마이크로 파이썬 micro python

라즈베리 파이 Pico, 시리얼 통신으로 서로 연결! (마이크로파이썬)

smy383 2025. 3. 9. 15:18
728x90
반응형

 

 

라즈베리 파이 Pico, 시리얼 통신으로 두뇌 연결! (마이크로파이썬)

라즈베리 파이 Pico는 다양한 센서, 모듈, 그리고 다른 마이크로컨트롤러와 통신할 수 있는 강력한 기능을 제공합니다. 그중에서도 시리얼 통신은 가장 기본적인 통신 방식 중 하나이며, 간단한 연결과 코드로 데이터를 주고받을 수 있다는 장점이 있습니다. 이 글에서는 라즈베리 파이 Pico끼리 시리얼 통신을 통해 데이터를 주고받는 방법을 마이크로파이썬 코드를 통해 쉽고 자세하게 설명합니다.

시리얼 통신이란?

시리얼 통신은 데이터를 한 번에 한 비트씩 순차적으로 전송하는 통신 방식입니다. Tx (Transmitter, 송신) 핀과 Rx (Receiver, 수신) 핀, 그리고 GND (Ground, 접지) 핀을 사용하여 두 장치를 연결합니다. 시리얼 통신은 간단한 하드웨어 구성과 소프트웨어 구현으로 널리 사용되며, 특히 마이크로컨트롤러 간 통신에 적합합니다.

준비물

  • 라즈베리 파이 Pico 보드 (2개)
  • Micro USB 케이블 (2개)
  • 점퍼 와이어 (3개)

하드웨어 연결

두 개의 라즈베리 파이 Pico 보드를 다음과 같이 연결합니다.

Pico 1 (송신) Pico 2 (수신)
GP0 (TX) GP1 (RX)
GP1 (RX) GP0 (TX)
GND GND

주의: Tx 핀은 Rx 핀에, Rx 핀은 Tx 핀에 연결해야 합니다. GND 핀은 서로 연결해야 합니다.

마이크로파이썬 코드 (송신)

다음 코드는 첫 번째 라즈베리 파이 Pico (송신)에 업로드할 마이크로파이썬 코드입니다.


from machine import UART
import time

# UART0 설정 (GP0: TX, GP1: RX)
uart = UART(0, baudrate=115200, tx=0, rx=1)

while True:
    # 전송할 데이터
    data = "Hello from Pico 1!\\n"

    # 데이터 전송
    uart.write(data)
    print(f"Sent: {data}")

    # 1초 대기
    time.sleep(1)
    

코드 설명:

  • from machine import UART: machine 라이브러리에서 UART (Universal Asynchronous Receiver/Transmitter) 클래스를 가져옵니다. UART는 시리얼 통신을 위한 하드웨어 인터페이스를 제공합니다.
  • uart = UART(0, baudrate=115200, tx=0, rx=1): UART0를 설정합니다.
    • 0: UART 채널 번호 (0 또는 1)
    • baudrate=115200: 통신 속도 (보 레이트)를 115200으로 설정합니다. 두 장치의 보 레이트는 반드시 일치해야 합니다.
    • tx=0: GP0 (GPIO 0번 핀)을 TX (송신) 핀으로 설정합니다.
    • rx=1: GP1 (GPIO 1번 핀)을 RX (수신) 핀으로 설정합니다.
  • data = "Hello from Pico 1!\\n": 전송할 데이터를 설정합니다. \\n은 줄바꿈 문자입니다.
  • uart.write(data): 데이터를 시리얼 포트를 통해 전송합니다.
  • print(f"Sent: {data}"): 터미널에 전송한 데이터를 출력합니다.
  • time.sleep(1): 1초 동안 대기합니다.

마이크로파이썬 코드 (수신)

다음 코드는 두 번째 라즈베리 파이 Pico (수신)에 업로드할 마이크로파이썬 코드입니다.


from machine import UART
import time

# UART0 설정 (GP0: TX, GP1: RX)
uart = UART(0, baudrate=115200, tx=0, rx=1)

while True:
    # 데이터 수신 가능 여부 확인
    if uart.any():
        # 데이터 수신
        received_data = uart.readline()

        # 수신 데이터 디코딩 (byte -> string)
        received_data = received_data.decode('utf-8').strip()

        # 수신 데이터 출력
        print(f"Received: {received_data}")

    # 0.1초 대기
    time.sleep(0.1)
    

코드 설명:

  • from machine import UART: machine 라이브러리에서 UART 클래스를 가져옵니다.
  • uart = UART(0, baudrate=115200, tx=0, rx=1): UART0를 설정합니다. 송신 코드와 동일한 설정 (채널 번호, 보 레이트, TX/RX 핀)을 사용해야 합니다.
  • if uart.any():: 시리얼 포트에 수신된 데이터가 있는지 확인합니다. uart.any() 함수는 수신된 데이터가 있으면 True, 없으면 False를 반환합니다.
  • received_data = uart.readline(): 시리얼 포트에서 한 줄의 데이터를 읽어옵니다. uart.readline() 함수는 줄바꿈 문자 (\\n)까지 데이터를 읽어옵니다.
  • received_data = received_data.decode('utf-8').strip(): 수신된 데이터는 byte 형태로 저장되므로, decode('utf-8') 함수를 사용하여 string 형태로 변환합니다. strip() 함수는 문자열 양쪽 끝의 공백 문자 (줄바꿈 문자 포함)를 제거합니다.
  • print(f"Received: {received_data}"): 터미널에 수신된 데이터를 출력합니다.
  • time.sleep(0.1): 0.1초 동안 대기합니다.

코드 실행

  1. Thonny 에디터를 사용하여 송신 코드를 첫 번째 라즈베리 파이 Pico에 업로드하고 실행합니다.
  2. Thonny 에디터를 사용하여 수신 코드를 두 번째 라즈베리 파이 Pico에 업로드하고 실행합니다.
  3. 각 Pico의 Thonny 에디터 하단의 "Shell" 창에서 송신 및 수신 데이터를 확인할 수 있습니다. 첫 번째 Pico는 "Sent: Hello from Pico 1!\n" 메시지를 주기적으로 출력하고, 두 번째 Pico는 "Received: Hello from Pico 1!" 메시지를 주기적으로 출력합니다.

문제 해결

  • 데이터가 수신되지 않는 경우:
    • 하드웨어 연결을 다시 확인하세요. Tx 핀과 Rx 핀이 올바르게 연결되었는지, GND 핀이 연결되었는지 확인합니다.
    • 송신 및 수신 코드의 보 레이트가 일치하는지 확인하세요.
    • 점퍼 와이어가 제대로 연결되어 있는지 확인하세요.
  • 깨진 문자가 수신되는 경우:
    • 인코딩 방식이 올바른지 확인하세요. 일반적으로 UTF-8 인코딩을 사용합니다.

응용

  • 센서 데이터 전송:** 센서 값을 읽어와서 시리얼 통신을 통해 다른 Pico 또는 PC로 전송할 수 있습니다.
  • **모터 제어:** 다른 Pico에서 모터 제어 명령을 전송하여 모터를 제어할 수 있습니다.
  • **로봇 제어:** 로봇의 각 부품을 제어하는 여러 개의 Pico를 시리얼 통신으로 연결하여 로봇 전체를 제어할 수 있습니다.
728x90
반응형