问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C51单片机控制小车项目笔记:循迹、避障与OLED二次开发

创作时间:
作者:
@小白创作中心

C51单片机控制小车项目笔记:循迹、避障与OLED二次开发

引用
CSDN
1.
https://m.blog.csdn.net/L_1068/article/details/144310237

一、循迹小车

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号