라즈베리파이 시리얼 통신 설정 (setting up Raspberry pi serial connection via GPIO)

도구의인간 메이커스 위키
이동: 둘러보기, 검색

라즈베리파이 시리얼 통신 설정 (setting up Raspberry pi serial connection via GPIO)

참고: https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3/

회로 구성

라즈베리의 8번째, 10번째 핀이 시리얼 통신용이다.

시리얼 포트 확인

  • 가장 먼저, 라스베리파이에서 시리얼 포트가 어디에 있는지 알아야한다. GPIO상 BCM 14,15번 핀이 시리얼통신용 (각각 TX, RX)인데, 라스비안에서 /dev/serial0으로 불린다. (ls 명령어로 찾아보자)

  • 원래 시리얼통신 포트 이름은 /dev/ttyAMA0이다. 그런데 파이3에서는, 이전까지 /dev/ttyAMA0에 할당되어있던 시리얼포트가 블루투스에 할당되었다. 시리얼포트는 /dev/ttyS0로 옮겨졌다.

  • 위와같은 이유로 rpi3와 그 이전 기계에서 함께쓰는 코드를 쓰려면 /dev/ttyAMA0라는 이름을 쓰면 안된다. 대신 /dev/serial0라는 이름-일종의 바로가기(aliase)-를 사용하면 된다. 즉 rpi1,2에서는 시리얼 == /dev/ttyAMA0 == /dev/serial0 그리고 rpi3에서는 시리얼 == /dev/ttyS0 == /dev/serial0 터미널에서 확인해보자.

    $ ls -l /dev

결론적으로 이것저것 골치아프게 생각하지 말로 시리얼포트는 '/dev/serial0'을 사용하면 된다.

  • rpi3에서 /dev/ttyS0포트는 UART(병렬<>직렬 컨버터 하드웨어)가 아닌, UART를 모사한 소프트웨어시리얼이다. 때문에 CPU상태에 따라 시리얼통신이 안정적이지 않은 경우가 있을 수 있다. 만약 블루투스를 소프트시리얼로 돌리고(혹은 사용하지 않고) 시리얼통신을 하드웨어 UART를 사용해 안정적으로 하고자한다면 GPIO 시리얼을 /dev/ttyAMA0에 할당할 수도 있다. 구체적인 방법은 위 자료 참고.

UART 활성화 & 시리얼 콘솔 연결 (getty service) 비활성화

  • 예전 컴튜터라는게 막 생겨난 시기, 다른 컴퓨터에 접속해 콘솔창을 띄우는 용도로 시리얼 포트를 사용하곤 했었는데, rpi에서 시리얼 포트를 그런 용도로 사용하는 것을 기본으로 설정해 두었다. (getty 서비스라고 함).

  • 시리얼 포트를 다른 하드웨어와 연결해 우리 마음대로 다루고 싶다면 콘솔 연결을 비활성화 시켜야 한다.

  • 콘솔연결은 비활성화하더라고 시리얼포트는 사용가능하게 두어야 한다.

  • raspi-config 프로그램으로 간단히 할 수 있다.
    터미널에서

    $ sudo raspi-config

  • 재부팅한다.

  • 혹은 GUI에서는 Raspberry Pi Configuration 창을 열어서

시리얼 연결

시리얼로 들어오는 rawdata 확인해보자

  • 먼저 시리얼 포트 설정
    $ stty -F /dev/serial0 raw 9600 cs8 clocal -cstopb
  • 시리얼포트로 들어오는 값을 살펴보자
    $ cat /dev/serial0

putty 프로그램 설치, 테스트

GUI환경에서는 putty를 설치해 시리얼통신을 테스트해보면 편리하다

  • 터미널에서 sudo apt-get install putty를 입력해 putty 설치. 시리얼 연결을 선택한 후, 시리얼 포트이름, 연결 속도를 정해준다.

  • 시리얼을 통해 연결될 상대측에는 무엇이 와도 좋다. 아두이노의 시리얼 모니터나 안드로이드 시리얼 모니터에 연결해보자

  • 잘 된다 ^^

pySerial 라이브러리 설치

파이썬에서 시리얼 통신 사용하기 위해서 pySerial 라이브러리 필요함. 참고: https://pyserial.readthedocs.io/en/latest/index.html

  1. 터미널에서 $python -m pip install pyserial을 입력해 라이브러리 설치. ( -m은 모듈실행명령. pip는 파이썬 라이브러리 관리 모듈인 pipy를 의미.)
  2. pySerial 샘플 코드를 실행해보자. (한 라인씩 넣어도 좋다)
    import serial
    ser = serial.Serial ("/dev/serial0")    #Open named port 
    ser.baudrate = 57600                     #Set baud rate to 57600
    data = ser.read(10)                     #Read ten characters from serial port to data
    ser.write(data)                         #Send back the received data
    ser.close()