프로젝트/스마트 요양 지원 시스템 (RoboCare) : 노약자와 장애인 돌봄

🔄Raspberry Pi 와 Arduino UART 통신하기

projectlim 2024. 10. 18. 10:49
728x90
반응형
SMALL

오늘은 Raspberry Pi와 외부 장치(예: Arduino) 간의 UART 통신을 pigpio 라이브러리를 사용하여 설정하는 방법을 알려드리겠습니다. 이를 통해 UART 통신을 활용한 데이터 전송 및 수신을 실습할 수 있습니다. 

그냥 간단하게 말하면 라즈베리파이랑 아두이노 uart통신입니다.

gpio이용해서요 ㅎㅎ

필요한 준비물 🛠️

  • Raspberry Pi
  • Arduino
  • pigpio 라이브러리

1. pigpio 라이브러리 설치 💻

먼저, pigpio 라이브러리를 설치해야 합니다. Raspberry Pi에서 UART 통신을 설정하기 위해 pigpio를 사용하여 손쉽게 GPIO 핀을 제어하고 데이터를 전송할 수 있습니다.

sudo apt-get update
unzip pigpio-master.zip
cd pigpio-master
make
sudo make install
sudo pigpiod

2. Raspberry Pi에서 시리얼 포트 활성화 🔌

Raspberry Pi에서 시리얼 포트를 활성화하려면 raspi-config를 사용해야 합니다.

  1. 터미널에서 sudo raspi-config 입력
  2. Interfacing Options 메뉴 선택
  3. P6 Serial 선택 후, 시리얼 로그인 셸 비활성화 및 하드웨어 시리얼 포트 활성화

3. Python 코드 작성 📝

다음으로, Python을 사용하여 pigpio 라이브러리로 UART 통신을 설정하는 코드를 작성합니다. 이 코드는 메시지 전송 및 수신을 다룹니다. 📬

import pigpio
import time

# pigpio 초기화
pi = pigpio.pi()

# GPIO 핀 설정 (TX: GPIO 17, RX: GPIO 27)
TX = 17
RX = 27

# UART 설정 (9600 보드레이트)
pi.set_mode(TX, pigpio.OUTPUT)
pi.set_mode(RX, pigpio.INPUT)
pi.bb_serial_read_open(RX, 9600)

def send_uart_message(message):
    pi.wave_add_serial(TX, 9600, message)
    wave_id = pi.wave_create()
    pi.wave_send_once(wave_id)
    while pi.wave_tx_busy():
        time.sleep(0.01)
    pi.wave_delete(wave_id)

try:
    while True:
        user_input = input("Enter a message to send to Arduino: ")
        send_uart_message(user_input + '\\n')
        print(f"Data sent: {user_input}")
        time.sleep(1)

        # UART 수신 데이터 읽기
        (count, data) = pi.bb_serial_read(RX)
        if count > 0:
            print(f"Received: {data.decode('utf-8')}")
        else:
            print("No data received")
except KeyboardInterrupt:
    pi.bb_serial_read_close(RX)
    pi.stop()

기능 설명

TX & RX 핀 설정 TX: GPIO 17, RX: GPIO 27, 각각 데이터 송수신 역할
UART 설정 9600 보드레이트로 통신 설정
데이터 송신 사용자가 입력한 메시지를 UART를 통해 송신
데이터 수신 Arduino에서 수신한 데이터를 읽어 출력
종료 처리 KeyboardInterrupt로 안전하게 종료하도록 설정

4. Arduino 코드 작성 🎯

Arduino는 수신된 데이터에 따라 LED를 제어합니다. 아래는 Arduino 코드입니다.

int ledPin = 13;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    int pulse = Serial.read();
    if (pulse == '1') {
      digitalWrite(ledPin, HIGH);
      delay(1000);
      digitalWrite(ledPin, LOW);
    }
  }
}

기능 설명

LED 제어 수신된 데이터가 '1'일 경우 LED를 켜고 1초 후 끄기
Serial.available() 수신된 데이터가 있을 경우 그 값을 읽어 LED 상태 변경

5. pigpiod 실행 및 프로세스 확인 🔍

pigpiod는 pigpio 라이브러리의 데몬으로, Raspberry Pi의 GPIO를 제어합니다. 이를 실행한 후, 프로세스가 정상적으로 실행 중인지 확인해야 합니다.

sudo pigpiod
ps aux | grep pigpiod

명령어 설명

sudo pigpiod pigpio 데몬 실행
`ps aux grep pigpiod`

결론 🎉

이제 Raspberry Pi에서 pigpio 라이브러리로 UART 통신을 설정하여, Arduino와의 데이터 송수신 및 제어를 할 수 있게 되었습니다. LED 제어와 같은 실습을 통해 실제 하드웨어와의 상호작용을 실습할 수 있습니다. 🔄

추가 실습 아이디어:

  • 수신된 데이터를 통해 다양한 센서 제어 또는 모터 제어를 시도해 보세요!
  • 더 높은 보드레이트나 여러 장치와 연결하여 다양한 통신 실습을 해보세요!

이러한 실습은 IoT, 자동화 시스템, 로보틱스 등 다양한 분야에서 유용하게 활용될 수 있습니다. 🚀


어떤 프로젝트에 사용해 보셨나요? 댓글로 공유해주세요! 💬

728x90
반응형
LIST