2017년 6월 12일 월요일

32. 장애물 회피 아두이노 자율 자동차 만들기

Step1. 개요

장애물 회피 자율자동차는 최초 전진하다 장애물을 만나면 일단 서고 다른 방향으로 움직이는 자동차입니다. 이를 위해서는 장애물을 인식할 수 있는 초음파 센서가 필요합니다.

아래 사진의 모습은 완성된 모습인데 몸체는 버려진 종이박스를 적당히 잘라 무게를 최소화해야하고 바퀴는  원할한 방향전환과 적은 마찰력 고려하여 3개 사용하였습니다. 따라서 앞바퀴는 케스터 바퀴를 사용했습니다. 장애물을 인식하게 하기 위해서 앞부분에 초음파 센서를 부착했습니다.전압은 전체 무게 때문에 9V 건전지 2개를 사용해야 원할하게 작동 됩니다.각 부품을 글루건으로 부착하였습니다.

자율주행 모형 자동차


Step 2. 준비물

먼저 몸체를 이루는 것으   로 보드지(10X15cm),초음파센서, 아두이노,모터드라이버, DC모터2개, 건전지9V 2개,점퍼 케이블, 브레드보드 작은것, 두꺼운 종이조각,각 부품을 보드지에 접착하기위한 글루건, 바퀴2개, 케스트 바퀴1개가 필요합니다. 여기서 두꺼운 종이조각은  적당한 두께의 종이상자에서 알맞은 크기로 잘라 사용하면 되겠습니다. 다 완성된 자율자동차가 제대로 움직이려면 9 V건전지가 2개가 필요합니다.여기서 필요한 부품은 온라인쇼핑몰에서 구입할 수 있으며, 해외직구로 구입하면 훨씬 저렴합니다.
브레드보드

아두이노

케스트 바퀴(앞바퀴용)

모터드라이버(HC23N)

9V 건전지

바퀴(뒤바퀴 2개용)
점퍼 케이블선

초음파센서(HC-SR04)
DC Motor(노란색 2개)


Step 3. 회로도:


조립 테이블
위 조립 테이블에서 왼쪽 DC모터의 극과 모터드라이버 OUT1,OUT2 연결과 오른쪽 DC모터의 극과 모터드라이버 OUT3,OUT4의 연결이 반대인 것을 주의하시기 바랍니다. 

Step 4. coding:
아래 프로그램을 아두이노툴에 입력하여 저장, 업로드합니다.

#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() {
  // put your setup code here, to run once:
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() {
  // put your main code here, to run repeatedly:
 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);
}
발췌 사이트:http://deneb21.tistory.com/313

위 프로그램을 아두이노 툴에 입력하여 저장 , 업로드하여 성공했다면 바로 작동됩니다.
이 때 원하는 대로 작동되지 않은다면 연결선을 교정하면 됩니다. 예를들어 처음에 전진하지 않고 제자리에서 계속 돈다면 DC모터의 +극과 -극 모터드라이버 OUT1,2,3,4를 바꿔가면서 교정하면 됩니다. 또 장애물을 피하지 않는다면 초음파센서의 연결상태를 확인합니다.
건전지는 9V 2개를 사용하시기 바랍니다. 조립완성된후 무게때문에 전압이 높일 필요가 있기 때문입니다.


Step 5. 시연 동영상




라벨:

0개의 덧글:

댓글 쓰기

에 가입 댓글 [Atom]

<< 홈