컴퓨터로 프로그래밍을 하다 보면 눈이 쉽게 피로해지는데 컬러 테마를 어두운색 계열로 바꾸어 놓으면 도움이 된다. 윈파이썬의 경우 spyder를 기본 IDE로 사용하는데 spyder의 Tools > Preferences 메뉴에서 Editor, Console 텝의 옵션을 조정하면 dark theme 를 사용할 수 있다.
먼저 Editor 텝에서 다음 그림과 같이 color scheme 을 변경한다. 이것을 적용하면 프로그램 에디터의 테마가 다크테마를 적용되어 어두운 배경에 밝은 색 폰트로 변경된다.
아래 그림에서는 체크를 해제하여야 console창과 python쉘의 배경이 검은색으로 된다.
winPython 은 초기에 python console을 실행시키게 되어 있다. 만약 ipython을 기본으로 사용하고 싶다면 다음과 같은 과정으로 설정하면 된다.
먼저 python console을 초기 기동시 자동으로 시작하게 하지 않으려면 Tools > Preferences 메뉴에서 다음 그림과 같은 옵션을 체크 해제한다. 이 옵션의 체크가 해제되면 winPython을 실행시킬 때 console 창이 자동으로 실행되는 것을 억제할 수 있다.
그 다음 ipython 옵션에서 다음 탭을 체크하여 선택한다.
그러면 이제 winPython을 실행시키면 초기에 python console 대신 ipython 이 실행된다.
먼저 pyserial을 소개하도록 하겠다. pyserial은 시리얼 통신을 하기 위한 파이썬 모듈이다. 만약 winPython 을 사용한다면 pyserial 이 기본으로 설치되어 있다. ( 처음에는 이 사실도 모르다가 따로 설치를 해야 하겠거니 짐작하고 한참을 헤맸었다. ) 따라서 바로 import 하면 사용할 수 있다. 주의할 점은 모듈명은 pyserial이 아니라 그냥 serial 이라는 것이다.
>>> import serial
일단 아두이노를 연결하면 윈도우 장치관리자에서 COM포트 번호를 확인할 수 있다. 아두이노 우노를 연결하고 내 컴퓨터의 예를 보면 아래와 같이 'COM22'번으로 잡혀있다.
먼저 시리얼 통신 객체를 생성하여야하는데 serial 모듈에 있는 Serial 클래스 (즉, serial.Serial 클래스이다.)를 이용하면 된다. 생성자의 정의는 다음과 같다.
class serial.Serial
__init__(
port=None,
baudrate=9600,
bytesize=EIGHTBITS,
parity=PARITY_NONE,
stopbits=STOPBITS_ONE,
timeout=None,
xonxoff=False,
rtscts=False,
writeTimeout=None,
dsrdtr=False,
interCharTimeout=None
)
입력 인수들:
port - 장치명. 윈도우즈에서는 'COM0', 'COM1' 등이다.
baudrate - 보레이트(baud rate) 예를 들면 9600, 115200 등.
parity - 패리티비트. FIVEBITS, SIXBITS, SEVENVITS, EIGHTBITS 등이 가능하다.
stopbit - 정지비트. STOPBITS_ONE , STOPBITS_ONE_POINT_FIVE , STOPBITS_TWO 등이 가능하다.
timeout - 수신 시간 제한 설정
xonxoff - 소프트웨어 흐름 제어를 설정
rtscts - 하드웨어(RTS/CTS) 흐름 제어 설정
dsrdtr - 하드웨어(DSR/DTR) 흐름 제어 설정
writeTimeout - 송신 시간 제한 설정
interCharTimeout
예외 발생
ValueError - 입력 변수값에 오류가 있을 경우 발생
SerialException - 시리얼 통신 장치에 오류가 있을 경우 발생
이것을 보면 포트 정도만 지정해 주어도 기본적으로 생성이 되는 것을 알 수 있다. 포트는 'COM22'와 같이 문자열로 넘겨주어야 한다. 포트명을 특정해 주면 즉시 장치와 연결이 open된다. 시리얼통신 장치를 다 사용하였다면 obj.close() 를 호출하여 반드시 닫아주어야 한다.
실험을 위해서 다음과 같은 간단한 프로그램을 아두이노 우노에 다운로드 하였다. 이 프로그램은 전원이 켜지면(또는 리셋 버튼을 누르면) "Hello python." 이라는 문자열을 보낸다.
void setup() {
Serial.begin(9600);
Serial.println("Hello python.");
}
void loop() {
}
그리고 파이썬에서 Serial 객체의 인스턴스를 다음과 같이 생성한다.
>>> ard = serial.Serial('COM22')
이렇게 하면 ard 변수에 Serial 클래스의 인스턴스가 생성된다. 이제 이 변수를 이용해서 아두이노에서 보내는 값을 읽어들일수 있다.
>>> obj = ard.readline()
>>> obj
b'Hello python.\r\n'
아두이노 쪽에서 println()함수를 썼기 때문에 끝에 \r\n 두 개의 개행 제어 문자가 붙어서 넘어왔다.
한 가지 주의할 것은 Serial.readlin() 함수의 반환 객체가 문자열이 아니라 bytes 라는 파이썬 객체로서 각각의 문자의 아스키코드 바이트 값의 배열이라는 점이다. 이것을 파이썬 문자열(string)로 변환하려면 bytes.decode()함수를 이용하면 된다.
>>> str = obj[:-2].decode()
>>> str
'Hello python.'
이제 str 변수에 아두이노로 부터 전송된 문자열이 정확히 저장되었다. 여기서 obj[:-2] 와 같이 인덱싱을 한 것은 \r\n 두 문자를 제외하기 위한 것이다.
이번에는 파이썬에서 값을 송신하면 그에 따라서 아두이노의 LED를 점멸시키는 예제를 해 보겠다. 파이썬에서 데이터를 쓰는 함수로 Serial.write() 함수가 있는데 전송할 바이트 데이터를 리스트나 튜플로 묶어서 넘겨주면 된다. 반환값은 전송한 데이터의 바이트 수이다. 예를 들면 다음과 같다.
여기에서는 C/C++언어에서 객체의 이름을 짓는 기본 규칙을 설명한다. 변수(variable), 함수(function), 그리고 클래스(class)의 이름을 지정하는데 사용되는 이름을 식별자(identifier)라고 한다. 변수란 어떤 데이터를 저장하는 그릇으로 이해하면 되며 함수나 클래스에 대해서는 뒤에서 자세히 설명할 것이다.
식별자를 만드는 데에는 다음과 같은 제약 사항이 있다.
❶ 알파벳 대소문자(a, b, …, z, A, B, …, Z), 숫자(0,1,2, …9), 밑줄(_)을 조합하여 만든다.
❷ 숫자로 시작해서는 안 된다.
❸ 최대 길이는 32자이다.
❹ C/C++언어의 예약어는 식별자로 쓸 수 없다.
특수문자로는 유일하게 밑줄(_)문자가 식별자를 만드는데 사용이 되며 이외의 다른 특수문자는 식별자롤 사용할 수 없다. 아래의 예는 올바른 식별자이다.
micropython 코어를 이용한 wipy 라는 IoT 보드가 킥스타터에서 자금을 모으고 있다.
내세우고 있는 특징들은 다음과 같다.
저가, 소형, 빵판에 장착 가능
초저전력 소모 (와이파이 연결해도 850uA )
100% 파이썬 프로그래밍
충분히 많은 GPIOs, 인터페이스, 주변기기
고성능 CPU와 최신 WiFi radio.
이 기기의 최대 특징은 와이파이와 결합된 파이썬 보드라는 것이다. micropython의 펌웨어를 이용하여 파이썬 3.4를 지원한다. 그리고 와이파이로 무선 프로그래밍이 가능하다는 것이다. 다음과 같이 텔넷 연결도 가능하다.
보면 알겠지만 일반적인 파이썬쉘로 접속이 가능하므로 그때그때 프로그램의 동작을 확인해 볼 수 있다.
물론 전문적인 시스템 개발자들은 앞으로도 한동안 여전히 C/C++을 이용해야 할 것이다. 하지만 이런 보드들이 좀 더 늘어나면 하드웨어 프로그래밍을 하는데 굳이 C/C++을 배우지 않고 파이썬만으로도 할 수 있는 환경이 마련되어 일반 사용자들에게 충분히 어필을 할 수 있을 것 같다.