이번 시간에는 시리얼 통신과 파이썬에서 시리얼 통신을 하는 방법에 대해서 알아보겠습니다.
시리얼 통신(Serial Communication)이란 정기적인, 일련의, 연속된 같은 뜻을 가지고 있는 serial과 통신, 대화, 소통 등의 뜻을 갖는 communication의 합성어입니다. 한글로는 직렬 통신이라고 부릅니다만 근래에 들어서는 다들 시리얼 통신이라고 부르는 게 더 익숙한 듯합니다. 이런 시리얼 통신은 통신 방법 중에 하나이고 직렬이 있으니 병렬 통신(Parallel Communication)도 존재합니다.
시리얼 통신의 특징은 데이터를 주고 받을 때 직렬로 즉, 한 선만을 이용해서 통신을 한다는 점입니다. 예를 들어서 Serial 이라는 데이터를 보낼 때 S 보내고, e 보내고, r 보내고... 이런 식으로 데이터를 하나씩 보낸다는 뜻이죠. 받을 때도 하나씩 받습니다. 아마 기계, 전자, 컴퓨터 등 관련 전공을 하셨던 분들은 엄청 많이 듣고 또 많이 써보셨던 방법일 겁니다. Tx/Rx 라고 적힌 것들을 몇 번 보셨을 텐데 Transmitt, Receive입니다(x는 뒤에 오는 글자가 서로 다르기 때문에 통일할 수 없어서 붙이는 거라고 합니다). 그래서 마이크로 컨트롤러로 통신을 해보신 분들은 기억나실까 모르겠는데 데이터를 주고받을 때 Tx/Rx 램프에 불이 엄청 빠르게 껐다 켜졌다 합니다. 당연히 이걸 이용해서 통신에 문제가 있을 때 램프를 잘 보면 송신과 수신 둘 중 어디에 문제가 있는지도 대략적으로 알 수 있겠죠.
시리얼 통신에는 UART, I2C, SPI 등 여러가지가 있지만 이 포스팅에서는 UART에 대해서만 알아보도록 하겠습니다.
UART(Universal Asynchrounous Receiver and Transmitter)는 비동기식 시리얼 통신 방식입니다. 비동기식이기 때문에 별도의 Clock라인이 필요하지 않아요(USART라고 동기식 시리얼 통신 방식도 있습니다. UART는 USART의 비동기 모드라고도 해요). 또한 동기식 통신과 달리 시작 비트와 정지 비트를 데이터에 붙여서 나간다는 특징이 있습니다. 안그러면 데이터의 시작이 어딘지, 끝이 어딘지 구분이 안되겠죠.
그럼 UART를 사용하기에 앞서서 알아야 되는 것을 조금 짚고 넘어가겠습니다.
1. Baud Rate(보 레이트) : 초 당 데이터를 얼마나 전송하는지에 대한 정보입니다. 전공자 분들은 어렴풋이 9600이니 38400이니 하는 숫자가 기억나실 수도 있겠네요. 사실상 가장 중요한 부분입니다. 보내는 쪽이랑 받는 쪽이 무조건 보 레이트는 맞춰야 해요. 이것만 알면 나머지는 자연스럽게 가능합니다.
2. Data Bit(데이터 비트) : 컴퓨터가 0,1로 모든 것을 처리한다는 사실은 알고 계실 겁니다. 그래서 0,1을 펄스로 구성해서 데이터를 보내는 거에요. 보통 1바이트 기준으로 데이터를 보내기 때문에 11110110 뭐 이런 식으로 데이터를 구성해서 보낸다는 뜻입니다. 실질적인 데이터라고 생각하시면 되겠네요.
3.Parity(패리티) : 전송 오류 확인을 위한 비트라고 하는데 안쓰셔도 무방합니다(저도 사실 써본 적이 없어요...).
이제는 파이썬에서 어떻게 시리얼 통신을 하는지에 대해서 한 번 해보겠습니다. 위에서 글을 쭉 썼지만 원래 알던 분이 아니시라면 조금 이해가 어려울 수도 있어요. 이럴 때는 직접 해보는 거 만큼 빨리 이해되는 게 없죠.
일단 파이썬에서 시리얼 통신을 사용하기 위해서는 pyserial 라이브러리를 깔아야 합니다. 전에 opencv나 numpy를 깔았던 것처럼 말이죠. 이번에도 pip를 이용해서 설치를 해볼 건데요. 터미널 창을 열어서 pip install pyserial을 입력해주시면 자동으로 설치가 완료됩니다. 그리고 ide를 재시작해주세요.
Python :
import serial
ser = serial.Serial('COM4', 9600)
a = input()
ser.write(a.encode())
print(ser.readline().decode())
ser.close()
Arduino :
char input_data;
void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop()
{
// put your main code here, to run repeatedly:
if(Serial.available())
{
input_data = Serial.read();
Serial.println(input_data);
}
}
일단 최대한 간단하게 후다닥 짜 봤습니다. COM4 부분은 컴퓨터에 따라 어디에 연결했는지에 따라 달라지므로 본인에게 맞춰서 고쳐주셔야 합니다. 아두이노는 아래 사진처럼 하시면 설정 가능해요.
잠깐 코드 설명을 드리자면 파이썬에서 글자를 입력하면 해당 글자가 아두이노로 전송되고 아두이노에서는 받은 글자를 파이썬으로 돌려보내고 파이썬은 받은 글자를 출력하는 것입니다.
최근에 주피터 노트북에 빠져서 주구장창 이것만 사용 중입니다. 코드 분석도 편하고 아주 좋아요. 아무튼 결과는 잘 나오는 걸 확인할 수 있었습니다. 사실 이번 포스팅에서 시리얼 통신을 완전히 끝내려고 했으나 이것저것 적다 보니 길어져서 일단은 여기서 마치고 다음 포스팅에서 조향값을 아두이노로 보내는 것까지 진행을 해보겠습니다.
'Programming > Capstone Design' 카테고리의 다른 글
[Capstone Design]5. 웹캠을 이용한 실시간 차선인식 (0) | 2022.04.18 |
---|---|
[Capstone Design]4. 시리얼 통신(Serial Communication) - 2 (0) | 2022.04.17 |
[Capstone Design]3. 차선 인식(Lane Detection) - 7 (0) | 2022.04.16 |
[Capstone Design]3. 차선 인식(Lane Detection) - 6 (0) | 2022.04.15 |