[IoT Project] 아두이노와 라즈베리파이 간의 시리얼 통신

in kr-dev •  last year  (edited)

안녕하세요.

이번 글은 아두이노와 라즈베리파이 간의 시리얼 통신에 대한 글입니다.

먼저, 시리얼 통신이 무엇인지에 대해 설명을 합니다.

그리고 J-bot에서는 시리얼 통신을 활용하였는가? 에 대해 적었습니다.

J-bot이 궁금하신가요? 아래 글들을 읽어보세요.

나만의 비서 로봇, J-bot 만들고 있습니다.
google-aiy-voice-kit 활용기
google-aiy-voice-kit 셋팅

아래는 J-bot의 동작 동영상입니다.

위 동영상 처럼 손이 가까이 오거나 답변을 한 후 로봇이 팔을 움직이기 위해서

시리얼 통신을 활용하였습니다.


시리얼 통신

시리얼 통신은 이종의 보드 간에 데이터를 주고 받는 방법 중 하나입니다.

시리얼 통신을 위해서 필요한 것들에 대해 소개를 하겠습니다.

  • Rx, Tx, GND 선 연결
    • 아두이노는 USB로 연결할 경우, 하드웨어는 따로 생각할 필요없습니다. 준비 끝!
    • 아두이노 내부에 칩이 있습니다. 그래서 USB만 연결해도 시리얼 통신을 할 수 있습니다.
  • 보레이트 (Baudrate) 설정
    • 보레이트는 시리얼 통신의 속도를 말합니다.
    • 아두이노와 라즈베리파이 모두 같은 보레이트로 설정해야합니다.
    • 9600 bps, 19200 bps, 38400 bps, 115200 bps 등이 있습니다.
    • bps 는 bit per second로 1초에 보낼수 있는 비트 수를 의미합니다.
    • 9600bps는 1초에 9600 bit를 보낼 수 있습니다.
  • 데이터 포맷
    • 한 번 데이터를 보낼 때, 아래 그림의 데이터 포맷과 같이 8bit씩 보냅니다.
    • 만약 "hello"라는 텍스트를 시리얼 통신을 통해 전송하면 'h', 'e', 'l', 'l', 'o'로 하나씩 전송됩니다.
사진 <시리얼 데이터 포맷> - http://nptel.ac.in/courses/Webcourse-contents/IIT-KANPUR/microcontrollers/micro/ui/Course_home2_11.htm

fig2.jpg


J-bot은 시리얼 통신을 어떻게 활용하는가?

J-bot은 아래와 같이 아두이노와 라즈베리파이를 활용합니다.

아두이노

  • 내부적으로는 서보모터를 제어하고 그리고 초음파 센서의 거리값을 수집
  • 1초에 10번 모터의 각도와 거리값을 라즈베리파이에게 전송합니다.
  • 라즈베리파이에서 모터를 몇 도로 동작하라는 신호를 받으면 모터 제어

라즈베리파이

  • 아두이노로부터 받는 데이터를 활용하여 여러 동작 수행
  • 라즈베리파이에서 아두이노로 원할 때 명령을 내릴 수 있습니다.

코드를 보면서 이야기 합시다.

먼저 아두이노에서 송수신을 어떻게 하는지 보겠습니다.

아두이노에서 라즈베리파이로 센서 데이터를 보내는 코드는 아래와 같습니다.

image.png

아두이노에서 라즈베리파이로 보내는 센서 데이터는 아래의 형식으로 표현합니다.

초음파 거리 (cm) * 서보 모터 각도 (deg)

50 * 40

위와 같은 데이터라면 거리 50cm, 각도 40도라는 의미입니다.

위에는 제가 단순하게 데이터 포맷을 정한 것입니다.

(필요하다면 데이터 길이, 데이터, 데이터 검증 byte 등으로 구성하여 보내기도 합니다.)

아두이노가 라즈베리파이로부터 데이터를 받아 처리하는 코드는 아래와 같습니다.

image.png

위 코드는 라즈베리파이가 '모터를 몇도로 회전하라' 라는 데이터를 보내는데, 그 데이터를 받는 부분입니다.

위의 코드에서 매 루프마다 serial.read를 통해 입력되는 문자가 있는지 체크합니다.

문자가 있을 경우, inputString이라는 문자열에 추가합니다.

만약 입력된 문자가 '*'일 경우, 문자열이 끝나는 것으로 생각합니다.

그리고 * 앞의 데이터를 추출하고, goal_servo_val에 넣습니다.


라즈베리파이에서 아두이노로부터 센서 데이터를 받는 코드는 아래와 같습니다.

image.png

SerialComm은 시리얼 통신을위한 모듈입니다. 초기화, 읽기, 쓰기 함수를 만들었습니다.

init함수에서 먼저 아두이노와 연결되는 드라이버를 초기화합니다.

그리고 read 함수는 아두이노에서 보낸 데이터에서 거리와 각도값을 추출합니다.

*을 구분자로 활용하여 첫번째 데이터가 거리, 두번째 데이터가 각도라는것을 알 수 있고 변수에 저장합니다.

motorcontrol 함수는 아두이노에게 회전할 각도를 전송하는 함수입니다.

main에서는 serial_comm의 객체를 만들고

쓰레드를 하나 만들어서 serial.read를 반복적으로 호출합니다.


결론

라즈베리파이 하나만으로 시스템을 구성하는게 아니라 두개를 같이 쓴 이유는

두개의 역할이 다르며, 각자의 역할을 하는게 효율적이기 때문입니다.

라즈베리파이는 통신, 영상처리, 음성처리 등을 하고

아두이노는 반복적이고 실시간으로 수행해야하는 작업 ( 모터를 제어하는 것이나 10hz로 센서 데이터를 수집)을 하고요!

여기까지해서 시리얼 통신에 대해 적어봤는데요.

읽어주셔서 감사합니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

(jjangjjangman 태그 사용시 댓글을 남깁니다.)
[제 0회 짱짱맨배 42일장]2주차 보상글추천, 1주차 보상지급을 발표합니다.(계속 리스팅 할 예정)
https://steemit.com/kr/@virus707/0-42-2-1
현재 1주차보상글이 8개로 완료되었네요^^
2주차에 도전하세요

그리고 즐거운 스티밋하세요!

예전에 아두이노와 라즈베리파이에 관심이 있었는데 어렵더군요
실제 로봇이 만들어지는건가요?^^

동영상 보시는것과 같이
현재는 말을하면 대답하는 기능,
그리고 손을 가까이 하면 팔을 드는 기능이 있습니다.

목표는 여기에 3d printer로 꾸미는 것
그리고 음성인식과 카메라로 할 수 있는 여러 기능들을 넣는 것
최종적으로 누구나 쉽게 만들 수 있도록 설명을 넣어보고 싶어요 ㅎㅎ

감사합니다!

아래 목표대로라면 로봇이라고 할 수 있겠죠?

기대해주세요~

멋진 로봇 기대하겠습니다^^

Congratulations @jacobyu! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of comments

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Do not miss the last post from @steemitboard:
SteemitBoard World Cup Contest - Quarter Finals - Day 1


Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes


Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

(로봇) 목소리가 좋네요!
근데 마지막 농담이 이해가 안돼요ㅜㅜ

소떼가 합창하면?
단체소송 이란 농담이였어요 ㅋㅋ

자기 글 추천하는 똥배짱이 좋네요. ㅎㅎㅎㅎ

자기글 추천하면 안되는거였나요?
기분이나쁘셨나요?
미안합니다 ㅜㅜ

아뇨. ㅋㅋㅋ 쿨해보여서 좋았습니다. 와서 보니깐 재밌는 거 개발하시네요. 스팀 친구추가 합니다. ㅎㅎㅎ

Congratulations @jacobyu! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard:
SteemitBoard World Cup Contest - The semi-finals are coming. Be ready!


Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes


Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

라즈베리파이의 블루투스를 이용해서 아두이블루투스랑 통신하여 무선으로 아두이노의 서보모터를 제어하면 아마 재미있을꺼에요.
파이썬 코딩을 하셨군요. gpio를 wiringPi.h로 C언어 코딩하는게 전 편하더군요.

아두이노에 붙일 블루투스만 사면 선은 필요없겠군요 ㅎㅎ

원격에다가 아두이노 해놓고 음성으로 제어해도 재밌을듯 하네요.

불꺼줘 하면 불꺼주는 ㅋㅋ 불켜줘 하면 불켜주고

좋은아이디어 감사합니다.

코드를 보니 외계어 보는 느낌입니다 하하
역시 컴퓨터 언어는 어려운것 같아요

뭐든 처음보는건 어렵죠!
어렵지않아요! ㅎㅎ

엠베디드 전문가가 여기도 계셨군요...

아닙니다 ㅎㅎ 감사해요!
임베디드를 잘 몰라도 다 할 수 있습니다.
하드웨어는 다 구매해서 쓰는거라 ㅎㅎ