이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi Pico, Raspberry Pi, WiFi 모듈을 사용 합니다.

python-uart

Raspberry Pi Pico UART - MicroPython
Raspberry Pi Pico UART - MicroPython


  • Raspberry Pi Pico UART
    • UART object(class UART)
      • RP2040의 UART
        • RP2040에는 ARM Primecell UART(PL011)(Revision r1p5)를 기반으로 하는 2개의 동일한 UART가 있다.
        • 각 UART는 다음 기능을 지원한다.
          • 분리된 32x8 Tx 와 32x12 Rx FIFO Buffer
          • clk_peri에 의하여 Clock 되는 Programmable baud rate generator
          • 전송시 자동으로 삽입되고 수신시 자동으로 제거되는 Standard asynchronous communication bits(start, stop, parity)
          • Line break detection
          • Programmable serial interface(5, 6, 7, or 8 bits)
          • 1 or 2 stop bits
          • Programmable hardware flow control
        • 각 UART는 GPIO muxing 테이블에 정의된 여러 GPIO 핀에 연결할 수 있다.
        • 참고자료: Raspberry Pi Pico Pinout

      • UART object 생성자(Constructors): class machine.UART(id, ...)
        • id: UART 식별자이다.
      • Methods
        • UART.init(baudrate=9600, bits=8, parity=None, stop=1, *, ...)
          • UART를 초기화 할 때 사용하는 매개변수
            • baudrate: Clock rate
            • bits: Number of bits per character, 7, 8 or 9.
            • parity: Parity is the parity, None, 0 (even) or 1 (odd).
            • stop: Number of stop bits, 1 or 2.
          • 포트 설정에 자주 사용하는 사용하는 전용 매개변수
        • UART.deinit(): Turn off the UART bus.
        • UART.any()
          • Blocking 없이 읽을 수 있는 문자 수를 세는 정수를 반환한다.
          • 사용 가능한 문자가 없으면 0을 반환하고 문자가 있으면 양수를 반환한다.
          • 이 Method는 읽을 수 있는 문자가 두 개 이상 있더라도 1을 반환할 수 있다. 사용 가능한 문자를 보다 정확하게 쿼리하려면 select.poll을 사용하여야 한다.
        • UART.read([nbytes])
          • UART로 부터 문자를 읽는다.
          • nbytes가 지정된 경우 최대 nbytes를 읽고, 읽을 수 있는 문자가 nbytes 보다 적은 경우에는 가능한 한 많은 데이터를 읽는다.
          • 시간 초과(timeout)이 발생하면 하면 nbytes 보다 더 적은 수의 문자만 읽고 빨리 반환될 수 있다. 시간 초과 설정은 생성자에서 구성할 수 있다.
          • Return value: 읽은 문자(Bytes)를 포함하는 Byte열 객체. 시간 초과 시 None을 반환한다.
        • UART.readinto(buf[, nbytes])
          • buf로 Bytes를 읽는다.
          • nbytes가 지정된 경우 최대 nbytes를 읽고, 읽을 수 있는 문자가 nbytes 보다 적은 경우에는 최대 len(buf) 바이트를 읽는다.
          • 시간 초과(timeout)이 발생하면 하면 nbytes 보다 더 적은 수의 문자만 읽고 빨리 반환될 수 있다. 시간 초과 설정은 생성자에서 구성할 수 있다.
          • Return value: buf에 저장한 Bytes 수. 시간 초과 시 None을 반환한다.
        • UART.readline()
          • 줄 바꿈 문자(Newline character)로 끝나는 줄을 읽는다.
          • 시간 초과(timeout)이 발생하면 하면 한 줄(Line) 보다 더 적은 수의 문자만 읽고 빨리 반환될 수 있다. 시간 초과 설정은 생성자에서 구성할 수 있다.
          • Return value: 한 line을 읽은 문자열. 시간 초과 시 None을 반환한다.
        • UART.write(buf)
          • Bytes buffer의 문자열을 UART bus에 write 한다.
          • Return value: Write 한 Bytes 수. 시간 초과 시 None을 반환한다.
        • UART.sendbreak()
          • UART bus에 Break condition을 보낸다. 이것은 문자의 정상적인 전송에 필요한 것보다 더 긴 기간 동안 버스를 Low로 구동한다.
        • UART.irq(trigger, priority=1, handler=None, wake=machine.IDLE)
          • UART에서 데이터가 수신될 때 트리거될 Callback을 생성한다.
          • trigger는 오직 UART.RX_ANY 만 될 수 있다.
          • 인터럽트의 우선 순위. 1-7 범위의 값을 사용할 수 있다. 값이 높을수록 우선 순위가 높음을 나타낸다.
          • handler는 새 문자가 도착할 때 호출되는 선택적 함수로 아래의 두 조건 중 하나가 충족될 때마다 호출된다.
            • 8 개의 새 문자기 수신된 경우
            • Rx 버퍼에서 최소 1개의 새 문자가 대기 중이고 Rx 라인이 1개의 완전한 프레임 기간 동안 침묵(silent)한 경우
            • 이것은 handler 함수가 호출될 때 1-8개의 문자가 대기한다는 것을 의미한다.

          • wake는 오직 machine.IDLE 만 될 수 있다.
          • 주: Pi pico 보드는 이 Method를 지원하지 않는 것 같다. 문제를 해결한 분은 e-mail로 연락 주시기 바람니다.

        • UART object의 생성과 초기화 예
          • from machine import UART

            uart = UART(1, 9600)   # UART 1 object를 생성 하고 baudrate를 초기화 한다.

            uart.init(9600, bits=8, parity=None, stop=1)   # uart를 주어진 parameters로 초기화 한다.


    • 프로그램 예: UART basic
      • 이 예는 Pi Pico 개발보드 UART 1을 이용하여 PC와 Serial communication을 하는 예이다.

        실험 회로 구성 예

      • UART 통신를 위한 설정과 문자 Input/Output 프로그램 예: uart-basic.py
      • 실험을 위한 준비
        • Pi Pico 개발보드와 PC의 UART 신호 연결
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Pi Pico 개발보드의 TXD1(GP4)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Pi Pico 개발보드의 RXD1(GP5)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Pi Pico 개발보드의 GND를 연결한다.
          • 주의: 컴퓨터(USB --> UART(RS232) 변환 모듈)의 전원 전압(Vdd)과 Pi Pico 개발보드의 전원 전압(Vdd)은 서로 연결하지 않는다. USB --> UART와 Pi Pico 개발보드의 전원 전압(Vdd)은 서로 다를 수 있다.

            주: UART0는 개발 도구에서 사용하기 때문에 실험에는 UART1을 사용한다.

      • 실험 방법
        • 윗 프로그램을 File name "uart-basic.py"로 저장 한다.
        • PC에서 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 USB --> UART(RS232) 변환 모듈의 Serial Port를 확인하고 필요한 설정(Serial Port와 Baudrate(115200) 등을 설정)을 한다.
        • Thonny IDE를 실행하고 Thonny IDE의 사용 환경(Thonny 실행에 사용할 장치와 COM Port 선택)이 바르게 되어 있는지 확인한다.
        • Thonny IDE의 Python shell 창에 prompt( >>> )가 출력되었는 확인한다.
        • Thonny IDE에서 "파일 -> 열기... -> 이 컴퓨터"를 실행하여 uart-basic.py를 Open 한다.
        • 실험
          • "실행 -> 현재 스크립트 실행"을 실행하거나 Toolbar의 "실행" Icon을 클릭하면 스크립트가 개발보드에 전송되고 프로그램이 실행된다.
          • 프로그램이 실행되면 모니터 프로그램에 "UART test" 메세지가 출력된다.
          • 모니터 프로그램에 문자를 입력하면 입력한 문자가 Pi Pico에 전송되고, Pi Pico에서 수신한 문자는 다시 PC에 전송되어 모니터 프로그램에 문자가 출력된다.

    • 프로그램 예: UART-LED control
      • 이 예는 Pi Pico 개발보드 UART 1을 이용하여 Pi Pico 개발보드의 LED의 점멸 속도를 제어하는 예이다.

        실험 회로 구성 예

        주: Raspberry Pi Pico는 GPIO25를 On-board LED 제어에 사용하고, Raspberry Pi Pico W는 WL_GPIO0(Infineon CYW43439의 GPIO0)를 On-board LED 제어에 사용한다.

        주: 위 회로에서 LED 회로(보드에 점선으로 연결)는 개발보드에 내장된 LED를 사용하기 때문에 실제 회로 구성은 하지 않아도 된다.

      • UART 통신를 위한 설정과 문자 Input/Output 프로그램 예: uart-led-control.py
      • 실험을 위한 준비
        • Pi Pico 개발보드와 PC의 UART 신호 연결
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Pi Pico 개발보드의 TXD1(GP4)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Pi Pico 개발보드의 RXD1(GP5)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Pi Pico 개발보드의 GND를 연결한다.
          • 주의: 컴퓨터(USB --> UART(RS232) 변환 모듈)의 전원 전압(Vdd)과 Pi Pico 개발보드의 전원 전압(Vdd)은 서로 연결하지 않는다. USB --> UART와 Pi Pico 개발보드의 전원 전압(Vdd)은 서로 다를 수 있다.

          • LED는 Pi Pico 개발보드의 LED(GP25)를 사용한다.
      • 실험 방법
        • 윗 프로그램을 File name "uart-led-control.py"로 저장 한다.
        • PC에서 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 USB --> UART(RS232) 변환 모듈의 Serial Port를 확인하고 필요한 설정(Serial Port와 Baudrate(115200) 등을 설정)을 한다.
        • Thonny IDE를 실행하고 Thonny IDE의 사용 환경(Thonny 실행에 사용할 장치와 COM Port 선택)이 바르게 되어 있는지 확인한다.
        • Thonny IDE의 Python shell 창에 prompt( >>> )가 출력되었는 확인한다.
        • Thonny IDE에서 "파일 -> 열기... -> 이 컴퓨터"를 실행하여 uart-led-control.py를 Open 한다.
        • 실험
          • "실행 -> 현재 스크립트 실행"을 실행하거나 Toolbar의 "실행" Icon을 클릭하면 스크립트가 개발보드에 전송되고 프로그램이 실행된다.
          • 프로그램이 실행되면 모니터 프로그램에 "UART LED period control" 메세지가 출력된다.
          • 모니터 프로그램에서 U(or u) 문자를 입력하면 LED의 점멸 속도가 빨라지고,
          • 모니터 프로그램에서 D(or d) 문자를 입력하면 LED의 점멸 속도가 느려진다.

    • 프로그램 예: UART readline
      • 이 예는 Pi Pico 개발보드 UART 1을 이용하여 PC와 Line 단위로 Serial communication을 하는 예이다.

        실험 회로 구성: UART basic의 실험 회로 구성 예와 같다.

      • UART 통신를 사용하여 line 단위로 통신하는 프로그램 예: uart-readline.py
      • 실험을 위한 준비
        • Pi Pico 개발보드와 PC의 UART 신호 연결
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Pi Pico 개발보드의 TXD1(GP4)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Pi Pico 개발보드의 RXD1(GP5)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Pi Pico 개발보드의 GND를 연결한다.
          • 주의: 컴퓨터(USB --> UART(RS232) 변환 모듈)의 전원 전압(Vdd)과 Pi Pico 개발보드의 전원 전압(Vdd)은 서로 연결하지 않는다. USB --> UART와 Pi Pico 개발보드의 전원 전압(Vdd)은 서로 다를 수 있다.

      • 실험 방법
        • 윗 프로그램을 File name "uart-readline.py"로 저장 한다.
        • PC에서 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 USB --> UART(RS232) 변환 모듈의 Serial Port를 확인하고 필요한 설정(Serial Port와 Baudrate(115200) 등을 설정)을 한다.
        • Thonny IDE를 실행하고 Thonny IDE의 사용 환경(Thonny 실행에 사용할 장치와 COM Port 선택)이 바르게 되어 있는지 확인한다.
        • Thonny IDE의 Python shell 창에 prompt( >>> )가 출력되었는 확인한다.
        • Thonny IDE에서 "파일 -> 열기... -> 이 컴퓨터"를 실행하여 uart-readline.py를 Open 한다.
        • 실험
          • "실행 -> 현재 스크립트 실행"을 실행하거나 Toolbar의 "실행" Icon을 클릭하면 스크립트가 개발보드에 전송되고 프로그램이 실행된다.
          • 프로그램이 실행되면 모니터 프로그램에 "UART readline test" 메세지가 출력된다.
          • 아래 내용이 반복(while loop)된다.
            • 개발 Tool의 console에 while loop의 count 값이 출력된다.
            • UART console에 while loop의 count 값이 출력된다.
            • UART console에 count 값이 출력된음 4초 이내에 UART console에서 문자열을 입력하고 Enter key를 누른다.
            • UART console에서 문자열을 readline으로 읽어 개발 Tool의 console과 UART console에 출력한다.

  • Raspberry Pi Pico UART 관련 페이지 보기