基于arduino的 5路红外循迹小车代码

窦直坦 18053688908 2020-07-01 12:22:02
arduino 5路红外循迹。纯新手 不会发代码到论坛


#define STOP 0
#define FORWARD 1
#define BACKWARD 2
#define STURNLEFT 3
#define STURNRIGHT 4
#define TURNLEFT 5
#define TURNRIGHT 6
#define TURNRIGHT90 7
#define TURNLEFT90 8
#define TURNLEFT360 9
#define TURNRIGHT360 10

#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;

int leftA_PIN = A0;
int leftB_PIN = A1;
int righA_PIN = A2;
int righB_PIN = A3;
int righ_PWM = 5;
int left_PWM = 6;

int trac1 = 11; //从车头方向的最右边开始排序
int trac2 = 10;
int trac3 = 9;
int trac4 = 8;
int trac5 = 7;

void setup()
{
//电机引脚初始化
Serial.begin(9600);
pinMode(leftA_PIN, OUTPUT);
pinMode(leftB_PIN, OUTPUT);
pinMode(righA_PIN, OUTPUT);
pinMode(righB_PIN, OUTPUT);
pinMode(righ_PWM, OUTPUT);
pinMode(left_PWM, OUTPUT);
pinMode(2, OUTPUT);

Serial.begin(9600);
Wire.begin();
sensor.init();
sensor.setTimeout(500);
sensor.startContinuous();



//寻迹模块D0引脚初始化
pinMode(trac1, INPUT);
pinMode(trac2, INPUT);
pinMode(trac3, INPUT);
pinMode(trac4, INPUT);
pinMode(trac5, INPUT);
}

void loop() {
int buttonState = 0;//模式开关LOW-0循迹,HIGH-1蓝牙
pinMode(4, INPUT); //模式开关
buttonState = digitalRead(4);
if (buttonState == HIGH) {

while(Serial.available())
{
char val=Serial.read();

if(val=='w'){
Serial.println("前进");
Serial.write("前进");
Serial.println();
motorRun(FORWARD);
}
else if(val=='s'){
Serial.println("后退");
Serial.write("后退");
Serial.println();
motorRun(BACKWARD);

}

else if(val=='d'){
Serial.println("右转");
Serial.write("右转");
Serial.println();
motorRun(TURNRIGHT);
delay(200);
motorRun(STOP);
}

else if(val=='a'){
Serial.println("左转");
Serial.write("左转");
Serial.println();
motorRun(TURNLEFT);
delay(200);
motorRun(STOP);
}

else if(val=='t'){
Serial.println("停止");
Serial.write("停止");
Serial.println();
motorRun(STOP);
}
else if(val=='l'){
Serial.println("原地左转360");
Serial.write("原地左转360");
Serial.println();
motorRun(TURNLEFT360);
motorRun(STOP);
}

else if(val=='r'){
Serial.println("原地右转360");
Serial.write("原地右转360");
Serial.println();
motorRun(TURNRIGHT360);
motorRun(STOP);
}




}

}
else
if (sensor.readRangeSingleMillimeters()<200)
{
digitalWrite(2,HIGH);
delay(100);
digitalWrite(2,LOW);

motorRun(BACKWARD);
delay(500);
}

else
tracing();
delay(5);
}


void motorRun(int cmd)
{
Serial.print(sensor.readRangeSingleMillimeters());
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

Serial.println();



switch(cmd){
case FORWARD:
Serial.println("FORWARD"); //输出状态
digitalWrite(leftA_PIN,LOW);
digitalWrite(leftB_PIN,HIGH);
digitalWrite(righA_PIN,LOW);
digitalWrite(righB_PIN,HIGH);
analogWrite(left_PWM,33);
analogWrite(righ_PWM,30); //左轮前进40 右轮前进40
break;
case BACKWARD:
Serial.println("BACKWARD"); //输出状态
digitalWrite(leftA_PIN,HIGH);
digitalWrite(leftB_PIN,LOW);
digitalWrite(righA_PIN,HIGH);
digitalWrite(righB_PIN,LOW);
analogWrite(left_PWM,25);
analogWrite(righ_PWM,25); //左轮后退40 右轮后退40
break;
case TURNLEFT:
Serial.println("TURN LEFT"); //输出状态
digitalWrite(leftA_PIN,LOW);
digitalWrite(leftB_PIN,HIGH);
digitalWrite(righA_PIN,LOW);
digitalWrite(righB_PIN,HIGH);
analogWrite(left_PWM,25);
analogWrite(righ_PWM,55); //左轮前进20 右轮前进45
delay(50);
break;
case STURNLEFT:
Serial.println("STURN LEFT"); //输出状态
digitalWrite(leftA_PIN,LOW);
digitalWrite(leftB_PIN,HIGH);
digitalWrite(righA_PIN,LOW);
digitalWrite(righB_PIN,HIGH);
analogWrite(left_PWM,10);
analogWrite(righ_PWM,35); //左轮前进30 右轮前进45
break;

case TURNRIGHT:
Serial.println("TURN RIGHT"); //输出状态
digitalWrite(leftA_PIN,LOW);
digitalWrite(leftB_PIN,HIGH);
digitalWrite(righA_PIN,LOW);
digitalWrite(righB_PIN,HIGH);
analogWrite(left_PWM,55);
analogWrite(righ_PWM,25); //左轮前进45 右轮前进20
break;

case STURNRIGHT:
Serial.println("STURN RIGHT"); //输出状态
digitalWrite(leftA_PIN,LOW);
digitalWrite(leftB_PIN,HIGH);
digitalWrite(righA_PIN,LOW);
digitalWrite(righB_PIN,HIGH);
analogWrite(left_PWM,35);
analogWrite(righ_PWM,10); //左轮前进45 右轮前进30
break;

case TURNRIGHT90:
Serial.println("TURN RIGHT 90"); //输出状态
digitalWrite(leftA_PIN,LOW); //HIGH 右90
digitalWrite(leftB_PIN,HIGH); //LOW
digitalWrite(righA_PIN,HIGH);
digitalWrite(righB_PIN,LOW);
analogWrite(left_PWM,40);
analogWrite(righ_PWM,20);
delay(590);
break;

case TURNLEFT90:
Serial.println("STURN LEFT 90"); //输出状态
digitalWrite(leftA_PIN,HIGH); //HIGH 左90
digitalWrite(leftB_PIN,LOW); //LOW
digitalWrite(righA_PIN,LOW);
digitalWrite(righB_PIN,HIGH);
analogWrite(left_PWM,20);
analogWrite(righ_PWM,40);
delay(520);
break;


case TURNLEFT360:
Serial.println("STURN LEFT 360"); //输出状态
digitalWrite(leftA_PIN,HIGH); //HIGH 左90
digitalWrite(leftB_PIN,LOW); //LOW
digitalWrite(righA_PIN,LOW);
digitalWrite(righB_PIN,HIGH);
analogWrite(left_PWM,40);
analogWrite(righ_PWM,40);
delay(2580);
motorRun(STOP);
break;
case TURNRIGHT360:
Serial.println("TURN RIGHT 360"); //输出状态
digitalWrite(leftA_PIN,LOW); //HIGH 右90
digitalWrite(leftB_PIN,HIGH); //LOW
digitalWrite(righA_PIN,HIGH);
digitalWrite(righB_PIN,LOW);
analogWrite(left_PWM,40);
analogWrite(righ_PWM,40);
delay(2760);
motorRun(STOP);
break;



default:
Serial.println("STOP"); //输出状态
digitalWrite(leftA_PIN,0);
digitalWrite(leftB_PIN,0); //左轮静止不动
digitalWrite(righA_PIN,0);
digitalWrite(righB_PIN,0); //右轮静止不动
}
}
void tracing()
{
int data[3];
data[0] = digitalRead(11);
data[1] = digitalRead(10);
data[2] = digitalRead(9);
data[3] = digitalRead(8);
data[4] = digitalRead(7);
Serial.print(data[0]);
Serial.print("---");
Serial.print(data[1]);
Serial.print("---");
Serial.print(data[2]);
Serial.print("---");
Serial.print(data[3]);
Serial.print("---");
Serial.println(data[4]);




if(!data[0]&&!data[1]&&!data[2]&&!data[3]&&!data[4]||data[0]&&data[1]&&!data[2]&&data[3]&&data[4])//00000直行
{

motorRun(FORWARD);
}

else if(data[0]&&!data[1]&&!data[2]&&!data[3]&&!data[4]) //10000左转
{
motorRun(TURNLEFT);
}


else if(data[0]&&data[1]&&data[2]&&!data[3]&&!data[4]||data[0]&&data[1]&&!data[2]&&!data[3]&&!data[4]) //11100或11000左转90度
{
motorRun(TURNLEFT90);
}

else if(!data[0]&&data[1]&&!data[2]&&!data[3]&&!data[4]) //01000小左转
{
motorRun(STURNLEFT);
}

else if(!data[0]&&!data[1]&&!data[2]&&data[3]&&!data[4]) //00010小右转
{
motorRun(STURNRIGHT);
}

else if(!data[0]&&!data[1]&&!data[2]&&!data[3]&&data[4]) //00001右转
{
motorRun(TURNRIGHT);
}



else if(!data[0]&&!data[1]&&!data[2]&&!data[3]&&data[4]||!data[0]&&!data[1]&&!data[2]&&data[3]&&data[4]) //00111或00011右转90度
{
motorRun(TURNRIGHT90);
}

else if(data[0]&&data[1]&&data[2]&&data[3]&&data[4]) //11111停止
{

motorRun(STOP);
}

}
...全文
1924 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5,337

社区成员

发帖
与我相关
我的任务
社区描述
硬件使用专区,欢迎大家讨论硬件相关内容 宝藏!数字IC精品文章收录(CSDN近500篇) http://t.csdn.cn/QbivO
社区管理员
  • 硬件使用社区
  • 张江打工人
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧