
【立创开发板】三红外巡线小车
简介
使用三个红外避障传感器自动控制小车沿黑色线路行走。
简介:使用三个红外避障传感器自动控制小车沿黑色线路行走。开源协议
:MIT
描述
题目要求
使用三个红外避障传感器自动控制小车沿黑色线路行走,要求能走直线、弧线,能在直角、钝角、锐角转弯,能避开途中的干扰线。
题目分析
巡线小车要根据红外传感器的电平输出判断车辆是否已偏离线路,设计了三个红外避障传感器,中间的传感器在线上,左右传感器在线的边缘包裹黑线。
巡线小车功能设计图
在巡线功能的修正设计中,我将左传感器的修正值设为-1,右传感器的修正值设为1,P值为这两个修正值相加,这样当左右同时修正时表示可能遇到了干扰线从而使车辆依然保持前进;中间传感器用于判断车辆是否严重偏离路线,严重偏离时要加速修正;如果三个传感器全部到了线外表示车辆已经超出线路区域,需要原地向修正方向修正。
原理图设计
小车的很多功能模块都采购市售的模块,稳定可靠,可以简化PCB设计,避免因设计失误导致PCB报废反复变更PCB设计。
小车底盘
采购市售的成品三轮小车底盘,电机固定稳固,有很多的固定孔方便固定模块和PCB。
4路红外寻迹循迹巡线模块
该传感器模块对环境光线适应能力强,其每个感应子模块具有一对红外线发射与接收管,可通过电位器旋钮调节检测距离,顺时针增加,有效距离范围1~12cm,探测角度35°。传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM339比较器,信号干净,波形好,驱动能力强。
双路直流电机驱动模块
产品参数:
1.双路H桥电机驱动,可以同时驱动两路直流电机或者1个4线两相式步进电机;
2模块供电电压3V-14V;
3.信号端输入电压2.2-6V,支持3.3V和TTL电平;
4.单路工作电流5A,峰值电流可达9A,低待机电流(小于 10uA)
5.安装孔直径:2mm。
6.重量:14g
SY8205直流降压模块
产品参数:
输入电源:7V - 30V,建议24V以下
输出电压:5V
输出电流:5A Max.
代码说明
获取传感器状态
测试对比发现使用中断方式读取传感器值没有优势,所以采用了扫描方式在主线程获取传感器值。
变量定义
struct sensor
{
int last_sensor;//最后一次调整的方向
float infrared_left ;//左传感器
float infrared_middle;//中传感器
float infrared_right;//右传感器
} ;
读取传感器值代码
void get_sensor_value()
{
if (gpio_input_bit_get(LEFT_KEY_PORT, LEFT_KEY_PIN) == RESET) // 左传感器触发
{
car_sensor.infrared_left = 0;
}
else
{
car_sensor.infrared_left = -1;
car_sensor.last_sensor = -1;
}
if (gpio_input_bit_get(MIDDLE_KEY_PORT, MIDDLE_KEY_PIN) == RESET) // 中传感器触发
{
car_sensor.infrared_middle = 3.5;
}
else
{
car_sensor.infrared_middle = 0;
}
if (gpio_input_bit_get(RIGHT_KEY_PORT, RIGHT_KEY_PIN) == RESET) // 右传感器触发
{
car_sensor.infrared_right = 0;
}
else
{
car_sensor.infrared_right = 1;
car_sensor.last_sensor = 1;
}
}
PID计算
第一次接触PID计算,不熟不大会用
变量定义(部分变量定义沒用到,懒得删了^_^)
float Kp = 5, Ki = 0.1, Kd = 0.0;
float P = 0.0, I = 0.0, D = 0.0, PID_value = 0.0;//pid参数
计算部分
P = (car_sensor.infrared_left + car_sensor.infrared_right);
I += Ki * (1 + car_sensor.infrared_middle);
PID_value = P * (Kp + I);
P=修正方向,是左右传感器之和
I=累加修正值,使车辆更快回正
如果三个传感器都到了线外则全速转弯回到线上
if (car_sensor.infrared_left == car_sensor.infrared_right && car_sensor.infrared_middle > 0)
{
I = 0;
PID_value = car_sensor.last_sensor * LEFT_SPEED * 2;
}
电机占空比计算代码
(uint32_t)((float)car_period_value * speed / 100.0f)
PWM参数配置里的period参数值*想要设置的占空比/100
由于电机驱动模块在突然改变电机方向时容易烧毁,所以我的代码里要突然改变电机方向需要先输出100%占空比信号刹车50MS,虽然会导致车子抖动,但是可以保护电机驱动模块。
实物展示
PCB架空,下面可以放置电机驱动模块和降压模块,还可以放电池,但是超声波自主寻路功能工作不理想就去掉了超声波自主寻路方案,把电池放在前部当配重。
设计图

BOM


评论