BASIC4MCU | 질문게시판 | 아두이노 자동차 소스 작성중 어려움이 있어 질문 드립니다.
페이지 정보
작성자 쿤싼 작성일2019-12-15 02:10 조회6,052회 댓글1건본문
const int Left_motor_back = 8,Left_motor_go = 10; // 좌측모터후진(IN1) // 좌측모터전진(IN2)
const int Right_motor_back=12,Right_motor_go=11; // 우측모터전진(IN3) // 우측모터후진(IN4)
const int SensorRight=3,SensorLeft=4;
int Echo=A1,Trig=A0;
int servopin=2;
int SL,SR; // 센서 상태
//
int Front_Distance=0,Left_Distance=0,Right_Distance=0;
int myangle,pulsewidth,val;
void setup(){
pinMode(Left_motor_go,OUTPUT); // PIN 8(PWM)
pinMode(Left_motor_back,OUTPUT); // PIN 9(PWM)
pinMode(Right_motor_go,OUTPUT); // PIN 10(PWM)
pinMode(Right_motor_back,OUTPUT); // PIN 11(PWM)
pinMode(SensorRight,INPUT_PULLUP); // 우측센서포트를 입력으로 정의
pinMode(SensorLeft ,INPUT_PULLUP); // 좌측센서포트를 입력으로 정의
pinMode(Echo,INPUT); pinMode(Trig,OUTPUT);
pinMode(servopin,OUTPUT);
}
//
void run(){ // 전진
analogWrite(Right_motor_go,100); analogWrite(Right_motor_back,0);
analogWrite(Left_motor_go ,100); analogWrite(Left_motor_back,0);
//delay(time*100);
}
//
void brake_line(){ //제동,정지
analogWrite(Right_motor_go,0); analogWrite(Right_motor_back,0);
analogWrite(Left_motor_go ,0); analogWrite(Left_motor_back ,0);
//delay(time*100);
}
void brake(int time){ //자동차 멈출때 설정
analogWrite(Right_motor_go,0); analogWrite(Right_motor_back,0);
analogWrite(Left_motor_go ,0); analogWrite(Left_motor_back,0);
delay(time*100);
}
//
void left_line(){ //좌회전(좌측정지,우측직진)
analogWrite(Right_motor_go,100); analogWrite(Right_motor_back,0);
analogWrite(Left_motor_go , 0); analogWrite(Left_motor_back ,0);
//delay(time*100);
}
void left(int time){ // 자동차 좌회전
analogWrite(Right_motor_go,100); analogWrite(Right_motor_back,0); //부저를 0.1초 간격으로 on-off-on-off
analogWrite(Left_motor_go , 0); analogWrite(Left_motor_back,0);
delay(time*100);
}
//
void spin_left(int time){ //좌측스핀(좌측후진,우측직진)
analogWrite(Right_motor_go,100); analogWrite(Right_motor_back, 0);
analogWrite(Left_motor_go , 0); analogWrite(Left_motor_back ,150);
delay(time*100);
}
//
void right_line(){ //우회전(우측정지,좌측직진)
analogWrite(Right_motor_go, 0); analogWrite(Right_motor_back,0);
analogWrite(Left_motor_go ,100); analogWrite(Left_motor_back ,0);
//delay(time*100);
}
void right(int time){ //자동차 우회전
analogWrite(Right_motor_go, 0); analogWrite(Right_motor_back,0);
analogWrite(Left_motor_go ,100); analogWrite(Left_motor_back,0);
delay(time*100);
}
//
void spin_right(int time){ //우측스핀(우측후진,좌측전진)
analogWrite(Right_motor_go, 0); analogWrite(Right_motor_back,150);
analogWrite(Left_motor_go ,100); analogWrite(Left_motor_back , 0);
delay(time*100);
}
//
void back(int time){ //후진
analogWrite(Right_motor_go,0); analogWrite(Right_motor_back,150);
analogWrite(Left_motor_go ,0); analogWrite(Left_motor_back ,150);
delay(time*100);
}
float Distance_test(){ //거리 테스트
digitalWrite(Trig,HIGH); delayMicroseconds(10); digitalWrite(Trig,LOW); //Trig
float Fdistance=pulseIn(Echo,HIGH); Fdistance=Fdistance/58; //Echo
return Fdistance;
}void servopulse(int servopin,int myangle){ //서브모터 설정
pulsewidth=(myangle*10)+600;
digitalWrite(servopin,HIGH); delayMicroseconds(pulsewidth); digitalWrite(servopin,LOW);
delay(20-pulsewidth/1000);
}
//
void front_detection(){ //앞쪽 장애물 감지
for(int i=0; i<=5; i++)servopulse(servopin,90); //서보 90도
Front_Distance=Distance_test();
}
//
void left_detection(){ //왼쪽 장애물 감지
for(int i=0; i<=15; i++)servopulse(servopin,165); //서보 165도
Left_Distance=Distance_test();
}
//
void right_detection(){ //오른쪽 장애물 감지
for(int i=0; i<=15; i++)servopulse(servopin,15); //서보 15도
Right_Distance=Distance_test();
}void loop(){
while(1){
front_detection();
if(Front_Distance<20){back(2); brake(2);
left_detection();
right_detection();
if ((Left_Distance<20)&&(Right_Distance<20)){ spin_left(0.7);}else if(Left_Distance>Right_Distance ){ right(4); brake(1);}
else { left(4); brake(1);}
}
else
{
SR=!digitalRead(SensorRight);
SL=!digitalRead(SensorLeft);
if ( SL && SR)run(); // 전진
else if( SL && !SR)left_line(); // 좌회전
else if(!SL && SR)right_line(); // 우회전
else run(); // 정지
}
}
}
저희가 하고 싶은 부분은 블랙라인을 라인 트레이서로 인식하여 보다 매끄럽게 자율주행하는 것에 목표를 두고 있습니다.
시현 경기장에서 블랙 라인이 끝난뒤 초음파센서를 이용한 장애물 피해 주행하는 것 까지 작성하고 있는데
loop문에서 문제가 있는 것 같습니다... 제대로 주행이 안됩니다.
라인 트레이서로 매끄럽게 인식하기 위해선 void left_line 부분에는 int time을 안 넣고 하는게 좋고
초음파 센서를 가동시키기 위해선 void_left 부분에는 int time 이 필요한것 같아서 보이는 것처럼 좌회전, 우회전 같은 모터 구동 함수를 2개씩 만들어 줬습니다. 하지만 loop문에서 코드를 작성할 때 어려운 부분이 많아 도움을 부탁드립니다.
댓글 1
조회수 6,052master님의 댓글
master 작성일
실제로 구동을 하면서 증상을 봐야지 코드를 수정해야 할 방향이 정해집니다.
이 말의 의미는 물건을 가지고 있지 않은 사람은 도움이 안된다는 뜻입니다.
마무리 잘 해보세요