아두이노2016. 4. 20. 10:00

블루투스로 컨트롤 하는 자동차도 만든김에 초음파 센서를 이용해 장애물을 감지해서 혼자서 움직이는 자율주행 자동차를 만들어보기로 했습니다. 이름이 거창하지만 움직이는 패턴은 그냥 전진하다가 앞에 장애물이 있으면 감지해서 후진 후 좌회전 또는 우회전 후 (좌, 우 회전은 랜덤하게...) 전진하는 자동차 입니다. 초음파 센서를 더 많이 붙인다면 더 정교한 움직임이 가능하겠는데 초음파 센서가 하나 밖에 없네요. ^^   그래도 원하는 대로 잘 움직입니다. 어쨋든 센서가 많아지더라도 원리는 같습니다. 초음파 센서나 모터 드라이버에 대해서는 기존에 썼던 아래의 글들을 참고 하시면 도움이 될 것입니다.


■ 참고 글

▶ [아두이노] 초음파센서(HC-SR04)를 이용한 거리측정

▶ [아두이노] DC 모터의 제어(모터드라이버 L298N) 1편

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


기존 블루투스로 컨트롤 하는 자동차에서 달라진 부분은 블루투스 모듈이 사라지고 초음파 센서를 추가하였으며 9V 건전지를 아두이노 전원으로 추가해서 전원부를 보강했습니다. 이게 6V만 연결하면 처음에는 잘 되는데 조금 작동시키면 전압이 낮아져서 오류가 발생하더군요. 전원을 보강하니 잘 움직입니다.


앞부분에 HC-SR04 초음파 거리측정 센서를 달았습니다.



9V 아두이노 전원공급용 커넥터

6V 건전지 전원 외에 9V 건전지를 아두이노 전원연결용 커넥터를 이용해서 추가해 주었습니다. 그 이외 구성은 블루투스 자동차와 같습니다. 한 번 더 정리하자면 아두이노 우노, L298N DC 모터 드라이버 모듈, 바퀴달린 모터 2개, 앞바퀴용 캐스터 바퀴, 전원은 AA 건전지 4개 들어가는 건전지 홀더(6V) 와 9V 건전지, HC-SR04 초음파 센서, 배선용 미니 브레드보드 정도 들어갔네요. 본체는 하드보드지를 잘라서 만들었습니다. 부품들의 고정은 양면테이프로 고정했습니다.


◆ 연결

각각 부품의 연결은 다음과 같이 했습니다. 자세히 보고 싶은 분은 fritzing 파일을 다운받아서 보세요. L298N 에 연결되는 외부전원은 실제로 6V를 연결했는데 12V 까지 연결해도 상관이 없으므로 12V 내에서 연결하고싶은 전압의 전원을 연결하면 됩니다.




■ 자율주행 자동차 fritzing 파일

Auto_Drive_Car.fzz


빨간선은 전원연결 + 이며 까만선은 GND ( - ) 입니다.

초음파 모듈의 Trig 는 D9, Echo 는 D8 에 연결했습니다.

모터 드라이버 모듈의 IN1 은 D7 에 연결하였고 차례대로 IN2 는 D6 에, IN3 는 D5, IN4 는 D4 에 연결 했습니다.


만약 소스는 문제가 없는데 모터가 원하는 방향과 거꾸로 돌아간다면 모터 드라이버 모듈에 연결된 모터의 배선을 서로 바꿔보세요. 그럼 원하는 방향으로 돌아갈 겁니다.




◆ 소스

기존의 블루투스 자동차의 소스를 수정하여 블루투스 관련 코드를 없애고 초음파 센서 관련 소스를 넣었습니다. 자동차의 동작제어는 전진, 좌/우 회전, 후진, 정지 기능이 있습니다. 장애물 감지하는 초음파 센서의 값은 20cm 로 설정했습니다.  장애물 감지 시 후진->좌 또는 우회전->장애물 없으면 전진... 이런 식으로 무한반복 하는데 각 동작마다 delay 를 주었습니다. 이 부분도 사정에 맞게 수정하거나 기능을 강화하면 더욱 정교한 움직임이 가능할 듯 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
 
//모터 PIN 설정
#define LEFT_A1 4 //왼쪽 바퀴
#define LEFT_B1 5 //왼쪽 바퀴
#define RIGHT_A2 6 //오른쪽 바퀴
#define RIGHT_B2 7 //오른쪽 바퀴
 
//초음파 센서 PIN 설정
#define IR_TRIG 9 //TRIG 핀 설정 (초음파 보내는 핀)
#define IR_ECHO 8 //ECHO 핀 설정 (반사된 초음파 받는 핀)
 
void setup() {
  Serial.begin(9600);   //시리얼모니터 
 
  //모터 핀모드 설정
  pinMode(LEFT_A1, OUTPUT);
  pinMode(RIGHT_A2, OUTPUT);
  pinMode(LEFT_B1, OUTPUT);
  pinMode(RIGHT_B2, OUTPUT);  
 
  //초음파 센서 핀모드 설정
  pinMode(IR_TRIG, OUTPUT);
  pinMode(IR_ECHO, INPUT);
}
 
void loop() {
  float duration, distance;
  digitalWrite(IR_TRIG, HIGH);
  delay(10);
  digitalWrite(IR_TRIG, LOW);
 
  // echoPin 이 HIGH를 유지한 시간
  duration = pulseIn(IR_ECHO, HIGH);
  // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
  // 340은 초당 초음파(소리)의 속도, 10000은 밀리세컨드를 세컨드로, 왕복거리이므로 2로 나눠주면 거리가 cm 로 나옴
  distance = ((float)(340 * duration) / 10000/ 2;
  Serial.print("\nDIstance : ");
  Serial.println(distance);
     
  if(distance < 20) {         //장애물 감지 (20cm 이내)
     Serial.println("stop");
     stop();  //정지(1초)
     Serial.println("backward");
     backward();  //후진(0.5초)
     int rnd = random(0,2);   //장애물 감지시 좌/우회전 랜덤처리
     if(rnd == 0){
        Serial.println("right");
        right();
     }else{
        Serial.println("left");
        left();
     }
   }else{         //장애물 없음
     Serial.println("forward");
     forward();
   }
}
 
void forward(){
  digitalWrite(LEFT_A1, HIGH);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, HIGH);
  digitalWrite(RIGHT_B2, LOW);
}
void backward(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, HIGH);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, HIGH);
  delay(500);
}
void left(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, HIGH);
  digitalWrite(RIGHT_A2, HIGH);
  digitalWrite(RIGHT_B2, LOW);
  delay(1000);
}
void right(){
  digitalWrite(LEFT_A1, HIGH);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, HIGH);
  delay(1000);
}
void stop(){
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, LOW);
  delay(1000);
}
cs




주행 동영상 입니다. 그럭 저럭 잘 움직이네요. 그냥 놔두면 지가 알아서 돌아다니니 왠지 블루투스 자동차 보다 마음이 편한 것은 왜 일까요?  조종해야 한다는 부담이 없어져서 그런가? ^^; 



▶추가내용(2016.08.12) : 위 내용 중 잘못된 내용이 있어서 바로 잡습니다. L298N 의 5V 단자는 전원 입력이 아니라 5V 출력 단자 입니다. 고로 위의 Fritzing 회로도 중 모터 드라이버에 연결한 아두이노 5V 전원은 필요가 없습니다. 전원은 외부전원을 충분하게 공급해주고 모터 드라이버 5V 출력을 아두이노의 VIN 에 연결해서 아두이노의 전원으로 사용하는 것이 가장 바람직하다고 생각 됩니다. http://deneb21.tistory.com/277 참고

반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. 비밀댓글입니다

    2016.11.04 01:09 [ ADDR : EDIT/ DEL : REPLY ]
    • 답변이 너무 늦었네요. http://deneb21.tistory.com/211 을 참고해 보세요. 사운드 센서 관련 포스팅 입니다.

      2016.11.22 12:44 신고 [ ADDR : EDIT/ DEL ]
  2. 성실대학

    안녕하세요! 아두이노 초급자입니다.

    다름이 아니라 올려주신 소스를 그대로 사용해보니 이하의 문장이 선언되어 있지 않다고 나왔습니다.

    DDT:43: error: 'stop' was not declared in this scope

    DDT:45: error: 'backward' was not declared in this scope

    DDT:49: error: 'right' was not declared in this scope

    DDT:52: error: 'left' was not declared in this scope

    DDT:56: error: 'forward' was not declared in this scope

    exit status 1
    'stop' was not declared in this scope

    혹시 이에대해서 답해주실 수 있을까요?

    2016.11.22 11:32 [ ADDR : EDIT/ DEL : REPLY ]
    • 아두이노 IDE 를 최신버전으로 바꾸시거나 에러가 나는 function 들을 void setup() 위로 올려 보세요. 아두이노 IDE 버전에 따라 function 의 위치에 따라 인식하지 못하는 경우도 있다고 하네요.

      2016.11.22 12:42 신고 [ ADDR : EDIT/ DEL ]
  3. 비밀댓글입니다

    2016.12.26 15:28 [ ADDR : EDIT/ DEL : REPLY ]
    • http://deneb21.tistory.com/notice/469
      먼저 공지사항 한 번 읽어보시구요.

      질문내용은 자율, 리모트 모두 다 되는 차를 만들고 싶다는 내용인데 질문내용에 답이 있네요. if 문을 이용하면 충분히 가능할 것으로 보입니다. if 문으로 e 가 아닐때는 리모트콘트롤 부분을 실행하게 만들고 e 라면 자율주행 모드로 가면 되겠네요. 물론 다음 loop 를 돌 때 e 말고 다른게 입력되지 않았으면 자율주행을 계속 유지하게 하면 되겠구요.

      2016.12.26 21:37 신고 [ ADDR : EDIT/ DEL ]
  4. 인터럽트

    인터럽트 방식으로도 가능한가요?

    2017.05.11 22:07 [ ADDR : EDIT/ DEL : REPLY ]
  5. 부품 구입처

    부품 구입처를 알 수 있을까요?

    2017.06.11 19:19 [ ADDR : EDIT/ DEL : REPLY ]
    • 저는 대부분 알리익스프레스에서 직구 했습니다.
      하지만 배송이 한 달 가까이 걸립니다.
      네이버쇼핑에 부품명 치시면 국내 인터넷
      쇼핑몰에서 거의 대부분 구입이 가능 합니다.
      물론 알리익스프레서 직구보다는 조금 비쌉니다.

      2017.06.11 20:19 신고 [ ADDR : EDIT/ DEL ]
  6. 회로도

    전원은 외부전원을 충분하게 공급해주고 모터 드라이버 5V 출력을 아두이노의 VIN 에 연결해서 아두이노의 전원으로 사용하는 것이 가장 바람직하다고 생각 됩니다.

    이 문장이 잘 이해가 되지 않습니다. 위 회로도에서 아두이노에 입력되는 9V 전원선을 빼라는 의미인가요?

    2017.07.16 00:11 [ ADDR : EDIT/ DEL : REPLY ]
    • 네... 좀 더 안정적으로 하려면
      위의 경우 아두이노 9v를 빼서
      l298n에 병렬로 추가하고
      l298n의 5v출력을 아두이노 전원으로 사용하는게 더 좋지 않을까? 해서
      써 본 문장 입니다.

      물론 위와 같이 해도 동작엔 이상이 없습니다

      2017.07.16 04:55 신고 [ ADDR : EDIT/ DEL ]
  7. 회로도

    네~ 답변감사합니다. 또 하나의 질문이 생겼습니다.
    Q1. 장애물을 감지했을 떄 정지와 후진하는 소스에서 초를 바꾸려면 어느 부분을 수정해야 하나요?
    Q2. 장애물을 감지한 후 피할 떄 방향을 RANDOM으로 설정하였습니다. 이 방향을 랜덤이 아닌 좌, 우로 바꾸려면 어떻게 해야 하나요?
    아직 코딩 부분이 미숙해서 질문 올려봅니다~

    2017.07.16 23:25 [ ADDR : EDIT/ DEL : REPLY ]
  8. 써니

    안녕하세요 질문할 곳을 찾지 못해 이렇게 질문드려요 s4a에서 리모콘 제어를 할 수 있나요? 답변 부탁드려요

    2017.09.26 00:42 [ ADDR : EDIT/ DEL : REPLY ]
  9. 전압

    안녕하세요. 프로젝트에 도움이 많이되고있습니다.
    궁금한점이 있는데 저희가 블루투스(hc-06)랑 초음파센서랑 피에조부저도 달려고 하는데 외부전압을 L298N에 9v 아두이노에 9v할려하는데 충분한가요?
    추가로 추가내용에서 L298N 5v출력단자를 아두이노의 VIN에 직접 연결시켜주는건가요?


    2017.09.27 11:52 [ ADDR : EDIT/ DEL : REPLY ]
    • 9V면 전압은 충분합니다. 다만 중요한 것은 충분한 전류의 공급이 중요하죠. 추가내용은 그렇게 하시면 됩니다

      2017.09.30 23:31 신고 [ ADDR : EDIT/ DEL ]
  10. blackstar

    안녕하세요~올려주신 포스트를 설계 프로젝트에 참고하고 있습니다. 포스트를 보다가 궁금한 점이 생겼는데 제작 과정에서 서보 모터는 사용하지 않으신 건가요?? 혹시 사용하지 않으셨다면 그렇게 해도 상관 없는지 여쭤보고 싶고, 만약 사용하셨다면 서보모터 라이브러리 코드는 위에 올려주신 아두이노 코드와 별개로 따로 입력하신건지 여쭤보고 싶습니다!!

    2017.11.07 22:32 [ ADDR : EDIT/ DEL : REPLY ]
    • 보시다시피 서보모터는 없습니다 그저 dc 모터 2개의 제어로만 움직이는 야매 자동차 입니다. 서보로 방향전환 되게하면 더 고급진 자동차가 되겠네요

      2017.11.07 23:04 신고 [ ADDR : EDIT/ DEL ]
  11. helloej

    안녕하세요. 아두이노 자동차 만들려고하는데 코딩을 아예 할 줄 몰라서 소스 얻어가려고 하는데
    저거 소스 그대로 복사해서 스케치에 넣어서 업로드 하면 되는건가요?

    2017.11.12 22:39 [ ADDR : EDIT/ DEL : REPLY ]
  12. 비밀댓글입니다

    2018.05.14 14:57 [ ADDR : EDIT/ DEL : REPLY ]
    • 처음부터 하나 하나 점검해 보심이... ^^

      2018.05.14 15:09 신고 [ ADDR : EDIT/ DEL ]
    • Zizio

      우노 프로그램이랑 다 그대로 입력했는데 바퀴모터가 안굴러간다? 그런느낌이라서 ㅜ ㅜ 완전히 부품도 같은걸루했거든요

      2018.05.14 16:12 [ ADDR : EDIT/ DEL ]
    • 전력부족일수도 있어요. 제 블로그에서 아두이노 전원으로 검색하시면 추가 전원을 연결하는 방법이 나옵니다.

      2018.05.15 11:10 신고 [ ADDR : EDIT/ DEL ]
    • 이 글 보시면 되겠네요.
      http://deneb21.tistory.com/m/545

      2018.05.15 11:11 신고 [ ADDR : EDIT/ DEL ]
  13. 안녕하세요

    질문이있는데 왜 dc모터 4개를 사용하지 않으셨나요? 바퀴4개를 제어하는게 더욱 안정적인듯한데

    2018.10.24 22:45 [ ADDR : EDIT/ DEL : REPLY ]
  14. 질문있습니다

    바퀴4개를제어하려면 코딩 어디를수정해야할까요..? ㅜㅜ

    2018.11.07 09:47 [ ADDR : EDIT/ DEL : REPLY ]
  15. 비밀댓글입니다

    2018.12.05 15:06 [ ADDR : EDIT/ DEL : REPLY ]
  16. 비밀댓글입니다

    2018.12.05 15:36 [ ADDR : EDIT/ DEL : REPLY ]
    • 그 드라이버는 저도 써본적이 없습니다. 데이터시트 등을 통해서 드라이버 스펙을 보시고 코딩 하시길 바랍니다.

      2018.12.05 16:05 신고 [ ADDR : EDIT/ DEL ]
  17. 좋은 정보입니다.

    2020.07.04 07:18 [ ADDR : EDIT/ DEL : REPLY ]