안녕하세요. 이번 글은 아두이노와 라즈베리파이 간의 시리얼 통신에 대한 글입니다. 먼저, 시리얼 통신이 무엇인지에 대해 설명을 합니다. 그리고 J-bot에서는 시리얼 통신을 활용하였는가? 에 대해 적었습니다. J-bot이 궁금하신가요? 아래 글들을 읽어보세요. 나만의 비서 로봇, J-bot 만들고 있습니다. 아래는 J-bot의 동작 동영상입니다. 위 동영상 처럼 손이 가까이 오거나 답변을 한 후 로봇이 팔을 움직이기 위해서 시리얼 통신을 활용하였습니다. 시리얼 통신시리얼 통신은 이종의 보드 간에 데이터를 주고 받는 방법 중 하나입니다. 시리얼 통신을 위해서 필요한 것들에 대해 소개를 하겠습니다.
J-bot은 시리얼 통신을 어떻게 활용하는가?J-bot은 아래와 같이 아두이노와 라즈베리파이를 활용합니다. 아두이노
라즈베리파이
코드를 보면서 이야기 합시다. 먼저 아두이노에서 송수신을 어떻게 하는지 보겠습니다. 아두이노에서 라즈베리파이로 센서 데이터를 보내는 코드는 아래와 같습니다. 아두이노에서 라즈베리파이로 보내는 센서 데이터는 아래의 형식으로 표현합니다. 초음파 거리 (cm) * 서보 모터 각도 (deg) 50 * 40 위와 같은 데이터라면 거리 50cm, 각도 40도라는 의미입니다. 위에는 제가 단순하게 데이터 포맷을 정한 것입니다. (필요하다면 데이터 길이, 데이터, 데이터 검증 byte 등으로 구성하여 보내기도 합니다.) 아두이노가 라즈베리파이로부터 데이터를 받아 처리하는 코드는 아래와 같습니다. 위 코드는 라즈베리파이가 '모터를 몇도로 회전하라' 라는 데이터를 보내는데, 그 데이터를 받는 부분입니다. 위의 코드에서 매 루프마다 serial.read를 통해 입력되는 문자가 있는지 체크합니다. 문자가 있을 경우, inputString이라는 문자열에 추가합니다. 만약 입력된 문자가 '*'일 경우, 문자열이 끝나는 것으로 생각합니다. 그리고 * 앞의 데이터를 추출하고, goal_servo_val에 넣습니다. 라즈베리파이에서 아두이노로부터 센서 데이터를 받는 코드는 아래와 같습니다. SerialComm은 시리얼 통신을위한 모듈입니다. 초기화, 읽기, 쓰기 함수를 만들었습니다. init함수에서 먼저 아두이노와 연결되는 드라이버를 초기화합니다. 그리고 read 함수는 아두이노에서 보낸 데이터에서 거리와 각도값을 추출합니다. *을 구분자로 활용하여 첫번째 데이터가 거리, 두번째 데이터가 각도라는것을 알 수 있고 변수에 저장합니다. motorcontrol 함수는 아두이노에게 회전할 각도를 전송하는 함수입니다. main에서는 serial_comm의 객체를 만들고 쓰레드를 하나 만들어서 serial.read를 반복적으로 호출합니다. 결론라즈베리파이 하나만으로 시스템을 구성하는게 아니라 두개를 같이 쓴 이유는 두개의 역할이 다르며, 각자의 역할을 하는게 효율적이기 때문입니다. 라즈베리파이는 통신, 영상처리, 음성처리 등을 하고 아두이노는 반복적이고 실시간으로 수행해야하는 작업 ( 모터를 제어하는 것이나 10hz로 센서 데이터를 수집)을 하고요! 여기까지해서 시리얼 통신에 대해 적어봤는데요. 읽어주셔서 감사합니다. Raspberry PI와 Arduino Serial 통신 최근 Arduino와 온도센서(DS18B20)를 구입해서 놀고 있다가 외부 온도를 측정하려는데 괜찮은 방법이 없었다. 먼저 환경을 보면 다음과 같다. Raspberry PI 모델 B Arduino Nano (328p) 호환보드, DS18B20, GPS Module 두 기기간 연결 Arduino 소스 DS18B20은 1 Wire 통신방법으로 9600,N,8,1로 Arduino D2에 연결한다. /*-----( Import needed libraries )-----*/ /*-----( Declare Constants )-----*/ /*-----( Declare objects )-----*/ /* Tell Dallas Temperature Library to use oneWire Library */ SoftwareSerial gpsSerial (10, 11); /*-----( Declare Variables )-----*/ void setup() /*----( SETUP: RUNS ONCE )----*/ delay(1000); /*-( Start up the DallasTemperature library )-*/ void loop() /*----( LOOP: RUNS CONSTANTLY
)----*/ /* ( THE END ) */ Raspberry PI 측 프로그램을 이용하여 관찰하는 것을 목표로 했지만 일단 귀찮아서 데이터가 들어오는 것을 minicom으로 확인만 한다. $ sudo apt install minicom # minocom 설치 일단은 여기까지. :-) |