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++을 배우지 않고 파이썬만으로도 할 수 있는 환경이 마련되어 일반 사용자들에게 충분히 어필을 할 수 있을 것 같다.
3D프린팅을 하다 보면 인쇄물이 밑판(베드)에 너무 단단하게 붙어버려서 이걸 떼어내는데 굉장히 힘들거나 아예 안 되는 경우도 종종 발생한다. 이것을 해결하기 위해서 youtube에서 검색을 좀 해보면 얼음팩으로 접합면을 식힌 다음에 망치같은 것으로 살살 쳐서 떼어내는 동영상도 있던데 훨씬 간단한 팁을 발견해서 여기에 소개하도록 하겠다.
바로 헤어스프레이를 bed에 뿌린 다음에 그 위에 인쇄를 하는 것인데 이게 의외로 효과적이다. 별다른 힘을 들이지 않고 인쇄물을 떼어낼 수 있다. 헤어스프레이 자체가 접착력이 있기는 한데 그 힘이 별로 크지 않기 때문에 서포트가 살짝 bed에 달라 붙게 되는 것이다.
필자는 UP! plus 라는 프린터를 사용하고 있는데 이것에는 갈색 플라스틱으로 된 밑판(bed)이 몇 장 딸려온다. 이것에는 조그만 구멍이 격자모양으로 뚫려 있어서 프린트할 때 서포트가 잘 달라붙도록 되어있는데 종종 너무 밀착되어 떼어내기가 매우 힘든 경우가 있다. 분리하는 도구(끝이 칼날로 된 주걱)가 딸려오기는 하는데 이것을 사용해도 떼어내기가 쉽지 않은 경우가 많다.
그래서 위 동영상에 나온대로 마트에서 헤어스프레이를(strong 형으로. 마트에서 몇 천원이면 살 수 있다.) 구입한 후 살짝 (5초~10초 정도) 골고루 뿌린 다음 인쇄하면 인쇄물이 베드에서 뜨지 않고 서포트가 너무나 쉽게 분리가 되서 아직까지는 편하게 사용하고 있다.
robox 라는 프린터는 특이하게 노즐이 두 개인데 하나는 0.3mm 이고 다른 하나는 0.8mm 이다. 기본적인 아이디어는 정밀도를 요하는 외곽은 0.3mm 노즐로, 대충 채워도 되는 내부는 0.8mm노즐을 사용하여 프린팅 속도를 높이도록 설계되어 있다. 이 회사 홍보 문구에는 기존 제품 대비 최대 3배의 속도를 낸다고.
3세대 Cube 가 출시되었는데 가격은 1000불 정도이다. (우리 돈 120만원 정도) 3D프린팅을 하다보면 노즐의 초기 높이를 설정하는 과정을 거쳐야 하는데 이게 수동으로 하려면 어렵기도 하고 매번 해줘야 되서 번거롭다. 노즐과 베드의 간격이 너무 낮거나 너무 높으면 프린팅이 제대로 되기 않기 때문에 대충해서도 안 된다.
요즘에는 100만원 대의 저가형 제품들 중에도 이러한 세팅 과정을 센서를 이용하여 자동으로 해주는 제품들이 나오고 있는데 3세대 큐베도 이러한 오토 레벨링(auto leveling)기능이 포함되어 있다. 초보자들은 이 기능이 포함되어 있는 제품을 선택하는 것이 좋다. 그리고 프린팅 베드를 감싸는 케이스도 있는 것이 좋은데 프린팅할 때 외부와 공기가 차단되어야 인쇄 품질이 더 높아지기 때문이다.
라즈베리파이 컴퓨트 모델에 이어서 새로운 모델이 출시되었다. 이름은 model b+ 인데 기존 model b 의 단점과 제기되었던 불편한 요소들을 개선한 최종 진화판이라고 소개하고 있다.
하지만 아쉽게도 모델B와 동일한 프로세서를 사용하므로 사용자들이 가장 원했던 성능의 향상은 없지만 소소하게 개선된 점들을 짚어보면 다음과 같다.
전원부의 회로를 개선하여 불안정했던 전원을 보완하였다.
오디오 회로의 수정으로 잡음이 많았던 단점을 보완하였다.
아날로그 비디오와 오디오 단자를 하나로 통합하였다.
USB포트를 두 개에서 네 개로 늘려서 키보드, 마우스, 와이피이동글을 꽂고도 하나가 남는다.
마이크로SD카드 채용하여 메모리카드의 고정성이 좀 더 향상되었다.
GPIO가 26핀에서 40핀으로 확장되었으나 추가된 핀들이 대부분 포트핀(디지털입출력핀)이다. 외부의 EEPROM을 자동 인식하기 위한 통신선 두 개가 추가되었고, PWM은 여전히 하나이며 ADC는 없다.
그외 마운트 홀의 위치를 좀 더 안정적으로 변경하였고 모서리를 둥글게 처리하였다.
그외 크기나 성능 사양은 model B와 동일하다. 프로세서와 동작클럭도 같고 램도 512MB 이다. 가격은 모델B와 같은 가격으로 책정되었다.
참고로 (3)번 항에서 알 수 있듯이 새로운 A/V 단자가 있는데 이 단자에 스테레오 이어폰을 끼우면 그냥 오디오 단자로 사용할 수 있는데 아래 그림과 같은 케이블을 이용하면 영상신호와 음향신호를 모두 뽑아낼 수 있다고 한다. 이건 참 개인적으로 기발한 변경점이라고 생각된다.