6.2小车循迹,跟随,摇头测距功能实现

2023-11-13

1.循迹小车

  1. 1循迹模块的使用

TCRT5000传感器的红外发射二极管不断发射红外线 当发射出的红外线没有被反射回来或被反射回来但强度不够大时, 红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态 被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和, 此时模块的输出端为低电平,指示二极管被点亮
  • 总结就是一句话,没反射回来,D0输出高电平,灭 灯

  • 接线方式 VCC:接电源正极(3-5V) GND:接电源负极 DO:TTL开关信号输出0、1 AO:模拟信号输出(不同距离输出不同的电压,此脚一般可以不接),ADC在后面学习stm32中学到

1.2 循迹小车原理

由于黑色具有较强的吸收能力,当循迹模块发射的红外线照射到黑线时,红外线将会被黑线吸收,导致 循迹模块上光敏三极管处于关闭状态,此时模块上一个LED熄灭。在没有检测到黑线时,模块上两个LED 常亮

  • 总结就是一句话,有感应到黑线,D0输出高电平 ,灭灯

循迹模块安装在小车车头两侧 下方小车两个模块都能反射回来红外,输出低电平,灯亮,直走 上方小车左模块遇到黑线,红外被吸收,左模块输出高电平,右模块输出低电平,左转,反之右转

1.3代码-循迹小车不调速

main.c

void main()
{
//    没反射回来,D0输出高电平,灭灯      都反射回来亮灯
//    Timer0Init();
//    Timer1Init();
//    UartInit();

    while(1){
        if(LeftTarce == 0 && RightTarce == 0){
           goForward();
    
         }
        if(LeftTarce == 0 && RightTarce == 1){
            goRight();
        }
        if(LeftFollow == 1 && RightTarce == 0){
             goLeft();
        }
        if(LeftTarce == 1 && RightTarce == 1){
          stop();
        }
    }    

}

1.4代码-循迹小车调速

main.c

#include "reg52.h"
#include "motor.h"
#include "delay.h"
#include "config.h"
#include "time.h"

extern int speedLeft;
extern int speedRight;

void main()
{
//    没反射回来,D0输出高电平,灭灯
    Timer0Init();
    Timer1Init();
//    UartInit();

    while(1){
        if(LeftTarce == 0 && RightTarce == 0){
           //都反射回来,没遇到黑色,直走
           speedLeft   = 70;
           speedRight = 70;
         }
        if(LeftTarce == 0 && RightTarce == 1){
           //右侧遇到黑色,需要右转
           speedLeft   = 80;
           speedRight  = 10;
        }
        if(LeftTarce == 1 && RightTarce == 0){
          //左侧遇到黑色,需要右转
          speedLeft   = 10;
          speedRight  = 80;
        }
        if(LeftTarce == 1 && RightTarce == 1){
          //都遇到黑色
          speedLeft   = 0;
          speedRight  = 0;
        }
    }
    
}

motoc.c

#include "reg52.h"
#include "config.h"

void goForwardLeft()
{
    LeftCon1A = 0;    
    LeftCon1B = 1;
}

void goForwardRight()
{
    RightCon1A = 0;
    RightCon1B = 1;
}

void stopLeft()
{
    LeftCon1A = 0;    
    LeftCon1B = 0;
}

void stopRight()
{
    RightCon1A = 0;
    RightCon1B = 0;
}


void goBack()
{
    RightCon1A = 1;
    RightCon1B = 0;

    LeftCon1A = 1;    
    LeftCon1B = 0;
}
void goForward()
{
    RightCon1A = 0;
    RightCon1B = 1;

    LeftCon1A = 0;    
    LeftCon1B = 1;
}
void goRight()
{
    RightCon1A = 0;
    RightCon1B = 0;

    LeftCon1A = 0;    
    LeftCon1B = 1;
}
void goLeft()
{
    RightCon1A = 0;
    RightCon1B = 1;

    LeftCon1A = 0;    
    LeftCon1B = 0;
}
void stop()
{
    RightCon1A = 0;
    RightCon1B = 0;

    LeftCon1A = 0;    
    LeftCon1B = 0;
}

time.c

#include "reg52.h"
#include "motor.h"
sfr AUXR = 0x8e;

int cntLeft  = 0;
int cntRight = 0;
int speedLeft;
int speedRight;

void Timer0Init(void)        //500微秒@11.0592MHz
{
    AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;        //设置定时器模式      
    TL0 = 0x33;        //设置定时初值
    TH0 = 0xFE;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    EA  = 1;
    ET0 = 1;
}

void Timer1Init(void)        //500微秒@11.0592MHz
{
    AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0x0F;        //设置定时器模式
    TMOD |= 0x20;        //设置定时器模式      
    TL1 = 0x33;        //设置定时初值
    TH1 = 0xFE;        //设置定时初值
    TF1 = 0;        //清除TF0标志
    TR1 = 1;        //定时器0开始计时
    EA  = 1;
    ET1 = 1;
}

void Time0Init() interrupt 1
{
        cntLeft++;       //统计爆表的次数     
        //重新给初值
        TL0 = 0x33;
        TH0 = 0xFE;
        if(cntLeft < speedLeft){
            goForwardLeft();
        }else{
            stopLeft();    
        }

        if(cntLeft == 80){
            cntLeft = 0;
        }
}

void Time1Init() interrupt 3
{
        cntRight++;       //统计爆表的次数     
        //重新给初值
        TL1 = 0x33;
        TH1 = 0xFE;
        if(cntRight < speedRight){
            goForwardRight();
        }else{
            stopRight();    
        }

        if(cntRight == 80){
            cntRight = 0;
        }
}

2. 跟随小车

2.1红外壁障模块分析

原理和寻线是一样的,寻线红外观朝下,跟随朝前

2.2跟随小车的原理

左边跟随模块能返回红外,输出低电平,右边不能返回,输出高电平,说明物体在左边,需要左转 右边跟随模块能返回红外,输出低电平,左边不能返回,输出高电平,说明物体在右边,需要右转

2.3代码-跟随小车

void main()
{
//左边跟随模块能返回红外,输出低电平,右边不能返回,输出高电平,说明物体在左边,需要左转
//右边跟随模块能返回红外,输出低电平,左边不能返回,输出高电平,说明物体在右边,需要右转
    while(1){
        if(LeftFollow == 0 && RightFollow == 0){
           goForward();
    
         }
        if(LeftFollow == 0 && RightFollow == 1){
            goLeft();
        }
        if(LeftFollow == 1 && RightFollow == 0){
             goRight();
        }
        if(LeftFollow == 1 && RightFollow == 1){
          stop();
         }
        }
}

3. 摇头测距小车

  • 1. 改装垃圾桶代码 2. 实现摇头功能,实现疯狂摇头

3.1上代码-疯狂摇头

#include "reg52.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"
void main()
{
    Time0Init();
    Time1Init();
    //舵机的初始位置
    sgMiddle();
    Delay300ms();
    Delay300ms();
    while(1){
    sgLeft();
    Delay300ms();
    sgMiddle();
    Delay300ms();
    sgRight();
    Delay300ms();
    sgMiddle();
    Delay300ms();
    }
}


#include "reg52.h"
#include "delay.h"
sbit sg90_con = P1^1;
int jd;
int cnt = 0;
void Time0Init()
{
    //1. 配置定时器0工作模式位16位计时
    TMOD &= 0xF0; //设置定时器模式
    TMOD |= 0x01;
    //2. 给初值,定一个0.5出来
    TL0=0x33;
    TH0=0xFE;
    //3. 开始计时
    TR0 = 1;
    TF0 = 0;
    //4. 打开定时器0中断
    ET0 = 1;
    //5. 打开总中断EA
    EA = 1;
}

void sgMiddle()
{
    //中间位置
    jd = 3; //90度 1.5ms高电平
    cnt = 0;
}
void sgLeft()
{
    //左边位置
    jd = 5; //135度 1.5ms高电平
    cnt = 0;
}
void sgRight()
{
    //右边位置
    jd = 1; //0度
    cnt = 0;
}
void Time0Handler() interrupt 1
{
    cnt++; //统计爆表的次数. cnt=1的时候,报表了1
    //重新给初值
    TL0=0x33;
    TH0=0xFE;
    //控制PWM波
    if(cnt < jd){
        sg90_con = 1;
    }else{
        sg90_con = 0;
    }
    if(cnt == 40){//爆表40次,经过了20ms
        cnt = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
        sg90_con = 1;
    }
}

3.2 添加电机,实现测距摇头,“懂得避障”

main.c

void main()
{
    char dir;
    double disMiddle;
    double disLeft;
    double disRight;

    Time0Init();
    Time1Init();

    sgMiddle();
    Delay300ms();
    Delay300ms();
    dir = MIDDLE;
    while(1){
        
        disMiddle = get_distance();
        if(disMiddle > 20){
            //前进
            goForward();
            
        }
        else if(disMiddle < 7){
            goBack();
            Delay150ms();
            stop();
        }
        else{
            sgRight();
            Delay300ms();
            disRight = get_distance();

            sgMiddle();
            Delay300ms();
            disMiddle = get_distance();

            sgLeft();
            Delay300ms();
            dir = LEFT;
            disLeft = get_distance();

            if(disRight < disLeft){
                goLeft();
                Delay200ms();
                stop();
            }
            if(disRight > disLeft){
                goRight();
                Delay200ms();
                stop();
            }
            
        }
        if(dir != MIDDLE){
            sgMiddle();
            dir = MIDDLE;
            Delay300ms();
        }
    }                         
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

6.2小车循迹,跟随,摇头测距功能实现 的相关文章

  • Java I/O (第二版) I/O基础 I/O概述

    第一部分 第一章 介绍I O 输入和输出 的简写I O 它是任何操作系统和程序设计语言所必须的基础功能 只有空想家才会喜欢没有输入输出的程序 同时 IO的话题似乎对程序员没有什么吸引力 其实不然 我们应该有很多有趣的东西需要学习在IO中 J
  • react从入门到精通总结(一)

    React简介 React 是一个用于构建用户界面的 JS 库 主要用于构建UI React由美国的公司Facebook在2011年诞生并于2013年开源发布 特点 1 声明式设计 React采用声明范式 可以轻松描述应用 2 高效使用虚拟
  • Django 连接redis

    安装 pip install django redis redis安装 docker pull redis latest docker run d name redis p 6379 6379 redis requirepass passw

随机推荐

  • STL容器

    这里写目录标题 三大组件介绍 1 容器 2 算法 3 迭代器 STL容器 string容器 vector容器 deque容器 stack容器 queue容器 list容器 set multiset容器 map multimap容器 常见面试
  • 【LeetCode第1场双周赛】

    第 1 场双周赛 A 模拟 class Solution public int fixedPoint vector
  • 计算机网络设备子系统,网络综合布线七大子系统详细讲解

    打开APP 查看更多精彩图片 在实施时主要注意以下几点 1 确定介质布线方法和线缆走向 2 双绞线的长度一般不超过90m 3 尽量避免水平线路长距离与供电线路平行走线 应保持一定的距离 非屏蔽缆线一般为30cm 屏蔽缆线一般为7cm 4 线
  • 基于STM32的LVGL的实时日历设置界面

    基于STM32的LVGL的实时日历设置界面 提示 STM32 RTC littlevgl GUI 设置时间代码 if obj Set time btn 点击对象为设置按钮 if event LV EVENT RELEASED uint8 t
  • 轻量级Transformer模型ConvBERT架构及完整源码实现

    第28章 使用Local dependency轻量级Transformer模型ConvBERT架构内幕及完整源码实现 1 BERT依赖global self attention而带来的问题分析 2 BERT不同Layer的computati
  • 向电脑(windows11 OS环境)的所有外挂移动硬盘写入数据提示目标文件夹访问被拒绝的解决方法

    向电脑 windows11 OS环境 的所有外挂移动硬盘写入数据 就是在粘贴文件 出现以下提示框 解决办法流程如下 运行窗口 输入 gpedit msc 命令 按 确定或回车 快速打开本地组策略编辑器 本地组策略编辑器窗口 依次展开 计算机
  • esp32-S3专题二:内存2之RTC内存、FLASH使用

    承接上文 讲一下esp32上剩下的几个存储空间的用途 目录 一 RTC存储器 一 RTC 快速存储器 二 RTC 慢速存储器 二 Flash 一 NVS 表 二 程序和OTA分区 三 SPIFFS 文件系统 三 总结 一 RTC存储器 es
  • 不安全的加密算法

    不安全的加密算法 SKIPJACK RC4 RSA 1024位以下 des md2 md4 md5 属于经过验证 安全的 公开的加密算法 RSA DSA ECDSA 加入盐值的SHA256 推荐使用的数字签名算法有 DSA ECDSA
  • 值得重点推荐的BI软件有哪些?全在这里了

    在数字化程度越来越高的趋势下 发挥着推动企业数字化转型重要作用的商业智能BI也在不断提升市场份额 也催生出不少的BI软件新星 那么 BI软件有哪些 哪些BI软件更普遍适用于不同行业 针对这些问题 我们做了以下总结 BI软件有哪些 国内比较老
  • goland missing dependency错误

    新建一个项目 里面引用到第三方的包 项目编译没有问题 可是在goland里按住ctrl 鼠标点击打算跳转到第三方包相应的实现时却跳转不了 import的第三方也标红 同时go mod文件该第三方包也是标红的 看这篇文章 出现的问题和我的比较
  • moviepy音视频开发:音频拼接函数concatenate_audioclips介绍

    前往老猿Python博文目录 concatenate audioclips函数用于将多个音频剪辑进行拼接合成一个顺序播放的剪辑 调用语法 concatenate audioclips clips 说明 clips参数用于存放需要顺序拼接的音
  • 【备忘】Linux上传文件,下载文件

    背景小故事 这次在迁移服务器的时候要把ssl文件传到Linux里面 但是我又不想用ide来传 之前看同事演示过 当时没记住 感觉他简单操作就可以了 这次打算学会它 这功能用得不多 平常都不怎么使用 我们也可以用客户端连接服务器进行上传 方法
  • Android 设备 设置adb自动监听tcp 5555端口,重启有效

    Android 设备调试有两种连线方式 有线和无线 有线是通过USB导线连接android设备和电脑端 无线方式是通过连接WIFI 通过TCP的方式 连接设备和电脑端 一般用 5555端口 有线的调节 只需要打开调试模式基本就可以了 无线连
  • VirtualBox 安装32位Windows 7和64位Windows Sever 2008R2 双系统图文教程——利用VHD技术

    VirtualBox 安装32位Windows 7和64位Windows Sever 2008R2 双系统图文教程 利用VHD技术 先说说为什么要装双系统 因为想用一个系统只是用来休闲娱乐上网 聊天 看视频等等 所以这个时候坚决抵制一切数据
  • 【问题解决记录】无法识别的标志“-sdlMode”,在“p2”中

    问题解决记录 无法识别的标志 sdlMode 在 p2 中 参考文章 1 问题解决记录 无法识别的标志 sdlMode 在 p2 中 2 https www cnblogs com dbylk p 5133739 html 3 https
  • 30天自制操作系统第4天harib01a

    30天自制操作系统 第4天 C语言与画面显示的练习 用C语言实现内存写入 harib01a harib01a 准备材料 windows环境 VMware Workstation Visual Studio Code 程序和源代码 https
  • 如何为你的网站添加二级域名?

    一般公司注册的域名支持添加20个二级域名 辅助域名的添加与www的主域名相同 填写二级域名的名称 如bbs 并填写二级域名对应的IP 如果你的域名是www 98yun com bbs 这是一个论坛 你想添加一个bbs 98yun com 这
  • 大数据之——Zookeeper个人讲解

    一 zookeeper的概念 1 ZooKeeper是一个分布式的 开放源码的分布式应用程序协调服务 是Google的Chubby一个开源的实现 是Hadoop和Hbase的重要组件 它是一个为分布式应用提供一致性服务的软件 提供的功能包括
  • 用IDEA编写第一个JAVA程序

    第一步 打开IDEA IDEA下载链接 IntelliJ IDEA The Capable Ergonomic Java IDE by JetBrains 第二步 选择新建一个空项目 第三步 java项目的文件层次是 项目 包 类 创建一个
  • 6.2小车循迹,跟随,摇头测距功能实现

    1 循迹小车 1循迹模块的使用 TCRT5000传感器的红外发射二极管不断发射红外线 当发射出的红外线没有被反射回来或被反射回来但强度不够大时 红外接收管一直处于关断状态 此时模块的输出端为高电平 指示二极管一直处于熄灭状态 被检测物体出现