2016년 11월 28일 월요일

라즈베리 파이에 여러개의 시리얼 포트가 필요할 때 (Use multiple serial port in Raspberry Pi)

라즈베리 파이로 무언가를 만들려고 하다 보면 여러개의 시리얼 포트가 필요한 경우가 있다.  라즈베리 파이에는 기본적으로 두개의 시리얼 포트가 있지만 그 중 하나는 미니포트라 사용에 꽤 신경 써 줘야 하는 부분이 많고,  라즈베리 파이 3의 경우 시리얼포트를 블루투스가 사용하고 있어 블루투스를 동시에 사용하려고 하면 매우 골치 아퍼 진다.  (상세한 내용은 이전 포스트 (라즈베리 파이 3 시리얼/블루투스 문제 (Raspberry Pi 3 UART/Bluetooth problem))를 참고)

그럼 시리얼 포트를 추가할 수 있는 가장 쉬운 방법은 USB-to-Serial converter를 사용하는 것이다. 



시중에 다양한 종류의 제품이 나와 있고 가격도 그리 비싸지 않다.

다만 이 제품들을 사용해서 여러개의  시리얼 포트를 추가하려면 포트당 한개의 USB  포트가 필요하기 때문에 별도의 허브를 붙여줘야 하는 문제가 발생한다. 

그래서 FTDI에서는  USB-to-multiport  Serial  comverter  칩을 제공하고 있다.  FT2232H나 FT4232H  칩을 이용하면 한개의 USB포트로 2개 또는 4개의 시리얼 포트를 확장할 수 있게 된다. 






FT2232H breakout board

그리고  이 경우 가장 큰 장점은 raspbian에 디바이스 드라이버가 이미 포함되어 있어 따로 드라이버를 설치할 필요 없이 라즈베리 파이에 연결만 해 주면 장치를 인식해 곧바로 사용할 수 있다는 것이다. 


위의 화면 캡춰와 같이 breakout board를 연결하기 전에는 없었지만 breakout board를 USB에 연결하고 나면 /dev/ttyUSB0, /dev/ttyUSB1 이 자동으로 추가된다.  (FT2232H의 경우,  FT4232H의 경우는 저 두개 외에 추가로 /dev/ttyUSB2, /dev/ttyUSB3  도 만들어진다.)


FT2232H의 경우 단순히 asynchronous serial (우리가 일반적으로 사용하는 시리얼 통신방식) 뿐 아니고 synchronous serial, FIFO,  SPI,  I2C, Host emulation 등 매우 다양한 방식으로 동작할 수 있기 때문에 여러 핀이 나와 있지만 async serial로 사용하는 경우는 위의 4개 핀만 사용하면 된다. 

테스트를 위해 아래와 같이 uart0의 Tx핀을 uart1의 Rx에 연결해준다.


이제 라즈베리 파이에서 두개의 터미널 창을 열어준다.


minicom 또는 다른 시리얼 터미널 프로그램을 사용해 위쪽의 창은 /dev/ttyUSB0,  아래쪽 창은 /dev/ttyUSB1 포트를 열어준다.


미니컴을 사용하는 경우 디폴트로 하드웨어 플로우 컨트롤을 사용하는걸로 되어 있으므로 그걸 꺼 줘야 한다.  먼저 Ctrl-A 를 누른 다음 'O'를 누르면 위와 같은 메뉴 화면이 나온다.  거기에서 'Serial  port  setup'을  선택  해  준다.


위의 화면이 나오면 'F'  키를 한번 눌러 Hardware Flow Control 부분이 'Yes'로 되어 있는걸 'No'로 바꿔 준다.


위와 같이  되었으면 엔터키를 눌러주고 나서 'Exit'을 선택해주면 된다.  이 과정은 위쪽,  아래쪽 두 터미널 모두 해 줘야 한다.


이제 위쪽 터미널에서 글자를 입력해 보면 아래쪽 터미널에  입력한 글자가 나타나게 된다.  하지만 반대로 아래쪽 터미널에서는 아무리 글자를 입력해도 위쪽 터미널에는 나타나지 않는다.  테스트를 위해 Tx(uart0) -> Rx(uart1) 은 연결했지만 Tx(uart1) -> Rx(uart0)는 연결해 주지 않았기 때문에 그런 것이다. 

현재  aliexpress에서 FT2232H breakout board는 약 $15  정도에 구할 수 있다.  다만 FT4232H breakout board는 aliexpress에서는 찾기가 쉽지 않고 Numato Lab, Mouser 등에서 약 3~4만원 정도(배송비 별도)에 구할 수 있다.

이 디바이스들은 맥,  윈도우용 디바이스 드라이버도 제공되고 있으므로 맥이나 윈도우 환경에서도 여러개의 시리얼 포트가 필요한 경우 유용하게 사용할 수 있다.


Mac Coolterm에서 사용하는 경우  1


Mac  Coolterm에서 사용하는 경우 2

2016년 11월 21일 월요일

macOS Sierra에서 CH340/CH341 사용하기


맥에 Sierra  (Mac OS 10.12)를 설치한 후 CH340/CH341  칩을 사용한 디바이스(알리에서 판매하는 대부분의 저가 아두이노 보드,  ESP8266  기반 보드들이 여기에 들어감)를 연결하면 바로 커널 패닉이 발생해 버린다.




일단 커널 패닉이 발생하면 패닉을 발생시키는 원인이 되는 kext/드라이버를 제거해 줘야 한다.  어떤 kext가 문제를 발생시켰는가는 /Library/Logs/DiagnosticReports  안의 .panic  확장자를 가진 로그 파일에서 확인할 수 있다.
CH340인 경우 보통 wch.usb.usb 가 원인이 된다.
이 kext를 제거하려면 어느 디렉토리에 들어있는가 확인해 줄 필요가 있다.  이 경우 /Sysyem/Library/Extensions 디렉토리 내에 usb.kext라는 이름이지만 불행하게도 이름과 위치가 다를 수도 있다.  이게 찾는 드라이버가 맞는지 확인하고 싶으면 다음의 명령을 사용하면 된다.

$  cat usb.kext/Contents/Info.plists | grep wch.usb.usb

위의 명령을 실행해 무언가 내용이 출력된다면 찾는 파일이 맞다는 것이다.  이제 저 파일을 삭제하고 나면 디바이스를 연결해도 커널 패닉이 발생하지 않는다.  (물론 드라이버가 없으니 장치가 인식되지 않는다)

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

Mac Sierra에서 사용할 수 있는 CH340/CH341 드라이버가 만들어졌다.  아래 링크에서 다운받아 설치해 주면 된다.

Winchiphead  signed  drivers  for  CH340-CH341,  OS  X  10.9  to  macOS  10.12

The credit goes to the blog 'Playing with bits and bytes

2016년 11월 14일 월요일

Simblee BLE module

아두이노 등으로 작품을 만들 때 가장 골치아픈 부분중에 하나가 블루투스 통신이다.  블루투스 통신  뿐  아니고 스마트폰으로 무언가를 제어하거나 센서 값을 화면에 표시하려면 아두이노쪽 코드 뿐 아니고 안드로이드 또는 iOS  앱을 따로 만들어 줘야만 한다.
하지만 simblee는 이 문제를 다른 방법으로 접근해 간단하게 해결했다.

디바이스 코드 뿐 아니고 스마트폰에 표시될 UI  관련 코드까지 아두이노 UI에서 한번애  다 작성할 수 있게 만들어 버렸다.  즉 스마트폰 화면에 표시할 UI를 simblee에서 직접 보내주고,  스마트폰에서 이벤트가 발생(버튼 클릭 등)하면 그 이벤트에 대한 처리 코드 역시 simblee에 들어있다.



스마트폰은 일종의 웹 브라우져같이  동작해  스마트폰에서 Simblee for mobile앱을 실행시켜 놓으면 웹서버(즉 여기서는 simblee)에서 웹페이지 내용(여기서는 UI  화면)을 받아 화면에 표시해주고 사용자가 버튼이나 링크를 클릭하는 등의 이벤트가 생기면 웹 서버(여기서는 simblee)에 그 이벤트를 전달해 정해진 동작을 처리하게 한다.

그래서 아두이노 스케치에는 기본적으로 setup(), loop() 이렇게 두개의 함수가 있어야만 하는데 simblee  앱에서는 setup(), loop() 외에 추가로 ui(), ui_event() 함수가 있어야 한다.  Simblee는  자신의 정보를 advertise하고 있다가 스마트폰의 Simblee  for  mobile  앱과 연결되면 ui()  자동으로 ui()  함수가 실행되게 된다.  ui()  함수에서 아래와 같이 스마트폰 화면에 표시될 ui  정보를 보내주게 된다.

void ui()
{
  SimbleeForMobile.beginScreen(WHITE,PORTRAIT);
  SimbleeForMobile.drawSwitch(135, 100);
  SimbleeForMobile.endScreen();
}

UI  정보가 스마트폰으로 전송되면 스마트폰 앱 화면에 다음과 같이 수신된 UI가 표시된다.


사용자가 스위치를 토글하면 이벤트가 발생되어 그 이벤트 정보가 simblee로 전달된다.  Simblee는 이벤트를 받으면 자동으로 ui_event()  함수를 호출해 이벤트에 대한 처리를 수행하게 된다.

#include <SimbleeForMobile.h>

uint_8 switch;

void setup()
{
  Serial.begin(9600);
  SimbleeForMobile.deviceName = "Switch";  // SimbleeForMobile  앱에서 'Switch'라는 이름으로 검색됨
  SimbleeForMobile.begin();
}

void loop()
{
    SimbleeForMobile.process();
}

void ui()
{
  SimbleeForMobile.beginScreen(WHITE, PORTRAIT);
  switch = SimbleeForMobile.drawSwitch(135,100);
  SimbleeForMobile.endScreen();
}


void ui_event(event_t &event)
{
  if (event.id == switch) {
    Serial.println(event.value);
  }
}

위의 코드를 Simblee에 다운로드 하고 스마트폰에서 SimbleeForMobile앱을 실행해 'switch'라는 이름의디바이스를 선택하면 위와 같은 화면이 나오고 스위치를 토글하면 아래와 같이 시리얼 포트로 값이 변화하는걸  볼 수 있다.


 좌표계는 아래  그림처럼 좌측 상단이 (0, 0)이 된다.


 Simblee에 연결되는 디바이스마다 화면 크기는 달라진다.  아이폰 5의 경우 폭은 320픽셀,  높이는 570픽셀이 된다.  각 디바이스의 화면 크기는 스마트폰에 연결되면 SimbleeForMobile.screenWidth 과 SimbleeForMobile.screenHeight 에 자동으로 값이 설정된다.




2016년 10월 10일 월요일

Mac OS Sierra와 RNDIS (RNDIS in Mac OS Sierra)

Mac OS X를 사용하는 사람들에게 OS X 10.11 El Capitan은 몇가지 문제가 있었다. 그 중 가장 큰 문제가 RNDIS를 사용할 수 없다는 것이었다. 그 이전 버젼까지는 HORNDIS를 사용하면 되었는데 El Capitan으로 가면서 호환성에 문제가 생겨 horndis를 사용할 수 없게 되어 버렸다.
HORNDIS 개발자가 시간이 없어 변경된 부분을 수정해 주지 않아 다른 사람들이 몇가지 work around를 제시하긴 했지만 어느것도 안정적으로 사용하기에는 무리였다.
그런데 Mac OS 10.12인 Sierra로 오면서 OS내에 RNDIS 드라이버가 기본으로 들어있게 되어 이제는 horndis를 따로 설치하지 않아도 out-of-box로 바로 사용할 수 있게 되었다.

특히 Raspberry pi zero의 경우 별도의 이더넷 커넥터가 없어 따로 USB-to-serial 아답터를 사용해 콘솔을 연결해 주지 않으면, USB케이블로 맥과 연결해 rndis를 통해 USB/Ethernet gadget으로 사용해야 하는데 이제는 맥에 USB케이블로 연결만 하면 바로 USB/Ethernet gadget으로 잡히게 된다.


(처음 연결하면 IPv4 구성은 DHCP로 되어 있고 IP주소는 169.x.x.x로 나오는데 위와 같이 구성은 '수동', IP주소는 자신이 사용하고자 하는걸로 변경해 주면 된다.)

상세한 설정 방법은 이전 포스트(라즈베리 파이 제로를 USB 케이블 하나로 사용하기)를 참고하면 된다.


2016년 9월 22일 목요일

WS2812와 APA102의 차이 비교 (Comparison between WS2812 and APA102)

개별 칼라를 제어할 수 있는 LED strip으로 가장 많이 쓰이는 것이 WS2812B(Adafruit에서는 NeoPixel 이라는 제품명으로 판매)이다. 전원라인(+5V, GND)을 제외하면 단 한개의 신호선으로 수백개의 LED를 제어할 수 있어 매우 편리하다.




하지만 별도의 클럭신호 선 없이 한개의 신호선으로 데이터를 전송하다 보니 타이밍에 매우 민감하다. 아두이노용 WS2812 라이브러리(Adafruit_NeoPixel 등) 소스를 열어 본 사람들은 알겠지만 데이터를 전송하는 부분 코드는 타이밍을 정밀하게 맞춰주기 위해 전송중에는 인터럽트도 disable시켜 놓고 어셈블리 코드로 하드코딩 되어 있다.



최대 800KHz의 속도로 데이터를 전송하는데 만일 128개의 LED를 구동한다고 하면 한번 색을 변경하는데 약 4ms 정도의 시간이 걸리게 된다. 즉 이 시간동안은 프로세서가 다른 작업은 커녕 심지어 인터럽트도 안 걸리고 LED에 데이터를 보내야만 한다.
이는 특히 라즈베리 파이같이 OS를 사용하는 경우 매우 치명적이다. 물론 라즈베리 파이에서도 WS2812를 사용할 수 있게 DMA를 사용해 데이터를 전송하는 라이브러리가 나와 있긴 하지만 이런 라이브러리는 portability가 거의 없다. 즉 라이브러리를 가져다 다른데 포팅하는것이 매우 힘들다.

그래서 이런 문제를 해결한 비슷한 종류의 LED가 몇 종류 나와 있다. 그 중 하나가 APA102이다.




우선 WS2812와 가장 큰 차이점은 전원선(+5V, GND)외에 두개의 신호선(Data, Clk)이 있다는 것이다. (WS2812는 1개의 신호선(Data)만 있음)








그래서 SPI 버스의 MOSI, SCK 에 Data, Clk를 연결해서 SPI 방식으로 데이터를 보내주면 된다. 실제 데이터 전송은 SPI가 담당하기 때문에 프로세서가 데이터를 전송하는 동안 기다릴 필요도 없고 타이밍을 신경 쓸 필요도 없기 때문에 라이브러리 코드도 훨씬 간단해진다.

데이터 전송도 SPI 클럭 기준으로 이루어지기 때문에 16MHz의 속도로도 충분히 전송이 가능하다. (WS2812에 비해 20배 이상의 속도) 그래서 POV같이 LED 색이 빠른 속도로 바뀌어야 하는 경우 WS2812는 전환속도가 느려 적합하지 않지만 APA102는 충분히 빠르게 색을 바꿔줄 수 있다.

라즈베리 파이에서도 DMA를 사용하지 않아도 충분하기 때문에 순전히 파이선으로 만든 라이브러리도 있다.

https://github.com/tinue/APA102_Pi







2016년 9월 7일 수요일

micro:bit 설정하기 (Set up micro:bit)

먼저 스마트폰의 micro:bit 엡을 실행시킨다.


'Connections' 버튼을 선택한다.


기존에 페어링 된 micro:bit이 있으면 가장 최근에 사용된 micro:bit의 이름이 'Most recently used micro:bit' 에 나타날텐데 여기서는 처음 실행했기 때문에 빈 칸이다. 여기서 아래쪽의 노란색 'Pair a new micro:bit'을 선택해 준다.


그러면 어떻게 해야 하는지 알려주는 위와 같은 화면이 나온다.  위의 그림처럼 micro:bit의 'A', 'B' 버튼을 동시에 누르고 있는 상태에서 'RESET' 버튼을 눌렀다가 떼 준다. 그리고 화면에서 녹색 'Next' 버튼을 누른다.


위와 같은 화면이 나오게 된다. 저 위의 가로, 세로 5칸씩의 흰색 상자에 micro:bit 보드에 불빛과 동일하게 코드를 넣어주면 된다.


A, B 버튼을 누르고 있는 상태에서 리셋 버튼을 눌렀다가 놓으면 micro:bit 보드에 위와 같이 불빛이 들어오게 된다. 저 불빛 모양은 랜덤이라 매번 바뀐다.


 micro:bit에  불빛이 켜진 모양대로 흰색 박스를 빨간색으로 만들어 주고 'Next' 버튼을 눌러준다.

 

이제 페어링 할 준비가 된 것이다. 'Next' 버튼을 누르면 스마트폰과 micro:bit간에 페어링이 진행된다.


먼저 micro:bit을 검색한다.
 

원하는 micro:bit을 찾으면 페어링을 위한 코드를 물어본다. 여기서 micro:bit의 'A' 버튼을 누르면 6자리 숫자 코드가 LED에 표시되게 되는데 그 숫자를 넣어주고'Pair' 버튼을 눌러준다.


 위의 동영상을 참조하면 된다.




페어링이 성공화면 micro:bit와 스마트폰 화면은 각각 위의 사긴과 같이 바뀌게 된다.


WiFi & Bluetooth를 모두 지원하는 ESP-3212 발표

ESP-8266을 만든 Espressif사에서 ESP-3212 모듈을 새로 발표했다.

위의 사진처럼 크기나 외형은 ESP-8266과 별 차이가 없지만 가장 큰 차이점은 WiFi뿐 아니고 Bluetooth까지 포함되었다는 점이다.

내부 구조는 위의 그림과 같다.

프로세서는 Xtensa의 32-bit LX6 듀얼코어를 사용하고 있고 롬은 448KB, SRAM은 520KB이고 그와 별도로 RTC에 16KB의 SRAM이 더 들어 있다.

블루투스는 Bluetooth v4.2 BR/EDR, BLE를 모두 지원하고 별도의 외부 앰프 없이 class 1/2/3가 모두 가능하다.

Peripheral도 매우 다양하게 가지고 있다. 특히 ESP-8266에서 가장 아쉬웠던 1채널의 ADC가 18채널로 확장되었고 8-bit DAC도 2채널이 추가되었다. 그리고 심지어 CAN2.0까지 지원해 매우 저가의 OBD-II 장비도 쉽게 구현이 가능하다.
  •       • 12-bit SAR ADC up to 18 channels
  •       • 2 × 8-bit D/A converters
  •       • 10 × touch sensors
  •       • Temperature sensor
  •       • 4 × SPI, 2 × I2S, 2 × I2C, 3 × UART
  •       • 1 host (SD/eMMC/SDIO), 1 slave (SDIO/SPI)
  •       • Ethernet MAC interface with dedicated DMA and IEEE 1588 suppor
  •       • CAN 2.0
  •       • IR (TX/RX)
  •       • Motor PWM, LED PWM up to 16 channels
  •       • Hall sensor
  •       • Ultra low power analog pre-amplifier
IoT 장비에 가장 중요한 요소중에 하나인 보안 문제를 위해서도 다양한 하드웨어 가속기를 추가했다.
 
  • AES-HASH(SHA-2) library - RSA-ECC-RNG



이 정도면 IoT 디바이스를 위한 프로세서 모듈로는 거의 완전체에 가까워 진거 같다.

Pinout은 다음과 같다.

현재 SeeedStudio에서 개당 $6.95에 판매되고 있고 알리에서는 아직 올라오지 않았는데 조만간 알리에서 판매가 시작되면 더 저렴한 가격에 구할 수 있을거 같다.

https://www.seeedstudio.com/ESP3212-Wifi-Bluetooth-Combo-Module-p-2706.html






2016년 8월 26일 금요일

라즈베리 파이 제로를 USB 케이블 하나로 사용하기 (Use Raspberry Pi Zero as RNDIS/Ethernet gadget through single USB cable)

라즈베리 파이를 사용할 때 USB 케이블 하나로 전원공급부터 컴퓨터와 네트웍 통신을 해서 ssh로 접속해 제어할 수 있는 방법이 라즈베리 파이 제로를 RNDIS/Ethernet gadget으로 만들어 주는 것이다.



이를 위해서는 먼저 라즈베리 파이 부팅 이미지가 들어있는 sd카드를 PC에 연결해서 내용을 보면 다음과 같은 파일들이 들어 있다.


Raspian SD card 내의 파일
위의 파일들 중에 cmdline.txt와 config.txt 두개의 파일을 수정해야 한다.

먼저 config.txt 파일을 에디터로 열어준다.

config.txt 파일

파일의 맨 마지막 부분에 'dtoverlay=dwc2' 를 추가하고 저장해 준다.

다음은 cmdline.txt 파일을 오픈해서 rootwait 뒷부분에 'modules-load=dwc2,g_ether'를 추가하고 저장해 준다. 여기서 주의할 것은 이 파일에는 엔터키는 사용하지 않는다. 모든 파라미터는 스페이스로 구분된다.

cmdline.txt 수정 전

cmdline.txt 수정 후

이제 모든 변경이 끝났으니 sd 카드를 제거해서 라즈베리 파이 제로에 꼽아주면 된다.

맥의 경우 RNDIS 드라이버를 설치해야 하는데 관련된 내용은 HoRNDIS - 맥용 RNDIS 드라이버 를 참고하면 된다. 단 아쉬운 점은 HoRNDIS가 El Capitan(Mac OS X 10.11)을 지원하지 않아 현재까지는 Yosemite가 설치된 맥에서 까지만 사용할 수 있다.

윈도우의 경우 윈도우 7용 RNDIS 드라이버 설치하기 를 참고해 RNDIS 드라이버를 설치해 주면 된다. 

이제 ssh 클라이언트를 실행해 연결해 보자. 아래 화면은 윈도우용 Tera Term이다. Hostname을 'raspberrypi.local'로 해서 ssh로 연결하면 된다.


첫번째 연결하는 것이면 아래와 같이 security warning이 뜬다. 'Add this machine and its key to the known hosts list'를 체크하고 Continue를 누르면 다음번 부터는 나타나지 않을 것이다.


Username과 Passphrase를 묻는 화면이 나타난다.







디폴트 사용자 이름은 'pi', 암호는 'raspberry' 이다.



로그인이 성공해 프롬프트가 나왔다.


* 'raspberrypi.local' 이름으로 연결이 가능한 건 애플의 Bonjour 기술 덕분이다. 만일 윈도우에서 저 이름으로 접속을 하는데 연결이 안된다면 아이튠즈를 먼저 설치한 다음 다시 시도하면 문제 없이 될 것이다. (아이튠즈를 설치하면 윈도우용 bonjour이 같이 설치되기 때문이다.)

위의 방법으로 하면 편하긴 한데 한가지 문제가 있다.


ifconfig 명령으로 확인해 보면 라즈베리 파이 제로의 네트웍 인터페이스는 usb0인데 그 ip address는 dhcp로 받아오기 때문에 매번 바뀌게 된다.

IP 주소를 고정하려면 /etc/network/interfaces 파일을 수정해 줘야 한다.


에디터로 파일을 열어보면 다음과 같은 내용이 들어 있다.


파일 맨 아래쪽에 빨간색 부분을 추가한 다음 저장해 주면 된다. 아래에서는 라즈베리 파이의 IP주소를 '192.168.10.2'로 지정했다.


이제 라즈베리 파이를 재시동하고 확인해 보면 ip 주소가 바뀐걸 확인할 수 있다.

라즈베리 파이의 설정에 맞춰 pc의 설정도 변경 해 줘야 한다.

윈도우의 경우 먼저 제어판에서 '네트워크 및 공유 센터'를 선택한 다음 '어댑터 설정 변경'을 누른다.


어댑터 중에 RNDIS/Ethernet Gadget을 찾아 선택한 다음 마우스 오른쪽 버튼을 눌러 메뉴에서 '속성'을 선택한다.


Internet Protocol Version 4 (TCP/IPv4)를 선택하고 '속성' 버튼을 누른다.


IP 설정을 넣어주면 된다. 라즈베리 파이가 192.168.10.2를 사용하고 있으므로 윈도우도 192.168.10.x 를 사용해야만 한다. (x는 1~254 사이에서 2를 제외한 임의의 숫자중에 하나)


이제 설정이 끝났으므로 pc에서 라즈베리 파이로 ping을 날려 응답이 오는걸 확인해 보면 된다.