답변 : 아두이노 rc카 응용을 하고 싶은 부분이 있는데 막힘이 있어서 질문 드립니다.
페이지 정보
작성자 master 작성일19-11-16 10:18 조회6,917회 댓글0건본문
// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2019-11-16 오전 10:15:48
// by Ok-Hyun Park
//
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,beep=12,servopin=2,led3=3,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를 이용하여 하기는 했는데 좀 더 편리한 방법이 있을꺼 같아서 질문드립니다!!
부저는 두 군데서 제어합니다.
후진시 소리가 끊긴다는 것은
void back(int time){ // 자동차 후진
이 함수 실행 중에 부저 소리가 끊어진다는 것인가요?
LED를 딜레이 사용하고 있다는 말이 무슨 말인지
더 편리한 방법을 왜 찾는 것인지 모르겠습니다.
뭐가 불편하다는 것인가요?
댓글 : 0
조회수 : 6,917
등록된 댓글이 없습니다.