Post

pyserial을 이용한 아두이노와 라즈베리파이 시리얼 통신

작성자: 8기 이서준

pyserial을 이용한 아두이노와 라즈베리파이 시리얼 통신

앞서 DC 모터와 서보 모터를 라즈베리파이를 이용해 동시에 제어하는 것에 어려움이 있다는 것을 알았다. 따라서 DC 모터는 라즈베리파이로, 서보 모터는 아두이노를 이용해 제어하는 방법으로 바꾸었다. 웹 서버를 통해 제어한 신호가 아두이노로 전달되기 위해선 라즈베리파이와의 시리얼 통신이 필수적이다. Python의 serial 모듈을 사용하여 간단한 시리얼 통신 프로그램을 작성하였다.

사용한 부품

pyserial 설치

다음 명령어로 pip을 업데이트할 수 있다.

1
python -m pip install --upgrade pip

pyserial 간단히 pip으로 설치할 수 있다. 코드 실행 후 라이브러리 관련 오류가 계속 뜬다면, 삭제하고 재설치하는 것을 추천한다.

1
pip install pyserial

코드

다음은 시리얼 통신의 python 예제 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/home/ispaik/Desktop/WebpageTestFinal/env/bin python
import serial
import time

# 시리얼 포트 설정
ser = serial.Serial(
    port='/dev/ttyACM0',  # 시리얼 포트 경로
    baudrate=9600,        # 보드레이트 설정
    timeout=None          # 타임아웃 없음
)
time.sleep(2)  # 연결이 설정될 때까지 대기
print("시리얼 포트가 성공적으로 열렸습니다.")

# 무한 루프를 통해 사용자 입력을 시리얼 포트로 전송
while True:
    i = input("입력하세요\n")  # 사용자 입력 받기
    ser.write(i.encode())     # 입력 값을 인코딩하여 시리얼 포트로 전송

(1) 셰뱅 (Shebang)

1
#!/home/ispaik/Desktop/WebpageTestFinal/env/bin python

이는 사용할 Python 인터프리터의 경로를 지정한다.

(2) 시리얼 포트 설정

1
2
3
4
5
6
7
   ser = serial.Serial(
       port='/dev/ttyACM0',
       baudrate=9600,
       timeout=None
   )
   time.sleep(2)  # 연결이 설정될 때까지 대기
   print("시리얼 포트가 성공적으로 열렸습니다.")
  • baudrate는 데이터 전송 속도이며 장치와 일치해야 한다.
  • timeout은 읽기 작업의 시간 제한이다. None으로 설정하면 무제한이다.

(3) 데이터 전송

1
2
3
   while True:
       i = input("입력하세요\n")
       ser.write(i.encode())
  • ser.write(i.encode())는 입력받은 문자열을 바이트 형식으로 인코딩하여 시리얼 포트로 전송한다.

참고 사항

(1) 포트 경로

/dev/ttyACM0는 일반적인 포트 경로이다. Raspberry Pi에 연결된 장치에 따라 달라질 수 있으므로, dmesg | grep tty 명령을 사용하여 올바른 경로를 확인해야 한다. USB0 등 다양한 경로가 존재하므로 꼭 확인하자!

(2) 보드레이트 설정

장치의 보드레이트와 일치해야 한다. 일반적으로 9600bps를 사용하지만, 장치에 따라 다를 수 있다.

This post is licensed under CC BY 4.0 by the author.