基于51的智能小车(蓝牙、循迹)

2023-11-03 10:59
文章标签 智能 51 小车 蓝牙 循迹

本文主要是介绍基于51的智能小车(蓝牙、循迹),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 基本概述
      • 硬件组成
      • 功能概述
      • 原理图
    • 模块介绍
      • 单片机控制模块
      • L298N电机驱动模块
      • 红外循迹模块
      • 蓝牙模块
      • 电源和小车车体
    • 小车功能实现及代码介绍

一、基本概述

硬件组成整个系统包括单片机控制模块,L298N电机驱动模块、循迹模块、蓝牙模块、电源和小车车体

功能介绍小车的拥有两种功能模式,小车循迹模式蓝牙控制模式,通过拨动开关给给选择小车的两种模式

原理图

 ​​​​​​

pcb:

二、模块介绍

1.单片机控制模块 

        该小车使用STC89C52芯片作为驱动,利用了该单片机内部的三个定时器,一个UART串口通信还有若干个I/O口等。

2.L298N电机驱动模块

        

L298N就是L298的立式封装,源自意法半导体集团旗下品牌产品,是一款可接受高电压、大电流双路全桥式电机驱动芯片,工作电压可达46V,输出电流最高可至4A,采用Multiwatt 15脚封装,接受标准TTL逻辑电平信号,具有两个使能控制端,在不受输入信号影响的情况下通过板载跳帽插拔的方式,动态调整电路运作方式,有一个逻辑电源输入端,通过内置的稳压芯片78MO5,使内部逻辑电路部分在低电压下工作,也可以对外输出逻辑电压5V,为了避免稳压芯片损坏,当使用大于12V驱动电压时,务必使用外置的5V接口独立供电

L298N通过控制主控芯片上的I/O输入端,直接通过电源来调节输出电压,即可实现电机的正转、反转、停止,由于电路简单,使用方便,通常情况下L298N可直接驱动继电器(四路)、螺线管、电磁阀、直流电机(两台)以及步进电机(一台两相或四相)。

使用:右上角输入12,34分别接入单片机I\O口,通过I/O口给予不同高低电平驱动电机转向,A、B使能端控制输通过A、B端的开关,通道A、B分别接入两个电机的各自两条引线。

使用A、B使能时,需要插入跳线帽。

PWM:

PWM Pulse Width Modulation )即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域
PWM 重要参数:

     频率 = 1 / TS            占空比 = TON / TS           精度 = 占空比变化步距

                      

PWM原理

以STM32单片机为例,其IO口只能输出高电平和低电平。

假设高电平为5V、低电平则为0V,那么要输出不同的模拟电压就要用到PWM。通过改变IO口输出的方波的占空比,从而获得使用数字信号模拟成的模拟电压信号。

电压是以一种脉冲序列被加到模拟负载上去的,接通时是高电平1,断开时是低电平0。接通时直流供电输出,断开时直流供电断开。通过对接通和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值5V的模拟电压。

比方说,占空比为50%那就是高电平时间一半,低电平时间一半。在一定的频率下,就可以得到模拟的2.5V输出电压。那么75%的占空比,得到的电压就是3.75V,如下图所示。

也就是说,在一定的频率下,通过不同的占空比即可得到不同大小的输出模拟电压,PWM就是通过这种原理实现数字模拟信号转换的。

PWM对电机转速的控制

调节占空比可以实现不同电压的输出,实现对电机转速的调节。

对于直流电机来讲,电机输出端引脚是高电平电机就可以转动,当输出端高电平时,电机会转动,但是是一点一点的提速,在高电平突然转向低电平时,电机由于电感有防止电流突变的作用是不会停止的,会保持这原有的转速,以此往复,电机的转速就是周期内输出的平均电压值,所以实质上我们调速是将电机处于一种,似停非停,似全速转动又非全速转动的状态,那么在一个周期的平均速度就是我们占空比调出来的速度了。

在电机控制中,电压越大,电机转速越快,而通过PWM输出不同的模拟电压,便可以使电机达到不同的输出转速。

当然,在电机控制中,不同的电机都有其适应的频率 频率太低会导致运动不稳定,如果频率刚好在人耳听觉范围,有时还会听到呼啸声。频率太高时,电机可能反应不过来,正常的电机频率在 6-16kHZ之间为好。

3.红外循迹

                                                                     

TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;总结就是:

没反射——D0输出高电平——灭灯

反射——D0输出低电平——点亮

接线

1VCC:接电源正极(3-5V)

2GND:接电源负极

3D0TTL开关信号输出

4A0:模拟信号输出

AI和AO的讲解

(1)AI信号:模拟量输入

所谓模拟量即4-20mA或0-10V的电流或电压信号,输入到DCS中,经过变换,还原出原来的值,比如电流值到DCS中显示出来;电流互感器二次值(5A)经过电流变送器转换成4-20mA信号(5A对应20mA),输入到DCS机柜,经过转换,在DCS中显示实际的电流值。

(2)AO信号:模拟量输出

和AI相反,AO是DCS输出4-20mA或0-10V信号,去控制设备的运行参数;比如,变频器的速度控制过程,以40HZ为例,通过远程DCS控制,认为给定参数值:40HZ,DCS同样发出一个对应的模拟量电流值,在4-20mA范围内(20mA对应50HZ),信号传入到变频器的控制器,变频器按照要求运行在40HZ。

4.蓝牙模块

蓝牙通信:蓝牙小车通过蓝牙模块与控制设备——手机,进行无线通信。

控制信号传输:蓝牙模块接入51单片机的TXRX口,手机通过蓝牙串口连接发送指令数字给蓝牙小车。

数据解析与处理:蓝牙接收到控制设备发送的指令后,会通过蓝牙模块接收并解析这些数据。然后,根据指令的内容进行相应的动作,控制电机驱动轮子前进或后退。

电机驱动:小车接收到指令后控制,电机和驱动电路,用于控制车轮的转动。根据接收到的指令,电机驱动电路会控制电机的转速和方向,从而实现小车的运动。

      

       

*RXD: 接收端

*TXD: 发送端

*VCC: 模块供电正极(5V)

*GND: 模块供电负极

AT EN:在配置蓝牙模块时接上蓝牙下载口

5.小车车体及电源

该小车使用的二驱的车体,使用两组电池给小车整体供电,一组电池用于给L298N电机驱动来对电机进行驱动,另一组用于其他vcc、gnd供电,两组电池均为12v

三、小车功能实现及代码介绍

代码中P0_4口的为1还是为0由接入的vcc或gnd决定。

//#Car.h
#ifndef __CAR_H__
#define __CAR_H__
void Timer0Init(void);
//void Timer1Init(void)	;
void Timer2Init(void);
void goLeftForward();
void goLeftStop();
void goRightForward();
void goRightStop();
void goForward();
void goStop();
void goLeft();
void goRight();#endif//#Car.c  小车车轮转动#include <REGX52.H>
sfr AUXR = 0x8E;
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^4;
sbit right_con2A = P1^3;char leftSpeed;
char rightSpeed;
int cntLeft = 0;
int cntRight = 0;void Timer0Init(void)		//@11.0592MHz
{AUXR &= 0x7F;		TMOD &= 0xF0;		TMOD |= 0x01;		TL0 = 0x66;		TH0 = 0xFC;		TF0 = 0;		TR0 = 1;		ET0 = 1;EA  = 1;
}void Timer2Init(void)		//1毫秒@11.0592MHz
{T2MOD = 0;		//初始化模式寄存器T2CON = 0;		//初始化控制寄存器TL2 = 0x66;		//设置定时初值TH2 = 0xFC;		//设置定时初值RCAP2L = 0x66;		//设置定时重载值RCAP2H = 0xFC;		//设置定时重载值TR2 = 1;		//定时器2开始计时ET2=1;EA=1;
}void goLeftForward()//左边前进
{left_con1A = 1;left_con2A = 0;
}void goLeftStop()//左边停止
{left_con1A = 0;left_con2A = 0;
}//?????
void goRightForward()//右边前进 
{right_con1A = 1;	right_con2A = 0;
}//?????
void goRightStop()//右边停止 
{right_con1A = 0;	right_con2A = 0;
}//??
void goForward()//前进 
{leftSpeed = 18;rightSpeed = 19;
}//??
void goStop()//停止 
{leftSpeed = 0;rightSpeed = 0;
}//??
void goLeft()//左转 
{leftSpeed = 5;rightSpeed = 18;
}//??
void goRight()//右转 
{leftSpeed = 18;rightSpeed = 5;
}void Time0Handler() interrupt 1//左边电机调速
{cntLeft++;TL0 = 0x66;		TH0 = 0xFC;if(cntLeft == 20){cntLeft = 0;}//左边占空比if(cntLeft < leftSpeed){goLeftForward();}else{goLeftStop();}}void Timer2_Routine() interrupt 5  //右边电机调速
{cntRight++;if(cntRight < rightSpeed){goRightForward();}else{goRightStop();}if(cntRight == 20){cntRight = 0;}
}//#Uath.h#ifndef __UART_H__
#define __UART_H__ 
void Uart_Init();
void receive();
#endif//#Uath.c  蓝牙模式#include <REGX52.H>
#include "car.h"
unsigned char receiveData;void Uart_Init(){/*波特率设置*/TMOD = 0x20;//设置定时器T1的工作方式-2,即8位自动装填定时器TH1 = 0xFD;//波特率为9600TL1 = 0xFD;	TR1 = 1;//打开定时器T1/*串口设置*/SM0 = 0;//设置串口工作方式1SM1 = 1;REN = 1;//使能串口接收允许位ES  = 1;//使能串行中断允许位EA  = 1;//使能中断允许位}void receive()//执行蓝牙控制函数
{Uart_Init();while(1){ switch(receiveData){case '2':goForward();break;case '4':goLeft();break;case '6':goRight();break;case '8':goStop();}}
}void Uart_Routine() interrupt 4
{if(RI==1){	goStop();RI=0;receiveData=SBUF;}SBUF=receiveData;while(!TI);TI=0;}//#main.c#include <REGX52.H>
#include "car.h"
#include "Uart.h"
sbit tracingLeft = P1^5;
sbit tracingRight = P1^6;unsigned char keynum;
void tracingMode()//红外循迹模式
{	if(tracingLeft == 0 && tracingRight == 0){goForward();		}if(tracingLeft == 0 && tracingRight == 1){goRight();}if(tracingLeft == 1 && tracingRight == 0){goLeft();}if(tracingLeft == 1 && tracingRight == 1){goStop();}
}void main()
{Timer0Init();Timer2Init();while(1){if(P0_4==1)	//手机遥控模式 {receive();}else if(P0_4==0)//红外循迹模式{tracingMode();} }
}

这篇关于基于51的智能小车(蓝牙、循迹)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/337714

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

开放式耳机好用?平价开放式耳机推荐?四款开放式的蓝牙耳机推荐

开放式耳机好用吗?有平价些的开放式耳机推荐吗?那这两个问题的回答当然是肯定的。 首先开放式耳机好不好用取决于对耳机的需求,因为开放式耳机其实是比较适用于需要注意周围环境、需要‌长时间佩戴舒适以及需要频繁与人交流的场景中,在这些场景下使用开放式耳机的话就会比较有优势。就例如跑步骑行健身等运动的时候,能够兼得佩戴舒适度的同时,增加一定的安全性;还有在办公学习的时候,会很适合长时间佩戴,能够方便和