아두이노 코딩 질문
글쓴이: ykw1101 / 작성시간: 수, 2017/06/07 - 9:59오후
제가 아두이노로 대회를 나가는데.. 검은 선 밖으로 나가지 않고 장애물을 초음파센서로 탐지해 밀어내는 시합인데 이 코드에서 모자란 것이 무엇인지 궁금합니다.
int Left_motor_back=8; //좌측모터후진(IN1) int Left_motor_go=9; //좌측모터전진(IN2) int Right_motor_go=10; // 우측모터전진(IN3) int Right_motor_back=11; // 우측모터후진(IN4) int Echo = 12; // 초음파센서 Echo int Trig = 5; // 초음파센서 Trig int Front_Distance = 0; int Left_Distance = 0; int Right_Distance = 0; int servopin=6;//서보모터핀을 2번으로 설정 int myangle;//서보모터각도 int pulsewidth;//펄스폭 설정 int val; const int SensorRight = 3; //우측센서 const int SensorLeft = 4; //좌측센서 int SL; //좌측센서 상태 int SR; //우측센서 상태 void setup() { Serial.begin(9600); //모터구동을을 위한 초기화 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(Echo, INPUT); // 입력설정 pinMode(Trig, OUTPUT); // 출력설정 //서보모터 핀설정 pinMode(servopin,OUTPUT);// 출력설정 pinMode(SensorRight, INPUT); //우측센서포트를 입력으로 정의 pinMode(SensorLeft, INPUT); //좌측센서포트를 입력으로 정의 } void loop() { while(1){ SR = digitalRead(SensorRight); //적외선 센싱 SL = digitalRead(SensorLeft); if (SL==HIGH || SR==HIGH) {//바닥이 검은색이면 back(3); //후진, 좀 더 업그레이드 하면 후반 센서가 감지될때까지 후진. left(3); brake(2); }//정지 else { int minimumValue = Distance_test(); int finalDegree = 0; for (int degree = 150 ; degree> 29 ; degree -=10) { servopulse(6,degree); delay(80); int nowDistance = Distance_test(); if (nowDistance == 0) { nowDistance = 200; } if (minimumValue > nowDistance) { minimumValue = nowDistance; finalDegree= degree; } } delay(50); Serial.println(finalDegree); if(finalDegree>100) { Serial.println(finalDegree); servopulse(6,90); left(3);//우회전 brake(1); } else if (finalDegree<80) { servopulse(6,90); right(3); brake(1); } else { servopulse(6,90); run(3); brake(1); } } } } float Distance_test() // 전방거리측정 { digitalWrite(Trig, LOW); // 트리거핀LOW 2μs delayMicroseconds(2); digitalWrite(Trig, HIGH); // 트리거핀HIGH 10μs delayMicroseconds(10); digitalWrite(Trig, LOW); // 트리거핀 LOW float Fdistance = pulseIn(Echo, HIGH); // HIGH 시간 읽기 (단위:MICRO SECOND) Fdistance= Fdistance/58; //58로나누면 CM로 변환, Y미터=(X초*344)/2 // X초=( 2*Y미터)/344 ==》X초=0.0058*Y미터 ==》CM = MICRO SECOND/58 return Fdistance; } void servopulse(int servopin,int myangle) //서보모터를 각도만큼 회전 { pulsewidth=(myangle*11)+500;//각도를 500-2480 사이의 펄스값으로 변환 digitalWrite(servopin,HIGH);//서보핀 HIGH delayMicroseconds(pulsewidth);//펄스폭만큼 딜레이 digitalWrite(servopin,LOW);//서보핀 LOW delay(20-pulsewidth/1000);//남은 딜레이 } void front_detection() //전방 장애물 감지 { for(int i=0;i<=5;i++) { servopulse(servopin,90);//서보모터 PWM펄스 발생 } Front_Distance = Distance_test(); } void left_detection() { for(int i=0;i<=15;i++) { servopulse(servopin,175);//서보모터 PWM펄스 발생 } Left_Distance = Distance_test(); } void right_detection() { for(int i=0;i<=15;i++) { servopulse(servopin,5);//서보모터 PWM펄스 발생(우측서보패닝) } Right_Distance = Distance_test(); } void run(int time) // 전진 { digitalWrite(Right_motor_go,HIGH); // 우측모터전진 digitalWrite(Right_motor_back,LOW); analogWrite(Right_motor_go,65);//PWM값 0~255 조정,모터의 회전속도 조절. analogWrite(Right_motor_back,0); digitalWrite(Left_motor_go,HIGH); // 좌측모터전진 digitalWrite(Left_motor_back,LOW); analogWrite(Left_motor_go,60);//PWM값 0~255 조정,모터의 회전속도 조절. analogWrite(Left_motor_back,0); delay(time * 100); //딜레이 } void brake(int time) //제동, 정지 { digitalWrite(Right_motor_go,LOW); digitalWrite(Right_motor_back,LOW); digitalWrite(Left_motor_go,LOW); digitalWrite(Left_motor_back,LOW); delay(time * 100);//딜레이 } void left(int time) //좌회전(좌측정지,우측직진) { digitalWrite(Right_motor_go,HIGH); // 우측모터전진 digitalWrite(Right_motor_back,LOW); analogWrite(Right_motor_go,200); analogWrite(Right_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절. digitalWrite(Left_motor_go,LOW); //좌측모터정지 digitalWrite(Left_motor_back,LOW); analogWrite(Left_motor_go,0); analogWrite(Left_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절. delay(time * 100); //딜레이 } void right(int time) //우회전(우측정지, 좌측직진) { digitalWrite(Right_motor_go,LOW); //우측모터정지 digitalWrite(Right_motor_back,LOW); analogWrite(Right_motor_go,0); analogWrite(Right_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절. digitalWrite(Left_motor_go,HIGH);//좌측모터전진 digitalWrite(Left_motor_back,LOW); analogWrite(Left_motor_go,200); analogWrite(Left_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절. delay(time * 100); //딜레이 } void back(int time) //후진 { digitalWrite(Right_motor_go,LOW); //우측모터후진 digitalWrite(Right_motor_back,HIGH); analogWrite(Right_motor_go,0); analogWrite(Right_motor_back,200);//PWM값 0~255 조정,모터의 회전속도 조절. digitalWrite(Left_motor_go,LOW); //좌측모터후진 digitalWrite(Left_motor_back,HIGH); analogWrite(Left_motor_go,0); analogWrite(Left_motor_back,200);//PWM값 0~255 조정,모터의 회전속도 조절. delay(time * 100); //딜레이 }
긴 코드 죄송합니다.. 하지만 한번 봐주시면 감사하겠습니다.
Forums:
indentation 이 전혀 없군요.
indentation 이 전혀 없군요. maintenance 는 어찌 하시려고...
세벌 https://sebuls.blogspot.kr/
댓글 달기