728x90
자율주행 자동차 코딩하기
아두이노 자동차를 가지고 자율주행하는 코딩을 알아본다.
가지고 있는 자율 주행 자동차 모델은 이것이다.
https://github.com/emakefun/hummer-bot/
센서 종류
- 바퀴 모터 : 전진, 후진이 가능하다.
- 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
'아두이노' 카테고리의 다른 글
아두이노, 라즈베리파이 / node-red 시리얼 통신 (0) | 2021.08.26 |
---|---|
아두이노(arduino) / 아두이노 블루투스 모듈, 라즈베리파이 블루투스 통신 (0) | 2021.08.26 |
라즈베리파이 아두이노 IDE 설치하기 (0) | 2021.08.13 |
라즈베리파이 / 모니터 없이 라즈베리파이 이용하기, Putty, VNC Viewer (1) | 2021.08.01 |
아두이노(arduino) / IR 무선 적외선리모컨 (0) | 2021.07.26 |
댓글