먼저 아두이노 보드에서의 시리얼 통신시 사용 baud와 라즈베리파이 에서의 통신 baud는 115200으로 했다.
라즈베리파이에서 시리얼 통신하기 위한 코드는 아래와 같다.
import serial
import time
ser = serial.Serial('/dev/ttyACM1', 115200, timeout=1.0)
time.sleep(3)
ser.reset_input_buffer()
print("Serial OK")
try:
while True:
print("send message to ardu")
ser.write("hello \n".encode('utf-8'))
while ser.in_waiting <= 0:
time.sleep(0.01)
response = ser.readline().decode('utf-8').rstrip()
print(response)
except KeyboardInterrupt:
print("Close Serial Communication.")
ser.close()
1. Serial함수를 통해서 아두이노와 연결된 포트와 baud값을 입력한다.
2. ser.reset_input_buffer()를 통해 입력 버퍼를 비워준다.
3. 문자열 객체에 대해서 encode 메서드를 통해서 utf-8로 인코딩 한 후 시리얼 통신으로 전송한다.
4. ser.in_waiting을 통해 입력받은 것이 있는지 확인한다.
5. readline()을 통해서 한 라인을 읽어 디코딩 한 후 공백을 제거하여 출력한다.
아두이노 코드는 아래와 같다.
int counter = 0;
void setup() {
Serial.begin(115200);
while(!Serial){}
}
void loop() {
if(Serial.available() > 0) {
String message = Serial.readStringUntil('\n');
message = message + " " + String(counter);
counter++;
Serial.println(message);
}
}
1. Serial.begin 을 통해서 115200 보오드로 설정한다.
2. 시리얼 통신이 연결되지 않은 경우 while루프로 진행하지 않는다.
3. 시리얼 통신이 가능한 경우에 대해서 '\n'까지 입력을 Serial.readStringUntil함수를 통해서 받는다.
4. message는 카운터를 더한 뒤에 다시 전송한다.
#################### programmer is not response 같은 이상한 오류가 발생한 경우 ################
처음에 이런 오류로 애를 먹었는데 검색했을 때 얻을 수 있는 방법은 다 적용했는데도 계속 떴다.
문제점은 간단했는데 바로 라즈베리파이에서 데이터를 읽지 않은 경우에 대해서 아두이노 디버깅 콘솔에서 메세지가 뜬다.
즉 아두이노에서 메세지를 보내면 라즈베리파이에서 메세지를 읽어야 하며 라즈베리파이가 보낸 메세지는 아두이노가 읽어야 한다는 것이다.
'아두이노' 카테고리의 다른 글
| 아두이노 / 시리얼 통신을 통한 서보 제어 (2) | 2024.12.20 |
|---|---|
| 아두이노 / 외부 전원으로 서보모터 제어하기 (5) | 2024.12.20 |
| 아두이노 / 아날로그 출력신호(PWM)로 LED 밝기 제어하기 (4) | 2024.12.08 |
| 아두이노 / 아날로그 입력을 통해 LED 밝기 제어하기 (1) | 2024.12.08 |