레이블이 usb-to-serial인 게시물을 표시합니다. 모든 게시물 표시
레이블이 usb-to-serial인 게시물을 표시합니다. 모든 게시물 표시

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년 7월 21일 목요일

라즈베리 파이와 아두이노를 시리얼 포트로 연결하는 방법들 (Methods of connecting Raspberry Pi and Arduino using serial port)

라즈베리 파이와 아두이노를 시리얼 포트로 통신을 할 수 있도록 연결하는 방법을 소개한다.

가장 쉬운 방법은 라즈베리 파이의 USB 포트에 아두이노를 USB케이블로 연결하는 것이다.


이 경우는 라즈베리 파이에서 아두이노 IDE로 스케치를 작성해 아두이노로 바로 다운로드도 가능하다. 그리고 라즈베리 파이의 시리얼 포트 디바이스명은 '/dev/ttyUSB0'가 된다. 즉 라즈베리 파이에서 시리얼 포트로 데이터를 보내려면 아래와 같은 식으로 해야 한다.

$ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial

>>> ser = serial.Serial('/dev/ttyUSB0', 115200)
>>> ser.open()
>>> ser.write("Hello")
>>> ser.close()
>>> 

두번째로는 라즈베리 파이의 Tx/Rx핀과 아두이노의 Tx/Rx핀을 직접 연결해 주는 것이다.

Rx/Tx를 서로 크로스로 연결해주면 되는데 단 주의해야 하는 것은 라즈베리 파이의 I/O 핀들은 5V tolerant 하지 않다는 것이다. (즉 라즈베리 파이의 I/O핀에 5V 전압을 가하면 포트가 죽어버릴 수 있다) 그러므로 라즈베리 파이의 Tx -> 아두이노의 Rx 연결(위의 그림에서 노란색 케이블)은 그냥 직접 연결해 줘도 되지만, 아두이노의 Tx -> 라즈베리 파이의 Rx는 신호 레벨을 5V에서 3.3V로 변환해 주는 회로가 필요하다. 전용 level shifter IC를 사용할 수 있지만 여기서는 그냥 가장 간단하게 저항을 사용해 전압 분배회로를 만들어 연결해 줬다. 위의 그림에서 브레드보드에 있는 두개의 저항이 전압 분배 회로이다. 여기서는 1.5K, 3.3K 저항을 사용했다.

이 경우 라즈베리 파이의 시리얼 포트 디바이스명은 '/dev/ttyAMA0'가 된다. 즉 사용하려면 /dev/ttyAMA0 디바이스를 오픈해야만 한다.

$ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial

>>> ser = serial.Serial('/dev/ttyAMA0', 115200)
>>> ser.open()
>>> ser.write("Hello")
>>> ser.close()
>>>

브레드 보드 대신 만능기판에 작은 컨버터 보드를 만들어 사용하면 편하다.





세번째로는 라즈베리는 Tx/Rx핀을 사용하고 아두이노는 소프트웨어 시리얼을 사용해 연결해 줄 수도 있다. 아두이노 우노의 경우 하드웨어 시리얼 포트가 한개밖에 없어 시리얼 포트를 다른 용도로 사용해야만 하는 경우에는 이런 방법을 쓰면 된다.


위의 두번째 그림과 동일하고 단지 아두이노쪽의 핀 번호가 Rx(0), Tx(1) 대신 Rx(6), Tx(7)로 바뀐 것 뿐이다.

이렇게 하는 경우 스케치에서 달라져야 하는 부분은 다음과 같다.

먼저 하드웨어 시리얼을 사용해 아두이노가 라즈베리 파이에게 1초에 한번씩 "Hello"라는 글자를 보내는 경우의 스케치이다.

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.writeln("Hello");
  delay(1000);
}

다음은 소프트웨어 시리얼을 쓰는 경우의 스케치이다.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(6, 7); // RX, TX


void setup()
{
  mySerial.begin(9600);
}

void loop()
{
  mySerial.writeln("Hello");
  delay(1000);
}

추가되어야 하는 부분은 빨간색, 변경되어야 하는 부분은 파란색으로 표시해 놓았다.

마지막으로는 USB-to-serial 모듈을 사용해 연결하는 방법이다.


라즈베리 파이에도 하드웨어 시리얼 포트는 한개밖에 없는데 다른 용도로 사용해야 하는 경우 위와 같이 별도의 USB-to-serial 모듈을 사용해 연결해 줄 수도 있다. 위의 그림에 있는 USB-to-serial 모듈의 I/O핀은 5V tolerant하기 때문에 아두이노의 Tx/Rx에 별도의 레벨 컨버팅 회로 없이 바로 연결할 수 있지만 다른 제품의 경우는 I/O핀이 5V tolerant한지 확인하고 연결해 줘야만 한다. 

라즈베리 파이에 USB-to-serial 모듈을 여러개 연결해 줄 수도 있고 그 경우 각각의 시리얼 포트는 /dev/ttyUSB0, /dev/ttyUSB1, ...식으로 사용하면 된다.

pi@raspberrypi ~ $ ls /dev/tty*
tty    tty12  tty17  tty21  tty26  tty30  tty35  tty4   tty44  tty49  tty53  tty58  tty62  ttyAMA0
tty0   tty13  tty18  tty22  tty27  tty31  tty36  tty40  tty45  tty5   tty54  tty59  tty63  ttyprintk
tty1   tty14  tty19  tty23  tty28  tty32  tty37  tty41  tty46  tty50  tty55  tty6   tty7
tty10  tty15  tty2   tty24  tty29  tty33  tty38  tty42  tty47  tty51  tty56  tty60  tty8
tty11  tty16  tty20  tty25  tty3   tty34  tty39  tty43  tty48  tty52  tty57  tty61  tty9

첫번재 USB-to-serial 모듈을 꼽은 다음 다시 동일한 명령을 입력해 보면 다음과 같이 ttyUSB0가 추가된 걸 확인할 수 있다.

pi@raspberrypi ~ $ ls /dev/tty*
tty    tty12  tty17  tty21  tty26  tty30  tty35  tty4   tty44  tty49  tty53  tty58  tty62  ttyAMA0
tty0   tty13  tty18  tty22  tty27  tty31  tty36  tty40  tty45  tty5   tty54  tty59  tty63  ttyprintk
tty1   tty14  tty19  tty23  tty28  tty32  tty37  tty41  tty46  tty50  tty55  tty6   tty7  ttyUSB0
tty10  tty15  tty2   tty24  tty29  tty33  tty38  tty42  tty47  tty51  tty56  tty60  tty8
tty11  tty16  tty20  tty25  tty3   tty34  tty39  tty43  tty48  tty52  tty57  tty61  tty9

두번째 USB-to-serial 모듈을 꼽고 다시 실행해 본 결과이다.

pi@raspberrypi ~ $ ls /dev/tty*
tty    tty12  tty17  tty21  tty26  tty30  tty35  tty4   tty44  tty49  tty53  tty58  tty62  ttyAMA0
tty0   tty13  tty18  tty22  tty27  tty31  tty36  tty40  tty45  tty5   tty54  tty59  tty63  ttyprintk
tty1   tty14  tty19  tty23  tty28  tty32  tty37  tty41  tty46  tty50  tty55  tty6   tty7  ttyUSB0
tty10  tty15  tty2   tty24  tty29  tty33  tty38  tty42  tty47  tty51  tty56  tty60  tty8  ttyUSB1
tty11  tty16  tty20  tty25  tty3   tty34  tty39  tty43  tty48  tty52  tty57  tty61  tty9