이 블로그는 Web 환경을 이용한 원격 제어 기술에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Raspberry Pi와 Raspberry Pi Pico, ATmega128 보드, Arduino Mega 보드(ATmega2560), WiFi 모듈을 사용 합니다.

raspi-node-serialport

Node.js - Raspberry PI 3 serial communication
Node.js 환경을 사용한 Raspberry Pi3 UART(비동기 직렬통신: universal asynchronous receiver-transmitter) 통신


  • 필요한 배경 지식
    • HTML: Web pages 작성에 필요한 Markup language
    • JavaScript: Web pages 작성에 필요한 Programming language
    • jQuery, AJAX: JavaScript Library
    • Linux OS: Raspberry Pi의 OS 가 Linux 이다.
    • UART(universal asynchronous receiver-transmitter) 통신 개요. Serial I/O(UART) Communication를 참고하기 바람.
  • Raspberry Pi 3 UART
    • Raspberry Pi에는 두 가지 내장 UART(PL011과 mini UART)가 있다.
    • PL011 UART는 ARM 기반 UART로 mini UART에 비교하여 더 좋은 성능을 갖는다. Mini UART는 GPU의 core frequency에 연동되기 때문에 GPU의 core frequency가 변경되면 UART의 Baud rate 가 영향을 받는다.
    • Raspberry Pi 3에서 mini UART(/dev/ttyS0)는 Linux console output으로 사용(Pi 2에서는 PL011을 Linux console output으로 사용)하고, PL011(/dev/ttyAMA0)는 On-board Bluetooth module이 사용 한다. Raspberry Pi 3에서는 기본으로 Linux console에 Hardware UART port(GPIO14(TxD), GPIO15(RxD)이 연결되어 있다.
    • ttyAMA0를 UART 통신에 사용하고자 하는 경우에는 Configuring The GPIO Serial Port On Raspbian참고 자료를 참고하기 바람. 이 페이지에서는 /dev/ttyS0를 UART 통신에 사용에 사용 한다.

    • Raspberry Pi 3 UART는 3.3V 전원을 사용하기 때문에 다른 장치와 연결 할 때 주의 하여야 한다. 5V 전원을 사용하는 장치와 연결 할 경우 신호선(TxD, RxD)과 GND 만 서로 연결(두 장치의 전원(VCC)은 직접 연결 하면 안 됨) 하면 대부분의 장치에서 무리 없이 동작 한다. 가장 종은 방법은 전압 레벨을 변경하는 Adapter를 사용하여 두 장치를 연결하는 것 이다.
  • UART 통신을 위한 설정
    • UART 통신을 위한 기본 설정
      • UART Pin에 연결된 Linux console output 해제 하기
      • UART Pin을 UART 통신에 사용하려면 UART Pin에 연결된 Linux console output를 해제 하여야 한다.

        • 터미널 창에서 다음 명령을 실행하여 "Raspberry Pi Software Configuration Tool" 창을 Open 한다.
        • sudo raspi-config

        • 윗 창(Configuration Tool)에서 5번 "Interfacing Option"을 선택하고, Enter Kry를 누르면 아래와 같은 창이 열린다.
        • 윗 창에서 "P6 Serial"을 선택 하고, Enter Kry를 누르면 아래와 같은 창이 열린다.
        • 윗 창에서 <아니오>을 선택(Login shell이 Serial을 Access 하지 못하도록 설정) 하고, Enter Kry를 누르면 아래와 같은 창이 열린다.
        • 윗 창에서 <예>을 선택(Serial port hardware를 Enable 한다.) 하고, Enter Kry를 누르면 아래와 같은 창이 열린다.
        • 윗 창 메세지에서 serial login shell은 Disable, serial interface는 Enable로 설정되었나 확인한 다음, <확인>을 선택 하고, Enter Kry를 누르면 아래와 같은 창이 열린다.
        • 윗 창에서 Finish 를 선택하고, Enter key를 누르면 설정이 저장되고 Raspberry Pi가 Reboot(다시 시작) 된다.
        • Raspberry Pi가 다시 시작되면 Hardware UART port(GPIO14(TxD), GPIO15(RxD)를 사용 할 수 있다.

    • UART mapping 확인 하기
      • 터미널 창에서 다음 명령으로 UART mapping을 확인 한다.
      • ls -l /dev

        아래 창에서 ttyS0는 serial0에 Mapping 되었고, ttyAMA0는 serial1에 Mapping 되었다.

        Raspberry Pi 3에서 Hardware UART port(GPIO14(TxD), GPIO15(RxD)는 serial0라는 이름으로 사용하고, 다른 UART port는 serial1로 사용 한다. serial0, serial1 이름을 사용하는 것은 다른 버전 사이의 Software 호환을 위함이다. 다른 장치가 serial0에 Mapping 되어도 Hardware UART port는 언제나 동일한 serial0 라는 이름을 사용 하기 때문에 Software 호환성이 유지 된다.

    • 장치 연결하기
      • Raspberry Pi 3와 UART 통신을 하려는 장치와 사이에 통신 신호선(Txd, RxD, GND) 연결 하기
      • 이 예에서는 Windows PC(USB to Serial Converter 사용)와 Raspberry Pi 3 사이에 UART 통신을 하는 것으로 한다.

        • USB to Serial Converter와 Raspberry Pi 3 GPIO 헤더 사이의 연결
          • Raspberry Pi 3 TxD0(GPIO14: Pin8) < -> USB to Serial Converter RxD
          • Raspberry Pi 3 RxD0(GPIO15: Pin10) < -> USB to Serial Converter TxD
          • Raspberry Pi 3 GND(GND: Pin9) < -> USB to Serial Converter GND
        • USB to Serial Converter의 USB 소켓을 PC의 USB 소켓에 연결 한다.
    • Windows PC에서 UART 통신 동작 확인 하기
      • 아래와 같이 USB - Converter 변환 모듈을 사용하여 PC의 USB Port와 Raspberry Pi의 Serial Port를 연결 한다.
      • UART 통신을 위한 PC와 Raspberry Pi의 연결 예

      • PC에서 UART 통신을 위한 터미널 프로그램(예: Tera Term 프로그램 등)을 실행 한다.
      • 터미널 프로그램에서 시리럴 포트 번호(PC의 장치 관리자에서 USB - Converter 변환 모듈의 포트 번호를 확인) 와 Baudrate(9600 : Raspberry Pi 3의 기본 설정이 9600 이다.)을 설정한다.
      • Raspberry Pi 터미널 창에서 다음 명령으로 PC에 테이터("Hello" 메세지)를 전송 한다.
      • echo "Hello" > /dev/ttyS0

      • PC 터미널 프로그램(예: Tera Term 프로그램 등)의 터미널 창에서 데이터("Hello" 메세지)가 정상으로 수신되었는지 확인 한다.
  • Raspberry Pi 3와 Embedded computer(ATmega128 보오드 컴퓨터, Arduino 등)를 사용한 제어 시스탬(UART 통신 사용) 예
    • Raspberry Pi의 Web 기능(원격 제어를 가능 하게 함)과 Embedded computer의 장치 제어에 특화된 기능을 결합하면 용이하게 복잡한 장치를 원격에서 제어하는 시스템을 구축 할 수 있다.

      Raspberry Pi 3와 Embedded computer를 사용한 제어 시스템(UART 통신 사용)의 구성은 아래와 같다.

    • Raspberry Pi 3에서 실행되는 UART 통신 프로그램 예
      • Embedded computer에서 UART 통신을 이용하여 Raspberry Pi 3에 전송된 메세지는 Raspberry Pi 터미널 창에 출력(표시)되고 Raspberry Pi의 터미널 창에서 입력한 메세지는 Embedded computer 터미널 창에 출력되는 프로그램 예 이다.

        ras-serial-port-rw.js

    • ATmega128 보오드 컴퓨터에서 실행되는 UART 통신 프로그램 예
      • UART 통신을 이용하여 Raspberry Pi 3의 터미널 창에서 입력한 메세지는 ATmega128 보오드 컴퓨터 터미널 창에 출력되고, ATmega128 보오드 컴퓨터의 터미널 창에서 입력한 메세지는 Raspberry Pi 3 터미널 창에 출력되는 예 이다. ATmega128 보오드에서 실행되는 프로그램 예: cho_uart_ras_node_basic.zip

        cho_uart_ras_node_basic.c 보기

      • 실험 방법
        • UATmega128 보오드 컴퓨터 UART Pin과 Raspberry Pi 3 GPIO 헤더 사이를 다음과 같이 연결 한다.
          • Raspberry Pi 3 TxD0(GPIO14: Pin8) < -> ATmega128 보오드 컴퓨터 RxD1
          • Raspberry Pi 3 RxD0(GPIO15: Pin10) < -> ATmega128 보오드 컴퓨터 TxD1
          • Raspberry Pi 3 GND(GND: Pin9) < -> ATmega128 보오드 컴퓨터 GND
        • Raspberry Pi 3에서 아래 명령으로 UART 통신을 위한 프로그램(ras-serial-port-rw.js)을 실행 한다.
        • node ras-serial-port-rw.js

        • PC 제어판 -> 장치 관리자 -> 포트(COM & LPT) 에서 ATmega128 보오드 COM 포트 번호를 확인 한다.

        • PC에서 터미널 프로그램(예: Tera Term)을 실행하고 ATmega128 보오드 컴퓨터에 연결(COM 포트 번호와 Baud rate를 설정) 한다.
        • PC 측 터미널 프로그램(예: Tera Term)에서 문자를 입력 하면 PC 측 모니터와 Raspberry Pi 터미널 창에 문자가 동시에 출력 된다.
        • Raspberry Pi 3에서 문자열을 입력 하면 ATmega128 보오드 컴퓨터에 연결(UART0 이용) PC의 터미널 창에 메세지가 출력 된다.
        • PC 측 터미널 창에서 문자 AVR 를 입력하고, Raspberry Pi 터미널에서 메세지 Test를 입력한 경우 Raspberry Pi 터미널과 PC 측 터미널 창에는 아래와 같은 결과가 출력 된다.

          Raspberry Pi 터미널 창 예

          윗 예에서 Raspberry Pi 터미널 창에 b'A' 형태로 출력된 것은 Tmega128 보오드 컴퓨터에서 전송된 테이터가 Byte Data로 문자 A 라는 표시이다.

          PC 측 터미널 창 예

    • Arduino Mega 보오드에서 실행되는 UART 통신 프로그램 예
    • UART 통신을 이용하여 Raspberry Pi 3의 터미널 창에서 입력한 메세지는 Arduino의 시리얼 모니터에 출력되고, Arduino 시리얼 모니터에서 입력한 메세지는 Raspberry Pi 3 터미널 창에 출력되는 예 이다. Arduino에서 실행(업로드)되는 프로그램 예: cho_uart_arduino_node_basic.zip

      cho_uart_arduino_node_basic.ino 보기

    • 실험 방법
      • Arduino Mega 보오드 UART Pin과 Raspberry Pi 3 GPIO 헤더 사이를 다음과 같이 연결 한다.
        • Arduino Mega 보오드의 UART0 번은 시스템에서 사용 한다. Arduino Mega 보오드의 UART1 번을 Arduino Mega 보오드의 UART Port로 사용(PC와 통신에 사용)하고 Arduino Mega 보오드의 UART3 번을 Raspberry Pi 3와 통신에 사용 하였다.

        • Raspberry Pi 3 TxD0(GPIO14: Pin8) < -> Arduino Mega 보오드 RxD3
        • Raspberry Pi 3 RxD0(GPIO15: Pin10) < -> Arduino Mega 보오드 TxD3
        • Raspberry Pi 3 GND(GND: Pin9) < -> Arduino Mega 보오드 GND
        • PC에 연결된 USB to Serial Converter의 TxD < -> Arduino Mega 보오드 RxD1
        • PC에 연결된 USB to Serial Converter의 RxD < -> Arduino Mega 보오드 TxD1
        • PC에 연결된 USB to Serial Converter의 GND < -> Arduino Mega 보오드 GND
      • Raspberry Pi 3에서 아래 명령으로 UART 통신을 위한 프로그램(ras-serial-port-rw.js)을 실행 한다.
      • node ras-serial-port-rw.js

      • PC 제어판 -> 장치 관리자 -> 포트(COM & LPT) 에서 PC에 연결된 USB to Serial Converter의 COM 포트 번호를 확인 한다.

      • PC에서 터미널 프로그램(예: Tera Term)을 실행하고 PC에 연결된 USB to Serial Converter의 적합한 설저(COM 포트 번호와 Baud rate를 설정)을 한다.
      • PC 측 터미널 프로그램(예: Tera Term)에서 문자를 입력 하면 PC 측 모니터와 Raspberry Pi 터미널 창에 문자가 동시에 출력 된다.
      • Raspberry Pi 3에서 문자열을 입력 하면 Arduino Mega 보오드에 연결된 PC의 터미널 창에 메세지가 출력 된다.
      • PC 측 터미널 창에서 문자 AVR 를 입력하고, Raspberry Pi 터미널에서 메세지 Test를 입력한 경우 윗 예(ATmega128 보오드 컴퓨터의 예)와 동일한 결과가 Raspberry Pi 터미널과 PC 측 터미널 창에 출력 된다.

  • Web 환경에서 Raspberry Pi 3와 ATmega128 보오드를 사용(UART 통신)한 원격제어 예
    • Raspberry Pi의 Web 기능(원격 제어를 가능 하게 함)과 Embedded computer의 장치 제어에 특화된 기능을 결합(UART 통신 이용)하여 장치를 원격에서 제어하는 예 이다.

      이 예에서는 인터넷 환경(Web 페이지(휴대폰 또는 PC에서 실행 이용)을 이용하여 원격지의 LED를 제어 한다.

      Raspberry Pi 3와 Embedded computer를 사용한 원격제어 제어 시스템(UART 통신 사용)의 구성은 아래와 같다.

    • Raspberry Pi 3에서 실행되는 Web server와 Web 페이지 예
      • Raspberry Pi에서 실행되는 Web server 예: ras-server-serial-checkbox-led.js
      • PC(또는 휴대폰)의 Web browser에서 실행되는 Web Page 예: ras-serial-checkbox-led.html
        • ras-serial-checkbox-led.html File은 ras-server-serial-checkbox-led.js File이 위치한 폴더에 "html" 폴더를 만들고 html 폴더에 위치 하도록 하여야 한다. 이 위치는 ras-server-serial-checkbox-led.js File에서 변경 할 수 있다.

        LED 제어를 위한 Web Page 예


    • Embedded computer(ATmega128)에서 실행되는 프로그램 예
      • ATmega128 보오드에서 실행되는 프로그램(ATmel Studio 7 환경에서 c 언어로 작성) 예: node_js_serial_led128.zip

    • 실험 방법
      • 위에서 작성한 LED 제어 프로그램(C 언어 사용)을 Embedded computer(ATmega128)에 UpLoad하고 실행 한다.
      • Raspberry Pi 3 GPIO 헤더와 Embedded computer(ATmega128)의 UART Pin을 다음과 같이 연결 한다.
        • Raspberry Pi 3의 UART0 번과 Embedded computer(ATmega128)의 UART1을 사용 한다.

        • Raspberry Pi 3 TxD0(GPIO14: Pin8) < -> Embedded computer의 RxD1
        • Raspberry Pi 3 RxD0(GPIO15: Pin10) < -> Embedded computer의 TxD1
        • Raspberry Pi 3 GND(GND: Pin9) < -> Embedded computer의 GND
        • Vdd 연결: 두 장치의 Vdd 값(5V or 3.3V)이 다를 수 있기 때문에 연결 하지 않는 것이 좋다.
      • Raspberry Pi 3에서 다음 명령으로 Web server 프로그램(ras-server-serial-checkbox-led.js)을 실행 한다.
      • node ras-server-serial-checkbox-led.js

      • Chrome browser를 실행(PC 또는 휴대폰에서 실행)하고 아래 예를 참고하여 Web 페이지를 연결 한다.
      • http://공유기에서 포트포워드로 설정한 Raspberry Pi 주소:2682/ras-serial-checkbox-led.html

        워에서 2682는 Web server가 사용하는 Port 번지로 필요에 따라 Web server 프로르램에서 변경 할 수 있다.

      • Web browser에서 COM Port와 BuadRate를 선택하고 "COM Port Open 하기" 버튼을 Click 하여 COM Port를 연결 한다.

      • Web browser에서 Turn on 하려는 LED를 체크 하고 "Checkbox의 상태를 LED에 표시 하기" 버튼을 Click 한 다음, Serial 통신으로 연결된 AVR Controller의 대응하는 LED가 Turn on 되었는지 확인 한다.

      • Web browser에서 Checkbox의 상태를 임의로 변경 하고 "LED의 상태를 Checkbox에 표시 하기" 버튼을 Click 한 다음, Serial 통신으로 연결된 AVR Controller의 대응하는 LED가 상태가 Checkbox에 바르게 표시 되는지 확인 한다.