본문 바로가기
아두이노

아두이노(arduino) / 자율주행 자동차 코딩하기

by clean_h 2021. 8. 26.
728x90

자율주행 자동차 코딩하기

아두이노 자동차를 가지고 자율주행하는 코딩을 알아본다.

 

가지고 있는 자율 주행 자동차 모델은 이것이다.

https://github.com/emakefun/hummer-bot/

 

GitHub - emakefun/hummer-bot

Contribute to emakefun/hummer-bot development by creating an account on GitHub.

github.com

 

 

센서 종류

  • 바퀴 모터 : 전진, 후진이 가능하다. 
  • avoidance module : 앞에 물체가 있는지 확인하는 센서. 
  • Infrared tracking module : 자동차 밑쪽에 부착되어있는 센서. 라인트랙을 따라가는 역할을 한다. 
  • RGB Ultrasonic : 앞 물체와의 거리를 알아내는 센서.
  • ESP-M2 : 와이파이나 블루투스를 연결하는 센서.

자세한 설명은 깃허브를 확인해보면 자동차에 대해 알 수 있고 센서에 대한 코드도 확인해볼 수 있다.

 

센서를 이용하여 자율주행하는 코드이다.

//자율주행 테스트
//바퀴
#define EN1 6 //오른쪽 전진
#define EN2 9 //왼쪽 전진
#define EN3 10 //오른쪽 후진
#define EN4 5 //왼쪽 후진

const int leftPin = 12;
const int rightPin = A5;
byte LeftValue,RightValue;

void LightSeeking(){
  int left, mid, right;
  left = digitalRead(A0);
  mid = digitalRead(A1);
  right = digitalRead(A2);

  //직진
  if ((right == 1) && (mid == 0) && (left == 1)){
    analogWrite(EN1, 180);
    analogWrite(EN2, 180);
    analogWrite(EN3, LOW);
    analogWrite(EN4, LOW);
  }
  //우회전
  else if ((right == 0) && (mid == 1) && (left == 1)){
    analogWrite(EN1, 20);
    analogWrite(EN2, 180);
    analogWrite(EN3, LOW);
    analogWrite(EN4, LOW);
  }
  //좌회전
  else if ((right == 1) && (mid == 1) && (left == 0)){
    analogWrite(EN1, 180);
    analogWrite(EN2, 20);
    analogWrite(EN3, LOW);
    analogWrite(EN4, LOW);
  }
  //정지
  else if ((right == 0) && (mid == 0) && (left == 0)){
    analogWrite(EN1, LOW);
    analogWrite(EN2, LOW);
    analogWrite(EN3, LOW);
    analogWrite(EN4, LOW);
  }
}

void avoid(){
  LeftValue = digitalRead(leftPin);
  RightValue = digitalRead(rightPin);

  //직진
  if (LeftValue >= 1 && RightValue >= 1){
    analogWrite(EN1, 180);
    analogWrite(EN2, 180);
    analogWrite(EN3, LOW);
    analogWrite(EN4, LOW);
    //Serial.print(LeftValue);
    //Serial.print(" ");
    //Serial.print(RightValue);
    //Serial.print(" ");
    Serial.println("1 go");
    delay(300);
  }
  //왼쪽으로 턴, 오른쪽 불
  else if (LeftValue >= 1 && RightValue < 1){
    analogWrite(EN1, 200);
    analogWrite(EN2, LOW);
    analogWrite(EN3, LOW);
    analogWrite(EN4, 200);
    //Serial.print(LeftValue);
    //Serial.print(" ");
    //Serial.print(RightValue);
    //Serial.print(" ");
    Serial.println("2 Turning left");
    delay(300);
    analogWrite(EN1, LOW);
    analogWrite(EN2, LOW);
    analogWrite(EN3, LOW);
    analogWrite(EN4, LOW);
    delay(1000);
  }
  //오른쪽으로 턴, 왼쪽 불
  else if (LeftValue < 1 && RightValue >= 1){
    analogWrite(EN1, LOW);
    analogWrite(EN2, 200);
    analogWrite(EN3, 200);
    analogWrite(EN4, LOW);
    //Serial.print(LeftValue);
    //Serial.print(" ");
    //Serial.print(RightValue);
    //Serial.print(" ");
    Serial.println("3 Turning right");
    delay(300);
    analogWrite(EN1, LOW);
    analogWrite(EN2, LOW);
    analogWrite(EN3, LOW);
    analogWrite(EN4, LOW);
    delay(1000);
  }
  //후진, 왼쪽 오른쪽 불
  else if (LeftValue < 1 && RightValue < 1){
    analogWrite(EN1, LOW);
    analogWrite(EN2, LOW);
    analogWrite(EN3, 180);
    analogWrite(EN4, 180);
    //Serial.print(LeftValue);
    //Serial.print(" ");
    //Serial.print(RightValue);
    //Serial.print(" ");
    Serial.print("0 Turning around");
    delay(500);
    analogWrite(EN1, LOW);
    analogWrite(EN2, LOW);
    analogWrite(EN3, LOW);
    analogWrite(EN4, LOW);
    delay(1000);
  }
}

void setup(){
  Serial.begin(9600);
  pinMode(leftPin, INPUT);
  pinMode(rightPin, INPUT);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
   }
   void loop(){
     int left, mid, right;
     left = digitalRead(A0);
     mid = digitalRead(A1);
     right = digitalRead(A2);
     LeftValue = digitalRead(leftPin);
     RightValue = digitalRead(rightPin);
     
     LightSeeking();
   
       if((LeftValue >= 1 && RightValue < 1)||(LeftValue < 1 && RightValue < 1)||(LeftValue < 1 && RightValue >= 1)){
        while(1){
        avoid(); 
         }
       }  
       delay(20);
   }

 

 

avoidance module과 Infrared tracking module을 이용하여 구현한 코드이다. 

앞에 장애물이 없을때: "1 go"

오른쪽에 장애물이 있을 때 : "2 Turning left"

왼쪽에 장애물이 있을 때 : "3 Turning right"

양쪽에 장애물이 있을 때 : "0 Turning around"

다음과 같이 serial에 출력한다.

 

테스트 영상

728x90

댓글