본문 바로가기

포트폴리오

블루투스 및 적외선 리모컨으로 조종 가능한 라인트레이서로 반 자율주행이 가능한 초음파 센서로 장애물 감지가 가능한 아두이노 스마트카(RC카) 만들기

RC카란?

RC카의 RC란, 라디오 컨트롤(Radio Control)의 약자로 전파에 의한 무선조종을 의미합니다.

무선조종이라는 한마디의 단어는 그 적용범위가 대단히 넓어서 유아용 완구에서부터 군사위성에 이르기까지의 여러 가지 것들이 무선으로 컨트롤되고 있습니다.

인용: http://sunny1412.com/rc/beginner/rc_is.html

 

RC카의 기초 [01] - RC카란 무엇인가

RC카의 RC란, 라디오 컨트롤(Radio Control)의 약자로 전파에 의한 무선조종을 의미합니다. 무선조종이라는 한마디의 단어는 그 적용범위가 대단히 넓어서 유아용 완구에서부터 군사위성에 이르기까지의 여러가지 것들이 무선으로 컨트롤되고 있습니다. 여기서 다루려는 것는 그 중에서도 "RC 자동차모형"입니다. RC에 의해 조정되는 자동차 모형이라는 거죠. 이 RC 자동차모형이 아동(완구)용의 RC카와 크게 다른 점은, 우선 자신이 직접 조립하는 "킷트"

sunny1412.com

스마트카란?

이미지 출처: http://www.zamong.co.kr/wp-content/uploads/2015/12/%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC.png

스마트카는 전기 전자 통신 기술(ICT)을 자동차 기술과 융합하여 커넥티드 카 및 무인자동차를 의미합니다.


이번에 만들 RC카는 스마트카이고, 아두이노 기반이다.

https://www.bodnara.co.kr/bbs/article.html?num=130155

 

엔비디아, 자율주행 레이싱카에 ‘드라이브PX’ 탑재한다 :: 보드나라

비주얼 컴퓨팅 분야의 세계적인 선도기업인 엔비디아(www.nvidia.co.kr, CEO 젠슨 황)가 미국 캘리포니아 새너제이에서 진행 중인 세계 최대 GPU 개발자 컨퍼런스 ‘GTC 2016’에서 자율주행 모터스포츠 대회인 ‘로보레이스 챔피언십(Roborace Championship)’ 출전 차량에 엔비디아의 인공지능 슈퍼컴퓨터 ‘드라이브 PX2(DRIVE PX 2)’를 탑재한다고 발표했다. 전기자동차 경주 대회인 ‘포뮬러E’의 하나인 로보레이스 챔피온

www.bodnara.co.kr

사실 엔비디이아는 이미 초당 최대 24조의 처리 능력을 가진 인공지능(슈퍼컴퓨터)을 탑재한 차로 전기자동차 경주 대회

포뮬러 E에 출전한 바가 있는데, 우리가 쓰는 아두이노는 이정도의 괴물급 성능은 못 내지만 흉내는 낼 수 있는 정도이다.

(에초에 규모가 몇억 배 다름)


준비물

아두이노 우노 1개

https://eduino.kr/product/detail.html?product_no=59&cate_no=24&display_group=2

 

에듀이노(Eduino)

아두이노 전문 교육쇼핑몰, 보드, 쉴드, 센서, 모듈, 키트, 로봇, 드론 등 판매

www.eduino.kr

아두이노 센서 확장 쉴드 1개

https://eduino.kr/product/detail.html?product_no=115&cate_no=25&display_group=1

 

에듀이노(Eduino)

아두이노 전문 교육쇼핑몰, 보드, 쉴드, 센서, 모듈, 키트, 로봇, 드론 등 판매

www.eduino.kr

아두이노 우노용 USB 케이블 1개

바퀴 4개

바디 프레임 2개

9V 배터리 홀더 1개

1.5V 베터리 홀더 1개

점퍼 케이블 암-수 20CM 1세트

https://eduino.kr/product/detail.html?product_no=49&cate_no=71&display_group=1

 

에듀이노(Eduino)

아두이노 전문 교육쇼핑몰, 보드, 쉴드, 센서, 모듈, 키트, 로봇, 드론 등 판매

www.eduino.kr

점퍼케이블 암-암 20CM 1세트

https://eduino.kr/product/detail.html?product_no=107&cate_no=71&display_group=1

 

에듀이노(Eduino)

아두이노 전문 교육쇼핑몰, 보드, 쉴드, 센서, 모듈, 키트, 로봇, 드론 등 판매

www.eduino.kr

DC 모터 4개

초음파 센서 1개

적외선 리모컨 수신 모듈 1개

적외선 리모컨 1개

미니 브레드 보드 1개

3V 리튬 배터리 1개

케이블 타이 2개

DC 모터 드라이버 1개

초음파 센서 브라켓 1개

라인 트레이서 센서 3개

황동 서포트  1세트

https://eduino.kr/product/detail.html?product_no=103&cate_no=51&display_group=1

 

에듀이노(Eduino)

아두이노 전문 교육쇼핑몰, 보드, 쉴드, 센서, 모듈, 키트, 로봇, 드론 등 판매

www.eduino.kr

DC 모터 브라켓 4개

서보모터 SG90 1개

https://eduino.kr/product/detail.html?product_no=663&cate_no=55&display_group=1

 

에듀이노(Eduino)

아두이노 전문 교육쇼핑몰, 보드, 쉴드, 센서, 모듈, 키트, 로봇, 드론 등 판매

www.eduino.kr

https://eduino.kr/product/detail.html?product_no=614&cate_no=68&display_group=1

 

에듀이노(Eduino)

아두이노 전문 교육쇼핑몰, 보드, 쉴드, 센서, 모듈, 키트, 로봇, 드론 등 판매

www.eduino.kr

볼트/너트(M3) 1세트

https://eduino.kr/product/detail.html?product_no=447&cate_no=51&display_group=1

 

에듀이노(Eduino)

아두이노 전문 교육쇼핑몰, 보드, 쉴드, 센서, 모듈, 키트, 로봇, 드론 등 판매

www.eduino.kr

총정리 링크: https://eduino.kr/product/detail.html?product_no=80&cate_no=97&display_group=1

 

에듀이노(Eduino)

아두이노 전문 교육쇼핑몰, 보드, 쉴드, 센서, 모듈, 키트, 로봇, 드론 등 판매

www.eduino.kr

웬만해선 에듀이노에서 세트로 구매하는 게 좋다.(협찬 아님)


조립기

조립중 1
조립 중 2

1층, 2층 구성이다. 바퀴를 굴릴 모터 4개와 그것을 조절하는 기판이 1층 그리고 아두이노와 확장 센서 등이 2층에 위치.

생각보다 선꼽는게 힘들다.

확장 쉴드에 점퍼 케이블 연결하는 게 좀 난이도가 있다. 힘들다.


조립 후(완성)

완성된 붕붕이

완성하였다. 이름은 간단히 '붕붕이'로 하자.

붕붕이 완성

완성된 붕붕이의 전면이다. 밑에 빨간 조명은 라인 트레이서 3개에서 빛나는 것이다.

1층에 위치한 브레드 보드에는 적외선 리모컨 모듈이 달려있다. 

블루투스(BT) 모듈은 2층에 그냥 노출되어있다. (선정리는 귀찮아서 안 한 게 아님, 줄이 긴 건 길고 짧은 건 짧음)

이래 보여도 붕붕이는 첨단이다.

블루투스로도 조정 가능하고 적외선 리모컨으로도 조정 가능하다.

라인트레이서로 라인 만들면 라인을 따라가는 것도 가능하고,

앞에 초음파 센서로 장애물 감지도 가능하다!

무엇보다 중요한 것은 속도가 은근히 빠르고 힘도 세다는 것이다.(생각보다)

좌회전 우회전 방식은 왼쪽 바퀴 두 개가 멈추면 우회전 오른쪽 바퀴 두개가 멈추면 좌회전하는 방식이다.(동영상 참조)


내가 붕붕이에 코드 적용할 것은 블루투스 조정이다.

개인 스마트폰 (안드로이드만 가능)의 아두이노 블루투스 조종 앱으로 페어링 및 조종이 가능하다.


코드 참조 블로그

https://steemit.com/kr-arduino/@codingman/serial-string

 

Serial 통신 때 String 사용 (아두이노) — Steemit

Serial 통신 때 String 사용 (아두이노) 온라인 가상시뮬레이터 : 참고 : Serial 통신 제어 (아두이노) Bluetooth 통신 제어(아두이노) 공개회로도… by codingman

steemit.com

https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=5497

 

베이직포엠씨유

기술자료 정보 팁 제공 전자공학 질문하면 전문가가 답변

www.basic4mcu.com

https://www.arduino.cc/reference/ko/language/functions/digital-io/digitalwrite/

 

아두이노 참조

예제 코드 이 코드는 디지털 핀 13을 OUTPUT 로 만들고 1초마다 HIGH 와 LOW 사이를 전환합니다. void setup() { pinMode(13, OUTPUT); // 디지털 핀 13 을 출력으로 설정 } void loop() { digitalWrite(13, HIGH); // 디지털 핀 13 켜기 delay(1000); // 1초 기다리기 digitalWrite(13, LOW); // 디지털 핀 13 끄기 delay(1000); // 1초

www.arduino.cc

https://www.arduino.cc/reference/ko/language/functions/analog-io/analogwrite/

 

아두이노 참조

설명 아날로그 값(PWM 파)을 핀에 출력합니다. LED를 다양한 밝기로 켜거나 다양한 속도로 모터를 돌리는 데 쓸 수 있습니다. analogWrite() 를 호출하면, 해당 핀에 다음 analogWrite() (또는 digitalRead() 또는 digitalWrite() )가 불릴 때까지 특정 듀티 사이클의 구형파를 발생시킵니다. 대부분 핀에서 PWM 신호의 주파수는 약 490Hz입니다. Uno, 혹은 비슷한 보드에서, 5, 6번 핀은 약 980Hz의

www.arduino.cc

https://www.arduino.cc/reference/ko/language/functions/digital-io/pinmode/

 

아두이노 참조

예제 코드 이 코드는 디지털 핀 13을 OUTPUT 으로 만들고 HIGH 와 LOW 를 전환합니다. void setup() { pinMode(13, OUTPUT); // 디지털 핀 13 을 출력으로 설정 } void loop() { digitalWrite(13, HIGH); // sets the digital pin 13 on delay(1000); // waits for a second digitalWrite(13, LOW); // sets the di

www.arduino.cc

https://m.blog.naver.com/PostView.nhn?blogId=yuyyulee&logNo=220303855563&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

[아두이노 강좌] 18. String (1) - 문자형(char) 배열과 String

이번 강좌는 비교적 간단하니까 쉬어가는 페이지인걸로. String은 문자열을 쉽게 사용할 수 있게 하기 위...

blog.naver.com

http://vulkan.co.kr/doc_arduino_02/002/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8_%EC%BD%94%EB%94%A9_%EB%B0%8F_%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8_%EC%88%98%EC%97%85%EC%9A%A9_%EA%B5%90%EC%9E%AC_000_%ED%86%B5%ED%95%A9%EB%B3%B8_v2.pdf

불러오는 중입니다...

https://m.blog.naver.com/PostView.nhn?blogId=darknisia&logNo=220808977305&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

[아두이노 중급] 13. 소프트웨어 시리얼(SoftwareSerial)

아두이노를 어느정도 사용할 줄 아는 사람이면 무엇인가를 만들고 싶은 욕구가 당연히 생길 것이다. 그럴 ...

blog.naver.com

http://blog.naver.com/PostView.nhn?blogId=chandong83&logNo=220838727978&redirect=Dlog&widgetTypeCall=true

 

아두이노 사용기#10 HC-06 블루투스 모듈을 다루어 보다.

이전에 블루투스 모듈을 잘 못 구입하여 BLE 모듈을 구입하게 되었다. 그래서 원하는 기능을 구현해보지...

blog.naver.com

https://codingrun.com/76

 

아두이노 기초7. 시리얼통신

시리얼 모니터(Serial monitor) 아두이노와 컴퓨터간에 메세지를 주고받는 장치이다. 아두이노와 컴퓨터가 어떤 값을 주고 받는지 확인할 수 있는 가장 간단한 방법이다. 시리얼 통신(Serial communication) Ser..

codingrun.com

https://stackoverflow.com/questions/21447332/increment-i-i-and-i-1

 

Increment ++i, i++ and i+=1

I am beginner in C++. What I understand is that:- i++ is executing first, then increment, ++i is increment first, then execute,i+=1 is increment by 1,then execute. But in the FOR loop: for (i=0;...

stackoverflow.com

https://lin24.tistory.com/115

 

[Arduino] 안드로이드 앱 실습 (mit, bluetooth, chat)

#블루투스 이름, 속도, pin번호 정하기 모니터: CMD: AT Return: OK CMD: AT Return: OK CMD: AT+NAMEsongBT Return: OKsetname CMD: AT+BAUD4 Return: OK9600 CMD: AT+PIN1234 Return: OKsetPIN CMD: 코드: #incl..

lin24.tistory.com

https://arsviator.blogspot.com/2009/06/%EC%95%84%EB%92%A4%EB%85%B8%EC%97%90%EC%84%9C-%ED%83%80%EC%9D%B4%EB%A8%B8-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-timer-interrupt-in.html

 

아뒤노에서 타이머 인터럽트 (Timer interrupt in Arduino)

아뒤노가 임베디드 환경을 처음 접하는 사람들에게 매우 쉬운 환경임에 틀림없지만 조금만 복잡한 작업을 하려고만 하면 제약사항이 꽤 많아진다. 특히 가장 아쉬운게 attachInterrupt() 를 통해서 외부 인터럽트 2개(Arduino Mega에서...

arsviator.blogspot.com

https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=5411&sfl=wr_subject&stx=%EC%A0%81%EC%99%B8%EC%84%A0&sop=and

(제일 많이 참조)

 

베이직포엠씨유

기술자료 정보 팁 제공 전자공학 질문하면 전문가가 답변

www.basic4mcu.com

https://deneb21.tistory.com/311

 

[아두이노] 블루투스로 컨트롤하는 무선조종 자동차

예전에 HC-06 블루투스 모듈을 아두이노에서 컨트롤 하는 방법과 L298N DC 모터 드라이버 모듈을 컨트롤 하는 방법을 알아본적이 있습니다. 이 두개를 적절히 조합하면 스마트폰 블루투스 콘트롤 앱을 통해서 무선..

deneb21.tistory.com

http://www.ntrexgo.com/archives/30243

 

[34호] 너무 쉬운 아두이노 DIY ⑥ – 스마트폰으로 조종하는 스마트카 | NTREXGO - 디바이스마트, 엔티렉스 컨텐츠 통합 사이트

[34호] 너무 쉬운 아두이노 DIY ⑥ – 스마트폰으로 조종하는 스마트카 Posted by 디바이스마트 매거진 on Friday, January 15, 2016 · Leave a Comment  글 | 신상석 ssshin@jcnet.co.kr 이 강의는 아두이노를 가지고 간단하게 생활에 필요한 용품을 만들어 보는 강의입니다. 뚝딱뚝딱 뭔가 자신만의 DIY 용품을 만들어 보는 쏠쏠한 재미가 있는 강의라고나 할까요? 이미 주변에 아두이노와 관련한 많은 책이

www.ntrexgo.com

https://steemit.com/kr-arduino/@codingman/2-rc-bluetooth

 

2륜 RC카 Bluetooth를 통해 스마트폰(무선) 조정하기 (아두이노) — Steemit

2륜 RC카 Bluetooth를 통해 스마트폰(무선) 조정하기 (아두이노) 온라인 가상시뮬레이터 : 참고 : Bluetooth 통신 제어(아두이노) RC Car post 과정… by codingman

steemit.com


코드는 이렇게

*  명령
 *  1. 블루투스 w
 *  -> FORWARD 전진
 *  2. 블루투스 s
 *  -> BackWARD 후진
 *  3. 블루투스 a
 *  -> left 좌회전
 *  4. 블루투스 d
 *  -> right 우회전
 *  5. 블루투스 u
 *  -> BREAK 정지
 */
#include <SoftwareSerial.h>
#define BT_RXD 3
#define BT_TXD 4
SoftwareSerial bluetooth(BT_RXD, BT_TXD);

void controllerByBTCommand(char szBTCmd);

int RMEpin = 5;
int RM1pin = 8;
int RM2pin = 9;
int LM3pin = 10;
int LM4pin = 11;
int LMEpin = 6;

int CSPEED = 153;
int PVSPEED= 0;

#define FORWARD  1
#define BACKWARD  2
#define LEFT  3
#define RIGHT  4
#define BREAK  5
char CARDIR= 0;

void CARGo();
void CARBACk();
void CARBREAk();
void CARLEFT();
void CARIGHT();
void CARUDT();

void SERVOROT1();
void SERVOROT2();

int cnt =0;

void setup() {
  pinMode(RMEpin, OUTPUT);
  pinMode(RM1pin, OUTPUT);
  pinMode(RM2pin, OUTPUT);
  pinMode(LM3pin, OUTPUT);
  pinMode(LM4pin, OUTPUT);
  pinMode(LMEpin, OUTPUT);
  Serial.begin(9600);
  bluetooth.begin(9600);
  digitalWrite(RMEpin, HIGH);
  digitalWrite(LMEpin, HIGH);
}

void CARUDT()
{
  if(CARDIR== FORWARD)
    CARGo();
  else if(CARDIR== BACKWARD)
    CARBACk();
  else if(CARDIR== LEFT)
    CARLEFT();
  else if(CARDIR== RIGHT)
    CARIGHT();
  else if(CARDIR== BREAK)
    CARBREAk();
}

void CARGo()
{
    digitalWrite(RM1pin, HIGH);    
    digitalWrite(RM2pin, LOW);
    digitalWrite(LM3pin, HIGH);    
    digitalWrite(LM4pin, LOW);

    for(int i=PREVSPEED; i<=CSPEED; i=i+5){
      analogWrite(RMEpin, i); 
      analogWrite(LMEpin, i);    
      delay(20); 
    }
    PVSPEED= CSPEED;
}

void CARBACk()
{
    digitalWrite(RM1pin, LOW);    
    digitalWrite(RM2pin, HIGH);
    digitalWrite(LM3pin, LOW);    
    digitalWrite(LM4pin, HIGH);

    for(int i=PREVSPEED; i<=CSPEED; i=i+5){
      analogWrite(RMEpin, i); 
      analogWrite(LMEpin, i);    
      delay(20); 
    }
    PVSPEED= CSPEED;
}

void CARLEFT()
{
    digitalWrite(RM1pin, HIGH);    
    digitalWrite(RM2pin, LOW);
    digitalWrite(LM3pin, HIGH);    
    digitalWrite(LM4pin, LOW);
        
    for(int i=PREVSPEED; i<=CSPEED; i=i+5){
      analogWrite(RMEpin, i*1.4);
      analogWrite(LMEpin, i*0.2);
      delay(50); 
    }
    PVSPEED= CSPEED;
}

void CARIGHT()
{
    digitalWrite(RM1pin, HIGH);    
    digitalWrite(RM2pin, LOW);
    digitalWrite(LM3pin, HIGH);    
    digitalWrite(LM4pin, LOW);
    
    for(int i=PREVSPEED; i<=CSPEED; i=i+5){
      analogWrite(RMEpin, i*0.2);
      analogWrite(LMEpin, i*1.4);
      delay(50); 
    }  
    PVSPEED= CSPEED;
}

void CARBREAk()
{
    if(CARDIR== FORWARD || CARDIR== LEFT || CARDIR== RIGHT){
      for(int i=CSPEED; i>=0; i=i-5){
        analogWrite(RMEpin, i);  
        analogWrite(LMEpin, i);
        delay(20); 
      }
    }else if(CARDIR== BACKWARD){
      for(int i=CSPEED; i>=0; i=i-5){
        analogWrite(RMEpin, i);  
        analogWrite(LMEpin, i);
        delay(20); 
      }
    }
    digitalWrite(RMEpin, LOW);
    digitalWrite(LMEpin, LOW);
}

void loop() {
  char szRecvCmd = bluetooth.read();

  controllerByBTCommand(szRecvCmd);
  CARUDT();
  
  if((cnt % 20) == 0){ 
      cnt = 0;
      delay(10);
  }
  else if((cnt % 10) == 0){   
      delay(10);
  }
  cnt++;  
}

void controllerByBTCommand(char szBTCmd)
{
  if (szBTCmd == '+')
  {
    PVSPEED= CSPEED;
    CSPEED += 20;
    CSPEED = min(CSPEED, 255);
    Serial.print("SPD UP ");
    Serial.println(CSPEED);
  }
  else
  if (szBTCmd == '-')
  {
    PVSPEED= CSPEED;
    CSPEED -= 20;
    CSPEED = max(CSPEED, 50);
    Serial.print("SPD DOWN ");
    Serial.println(CSPEED);
  }
  else if(szBTCmd == 'w')
    CARDIR= FORWARD;  
  else if(szBTCmd == 'u')
    CARDIR= BREAK;  
  else if(szBTCmd == 's')
    CARDIR= BACKWARD;    
  else if(szBTCmd == 'a')
    CARDIR= LEFT;    
  else if(szBTCmd == 'd')
    CARDIR= RIGHT;   
}

참조할 자료가 많았다. (구글에 보면 참조할 자료가 널렸다.)

코드가 좀 길다.


코딩하고 업로드하면

구글 플레이스토어

플레이스토어에서 아두이노 블루투스 컨트롤러를 깔자

컨트롤러 모드

컨트롤러 모드를 선택한 뒤

키 지정

키 지정을 해주자

전진: W

후진: S

좌회전: A

우회전: D

브레이크(정지) U

▲ 속도 올리기: +

X 속도 내리기: -

요렇게 키 지정을 해주자.


동영상

 

붕붕이 동작!

성공적으로 붕붕이가 명령대로 움직이는 걸 확인할 수 있다. (사용한 기종: Samsung Galaxy S10 5G / SM-G977)

 

아두이노 조종 앱에서 블루투스 장치 스캔해도 안 뜰 때 팁.

1. 스마트폰 설정 -> 블루투스 가서 HC-06을 찾는다.

2. 초기 비밀번호 1234 입력 후 페어링 한다.

3. 앱에서 HC-06을 리스트에서 찾은 후 열기

 

다른 조종 시연 영상 내꺼아님! (출처: 에듀이노 유튜브)

https://www.youtube.com/watch?v=JFUmgpiyXcc


부품 구매는 에듀이노에서 하였다.

다시 링크 낭낭하게 드림.

https://eduino.kr/product/detail.html?product_no=80&cate_no=97&display_group=1
 

에듀이노(Eduino)

아두이노 전문 교육쇼핑몰, 보드, 쉴드, 센서, 모듈, 키트, 로봇, 드론 등 판매

www.eduino.kr


이렇게 블루투스로 움직이는 붕붕이를 만들었다.

붕붕이의 활용 방법은 무궁무진한데(?) 그중 젤 하고 싶은 것은 온습도 센서와 미세먼지 측정기를 달아서

짭-기상청-붕붕이로 재탄생시키고 싶다.

 

그렇게 되면 붕붕이가 할 수 있는 기능을 열거하자면

{

미세먼지 측정이 가능하면서도 온습도 측정을 하면서도 라인을 따라갈 수 있으면서 초음파로 장애물을 회피하고

속도를 단계별로 조절할 수 있으면서 전, 후, 좌, 우로 움직일 수 있으면서 AA 배터리 6개 정도로 움직일 수 있으며 조종을 블루투스 및 적외선 리모컨 둘 중 선택하여 할 수 있는 그러한!

}

스마트카-붕붕이 되시겠다.


결론: 추후 장치 업데이트가 기대되는 발전 가능성이 매우 높은 스마트카 붕붕이를 만들었다.

조립 난이도: ★★★★☆

코드 난이도(?): ★★★☆☆

성취감: 조립하며 고생한 만큼.