基于arduino的 5路红外循迹小车代码
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);
}
}
#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);
}
}
...全文
相关推荐
在protues仿真的循迹小车
带有原理图的循迹小车资源,程序在protues中可以仿真。。。
Arduino循迹小车源码拆解:从PID控制到TB6612调参实战
智能小车是嵌入式入门和竞赛中的经典实践载体,其核心往往围绕循迹算法展开。在Arduino平台上,通过红外灰度传感器实时采集地面反射信号,结合PID控制原理对电机进行差速调节,即可实现平滑稳定的路径跟踪。这一过程中,传感器阈值标定、电机死区补偿以及PD参数整定,都是决定小车能否高速过弯与直道不偏的关键。本文以5路TCRT5000灰度模块和TB6612驱动为例,从硬件接线、偏差计算到速度输出逐段剖析实用代码,并总结常见故障的排查方法,为初学者与竞赛队伍提供了一套可直接落地的工程参考。
【Arduino】基于Arduino的循迹小车电路连接与程序编写
文章目录L298P工作原理:L298P与其他元件的连接方法:laughing:与Arduino的连接与红外传感器的连接:smile_cat:电机的连接程序编写:smiley:Aruino函数说明初始宏定义功能函数定义初始化函数主任务循环完整代码如下:haircut:无法循迹、出现错误怎么调:apple: Author:1071094493@qq.com L298P工作原理: 上图是本文中使用的L298P驱动,他的作用是经输入的3.3V或5V低压信号转换为高压信号。 上图是L298P的原理图,从
8路循迹小车_3.zip
8路循迹小车_3.zip
循迹车参考资料
做循迹车的来,可以参考下,很实用的资料。


