BASIC4MCU | 질문게시판 | 아두이노 rc카 응용을 하고 싶은 부분이 있는데 막힘이 있어서 질문 드립니다.
페이지 정보
작성자 쿤싼 작성일2019-11-15 14:56 조회3,478회 댓글0건본문
int Echo=A1,Trig=A0;
int Left_motor_back=8,Left_motor_go=9,Right_motor_go=10,Right_motor_back=11;
int key=7;
int beep=12;
int servopin=2;
int led3=3;
int led4=4;
//
int Front_Distance=0,Left_Distance=0,Right_Distance=0;
int myangle,pulsewidth,val;
//
void setup(){
Serial.begin(9600);
pinMode(key,INPUT); pinMode(beep,OUTPUT);
pinMode(Echo,INPUT); pinMode(Trig,OUTPUT);
pinMode(servopin,OUTPUT);pinMode(led3,OUTPUT);pinMode(led4,OUTPUT);
keysacn();
}
//
void run(){ //자동차가 달릴때 설정
analogWrite(Right_motor_go,100); analogWrite(Right_motor_back,0);
analogWrite(Left_motor_go ,100); analogWrite(Left_motor_back,0);
}
//
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(int time){ // 자동차 좌회전
analogWrite(Right_motor_go,100); analogWrite(Right_motor_back,0);
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,255);
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,100);
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,100);
analogWrite(Left_motor_go ,0); analogWrite(Left_motor_back,100);
delay(time*100);
}
//
void keysacn(){
int val=digitalRead(key);
while(!digitalRead(key))val=digitalRead(key); // 키를 누를 때까지 대기
while(digitalRead(key)){ // 키를 누르면, 뗄 때까지 대기
delay(10); val=digitalRead(key);
if(val==HIGH){ digitalWrite(beep,HIGH); } // 키를 누르면 부저 ON
else { digitalWrite(beep,LOW); } // 키를 누르지 않으면 부저 OFF
}
}
//
void klaxon (int time) {
digitalWrite(beep,HIGH);
delay(500);
digitalWrite(beep,LOW);
}
void light_on (int time) {
digitalWrite(led3,HIGH);
digitalWrite(led4,HIGH);
}
void light_off (int time) {
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
}
void light_right (int time) {
digitalWrite(led3,HIGH);
digitalWrite(led4,LOW);
}
void light_left (int time) {
digitalWrite(led3,LOW);
digitalWrite(led4,HIGH);
}
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); //서보 175도
Left_Distance=Distance_test();
}
//
void right_detection(){
for(int i=0; i<=15; i++)servopulse(servopin,15); //서보 15도
Right_Distance=Distance_test();
}//
void loop(){
front_detection();
light_on(10);
if(Front_Distance<20){back(2); brake(2);
left_detection();
right_detection();
klaxon(2);//
if ((Left_Distance<20)&&(Right_Distance<20)){ spin_left(0.7); }
else if(Left_Distance>Right_Distance ){light_right(10); left(5); brake(1); }
else {light_left(10); right(5); brake(1); }
}
else{ run(); }
}
빨간부분이용해서
저희가 하고 싶은 부분은 후진시 부저가 끊겨서 소리나는 것과 그리고 차가 좌회전할떄 좌측 led 켜짐 우측 led켜짐 입니다.
delay를 이용하여 하기는 했는데 좀 더 편리한 방법이 있을꺼 같아서 질문드립니다!!
댓글 0
조회수 3,478등록된 댓글이 없습니다.