라즈베리파이 with AI 스피커 Raspberry PI 와 Python 1. Raspberry pi 소개및 OS Image 설치 1
Raspberry pi Raspberry pi( 이하라즈베리파이 ) 란영국라즈베리파이재단에서발매한제품으로학생들의컴퓨터교육을위해만들었음라즈베리파이는 Arduino( 이하아두이노 ) 와함께대표적인오픈소스하드웨어제품으로불리고있음 2
라즈베리파이와아두이노의차이점 아두이노에비해서라즈베리파이의성능이압도적으로높다는점에서두개의하드웨어는각각쓰임새가다름아두이노는 Atmel Corporation 의 ATMega 칩을주로사용, 라즈베리파이의경우는 Broadcom Corporation 에서제작된고성능칩을사용하드웨어구성면에서도라즈베리파이가더다양한옵션을가지고있음키보드, 마우스, USB 포트, 이더넷포트, 스피커잭, HDMI 등을제공운영체제가별도로제공된다는점에서아두이노에비해서다양한작업을수행할수있음단, 운영체제를별도로학습해야하는단점은존재함 3
라즈베리파이 4
SoC System-on-Chip (SoC) 단일칩시스템하나의칩에여러기능을집적한것을말함엄밀히말하자면단일칩만으로도하나의자기완결적시스템을구성할수있도록내부에연산장치 (CPU), 주기억장치 (RAM), 보조저장장치, 입출력장치가통합되어전원만넣으면작동하는수준의원칩솔루션을의미했으나현재는그의미가상당히바뀌어주기억장치의역할을하는 RAM과보조기억장치의역할을하는 NAND가별도로필요한경우에도 SoC라고통칭하는경우가많음시스템버스에주변장치를첨삭해야할경우칩의설계를바꿔야하는가아니면보드의설계나도터보드 (daughterboard) 추가여부만변경되는가에따라 SoC의여부를판별할수있음 5
GPIO 범용적인목적으로입 / 출력을담당하는것을 GPIO(General Purpose Input / Output) 라함 SPI 통신, I2C 통신, UART 통신등도갖추고있으며, 일반적으로마이크로세서는간단한리얼타임OS(RTOS) 정도올리던것을전부였는데라즈베리파이는데비안계열의기능축소판이긴하지만리눅스 OS를올릴수있으며, 더욱이자신이원하는포트제어를할수있기때문제어전용마이크로프로세서에비해리눅스를기반으로하고있기에시스템부하에따라프로그램실행속도가늦어지거나실행지점이다르다는등실시간제어가안된다는것이문제, 또한 ADC, PWM, 인터럽트기능이없는것도조금아쉬운점 6
주의사항 1. 전원구성 - 라즈베리파이의외부핀의전원관련으로는 3.3v, 5v 의두개의전원핀이존재, 하지만 GPIO 관련하여사용할때는 3.3v 의회로만을구성해야함. 그이상의전원에보호하는기능이없기때문 ( 스위치, LED를달더라도 3.3v 에회로에맞춰야함 ). 2. 전류사용 - 3.3v 의핀은최대 30mA이전류를사용할수있음, 그이상의전류가필요한회로를구성하게되면라즈베리파이의메인회로에문제가있을수있음 3. 과전압, 과전류 - GPIO 핀에과전류, 과전압을주게되면내부라즈베리파이회로에영향을주고동작하지않을수도있음 ( 보호장치가없음 ) 4. 버전별핀배열 - 라즈베리파이모델에따라 GPIO 핀이다르기때문에주의할것 ( 따라서구매시주의를요함 ) 7
라즈베리파이 with AI 스피커 Raspberry PI 와 Python 2. Raspberry pi 운영체제사용방법 8
운영체제설치 운영체제 (Operating System, OS) 은시스템하드웨어를관리할뿐아니라응용소프트웨어를실행하기위하여하드웨어추상화플랫폼과공통시스템서비스를제공하는시스템소프트웨어라즈베리파이는리눅스그중에서데비안을사용 9
운영체제다운로드및설치 Kt API Link 에가입로그인후, AI MAKERS KIT -> 이용신청하기 -> My Service -> OS Image 다운로드 SD 카드에운영체제를설치하기위해서 https://etcher.io/ 를다운로드 SD카드가느릴경우엄청나게오랜시간이걸릴수있으니 SD카드구매시속도에주의 10
라즈베리파이운영체제사용을위한환경설정 키보드 / 마우스연결 USB 전원을사용, 따라서라즈베리파이의어댑터는 2A 이상을사용모니터에 HDMI 연결모니터해상도는 FullHD를지원 TV에 HDMI 단자가있다면 TV도가능 11
라즈베리파이 with AI 스피커 Raspberry PI 와 Python 3. Python 개발환경및인터프리터, 기초문법 12
Python 개발환경 라즈베리파이의운영체제는기본적으로파이썬이설치되어있음 python 은 python 2 python3 은 python 3 터미널에서 python 인터프리터사용 13
라즈베리파이 with AI 스피커 Raspberry PI 와 Python 3. 파이썬기초문법 14
About Python 파이썬 ( Python ) 이란? 파이썬인터프리터파이썬의장점과단점그리고활용 15
파이썬 ( Python ) 이란? 파이썬은 1990년암스테르담의귀도반로섬 ( Guido Van Rossum ) 이개발한인터프리터언어귀도반로섬이좋아하는코미디쇼인 " 몬티파이썬의날아다니는서커스 (Monty Python s Flying Circus)" 에서이름이유래대부분의파이썬책표지가뱀모양으로그려져있는이유는그리스신화에나오는파르나소스 ( Παρνασσός ) 산의동굴에살던큰뱀을뜻하기때문이며, 파이썬의경우아폴로 ( Απόλλων ) 신이델파이에서퇴치했다는이야기가모티브라할수있음 2000년에는 Python 2, 2008년에는 Python 3 를발표 16
파이썬인터프리터 인터프리터언어란실행시점에프로그램을한줄한줄해석하며실행파이썬의경우실행시점에바이트코드를만들어서프로그램의명령을실행함파이썬인터프리터의경우파이썬 3을사용하길권장 Python 2.7은 2020년까지는필수보안업데이트를제공 17
대표적인파이썬인터프리터 CPython PyPy C로작성된파이썬구현체, 파이썬코드를가상머신에의해해석되는중간바이트코드로컴파일하며, CPython은파이썬패키지와 C언어의확장모듈간에높은수준의호환성을제공, C언어를기반으로확장해서사용하고싶다면사실상유일한대안 파이썬언어의정적타입으로만구현된파이썬인터프리터로서통칭 RPython이라불리며, just-in-time 컴파일러와복수의백엔드 (C, CLI, JVM) 를지원한다는것으로 PyPy의목표는 CPython과최대한의호환성을유지하는동시에그성능을향상시키는것 18
파이썬의장점과단점그리고활용 쉬운문법 파이썬의또다른별명 => ' 실행할수있는의사코드 (Executable pseudocode)' 파이써닉 ( Pythonic ) 한코드작성은쉽지않음 다양한패키지 다양한분야의패키지가있으며, pip 를통해간단하게설치할수있음파이썬2와파이썬3의호환성을고려해야함 동적타입 동적타입덕분에유연한설계와빠른개발이가능실행시간에오류가발생할가능성이높아짐 19
활용 프로토타입 출시하고자하는서비스나프로젝트를빠르게만들어볼수있음 웹서비스 Django, DRF, Flask 등을사용한웹서비스 데이터분석 Pandas, Matplotlib, Numpy 등을사용한데이터분석 머신러닝 / 딥러닝 Google 의 Tensorflow, Keras, scikit-learn 등을사용 20
Using the Python Interpreter 인터프리터사용법식과연산함수 ( 기초 ) 21
인터프리터사용법 C:\Users\pythonic>python Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> 22
식과연산 표현 / 표현식 / 식 (expression) => 결과값을반환하며부작용이없음 (return, no side effect) expression 은하나의값으로수렴 ( 평가 ) 되는문장 ( 코드조각 ) 상수, 변수, 연산자, 함수의조합을사용해서반드시값을만들어냄문장 / 문 (statement) => 결과값을반환하지않으며자체적으로부작용이있음 (no return, side effect) statement 는주로 expression 을포함하고있으며, 완결성있게실행되는최소한의코드단위명령형언어 (imperative programming language) 에서어떤동작을수행하는가장기본이되는요소 23
함수란? 함수프로그램에서한번이상실행할수있도록여러 ' 문장 ' 을묶어주는문법적장치 ' 복사 / 붙여넣기 ' 방식의대안왜사용하는가? 절차적분해 24
def 문 def name(arg1, arg2,... argn): statements... return value 들여쓰기주의! 25
함수예제 >>> def fib(n): # write Fibonacci series up to n... """Print a Fibonacci series up to n."""... a, b = 0, 1... while a < n:... print(a, end=' ')... a, b = b, a+b... print()... >>> # Now call the function we just defined:... fib(2000) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 26
함수도객체 >>> fib <function fib at 10042ed0> >>> f = fib >>> f(100) 0 1 1 2 3 5 8 13 21 34 55 89 >>> fib(0) >>> print(fib(0)) None 반환값 >>> def fib2(n): # return Fibonacci series up to n... """Return a list containing the Fibonacci series up to n."""... result = []... a, b = 0, 1... while a < n:... result.append(a) # see below... a, b = b, a+b... return result... >>> f100 = fib2(100) # call it >>> f100 # write the result [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 27
함수의기본개념 def 는실행가능한코드 def 는객체를생성, 할당인수는할당 ( 객체참조 ) 에의해전달, 파이썬에인수는할당에의한함수에전달인수는기본적으로위치에따라전달인수, 반환값, 변수는선언되지않음 28
def 는런타임에실행 if test: def func(): # 함수정의... else: def func(): # 함수정의... func() # 선택된함수 당연하다고생각하지만, def 는런타임에실행되기때문에항상주의해야함! 29
Flow and Control if for range() break / continue pass 30
if >>> x = int(input("please enter an integer: ")) Please enter an integer: 42 >>> if x < 0:... x = 0... print('negative changed to zero')... elif x == 0:... print('zero')... elif x == 1:... print('single')... else:... print('more')... More 31
for >>> words = ['cat', 'window', 'defenestrate'] >>> for w in words:... print(w, len(w))... cat 3 window 6 defenestrate 12 >>> for w in words[:]: # Loop over a slice copy of the entire list.... if len(w) > 6:... words.insert(0, w)... >>> words ['defenestrate', 'cat', 'window', 'defenestrate'] 32
range() >>> for i in range(5):... print(i)... 0 1 2 3 4 range(5, 10) 5, 6, 7, 8, 9 range(0, 10, 3) 0, 3, 6, 9 range(-10, -100, -30) -10, -40, -70 33
range() 응용 >>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range(len(a)):... print(i, a[i])... 0 Mary 1 had 2 a 3 little 4 lamb range() 는 object >>> print(range(10)) range(0, 10) >>> list(range(5)) [0, 1, 2, 3, 4] 34
break and continue break >>> for n in range(2, 10):... for x in range(2, n):... if n % x == 0:... print(n, 'equals', x, '*', n//x)... break... else:... print(n, 'is a prime number')... 2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3 35
continue >>> for num in range(2, 10):... if num % 2 == 0:... print("found an even number", num)... continue... print("found a number", num) Found an even number 2 Found a number 3 Found an even number 4 Found a number 5 Found an even number 6 Found a number 7 Found an even number 8 Found a number 9 36
pass >>> while True:... pass # Busy-wait for keyboard interrupt (Ctrl+C)... >>> class MyEmptyClass:... pass... 37
An Informal Introduction to Python Using Python as a Calculator Number, String, Lists 38
Using Python as a Calculator Numbers 1234, -24 1.23 0o177, 0x9ff, 0b101010 3+4j Deciaml('1.0'), Fraction(1,3) 39
기본연산 >>> 2 + 2 # 뺄셈과곱셈도해보세요! 4 >>> 50-5*6 # 올바른답인가요? 더좋은방법은없을까요? 20 >>> (50-5*6) / 4 # 왜 5.0 일까요? 5.0 >>> 8 / 5 # 나눗셈에대해서좀더자세히알아보죠! 1.6 40
수학연산 >>> 5 ** 2 25 >>> 2 ** 7 128 >>> import math >>> math.pow(5, 2) # 뭔가다른것같은...? 25.0 >>> math.pow(2, 7) # 뭔가확실히다르죠? 128.0 >>> round(math.pi, 2) # round() 말고다른건? math 는뭐지? 3.14 >>> abs(-42.0), sum((1,2,3,4)) (42.0, 10) >>> min(3,1,2,4), max(3,1,2,4) (1, 4) 41
Lists 파이썬에서가장중요한자료구조중하나 >>> squares = [1, 4, 9, 16, 25] >>> squares [1, 4, 9, 16, 25] 42
Reading and Writing Files Methods of File Objects Saving structured data with json 43
Reading and Writing Files >>> f = open('workfile', 'w') >>> with open('workfile') as f:... read_data = f.read() >>> f.closed >>> f.read() Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file. 44
Methods of File Objects >>> f.readline() 'This is the first line of the file.\n' >>> f.readline() 'Second line of the file\n' >>> f.readline() '' >>> for line in f:... print(line, end='')... This is the first line of the file. Second line of the file >>> f.write('this is a test\n') 15 >>> value = ('the answer', 42) >>> s = str(value) # convert the tuple to string >>> f.write(s) 18 45
이진파일 >>> f = open('workfile', 'rb+') >>> f.write(b'0123456789abcdef') 16 >>> f.seek(5) # Go to the 6th byte in the file 5 >>> f.read(1) b'5' >>> f.seek(-3, 2) # Go to the 3rd byte before the end 13 >>> f.read(1) b'd' 46
Saving structured data with json >>> import json >>> json.dumps([1, 'simple', 'list']) '[1, "simple", "list"]' >>> json.dump(x, f) >>> x = json.load(f) 47
종합예제 Building an Interactive Dictionary 아주단순한 ' 사전 ' 프로그램을만들어보자! 유사단어를처리하는방법을통해 ' 라이브러리 ' 사용법을알아보자 48
프로젝트설계 시나리오 1 Enter word : apple A native Eurasian tree of the genus ''Malus''. The popular, crisp, round fruit of the apple tree, usually with red, yellow or green ski The wood of the apple tree. 시나리오 2 Enter word: rainn Did you mean rain instead? Enter Y if yes, or N if no: Y Precipitation in the form of liquid water drops with diameters greater than 0.5 millimet To fall from the clouds in drops of water. 49
프로젝트구현 1 사전데이터파악 {"abandoned industrial site": ["Site that cannot be used for any purpose, being contamin "abandoned vehicle": ["A vehicle that has been discarded in the environment, urban or ot found wrecked, destroyed, damaged or with a major component part stolen or missing."], " 이런데이터는어떻게처리하면좋을까요? 50
프로젝트구현 2 - 빠른테스트 JSON? >>> import json >>> help(json.load) Help on function load in module json: load(fp, *, cls=none, object_hook=none, parse_float=none, parse_int=none, parse_constant Deserialize ``fp`` (a ``.read()``-supporting file-like object containing a JSON document) to a Python object. >>> json.load('data.json') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python37\lib\json\ init.py", line 293, in load return loads(fp.read(), AttributeError: 'str' object has no attribute 'read' 왜? 에러가? 51
프로젝트구현 3 - 빠른테스트 fp 는파일객체 ( file-like object con... ) >>> json_open = open('data.json') >>> json.load(json_open)... uscultation': ['Listening to the heart and lungs using a stethoscope.']} 줄일순없을까? 52
프로젝트구현 3 - 빠른테스트 >>> json.load(open('data.json')) >>>... uscultation': ['Listening to the heart and lungs using a stethoscope.']} 53
프로젝트구현 4 - 골격을만들어보자 import json data = json.load(open('data.json')) def translate(w): return data[w] word = input(' 검색어를영어로입력하세요 : ') print(translate(word)) 54
프로젝트구현 5 - 에레처리 사소한문제 : 찾고자하는파일이없으면에러발생후비정상종료 Enter word : af Traceback (most recent call last): File "findword_01.py", line 10, in <module> print(translate(word)) File "findword_01.py", line 6, in translate return data[w] KeyError: 'af' 여러분이라면어떻게? 55
프로젝트구현 6 - 에레처리 import json data = json.load(open('data.json')) def translate(w): if w in data: return data[w] else: return " 해당검색어는존재하지않습니다." word = input(' 검색어를영어로입력하세요 : ') print(translate(word)) 56
프로젝트구현 7 - 대소문자구분 APPLE 은존재하지않음? Enter word : APPLE 해당검색어는존재하지않습니다. 전형적인데이터분석의실패... 57
프로젝트구현 8 - 대소문자구분 import json data = json.load(open('data.json')) def translate(w): w = w.lower() if w in data: return data[w] else: return " 해당검색어는존재하지않습니다." word = input(' 검색어를영어로입력하세요 : ') print(translate(word)) 58
프로젝트구현 9 - 유사단어?? difflib >>> import difflib >>> from difflib import Sequencematcher Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: cannot import name 'Sequencematcher'... >>> from difflib import SequenceMatcher >>> SequenceMatcher(None, "rainn", "rain").ratio() 0.8888888888888888 >>> from difflib import get_close_matches >>> help(get_close_matches)... >>> get_close_matches("accept", _keyword.kwlist) ['except'] >>> >>> get_close_matches("rainn", ["happy", "sun", "rain"]) ['rain'] 59
프로젝트구현 10 - 유사단어?? >>> data.keys()... ', 'locked', 'West Arawe', 'arawe occidental', 'fronton', 'Gbànù', 'Banu', 'Gbanou', 'Gb >>> type(data.keys()) <class 'dict_keys'> >>> get_close_matches('rain', data.keys()) ['rain', 'train', 'rainy'] >>> get_close_matches('rain', data.keys(), n = 5) ['rain', 'train', 'rainy', 'grain', 'drain'] >>> get_close_matches('rain', data.keys(), n = 5)[0] 'rain' 60
프로젝트구현 10 - 유사단어?? >>> get_close_matches('rain', data.keys(), cutoff=0.8)[0] 'rain' 61
프로젝트구현 11 - 유사단어추천 import json from difflib import get_close_matches data = json.load(open('data.json')) def translate(w): w = w.lower() if w in data: return data[w] elif len(get_close_matches(w, data.keys())) > 0: return " 입력하신단어가 %s 인가요?" % get_close_matches(w, data.keys())[0] else: return " 해당검색어는존재하지않습니다." word = input(' 검색어를영어로입력하세요 : ') print(translate(word)) 62
프로젝트구현 12 - 유사단어검색 import json from difflib import get_close_matches data = json.load(open('data.json')) def translate(w): w = w.lower() if w in data: return data[w] elif len(get_close_matches(w, data.keys())) > 0: yn = input(" 입력하신단어가 %s 인가요? 맞으면 Y 를아니면 N 을입력하세요 : " % \ get_close_matches(w, data.keys())[0]) if (yn == 'Y' or yn == 'y') : return data[get_close_matches(w, data.keys())[0]] elif (yn == 'N' or yn == 'n') : return " 입력한단어가올바르지않습니다." else: return " 다시검색해주세요 " else: return " 해당검색어는존재하지않습니다."... 63
프로젝트구현 13 - 출력수정... output = translate(word) if type(output) == list: for item in output: print(item) else: print(output) 64
프로젝트구현연습문제 대문자로시작하는 ( Texas ) 단어가검색이가능하도록수정해보세요. 대문자로구성된단어가검색이가능하도록수정해보세요. 65
프로젝트구현연습문제 ( 해답 )...... elif w.title() in data: return data[w.title()] elif w.upper() in data: return data[w.upper()] 66