这是关于沿墙的代码:int red_led = 11;volatile int proximity8 ;unsigned char analogPin8 = A0A1A2A3A4A5A6A7;int PWM_left = 6;int left_dir = 7;int PWM_right = 5;int right_dir = 2;volatile int base_speed = 12;void
int red_led = 11; volatile int proximity[8] ; unsigned char analogPin[8] = {A0,A1,A2,A3,A4,A5,A6,A7}; int PWM_left = 6; int left_dir = 7; int PWM_right = 5; int right_dir = 2; volatile int base_speed = 12;
void setup() { // put your setup code here, to run once: pinMode(red_led,OUTPUT); Serial.begin(57600); }
void loop() {
// put your main code here, to run repeatedly:
// 检测左侧是否有墙
if(digitalRead(5) == HIGH || digitalRead(6) == HIGH || digitalRead(7) == HIGH){
// 左侧有墙,按照沿墙代码进行运动
int distance1 = readProximityDistance(7);
int distance2 = readProximityDistance(5);
Serial.print("distance1:");
Serial.println(distance1);
Serial.print("distance2:");
Serial.println(distance2);
if((distance1>=15 && distance1<20)&&(distance2>=15 && distance2<20) )
{
leftMotorForward(base_speed+2);
rightMotorForward(base_speed);
}
else if(distance1>=20 && distance2<20)
{
leftMotorForward(base_speed);
rightMotorForward(base_speed+1);
}
else if(distance1>=20 && distance2>=20){
leftMotorForward(base_speed);
rightMotorForward(base_speed+3);
}
else if(distance1<15 && distance2>15){
leftMotorForward(base_speed+3);
rightMotorForward(base_speed);
}
else if (distance1<15 && distance2<15){
leftMotorForward(base_speed+5);
rightMotorForward(base_speed);
}
}else{
// 左侧无墙,检测前方是否有障碍物
int distance0 = readProximityDistance(0);
int distance2 = readProximityDistance(2);
if(distance0 < 15 && distance2 > 15){
// 前方有障碍物且右侧无障碍物,右转
rightTurn();
}else{
// 没有障碍物,继续沿左侧墙运动
int distance1 = readProximityDistance(7);
int distance2 = readProximityDistance(5);
Serial.print("distance1:");
Serial.println(distance1);
Serial.print("distance2:");
Serial.println(distance2);
if((distance1>=15 && distance1<20)&&(distance2>=15 && distance2<20) )
{
leftMotorForward(base_speed+2);
rightMotorForward(base_speed);
}
else if(distance1>=20 && distance2<20)
{
leftMotorForward(base_speed);
rightMotorForward(base_speed+1);
}
else if(distance1>=20 && distance2>=20){
leftMotorForward(base_speed);
rightMotorForward(base_speed+3);
}
else if(distance1<15 && distance2>15){
leftMotorForward(base_speed+3);
rightMotorForward(base_speed);
}
else if (distance1<15 && distance2<15){
leftMotorForward(base_speed+5);
rightMotorForward(base_speed);
}
}
}
}
void initIRLED(){ DDRA |= B11111111; PORTA &= B00000000; }
void proxLEDon(unsigned char proxIndex){ PORTA |= 1<<proxIndex; }
void proxLEDoff(unsigned char proxIndex){ PORTA &= ~(1<<proxIndex); }
int readProximityDistance(unsigned char proxIndex){
int distance;
proxLEDon(proxIndex);
delay(1);
proximity[proxIndex] = analogRead(analogPin[proxIndex]);
// Serial.print("Sensor ");
// Serial.print("proxIndex :");
// Serial.println(proximity[proxIndex]);
// Serial.print("Sensor ");
// Serial.print("proxIndex :");
// Serial.print("proximity distance:");
distance = 3.425pow(2.7182,0.0026proximity[proxIndex]);
// Serial.print(distance); //y = a*x +b parametera and b are obtained through execl data fitting
// Serial.println("mm");
proxLEDoff(proxIndex);
return distance;
}
void MotorStop(){ digitalWrite(right_dir, HIGH); digitalWrite(PWM_right, HIGH);
digitalWrite(left_dir, HIGH); digitalWrite(PWM_left, HIGH); }
void leftMotorForward(float duty){ int dutyInt = duty; int dutyVal = map(dutyInt,0,100,0,100);
analogWrite(PWM_left, dutyVal); analogWrite(left_dir, 0); }
void rightMotorForward(float duty){ int dutyInt = duty; int dutyVal = map(dutyInt,0,100,0,100); analogWrite(PWM_right, dutyVal); analogWrite(right_dir, 0); }
void leftMotorBackward(float duty){
int dutyInt = duty;
int dutyVal = map(dutyInt,0,100,0,80);
analogWrite(PWM_left, 0);
analogWrite(left_dir, dutyVal);
}
void rightMotorBackward(float duty){ int dutyInt = duty; int dutyVal = map(dutyInt,0,100,0,80); analogWrite(PWM_right, 0); analogWrite(right_dir, dutyVal); }
void rightTurn(){ // 右转代码 leftMotorForward(base_speed+3); rightMotorBackward(base_speed+3); delay(1000); MotorStop();
原文地址: http://www.cveoy.top/t/topic/fHX7 著作权归作者所有。请勿转载和采集!