/*首先,想说,本程序很厉害的,卖这个价便宜了,也有可能是我自恋,哈哈,
我看了许许多多资料和才搞出来,可以参加大比赛拿个好成绩了,可惜我没有机
会了,只是在学校拿了个第一,你拿成绩了给我说下哈*/
/*此程序擅长走直线,曲线,效果很好。还可以直角、十字、丁字、虚线、锐角
最好保证电池电压不要误差大,因为电池电压不同,会导致速度不同,走直线和
弯道没影响,但是对于特殊情况的转弯会有影响,比如电压低了直角转不了90度
转了80度,会使精度变差,但是车车还是会自己调节过来的,另外还要注意,转
弯时程序是停留在延时上,没有一直扫描,具体还需自己在自己车测试,调节。
希望你可以更加优化代码*/
//定义电机引脚
#define leftA_PIN 3
#define leftB_PIN 5
#define righA_PIN 6
#define righB_PIN 9
//定义红外传感器引脚
#define hw1 A0
#define hw2 A1
#define hw3 A2
#define hw4 A3
#define hw5 A4
#define hw6 A5
#define hw7 A6
#define hw8 A7
float wt=10,ct=30; //速度调节参数设置
int sign; //路口判断标志
int error = 0; //速度误差调节值
int hw[8] = {0,0,0,0,0,0,0,0}; //存储传感器状态
int motor_speed = 150; //小车速度
int L_motor_speed; //调节后左电机速度
int R_motor_speed; //调节后右电机速度
void read_hw(); //读取红外线模块状态
void sign_crossing(); //判断路口类型
void m_speed_change(); //电机速度调节
void turn (); //特殊情况转向
void straight_S_line(); //直线和S弯输出控制电机PWM
void serial_data(); //串口显示数据
void m_stop(); //停止函数
void setup()
{
Serial.begin(9600); //串口波特率9600
pinMode (hw1, INPUT); //设置引脚为输入引脚
pinMode (hw2, INPUT); //设置引脚为输入引脚
pinMode (hw3, INPUT); //设置引脚为输入引脚
pinMode (hw4, INPUT); //设置引脚为输入引脚
pinMode (hw5, INPUT); //设置引脚为输入引脚
pinMode (hw6, INPUT); //设置引脚为输入引脚
pinMode (hw7, INPUT); //设置引脚为输入引脚
pinMode (hw8, INPUT); //设置引脚为输入引脚
pinMode (leftA_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (leftB_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (righA_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (righB_PIN, OUTPUT); //设置引脚为输出引脚
m_stop(); //初始状态小车不动
}
void loop()
{
read_hw(); //读取红外线模块状态
sign_crossing(); //判断路口类型
m_speed_change(); //电机速度调节
turn (); //特殊情况转向
straight_S_line(); //直线和S弯 输出控制电机PWM
serial_data(); //串口显示数据
}
void m_stop() //电机不动
{
analogWrite(leftA_PIN,0);
analogWrite(leftB_PIN,0);
analogWrite(righA_PIN,0);
analogWrite(righB_PIN,0);
}
void read_hw() //读取红外传感器数值,
{
hw[0] = digitalRead(hw1);
hw[1] = digitalRead(hw2);
hw[2] = digitalRead(hw3);
hw[3] = digitalRead(hw4);
hw[4] = digitalRead(hw5);
hw[5] = digitalRead(hw6);
hw[6] = digitalRead(hw7);
hw[7] = digitalRead(hw8);
}
void sign_crossing() //判断路口类型,如果左边几个同时扫描到黑线,右边几个没有扫描到黑线,就为左直角转弯,反之右直角转弯。sign为路口状态标记
{
//-----------------------------------------------直角路口判断----------------------------------------------------//
if ((hw[0] == 1) && (hw[1] == 1) && (hw[2] == 1) && (hw[3] == 0) && (hw[4] == 0) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 0))
{ //左90度路口 1 1 1 0 0 0 0 0 左转90度
sign = 1;
}
else if ((hw[0] == 1) && (hw[1] == 1) && (hw[2] == 1) && (hw[3] == 1) && (hw[4] == 0) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 0))
{ //左90度路口 1 1 1 1 0 0 0 0 左转90度
sign = 1;
}
else if ((hw[0] == 1) && (hw[1] == 1) && (hw[2] == 1) && (hw[3] == 1) && (hw[4] ==1) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 0))
{ //左90度路口 1 1 1 1 1 0 0 0 左转90度
sign = 1;
}
else if ((hw[0] == 0) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 0) && (hw[4] == 0) && (hw[5] == 1) && (hw[6] == 1) && (hw[7] == 1))
{ //右90度路口 0 0 0 0 0 1 1 1 右转90度
sign = 2;
}
else if ((hw[0] == 0) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 0) && (hw[4] == 1) && (hw[5] == 1) && (hw[6] == 1) && (hw[7] == 1))
{ //右90度路口 0 0 0 0 1 1 1 1 右转90度
sign = 2;
}
else if ((hw[0] == 0) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 1) && (hw[4] == 1) && (hw[5] == 1) && (hw[6] == 1) && (hw[7] == 1))
{ //右90度路口 0 0 0 1 1 1 1 1 右转90度
sign = 2;
}
//-----------------------------------------------锐角路口判断----------------------------------------------------//
//如果左边第一个扫描到黑线和中间某一个扫描到黑线,就为左锐角转弯,反之右锐角转弯。sign为路口状态标记
else if ((hw[0] == 1) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 1) && (hw[4] == 0) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 0))
{ //左锐角 1 0 0 1 0 0 0 0 左转
sign = 3;
}
else if ((hw[0] == 1) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 0) && (hw[4] == 1) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 0))
{ //左锐角 1 0 0 0 1 0 0 0 左转
sign = 3;
}
else if ((hw[0] == 1) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 1) && (hw[4] == 1) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 0))
{ //左锐角 1 0 0 1 1 0 0 0 左转
sign = 3;
}
else if ((hw[0] == 1) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 0) && (hw[4] == 0) && (hw[5] == 1) && (hw[6] == 0) && (hw[7] == 0))
{ //左锐角 1 0 0 0 0 1 0 0 左转
sign = 3;
}
else if ((hw[0] == 0) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 0) && (hw[4] == 1) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 1))
{ //右锐角 0 0 0 0 1 0 0 1 右转
sign = 4;
}
else if ((hw[0] == 0) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 1) && (hw[4] == 1) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 1))
{ //右锐角 0 0 0 1 1 0 0 1 右转
sign = 4;
}
else if ((hw[0] == 0) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 1) && (hw[4] == 0) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 1))
{ //右锐角 0 0 0 1 0 0 0 1 右转
sign = 4;
}
else if ((hw[0] == 0) && (hw[1] == 0) && (hw[2] == 1) && (hw[3] == 0) && (hw[4] == 0) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 1))
{ //右锐角 0 0 1 0 0 0 0 1 右转
sign = 4;
}
//-----------------------------------------------十字、丁字判断----------------------------------------------------//
//判断是否遇到横线
else if ((hw[0] == 0) && (hw[1] == 1) && (hw[2] == 1) && (hw[3] == 1) && (hw[4] == 1) && (hw[5] == 1) && (hw[6] == 1) && (hw[7] == 0))
{
sign = 5;// 0 1 1 1 1 1 1 0
}
else if ((hw[0] == 0) && (hw[1] == 1) && (hw[2] == 1) && (hw[3] == 1) && (hw[4] == 1) && (hw[5] == 1) && (hw[6] == 1) && (hw[7] == 0))
{
sign = 5;// 0 1 1 1 1 1 1 0
}
else if ((hw[0] == 1) && (hw[1] == 1) && (hw[2] == 1) && (hw[3] == 1) && (hw[4] == 1) && (hw[5] == 1) && (hw[6] == 1) && (hw[7] == 1))
{
sign = 5;// 1 1 1 1 1 1 1 1
}
else if (sign = 5) //此处为判断的 十字、丁字
{
analogWrite(leftA_PIN, 160);
analogWrite(leftB_PIN, 0);
analogWrite(righA_PIN, 160);
analogWrite(righB_PIN, 0);
delay(50);//直行50ms后判断是否还能扫描到黑线
if ((hw[0] == 0) && (hw[1] == 0) && (hw[2] == 0) && (hw[3] == 0) && (hw[4] == 0) && (hw[5] == 0) && (hw[6] == 0) && (hw[7] == 0))
{
sign = 6; // 0 0 0 0 0 0 0 0 未扫扫描到黑线,丁字路口,可以设置左右转
}
else
{
sign = 7; //扫描到黑线,十字路口,可以设置左右转和前
8路循迹小车_3.zip
需积分: 0 25 浏览量
2023-11-23
17:00:22
上传
评论
收藏 8KB ZIP 举报
2301_81308243
- 粉丝: 0
- 资源: 1