디지털 입출력 포트(digital I/O port, 혹은 그냥 포트)는 디지털 신호를 출력하거나 입력받을 수 있는 통로(물리적으로는 핀)이다. 디지털 신호는 0과 1 두 가지 상태만을 표현하므로 포트를 통해서 0 또는 1신호를 내보내거나 입력받을 수 있다. 아두이노 우노에는 13개의 디지털핀이 있는데 이것들이 포트에 해당된다.


 앞으로의 설명을 위해서 약간의 전기회로 지식이 필요하다. 먼저 전압(voltage)과 전류(current)의 개념을 설명하면 다음과 같다. 마트에서 흔히 살 수 있는 AA나 AAA사이즈 건전지 하나의 '전압'은 1.5V (V는 Volt 볼트, 전압의 단위) 라는 것은 알고 있을 것이다. 이 의미는 음극과 양극의 '전위차'가 1.5V라는 의미이며 일단 '전압은 전류를 흘릴 수 있는 힘' 정도로 이해하면 된다. 이 전위차가 있는 두 부분을 도선으로 연결하면 전자가 도선을 따라서 흐르게 되는데 이 전자의 흐름이 전류이다. 전자는 음극에서 양극으로 흐른다. 전압(또는 전위차)이 높을 수록 전자가 더 많이 흐르고 전류값도 높아진다. 전자의 흐름인 전류의 단위는 암페어(Ampere, A로 표시함)이다. 전류는 '양전하의 흐름'이다.


  • 전류(단위는 암페어, A) : 양전하의 흐름

  • 전압(단위는 볼트, V) : 전류를 흘릴 수 있는 힘



위 그림을 보면 건전지의 +극과 -극을 저항 $R$로 연결하였다. (왼쪽은 건전지와 저항의 모양을 그대로 그렸고 오른쪽은 이것을 기호로 표시한 것이다.) 이 경우 전류가 도선을 따라 흐르게 되는데 전지의 전압을 $v$, 저항을 $R$이라고 하면 전류의 크기는 $\frac{v}{R}$로 계산된다. 이것을 오옴의 법칙이라고 한다. 저항의 단위는 오옴(ohm)이다. '저항은 전류의 흐름을 제한하는 역할을 하는 소자'이다.


  • 저항(단위는 오옴 Ω) : 전류의 흐름을 제한하는 역할을 하는 소자

  • 오옴의 법칙 : $v = i R$


 디지털 시스템의 디지털 신호는 '전압'으로 표현된다. 신호 0(LOW)은 0V (GND, 그라운드라고 읽는다)가 사용되고 1신호는 주로 5V, 3.3V 혹은 1.8V이다. 아두이노의 경우 동작 전압이 대부분 5V이므로 신호 1 (HIGH) 은 전압으로 5V가 되는 것이다.


포트를 이용한 출력 내보내기


 포트를 출력으로 사용하는 경우는 스위치를 생각하면 간단히 이해할 수 있다. 건전지와 연결된 전구사이에 스위치가 있는 간단한 실험장치를 생각해 보면 된다. 스위치를 손가락으로 눌러서 연결(on 되었다고 한다)되면 전구에 전압이 걸려서 켜질 것이고 손가락을 떼면 (off되었다고 한다.) 전구가 꺼지게 된다.



포트는 이와 같이 핀에 연결된 회로에 전압을 인가하거나(1, HIGH 신호) 인가하지 않을 (0, LOW 신호) 수 있는 스위치의 역할을 하는데 아두이노의 경우 이 스위치를 프로그램을 통해서 on시키거나 off시킬 수 있다. 사용자가 원하는 타이밍, 주기, 속도를 가지고 스위치를 켰다 끌 수 있는 것이다. 따라서 손으로 스위치를 조작하는 것과는 비교할 수 없는 정밀도와 속도로 개폐를 제어할 수 있다.


포트를 이용한 입력신호 받기


 입력의 경우에는 출력과 반대로 이 물리적인 핀과 연결된 부분의 전압이 0V(LOW)이냐 혹은 5V이냐(HIGH)를 읽어들이는 기능을 한다. 보통 디지털 입력 실험을 할 때 처음으로 접하는 부품이 택스위치 회로인데 택스위치가 눌려졌는지 혹은 떼어졌는지를 포트의 입력 기능으로 판별할 수 있다.


 위 그림 (a)에서 화살표 표시된 곳의 전압은 5V인데 저항에 전류가 흐르지 않아 저항 양단에 전위차가 발생하지 않기 때문이다. 반면에 (b)를 보면 화살표 된 곳의 전압은 0V인데 GND와 직결되어 있기 때문이다.


 이제 (c) 그림을 보면 스위치를 안 눌렸을 때 (a)와 같고 스위치를 누르면 (b)그림과 같다는 것을 알 수 있다. 따라서 스위치를 눌렀을 때와 안 눌렸을 때의 전압값이 달라지므로 포트에서 이 전압값을 읽어 들여서 스위치의 상태를 검출할 수 있다. 여기에선 사용된 저항 $R$을 '풀업(pull-up) 저항'이라고 한다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad006}

Posted by 살레시오
,

 프로그램을 작성/편집 하고 컴파일/디버깅 할 수 있는 통합 환경을 IDE(Integrated development envirionment)라고 한다. processing 이라는 JAVA 기반의 흥미로운 오픈소스 그래픽 개발 환경이 있는데 GUI 구현을 위해서 종종 아두이노와 같이 사용되기도 한다. ( processing.org 홈페이지에 자세한 내용이 있다.) 아두이노는 바로 이 processing 의 IDE를 이용하여 개발된 전용 IDE를 무료로 제공하고 있어서 편리하게 사용할 수 있다. 그래서 processing IDE의 외관과 아두이노 IDE의 그것과 매우 비슷하다. 아래의 공식 다운로드 링크에서 OS에 맞는 프로그램을 다운받아서 설치한다.


아두이노 IDE 공식 다운로드 페이지


설치한 후 실행시키면 아래와 같은 조금은 단순해 보이는 화면이 뜰 것이다. 이 프로그램을 이용하여 아두이노 프로그램을 입력하고 컴파일한 후 (USB로 아두이노 보드와 연결되어 있다면) 다운로드까지 수행할 수 있다.



 만약 사용자가 C++에 익숙하다면 물론 좋겠지만 그렇지 않더라도 라이브러리가 사용하기 편하게 잘 갖추어져 있으므로 익히는 시간이 그리 많이 걸리진 않는다. 사실 사용하는 언어는 C++ 이지만 잘 모른다고 미리 겁먹을 필요는 없다. 어차피 아두이노라는 플랫폼 자체가 비전공자(디자이너, 예술가 등)들이 깊은 전공 지식 없이 개발을 할 수 있도록 설계가 된 것이기 때문이다.


 아두이노 보드를 PC와 USB로 연결하고 IDE를 실행한 다음, 메뉴에서


  • 도구>보드 항목 : 연결된 보드의 종류를 선택

  • 도구>포트 항목 : 가상 시리얼 포트의 번호를 선택


위의 두 항목만 올바르게 선택했다면 일단 개발 환경은 다 갖춘 셈이다. 아두이노 포트 번호는 윈도우즈의 경우 장치관리자에서 확인할 수 있다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad005}

Posted by 살레시오
,

 아두이노 우노(uno) R3는 ATmega328P 라는 AVR 8-bit 마이크로콘트롤러를 사용한다. PC와 USB로 연결할 수 있으며 이것으로 프로그램 다운로드 및 시리얼 통신에 사용된다.


전원 연결


 아두이노 우노보드는 내부적으로 5V로 동작한다. 전원은 다음과 같이 두 가지 방법 중 한 가지로 인가하면 된다.


  1. USB로부터 5V 전원을 공급받아서 동작할 수 있다. 따라서 이 보드를 PC와 USB로 연결하면 일단 기본적인 하드웨어 세팅은 끝난 것이다.

  2. 외부 전원을 연결하는 단자가 있는데 이것으로 7~12V 사이의 전원을 인가하면 되며 9V가 권장 전압이다. 일반적인 AA 혹은 AAA 사이즈의 1.5V건전지를 6개를 직렬 연결하거나 1.2V 충전지를 사용해도 된다. 물론 AC어댑터도 전압 범위가 맞으면 사용 가능하다.


만약 USB와 전원 소켓에 둘 다 연결되어 있다면 소켓에서 공급되는 전원을 자동으로 사용하게 된다.


디지털 입출력 핀 14개 (0번~13번 핀)


 디지털(digital) 입출력 핀들을 이용해서 외부의 이진 신호를 읽어들어나 또는 이진 신호를 내보낼 수 있다. 이진 신호란 on/off 와 같이 상태값이 두 가지만을 가지는 신호라는 의미이다. 이 디지털 핀을 이용해서 LED를 켜고/끄거나 외부의 스위치가 눌려져 있는지 아닌지 등을 검출할 수 있다. 구체적으로 0V 와 5V 두 전압중 하나의 값을 가지며 이것은 프로그램으로 제어할 수 있다.


디지털 입출력으로 사용되면서 또한 부가적인 기능을 가지는 핀들은 다음과 같다.


  • 0번과 1번 핀은 시리얼 통신에 사용된다. USB로 PC와 통신을 할 수 있다.

  • 2번과 3번 핀은 인터럽트 기능을 갖는다.

  • 3, 5, 6, 9, 10, 11번 핀은 PWM 기능을 가지며 아날로그 출력을 흉내낼 수 있다.


아날로그 입력 핀 6개 (A0~A5)


 아날로그 입력 핀이란 외부의 아날로그 입력값을 읽어들이는 핀으로서 주로 센서(sensor)와 연결하여 사용된다. 아날로그(analog)신호는 디지털 신호와는 달리 연속값을 의미하면 예를 들어서 온도, 빛의 세기 등이 있다. 이러한 물리량을 센서가 전기 신호로 변환하며 이것을 이 아날로그 핀으로 읽어들일 수 있다. 센서를 통해 읽은 전압값은 0에서 1023 사이의 숫자로 변환된다. 기준 전압은 5V 이지만 1.1V의 내부 전압이 사용될 수 있으며 AREF핀으로 기준 전압을 직접 인가할 수도 있다.


그리고 아날로그 핀은 디지털 입/출력 핀으로도 사용할 수 있다.


아날로그 출력핀 6개 (3,5,6,9,10,11번핀)


 디지털 출력핀이 0V/5V 두 가지 값만을 가질수 있는데 비해서 아날로그 출력핀은 0V~5V사이의 전압 값(256단계)을 가질 수 있다. 엄밀히 얘기하면 PWM방식으로 동작하므로 순수 아날로그 방식은 아니다.


인터럽트 (2, 3번 핀)


 2번핀과 3번핀은 인터럽트(interrupt) 기능을 가진다. 인터럽트 처리(interrupt handling)라는 것은 이벤트를 처리하는 데 사용되는 기능으로서 특정한 신호가 발생했을 때 정해진 동작을 수행하여야 하는 경우 사용되는 방식이다. 예를 들어서 버튼이 눌려진 시점에서 (또는 떼어진 시점에서) 어떤 작업을 수행해야 하는 경우다.


그 외의 기능들


 아두이노 우노 보드는 3.3V의 전압도 공급할 수 있다. 이는 USB만 연결한 경우도 마찬가지이다. AREF 핀은 아날로그 핀의 기준 전압을 설정하는 용도로 사용된다.


다른 기기와의 통신 기능은 다음과 같다.

  • 시리얼 통신 : 0번, 1번 핀

  • SPI 통신 : ICSP 헤더핀

  • TWI (I2C) 통신 : A0, A1 핀


시리얼 통신 방식 외에는 일반적으로 사용 빈도가 낮지만 기기간 통신이나 일대다 통신을 하는 경우 SPI, TWI 통신이 널리 사용된다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad04}

Posted by 살레시오
,

 아두이노(arduino)보드는 하드웨어와 소프트웨어 구조가 모두 개방된 오픈소스 플랫폼이기 때문에 정품뿐만 아니라 수많은 변종 보드들이 존재한다. 여기에서는 동일한 Arduino IDE를 사용해서 개발할 수 있고 기본적으로 많이 사용되는 보드들 위주로 설명하도록 하겠다.


우노(uno), 나노(nano) / 프로(pro), 미니(mini), 프로미니(pro mini)


 이 다섯 가지 보드는 모두 atmega328p 라는 프로세서를 기반으로 한 보드들이므로 코어 부분은 모두 동일하다. 다만 크기를 작게 만들거나 또는 양산을 위해서 USB통신부가 제거되었거나 하는 부분이 다를 뿐이다.


(a) 아두이노 우노와 나노


 아두이노 우노는 가장 많이 사용되는 기본적인 아두이노 보드이다. 이 보드의 핀 배열이 거의 표준과 같이 사용된다. 2014년 현재 세 번째 버전인 우노 R3 가 유통되고 있다.




아두이노 나노(nano)는 우노와 거의 동일한 구성을 가지고 있다. 빵판에서 실험할 수 있도록 작은 크기와 핀배열을 가진다.



(b) 아두이노 프로와 프로 미니


 다량의 완성품에 장착하기 용이하도록 소형화시키고 usb시리얼 변환 칩을 제거한 제품이다. 따라서 프로그래밍을 위한 별도의 usb시리얼 변환기가 필요하다. Atmega328 (혹은 Atmega168) 기반으로서 아두이노 우노와 거의 동일한 스펙을 가진다.


<아두이노 미니> - 프로미니와 핀배열이 거의 동일함


아두이노 레오나르도 (arduino leonardo)와 마이크로(micro)


레오나르도 보드는 USB기능이 내장된 atmega32u4 를 메인 프로세서로 사용한다. (이에 반해 우노 보드는 usb 통신을 위해서 메인 프로세서와 별도의 칩을 사용한다.) 따라서 프로그램 다운로드와 시리얼통신 포트가 독립적으로 동작된다. 단가가 우노보다 낮다.(고는 하지만 우노나 레오나르도나 -최저가로 검색하면- 만원대에 구입 가능함) 키보드/마우스/조이스틱과 같은 주변기기로 인식시킬 수 있어서 활용도가 높다.



아두이노 마이크로는 레오나르도 보드와 동일한 프로세서를 사용한 소형 보드이다.



아두이노 메가 2560 / 메가 ADK


 프로세서로 ATmgea2560 을 사용하여 우노 보드보다 기능과 핀수가 많은 보드이다.



아두이노 두에 (arduino due)


 다른 아두이노 제품들이 8-bit 마이크로콘트롤러인 AVR 기반인 것과 달리 아두이노 두에는 32-bit ARM core 프로세서를 사용한다. 기능과 성능이 높고 핀 수가 매우 많아서 보다 전문적인 제품 개발과 연구 목적으로 사용할 수 있다.



아두이노 제로 (arduino zero)


 Atmel사와 아두이노가 동동 개발한 거승로 프로세서는 AVR 이 아니라 ATSAMD21 이라는 ARM 계열의 32비트 프로세서를 채용하였다. 48MHz 의 클럭 주파수로 동작하는데 이것만 놓고 보면 아두이노 우노 성능의 3배이다.



클럭 속도 외에 우노와 비교하여 특이한 점은 0번과 1번을 제외한 모든 디지털 핀에서 PWM 기능을 사용할 수 있다는 점과 플래시메모리가 256KB 로서 우노의 8배 정도로 늘었다는 것이다. 개발 환경에서도 별도의 usb 통신 단자를 통해서 atmel 의 Embedded Debugger (EDBG) 기능을 사용할 수 있어서 디버깅에 별도의 장치가 필요없다는 점도 눈에 띈다. 우노와의 차이점을 정리하면 다음과 같다.


  • 32비트 프로세서 채용

  • 3.3V로 동작

  • 48MHz의 클럭 주파수 (우노대비 4배)

  • 12개의 PWM핀 (우노의 PWM핀은 6개)

  • 256KB의 플래시메모리 (우노대비 8배)

  • 디버깅(EDBG)을 위한 별도의 usb 단자 내장

  • 12비트 ADC (우노는 10비트 ADC임)


현재(2015년 4월) 아직 출시되지는 않았지만 조만간 나올 예정이다.


아두이노 융 (arduino yun)


 레오나르도 기판과 HTTP 통신과 같은 온갖 텍스트 기반의 작업을 처리하는 Linino(리눅스 변형 OS)를 구동하는 WI-FI 리눅스 기판을 내장하고 있다. USB통신 뿐만 아니라 와이파이를 통해 프로그램이 가능하다.



갈릴레오 보드 (galilero board)


 인텔의 쿼크(Quark) 프로세서 X1000 를 이용한 고성능의 아두이노 호환 보드이다.

최대 400MHz의 클럭속도를 가지는 초전력 x86 기반의 프로세서이다.

기존 아두이노 우노의 핀배열을 가지며 유사한 개발 환경을 이용할 수 있다.

별도의 갈릴레오보드 전용 IDE가 제공되지만 사용법은 아두이노 IDE 와 동일하다.



기타 변종 아두이노들


 '아두이노'는 등록된 상표이므로 정품 보드만 이 이름을 사용할 수 있다. 이런 이유로 보통 파생 제품들은 두이노(duino)라는 접미어로 새로운 이름을 만들어서 사용한다. 개중에는 공식 아두이노와 완벽하게 호환되면서 가격은 더 저렴한 것들이 많으므로 이것을 이용해도 같은 개발도구와 라이브러리로 작업을 할 수 있다.


몇몇 예를 들어보면 다음과 같다.


  • Freeduino

  • Funduino

  • Seeeduino

  • Korduino

  • Meduino (make block)

  • Paperduino

  • Boraduino

  • Roboduino

  • Femtoduino (가장 작은 아두이노 호환 복제품)

  • Ruggeduino (I/O 보호 기능이 내장된 아두이노 보드)

  • pcDuino (갈릴레오보드와 비슷한 개념)

  • Teensyduino


등등 이 외에도 수많은 변종 보드들이 존재한다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad03}

Posted by 살레시오
,

 아두이노는 널리 사용되는 오픈소스 프로토타이핑 도구이다. 아두이노 프로그래밍을 하려면 아두이노 IDE를 다운로드 받은 다음 PC에 설치한 후 그것을 이용하여 개발하는 것이 기본이지만 요즘에는 온라인 상에서도 똑같은 일을 할 수 있는데 바로 codebender.cc 라는 사이트에서 제공하고 있다.



그냥 로컬PC를 이용하면 되지 왜 느리고 불편한 온라인 환경을 이용해야 되는지 의아할 수 도 있지만 협업과 공유라는 측면에서 온라인 작업 쪽의 장점이 훨씬 크다. 언뜻 생각나는 로컬PC에서 개발을 수행하는 경우의 단점들을 꼽아보면 다음과 같다.


  • 자기가 짠 프로그램들 조차도 효율적으로 관리하기 어렵다.

  • 라이브러리를 일일이 설치해야 한다. (어쩌다 PC를 포맷하면 다시 처음부터..)

  • 협업을 하기 어렵다.

  • 내가 작성한 프로그램이나 라이브러리를 타인들과 쉽게 공유할 수 없다.


이러한 단점들이 codebender.cc 와 같은 서비스를 이용하면 대폭 개선된다. 더우기 기본 기능을 무료로 사용할 수 있으니 한 번 사용해 보고 판단을 하면 될 것이다.


단, 온라인 특성상 반응 시간이 조금 늦은 것과 자동완성과 같은 프로그램의 편의 기능은 지원하지 않는 등 소소한 단점은 존재한다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad001}

Posted by 살레시오
,

 아두이노(arduino)는 AVR이라는 마이크로 컨트롤러를 기반으로 한 오픈소스 원보드 마이컴이다. 예전에는 이런 시스템을 설계하고 다루기 위해서는 전기/전자와 관련된 전문적인 기술이나 지식이 필요했다. 이 보드의 특징은 그러한 어려움을 극복하고자 기술 숙련도가 낮은 디자이너 혹은 예술가들을 대상으로 설계된 것이다. 따라서 비전공자들도 손쉽게 익히고 사용할 수 있다는 큰 장점을 갖는다.


[그림 1] 가장 널리 사용되는 아두이노 우노 R3 보드의 외형과 크기


 그러면 이러한 아두이노 보드를 이용하여 어떤 일들을 할 수 있을까. 간단한 몇 가지 예를 들어보면 다음과 같다.


  • 사람이 접근하면 자동으로 조명이 켜지는 장치.

  • 애완 동물에게 정해진 시간에 먹이를 공급하는 장치.

  • 화분의 습도가 낮아지면 자동으로 물을 주라는 트윗을 보내는 장치.

  • 여러개의 LED를 이용하여 귀걸이나 목걸이의 장식으로 이용.

  • 좀 더 전문적인 응용으로 로봇의 제어 장치.


위의 예들은 단순한 몇 개의 예를 든 것이고 인터넷으로 검색을 해보면 정말 많은 응용 제품들이 만들어지고 있으며 일반인 뿐만 아니라 기업에서도 이것을 이용하여 상용 제품을 출시하며 비즈니스 모델로 이용하고 있는 등 널리 사용되고 있다.


[동영상 1] 아두이노 소개


 대부분의 아두이노 보드들은 AVR 이라는 8비트 마이크로콘트롤러를 기반으로 하고 있으나 최근에는 Cortex-M3를 이용한 제품(Arduino Due)을 비롯한 여러 하이엔드 제품군이 개발되고 있다. 또한 소프트웨어 개발을 위한 스케치(sketch)라는 통합 개발 환경(IDE)이 제공되며 이것 또한 오픈소스로 공개되어 있다. C++ 로 개발이 진행되지만 관련 라이브러리가 잘 갖추어져 있어서 난이도는 낮은 편이다.


[그림 2] 다양한 아두이노 보드들


 앞에서도 언급했듯이 아두이노의 가장 큰 장점은 전기/전자의 깊은 지식이 없이도 마이크로컨트롤러를 쉽게 동작시킬 수 있다는 점이다. 일반적으로 AVR 프로그래밍이 WinAVR로 컴파일하여, ISP장치를 통해 업로드를 하는 등 일반인들에게는 어렵고 번거로운 과정을 거치는데 비해서, 아두이노는 전용 IDE를 이용하여 컴파일된 펌웨어를 USB를 통해 업로드를 쉽게 할 수 있다.


 또한 다른 프로토타이핑(prototyping) 도구들에 비해 비교적 저렴하고, 윈도를 비롯해 맥 OS X, 리눅스와 같은 여러 OS를 모두 지원한다. 아두이노 보드의 회로도가 CCL에 따라 공개되어 있으므로, 누구나 직접 보드를 직접 만들고 수정할 수 있으며 실제로 수많은 유사 (호환) 제품이 존재한다. 특히 요즘에는 중국 심천을 중심으로 하는 초저가 제품들이 쏟아지고 있다.


 아두이노가 인기를 끌면서 이를 비즈니스에 활용하는 기업들도 늘어나고 있다. 인텔, 마이크로소프트, 삼성 등과 같은 대기업들이 아두이노 호완 제품들을 선보이고 있는가하면, 장난감 회사 레고는 자사의 로봇 장난감과 아두이노를 활용한 로봇 교육 프로그램을 학생과 성인을 대상으로 북미 지역에서 운영하고 있다. 자동차회사 포드는 아두이노를 이용해 차량용 하드웨어와 소프트웨어를 만들어 차량과 상호작용을 할 수 있는 오픈XC라는 프로그램을 선보이기도 했다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad002}


Posted by 살레시오
,

1. 파이시리얼(pyserial) : 파이썬 시리얼통신 모듈

 먼저 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() 를 호출하여 반드시 닫아주어야 한다.




Posted by 살레시오
,

2. 아두이노로부터 수신 실험

 실험을 위해서 다음과 같은 간단한 프로그램을 아두이노 우노에 다운로드 하였다. 이 프로그램은 전원이 켜지면(또는 리셋 버튼을 누르면) "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 두 문자를 제외하기 위한 것이다.





Posted by 살레시오
,

3. 두 번째 실험 : 송신


  이번에는 파이썬에서 값을 송신하면 그에 따라서 아두이노의 LED를 점멸시키는 예제를 해 보겠다. 파이썬에서 데이터를 쓰는 함수로 Serial.write() 함수가 있는데 전송할 바이트 데이터를 리스트나 튜플로 묶어서 넘겨주면 된다. 반환값은 전송한 데이터의 바이트 수이다. 예를 들면 다음과 같다.


-------------------------------------------------------------------------

>>> ard.write( [0] ) # 0이라는 데이터를 전송한다.

>>> ard.write( [10, 150, 255] ) # 10,150,255를 차례로 전송한다.

>>> ard.write( 123 ) # 예외 발생!

-------------------------------------------------------------------------


전송되는 데이터는 바이트 데이터이므로 0~255 사이의 정수여야 하며 마지막 예와 같이 리스트나 튜플이 아니라면 예외가 발생함을 유의하여야 한다.


만약 문자열을 한꺼번에 전송하고 싶다면 encode() 라는 문자열 내장 함수를 이용하면 된다. 이 함수는 파이썬 문자열을 아스키값의 bytes 배열로 변환시켜준다.


-------------------------------------------------------------------------

>>> ard.write( 'Hello arduino.\r\n'.encode() )

-------------------------------------------------------------------------


이 명령은 'H' 부터 맨 마지막 '\n' 까지 14개의 문자의 아스키코드를 차례로 전송한다.


이제 실험을 위해서 아두이노에 다음과 같은 프로그램을 작성하여 다운로드 했다.



아두이노 프로그램 : 전원이 켜지면(또는 리셋 버튼을 누르면) "Hello python." 이라는 문자열을 보낸다. 그리고 데이터가 들어오면 0값이면 LED를 끄고 아니라면 켠다.

-------------------------------------------------------------------------

void setup() {

Serial.begin(9600);

Serial.println("Hello python.");

pinMode(LED_BUILTIN, OUTPUT);

}


void loop() {

if( Serial.available() )

digitalWrite(LED_BUILTIN, Serial.read());

}

-------------------------------------------------------------------------


이제 ard.write([0]) 이라고 명령을 내리면 LED가 꺼지고 ard.write([1])이라고 하면 LED가 켜지는 것을 다음과 같이 확인할 수 있다. 




위 동영상을 보면 1을 쓰면 LED가 켜지고 0을 쓰면 꺼지는 것을 볼 수 있다.


Posted by 살레시오
,

 실험을 위해서 여러 하드웨어 보드들을 구해서 잠깐씩 살펴보았는데, 하드웨어를 제어하는 (주로 오픈소스)보드들이 공통적으로 가지고 있는 필수 기능으로 다음과 같은 것들이 있다.


  • (디지털) In/Out 포트            : on/off 입출력
  • 인터럽트 (interrupt)             : 이벤트 처리
  • PWM                                : 아날로그 (처럼) 출력
  • A/D 변환기                         : 아날로그 입력 (주로 센서의 입력)
  • 통신 (주로 시리얼 통신)       : (주로) PC 혹은 다른 보드와의 통신
  • D/A 변환기                      : 아날로그 전압 출력


보드에 따라서 이러한 기능을 구현하는데 사용하는 언어도 다르다.


  • 아두이노는 C++
  • 넷두이노는 (매우 특이하게) C#.Net
  • R-Pi는 주력 언어가 파이썬 (하지만 리눅스 보드이므로 다른 언어도 가능함)
  • 비글본블랙은 자바스크립트 (마찬가지로 C++, JAVA 등도 가능). 비글본블랙은 D/A변환기도 내장하고 있으며 주변기기가 가장 풍부하게 마련되어 있다.


 어떤 보드의 기능과 프로그래밍을 살펴볼 때 위의 기능들을 사용 언어로 어떻게 구현하는지를 파악할 수 있다면 반 이상은 아는 것이라고 봐도 될 것 같다. 많이 사용되는 라즈베리 파이는 GPIO에 A/D변환기가 없으며 PWM기능도 매우 빈약하다.


  언어의 난이도 순으로 배열해 보면 (순전히 주관적인 생각임) 다음과 같다, 


  • C++ >  JAVA, C# > javascript > python


C++이 제일 어렵고 파이썬이 상대적으로 제일 난이도가 낮은 편에 속한다.


얼마 전까지만 해도 임베디드는 닥치고 C/C++ 이었는데 요즘에는 고수준 언어나 심지어 스크립트 언어로도 프로그래밍할 수 있는 보드들이 출시되고 있어서 비전문가들이 좀 더 쉽게 접근할 수 있는 환경이 되고 있다.

[#00093]


Posted by 살레시오
,