基于51单片机的蓝牙循迹小车

您所在的位置:网站首页 循迹小车问题分析 基于51单片机的蓝牙循迹小车

基于51单片机的蓝牙循迹小车

2024-06-22 17:40| 来源: 网络整理| 查看: 265

51单片机课程设计做了辆蓝牙小车,下面是对课程设计内容的一些总结

基于51单片机的蓝牙循迹小车 硬件模块L298N工作原理问题以及解决方案 红外对管工作原理 HC-05 蓝牙模块模块介绍工作原理AT指令 TT电机硬件接线 软件部分电机车轮chelun.cchelun.h 红外对管RED.cRED.h 蓝牙模块HR_SC.cHR_SC.h 循迹小车main.c 蓝牙小车main.c 总结

硬件模块 L298N

具体如图所示: 在这里插入图片描述

工作原理

简介:可以直接驱动两路 3-16V 直流电机,并提供了 5V 输出接口(输入最低只要 6V),可以给 5V 单片机电路系统供电。 输入电压最好是7v以上,输入电压低了会导致一系列问题,在后面有具体实践总结 具体应用:可以方便的控制直流电机速度和方向,也可以控制 2 相步进电机,5 线 4 相步进电机。

管脚应用可以参考如图所示: 在这里插入图片描述 ①板载5V输出使能: 如果跳线帽接上,则5v端子可以输出电压,若跳线帽没有街上,则12v输入端子没有作用,只能5v输入口输入(如果不接上直接废了,5v输入基本不能使电机模块正常工作) ②AB通道使能: 端子接在上面表示AB通道一直保持高电平,处于使能状态,并且电压和5v输入端口电压相同;若处于没有使能状态,直接影响到输入端,让其无法工作! ③单片机IO控制输入 + 马达AB输出 : 顾名思义,四个IO输入端口和单片机四个IO口相连,然后通过电机驱动模块(双H桥电路)马达AB输出,以获得更大的驱动直流减速电机的能力,带动电机转动! B站直接搜L298N电机驱动模块,有视频详情介绍

问题以及解决方案

下面是一些使用L298N驱动电机的一些问题以及解决方法总结 问题:1.直流减速电机不能正常转动,一个轮子只能单方向转动 2.使能端口帽摘下来后,pwm信号输入问题 3.供电问题 解决:1.起初用4节南孚电池供电,用万用表测电压小于4.8v(电池快没啥电了),更换四节电池后用万用表测得4.9v+,上面出现的问题解决了 2.输入端电压小于7v(用得四节南孚电池6v不到供电),使能电压和5v输入端子的电压相同,经测量5v端口电压只有3.8v左右,故使能电压就只有3.8v左右了,对PWM输出使能有一定影响 3.L298N电机驱动中有稳压降压模块,如果供电足够大(大于7v),那么稳压降压模块会发挥作用,使得5v输入端子、使能端子、马达电机都能有稳定的5v高电平输出。

红外对管 工作原理

具体如图所示: 在这里插入图片描述 一些注意事项如下: ①VCC:外接3.3-5v(可以直接接L298N的5v端) GND:外接GND ; OUT:外接开发板或者单片机的IO口(有遮挡输出低电平,无遮挡输出高电平) ②距离较远/未感应到障碍物:输出指示灯灭,OUT引脚输出高电平 距离较近,感应到障碍物时,输出指示灯亮,OUT输出低电平 距离较近,感应到黑色物体时候,黑管接收不到,输出指示灯灭,OUT引脚输出高电平 ③检测距离2~30mm,可以通过电位器进行调节;顺时针调节,检测距离增加;逆时针调节,检测距离减少

HC-05 蓝牙模块 模块介绍

主要用于短距离的数据无线传输领域。可以方便的和 PC 机的蓝牙设备相连,也可以两个模块之间的数据互通。避免繁琐的线缆连接,能直接替代串口线。

工作原理

如图所示,核心模块使用蓝牙模块从模块,引出接口包括VCC,GND,TXD,RXD(TX、RX和串口通讯有关) 在这里插入图片描述 具体使用事项: ①led 指示蓝牙连接状态,闪烁表示没有蓝牙连接,需要进行配对;常亮表示蓝牙已连接并打开了端口 ②配对以后当全双工串口使用,无需了解任何蓝牙协议,但仅支持 8 位数据位、1 位停止位、无奇偶校验的通信格式。 ③在未建立蓝牙连接时支持通过 AT 指令设置波特率、名称、配对密码,设置的参数掉电保存。蓝牙连接以后自动切换到透传模式1

④蓝牙的使用

AT指令

HC-05进入 AT 命令: 按住按键或EN脚拉高,此时灯是慢闪, HC-05进入AT命令模式,默认波特率是38400(原始模式),原始模式下一直处于AT命令模式状态。 ①测试通讯 发送:AT(返回 OK,一秒左右发一次) 返回:OK ②改蓝牙串口通讯波特率 发送:AT+BAUDx 其中x代表0-C

字符x波特率(bauds)11200224003480049600(常用)5192006384007576008115200(常用)9230400A460800B921600C1382400

返回:BAUD(波特率) ③改蓝牙名称 发送:AT+NAMEname 返回:OK 参数 name:所要设置的当前名称,即蓝牙被搜索到的名称。20 个 字符以内 ④改蓝牙配对密码 发送:AT+PSWDxxxx 返回:+PSWD=xxxx 例如 设置密码888888 AT+PSWD123456 返回密码 123456 ⑤更改模块的主从模式 发送:AT+ROLE=1(设置模块为主模式 Master) 返回:+ROLE=1 发送:AT+ROLE=0(设置模块为从模式 Slave) 返回:+ROLE=0

TT电机

下面为一些电机注意事项

不带编码器,不能测速,测速的话需要添加测速模块;性能也没有编码器电机好。 两个电阻片端子,通过导线和AB马达输出端子连接,输出电平相反,电机实现前后转动;输出电平均为0,电机停止转动;

硬件接线

具体参考简图所示: 在这里插入图片描述

软件部分 电机车轮 chelun.c #include #include "CheLun.h" #include /**********************/ /****相关端口定义******/ /**********************/ sbit ENA = P1^0; sbit Left_IN1 = P1^1; sbit Left_IN2 = P1^2; sbit Right_IN3 =P1^3; sbit Right_IN4 =P1^4; sbit ENB = P1^5; //左右轮PWM当前值 左右轮PWM比较值 unsigned char pwm_val_left; unsigned char pwm_val_right; unsigned char push_val_left; unsigned char push_val_right; //改变这里的值就是改变左右轮子的占空比,实现调转速 unsigned char Left_Speed_Ratio =15; //左电机转速设定 unsigned char Right_Speed_Ratio =15 ; //右电机转速设定 //左右电机标志位 bit Left_moto_flag = 1; bit Right_moto_flag = 1; void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } /*左边电机调速函数*/ void pwm_out_left_moto() { if(Left_moto_flag) { if(pwm_val_left20) //PWM当前值自增到20之后变为0,相当于一个周期 pwm_val_left=0; } else ENA=0; } /*右边电机调速函数*/ void pwm_out_right_moto() { if(Left_moto_flag) { if(pwm_val_right20) pwm_val_right=0; } else ENB=0; } //左右轮前进后退停止,根据自己小车视情况而测 void Left_moto_Go() {Left_IN1 = 0,Left_IN2 = 1;} void Left_moto_Back() {Left_IN1 = 1,Left_IN2 = 0;} void Left_moto_Stop() {Left_IN1 = 1,Left_IN2 = 1;} void Right_moto_Go() {Right_IN3 = 1,Right_IN4 = 0;} void Right_moto_Back(){Right_IN3 = 0;Right_IN4 = 1;} void Right_moto_Stop(){Right_IN3 = 1;Right_IN4 = 1;} void GoStright() //小车前进 { /*设置比较值,左右轮子各自前转*/ push_val_left =Left_Speed_Ratio; push_val_right =Right_Speed_Ratio; Left_moto_Go(); Right_moto_Go(); } void GoBack() //小车后退 { push_val_left =Left_Speed_Ratio; push_val_right =Right_Speed_Ratio; } void TurnLeft() //小车左转 { push_val_right =10; //把右轮子速度降低 Right_moto_Go(); Left_moto_Stop(); } void TurnRight() //小车右转 { push_val_left =10; //把左轮子速度降低 Right_moto_Stop(); Left_moto_Go(); } void Stop() //小车停 { Left_moto_Stop(); Right_moto_Stop(); } void Rotate() //小车原地转圈 { push_val_left =Left_Speed_Ratio; push_val_right =Right_Speed_Ratio; Left_moto_Back(); Right_moto_Go(); } chelun.h #ifndef _CHELUN_H_ #define _CHELUN_H_ //预编译,防止头文件重复定义 void Delay1000ms();//1000ms延时函数 //关于轮子电机 void Left_moto_Go(void); void Left_moto_Back(void); void Left_moto_Stop(void); //左轮子 前进 后退 停止函数 void Right_moto_Go(void); void Right_moto_Back(void); void Right_moto_Stop(void); //右轮子 前进 后退 停止函数 void pwm_out_left_moto(void); //左边电机调速函数 void pwm_out_right_moto(void); //右边电机调速函数 void Rotate(); //小车原地转圈 void Stop(); //小车停 void TurnRight(); //小车右转 void TurnLeft(); //小车左转 void GoBack(); //小车后退 void GoStright(); //小车前进 #endif 红外对管 RED.c /*红外对管的使用 输出端子接单片机的io口,有遮挡输出0,无遮挡输出1*/ #include #include "RED.H" //红外对管,感应到黑线不亮指示灯且输出高电平,未感应到就亮指示灯且输出低电平 sbit RED_LEFT = P2^6; sbit RED_RIGHT = P2^7; //定义两个红外对管输出端子接的io口 //检测灯 sbit Left_led = P2^1; sbit Right_led = P2^0; void RED_test() { RED_RIGHT=1; if(RED_RIGHT == 0) //没感应到黑线 { LED1=1; } else { LED1=0; //感应到黑线 } } //感应到黑线 指示灯灭 输出1 没感应到黑线 指示灯亮 输出0 void xj_Run() { //碰到黑线为1,没碰到黑线为0 if(Left_led == 0 && Right_led==1) //右边碰到黑线 { TurnLeft();//左转 } if(Left_led == 1 && Right_led==0)//左边碰到黑线 { TurnRight();//右转 } if(Left_led == 0 && Right_led==0)//没有碰到 { GoStright();//前进 } } RED.h #ifndef _RED_H_ #define _RED_H_ void RED_test(); void xj_Run(); #endif 蓝牙模块 HR_SC.c #include #include "HR_SC.H" unsigned char flag; /*蓝牙控制小车前进后腿左转右转通过按键实现*/ void Init_UART() { TMOD &= 0X00; TMOD |= 0X21; //开启定时器1,采用工作方式2,8位自动重装载 //开启定时器0,采用工作方式1 SCON = 0X50; //串口通信采取工作方式1,REN位打开 PCON = 0X80; //波特率加倍 TH1 = 0XFA; TL1 = 0XFA;//9600 蓝牙配置好了也是这个波特率 ET1 = 0; ES = 1; EA = 1; //开启定时器中断 TR1 = 1; } void Init_Timer0() { TH0 = (65535-1000)/256; TL0 = (65535-1000)%256; ET0 = 1; EA = 1; TR0 = 1; } void SendByte(unsigned char temp) //串口发送数据 { SBUF = temp; while(TI == 0); TI = 0; } void HR_SC_INPUT() { flag = SBUF; //接收手机发来的数据 while(RI ==0); //等待接收完成 RI = 0; SendByte(flag); } HR_SC.h #ifndef _HR_SC_H_ #define _HR_SC_H_ void Init_UART(); //初始化串口 void HR_SC_INPUT(); void Init_Timer0(); void SendByte(unsigned char temp); #endif 循迹小车 main.c /* 循迹的main函数,主要实现循迹功能 */ #include #include "CheLun.h" #include "RED.h" extern unsigned char pwm_val_left; extern unsigned char pwm_val_right; void Init_Timer0() { TMOD = 0X01; TH0 = (65535-1000)/256; TL0 = (65535-1000)%256; ET0 = 1; EA = 1; TR0 = 1; } int main() { Init_Timer0(); while(1) { xj_Run(); } } void Timer0_ser () interrupt 1 { TH0 = (65535-1000)/256; TL0 = (65535-1000)%256; pwm_val_left++; pwm_val_right++; pwm_out_left_moto(); pwm_out_right_moto(); } 蓝牙小车 main.c /*蓝牙控制小车*/ #include #include "HR_SC.H" #include "RED.H" #include "CHELUN.H" sbit BEEP = P1^6; extern unsigned char flag; extern unsigned char Left_Speed_Ratio; //电机转速设定 extern unsigned char Right_Speed_Ratio; extern unsigned char pwm_val_left; extern unsigned char pwm_val_right; void Add_Speed_Ratio() //调速函数 { Left_Speed_Ratio++; Right_Speed_Ratio++; } void Remine_Speed_Ratio() //调速函数 { Left_Speed_Ratio--; Right_Speed_Ratio--; } void beep_ring() { BEEP = 0; Delay1000ms(); BEEP = 1; } int main() { Init_UART(); Init_Timer0(); while(1) { switch (flag) { case 'A':Add_Speed_Ratio();break; //加速 case 'B':Remine_Speed_Ratio();break;//减速 case 'G':GoStright();break;//前进 case 'K':GoBack();break;//后退 case 'H':TurnLeft();break;//左转 case 'J':TurnRight();break;//右转 case 'I':beep_ring();Stop();break;//停止 } } } void UART_ser() interrupt 4 { HR_SC_INPUT(); } void Timer0_ser () interrupt 1 { TH0 = (65535-1000)/256; TL0 = (65535-1000)%256; pwm_val_left++; pwm_val_right++; pwm_out_left_moto(); pwm_out_right_moto(); } // switch (flag) //蓝牙发送按键测试 // { // case 'G':P2 = 0XFE;break;//前进 // case 'K':P2 = 0XFD;break;//后退 // case 'H':P2 = 0XFB;break;//左转 // case 'J':P2 = 0XF7;break;//右转 // case 'I':P2 = 0XEF;break;//停止 总结

实现过程+问题

一.拼装车模: 对车子的总体构架有能有很好的理解

二.L298N电机驱动模块的测试+代码测试车轮运动情况: 了解到L298N的工作原理,测试电机运动情况可以增强代码调试能力,中间遇到过一些列不正常情况经过总结大部分都和供电有关(L298N供电最好用12v锂电池供电,我用的四节南孚电池只有6v左右,电机驱动模块不稳)建议用12v供电

三.红外对管模块的测试 实际情况下红外对管的识别度不是很好,很容易受到外界的干扰,用两个红外对管循迹有很大误差,循迹可以采用三路循迹模块或者更好好的方案! 在循迹转弯时候讲车速降低一点,不然车子容易跑飞,脱离循迹轨道,当然可以加入PID控制算法根据具体情况来控制车速(不建议51两轮小车,万向轮不好操作)

四.蓝牙模块的测试 蓝牙可以理解为一个手机上的串口调试助手,通过手机发送或接收指令, 而平时用的UART都是用ch340电平转化芯片来实现单片机和电脑串口的通讯!

简单理解为不赚差价的中间商!主机发数据,通过蓝牙模块的透传模式到从机,从机接收到对应的响应信号 ↩︎



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3