C51单片机控制小车项目笔记:循迹、避障与OLED二次开发
C51单片机控制小车项目笔记:循迹、避障与OLED二次开发
一、循迹小车
TCRT5000传感器的红外发射二极管不断发射红外线。当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态。当被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。
循迹模块TCRT5000的外观如下图所示:
接线方式如下:
- VCC: 接电源正极(3-5V)
- GND: 接电源负极
- DO: TTL开关信号输出0、1
- AO: 模拟信号输出(不同距离输出不同的电压,此脚一般可以不接)
循迹小车的工作原理是:由于黑色具有较强的吸收能力,当循迹模块发射的红外线照射到黑线时,红外线将会被黑线吸收,导致循迹模块上光敏三极管处于关闭状态,此时模块上一个LED熄灭。在没有检测到黑线时,模块上两个LED常亮。
循迹模块安装在小车车头两侧。当小车下方两个模块都能反射回红外线时,输出低电平,灯亮,小车直走。当上方小车左模块遇到黑线时,红外线被吸收,左模块输出高电平,右模块输出低电平,小车左转,反之右转。
代码如下:
void main()
{
Time0Init();
Time1Init();
//UartInit();
//Delay1000ms();
while(1){
if(leftSensor == 0 && rightSensor == 0){//前进
speedLeft = 28;//10份单位时间全速运行,30份停止,所以慢,20ms是40份的500us
speedRight = 30;
}
if(leftSensor == 1 && rightSensor == 0){//左转
speedLeft = 10;//10份单位时间全速运行,30份停止,所以慢,20ms是40份的500us
speedRight = 40;
}
if(leftSensor == 0 && rightSensor == 1){//右转
speedLeft = 28;
speedRight = 15;
}
if(leftSensor == 1 && rightSensor == 1){//停止
speedLeft = 0;
speedRight = 0;
}
}
}
走直线的时候,如果小车往左偏,证明左边马达比右边马达马力大,所以要把右边的速度调快,多次测试,找到合适的数值。
二、跟随小车/避障小车
使用的模块包括超声波、舵机、C51开发板、电机等。以下是避障小车的演示视频和代码:
代码如下:
char dir;
double disMiddle;
double disRight;
double disLeft;
Time1Init();//定时器1初始化
Time0Init();//定时器0初始化
//舵机初始位置
sgMiddle();//正前方
Delay200ms();
Delay200ms();
dir = MIDDLE;//用临时变量接收MIDDLE、LEFT、RIGHT的值,用它来判断当前小车头的状态
while(1){
//PWM(脉冲宽度调制)信号来控制旋转角度
//2.0ms的高电平时间对应舵机转动到135°,而2.5ms的高电平时间对应舵机转动到180,我现在是2.0ms
if(dir != MIDDLE){//车头不在正前方
sgMiddle();
dir = MIDDLE;//让车头变为正前方
Delay200ms();
}
disMiddle = get_distance();//测距
if(disMiddle>35){//前方距离大于35
//前进
Delay200ms();
openStatusLight();//距离D5亮D6灭
goForward();//向前走
}else if(disMiddle < 20){//前方距离小于20
goBack();//后退
Delay20ms();
}else{
//停止
stop();
//测左边距离
closeStatusLight();//D5灭D6亮
sgLeft();//
Delay200ms();
//Delay2000ms();
disLeft = get_distance();//左边距离
sgMiddle();
Delay20ms();
//Delay2000ms();
sgRight();
dir = RIGHT;
Delay200ms();
//Delay2000ms();
disRight = get_distance();//右边距离
if(disLeft < disRight){//如果右边距离大于左边距离,则向右转
goRight();
Delay20ms();
stop();
}
if(disLeft > disRight){//如果左边距离大于右边距离,则向左转
goLeft();
Delay20ms();
stop();
}
}
}
}
三、OLED二次开发小车
实现用OLED显示小车速度,还可以通过蓝牙模块显示小车的速度和控制小车前后左右移动。这里使用的测速模块用于电机转速测试。有遮挡时输出高电平,无遮挡时输出低电平。
- 测试原理和单位换算:
轮子走一圈,经过一个周长,C = 2x3.14x半径= 3.14 x 直径(6.5cm) 对应的码盘也转了一圈,码盘有20个格子,每经过一个格子,会遮挡(高电平)和不遮挡(低电平), 那么一个脉冲就是走了 3.14 * 6.5 cm /20 = 1.0205CM
定时器可以设计成一秒,统计脉冲数,一个脉冲就是1cm 假设一秒有80脉冲,那么就是80cm/s