最简单DIY的51蓝牙遥控小车设计方案
51单片机物联网智能小车系列文章目录
第一篇:最简单DIY的51蓝牙遥控小车设计方案
文章目录
- 51单片机物联网智能小车系列文章目录
- 前言
- 一、最简单DIY的51蓝牙遥控小车设计方案是什么?
- 二、制作步骤
- 1.购买现成的小车配件
- 2.下载代码
- 3.根据软件和硬件完成硬件连接
- 三、仿真与调试
- 1. 准备好硬件,小车上电和打开手机蓝牙和蓝牙调试助手,输入指令,点击发送。
- 2. 接收小车返回的响应
- 3. 拔除串口蓝牙模块接上USB转TTL模块用串口调试助手调试小车
- 总结
前言
daodanjishui物联网核心原创技术之最简单DIY的51蓝牙遥控小车设计方案。
市面上有各种开源智能小车,但是有复杂的有简单的,如果想快速入门DIY物联网智能小车,这个方案会给你一个快捷高效的方案。
一、最简单DIY的51蓝牙遥控小车设计方案是什么?
几年前用51单片机写了一个最简单的蓝牙遥控智能小车,基本上榨干了51单片机的资源,用了定时器T1作为波特率发送器编写串口打印程序,接收串口蓝牙接收的信息产生中断,并且写了一个串口打印函数send()作为单片机操作响应返回给蓝牙发送端手机。定时器T0作为PWM发生使用,目的是作为舵机sg90控制信号,当时做一个蓝牙自拍杆用到,虽然小车没搭建舵机,但是可以方便扩展,也方便买家学习舵机PWM控制技术。
虽然市面上也有不少开源的智能小车制作方案,还有自己小时候也玩过不少无线遥控的航模,但是全部由自己软件硬件全部独立设计的方案到几年前才正式实现,现在用文字的形式记录下来,对自己童年时代深刻地回忆和对未来技术的展望。“闭门造车”虽然有点痛苦,但是当你看到自己亲手做的小车在地上通过自制的遥控器遥控动起来的时候,你会发现一切的付出都是值得的!小车的全家福如下图所示:
51单片机最小系统板如下:
二、制作步骤
1.购买现成的小车配件
全部零部件都是购买的配件:L298N电机驱动模块,电池夹和18650电池两个,电源变压器、51单片机最小系统板、HC05串口蓝牙模块、小车底座。按照上面的实物图结合模块组装成小车。
2.下载代码
这个51单片机的代码也是相当精简,虽然是自己写的,但是也是经过严格的推敲和验证。
#include <reg52.h>
#include <stdio.h>
#include "String.h"
//author:daodanjishui 2020.10.1
/*****************************************/
//下面是舵机程序的移植
unsigned char count; //0.5ms次数标识
sbit pwm =P2^7 ; //PWM信号输出
sbit jia =P3^7; //角度增加按键检测IO口
sbit jan =P3^6; //角度减少按键检测IO口
unsigned char jd; //角度标识//下面是L298N的端口定义
sbit IN1 =P1^0;
sbit IN2 =P1^1;
sbit IN3 =P1^2;
sbit IN4 =P1^3;char AA[20];//存储串口发送过来的字符串
char OK[]={"OK"};
char SSS[]={"SSS"};
unsigned char flag,a='B',i=0,j;void delayms(unsigned int w){unsigned m,n;for(m=w;m>0;m--)for(n=110;n>0;n--);}void stop(void){//小车停止IN1 =0;IN2 =0;IN3 =0;IN4 =0;}void front(void){//小车前进IN1 =0;IN2 =1;IN3 =1;IN4 =0;delayms(1000); stop();}void left(void){//小车左转IN1 =1;IN2 =0;IN3 =0;IN4 =0;delayms(180); stop();}void right(void){//小车右转IN1 =0;IN2 =0;IN3 =0;IN4 =1;delayms(180); stop();}void back(void){//小车后退IN1 =1;IN2 =0;IN3 =0;IN4 =1;delayms(1000); stop();}void send(unsigned char *s){if(flag==1){ES=0;//关闭串口中断for(s;*s!='\0';s++){SBUF=*s;while(TI==0); //等待发送完成TI=0; //清除发送中断标志位}SBUF=a;//返回接收到电脑的数据while(TI==0); //等待发送完成TI=0; //清除发送中断标志位ES=1;flag=0;//清除串口接收标志位}}void Time0_Init() //定时器初始化
{//TMOD = 0x01; //定时器0工作在方式1
//IE = 0x82;//下面两行替代上面两行,防止影响到定时器1串口的设置
EA=1;//全局中断允许
ET0=1;//计数器0中断允许TH0 = 0xfe;
TL0 = 0x33; //11.0592MZ晶振,0.5msTR0=1; //定时器开始
}
void Time0_Int() interrupt 1 //中断程序
{TH0 = 0xfe; //重新赋值
TL0 = 0x33;if(count< jd) //判断0.5ms次数是否小于角度标识pwm=1; //确实小于,PWM输出高电平elsepwm=0; //大于则输出低电平count=(count+1); //0.5ms次数加1count=count%40; //次数始终保持为40 即保持周期为20ms,舵机控制需要20ms的脉冲
}void keyscan() //按键扫描
{ if(jia==0) //角度增加按键是否按下{delayms(20); //按下延时,消抖if(jia==0) //确实按下{jd++; //角度标识加1count=0; //按键按下 则20ms周期从新开始if(jd==6)jd=5; //已经是180度,则保持while(jia==0); //等待按键放开}}if(jan==0) //角度减小按键是否按下{delayms(20);if(jan==0){jd--; //角度标识减1count=0;if(jd==0)jd=1; //已经是0度,则保持while(jan==0);}}
}
/****************************************/void receive() interrupt 4 //串口中断服务程序
{if(RI==1){RI=0; //重新清0等待接收a=SBUF;//接收电脑传输过来的数据//SBUF=a;//单片机把接收到的数据返回给电脑 //这里可以放置舵机中断服务程序需要处理的逻辑/*if(a=='R') //右转{jd++; //角度标识加1count=0; //按键按下 则20ms周期从新开始if(jd==6)jd=5; //已经是180度,则保持}else if(a=='L'){jd--; //角度标识减1count=0;if(jd==0)jd=1; //已经是0度,则保持}*///下面加入智能小车指令解析AA[i++]=a;if((AA[i-1]=='\n')&&(AA[i-2]=='\r')){//判断是否遇到了"\r\n" AA[i-2]='\0'; //用"\0"替代了"\r"的字符变量 if((strstr(AA,"FFF")!=0)){//使用了字符串查找函数,这是第二种方法send(AA);front();//前进}else if((strstr(AA,"BBB")!=0)){//使用了字符串查找函数,这是第二种方法send(AA);back();//后退}else if((strstr(AA,"LLL")!=0)){//使用了字符串查找函数,这是第二种方法send(AA);left();//左转?}else if((strstr(AA,"RRR")!=0)){//使用了字符串查找函数,这是第二种方法send(AA);right();//右转}else {send(AA);stop();//停止}i=0;for(j=0;j<20;j++){AA[j]='\0';} //逻辑结束 flag=1;//接收标志位置1TI=0; //清除发送中断标志位}}}void init(){SCON=0x50;//串口控制寄存器,等价于SM0=0,SM1=1,SM2=0,串口方式一通信
//TMOD=0X20; //设置定时器1为模式2,做为波特率发生器,8位初值自动重装的8位定时器,定时到TH1的值自动装到TL1
TMOD=0X21; //这里同时设置定时器0工作在方式1
//PCON |=0X80; //电源管理寄存器,是否波特率倍增,SMOD=1,串口方式为123的时候波特率加倍
//TL1=0xFF; //57600波特率的初值,板子使用11.0592M晶振,初值=256-12000000/32/12/2400
//TH1=0xFF; //TH1=0xfd;//设置波特率为9600
TL1=0xfd; //TI = 1;//向CPU发送串口中断申请,直接使用printf必须加入此句才能实现发送IE=0x90; //CPU允许中断,串行允许中断?
REN=1;//允许串口接收中断?
EA=1;//开全局中断
ES=1;//串口中断允许TR1=1; //启动波特率发生器
}void main(void)
{//unsigned char ldat;
int num=88;int a=99;char *string="abde";char str[]="adb";
init();jd=1;
count=0;
Time0_Init(); while(1)
{keyscan(); //按键扫描 //注意用了printf函数就不能使用串口中断了,这个函数根本是调用putchar函数,其工作方式是中断}}
程序说明:用的是MDK5写的工程。只有一个串口通信,所以这个串口要么接串口蓝牙实现无线遥控,要么这个串口接USB转TTL模块与电脑的串口调试助手进行有线通信。程序写有详细的注释,读者可以慢慢斟酌。
3.根据软件和硬件完成硬件连接
接线说明:根据源码接线,大概的接线关系是蓝牙模块接单片机的串口:蓝牙模块rxd接单片机P3.1,Txd接单片机P3.0,L298N四个in管脚接单片机P1.0到P1.3四个管脚。
用串口调试助手发指令给小车可以实现有线控制小车行走:发送十六进制指令,因为小车接收指令 要加\r\n作为结束符号
所以指令后面要加上十六进制0d 0a
比如FFF\r\n是前进,指令转化为十六进制是 4646460d0a
三、仿真与调试
1. 准备好硬件,小车上电和打开手机蓝牙和蓝牙调试助手,输入指令,点击发送。
比如FFF\r\n是前进,指令转化为十六进制是 4646460d0a
下面是后退:BBB\r\n 指令转化为十六进制是4242420d0a
下面是左转: LLL\r\n指令转化为十六进制是4c4c4c0d0a
最后是右转: RRR\r\n指令转化为十六进制是(以此类推)
2. 接收小车返回的响应
看上面的截图,收到:464646a 说明小车响应了前进指令。
后面以此类推。
3. 拔除串口蓝牙模块接上USB转TTL模块用串口调试助手调试小车
输入FFF,点击“发送”按钮,小车就前进,串口调试窗口就看到小车回复了FFF,输入BBB就是倒退,左转是LLL,右转是RRR。
注意波特率是115200
总结
小车是用安卓手机蓝牙调试助手用指令发送的形式来控制的,所以说是最简单的蓝牙遥控小车。不过加上舵机和机械手和操控摇杆或者是手机控制app,就变得高端了,敬请期待。这个版本是免费的,但是功能还是很齐全和强大的,代码也写得通俗易懂,不拖泥带水。
代码工程下载链接:https://www.cirmall.com/circuit/20328/
点我直接跳转
最简单DIY的51蓝牙遥控小车设计方案相关推荐
- 最简单DIY基于STM32单片机的蓝牙智能小车设计方案
STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 文章目录 STM32库函数开发系列文 ...
- 最简单DIY基于51单片机的舵机控制器
51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 第四篇:最简单DI ...
- 最简单DIY基于51单片机、PCA9685、IIC、云台的舵机集群控制程序
51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 第四篇:最简单DI ...
- 项目小实战:51单片机控制的手机蓝牙遥控小车设计(程序 元件清单 实物图)
这几天有时间做了一个手机控制的蓝牙遥控小车车,终于今天实现了,把过程和心得跟大家分享一下. 废话不多说,先上实物图 一.项目元件清单 1.某宝购买一个智能小车底盘(本人车是四驱的,因此有四个电机,两块 ...
- 蓝牙遥控小车2.0版发布啦
蓝牙遥控小车2.0版发布啦! 蓝牙模块的主从机模式 1.主从机模式 2.设置主从机模式 蓝牙遥控器 1.硬件接线 2.程序设计 蓝牙小车 1.硬件接线 2.程序设计 今天要跟大家分享的是两个蓝牙模块之 ...
- MSP432蓝牙遥控小车
目录 前言 搭建 硬件 软件 原理 源码 前言 这个小车是去年电赛的时候准备的,很遗憾我们赛区因为疫情被取消了比赛,我们也都已经大二大三了,因此我们没有机会再参加两年一次的电赛了.但是这些成果总不能放 ...
- 【STM32】F103C8T6 蓝牙遥控小车
STM32F103C8T6 蓝牙遥控小车 前言 硬件部分 连线部分 软件部分 代码 问题与解决... 前言 本次项目使用的是STM32F103C8T6核心板作为主控,通过连接蓝牙模块,实现和手机APP ...
- 新朋实验室之玩具遥控车改装为ARDUINO蓝牙遥控小车(代码及制作过程开源)
新朋实验室之玩具遥控车改装为ARDUINO蓝牙遥控小车(代码及制作过程开源) 2017年08月21日 12:55:25 XPLab 阅读数:4008 你家里的玩具遥控车坏了?遥控器丢了?先不要急着丢掉 ...
- Arduino mega2560蓝牙遥控小车简介
Arduino mega2560蓝牙遥控小车简介 小车一览 主要模块如下: 一.电源 (1)BOM表:18650电池两节(单节3.6v,6800mAh) 18650 电池盒(两节带开关) 二.电机驱动 ...
- 5.39 综合案例2.0 - STM32蓝牙遥控小车2(语音控制)
综合案例2.0 - 蓝牙遥控小车1- 语音控制 成品展示 案例说明 器件说明 小车连线 小车源码 语音模块遥控 语音遥控连线 模块使用说明 1.MLT-BT05 4.0 蓝牙模块 2.ASRPRO-2 ...
最新文章
- 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但
- xcode 4.2 不再支持 Window-Based Application 的解决办法(转载)
- 支付宝技术风险负责人陈亮:把事情做到极致,技术的差异性才会体现出来
- bom表_MicroProfile 2.2 BOM导入支持
- linux 检测日志文件内容变化
- Dollar Dayz poj3181
- QT的QCameraFocus类的使用
- [转]Java AIO学习
- PHP学习笔记--抽象类和抽象方法的应用
- LeetCode 101. 对称二叉树 思考分析
- Spring Boot(一)入门篇
- 本地计算机策略无法建立管理单元,我的本地安全策略用不了!打开管理工具的本地安全策略管理单元初始化 爱问知识人...
- Git Tag 使用
- [转载] Python ascii()函数
- java 新浪博客_Java
- aurelia_Aurelia历险记:创建自定义PDF查看器
- 苹果群控的安装和使用
- 在64位系统下,使用 RadASM IDE 写 32 位及 16 位的汇编程序
- 龙华大浪注塑加工中模具原理及组成
- vue设计调查问卷:换个思路解决问题
热门文章
- php使用blob加密视频,javascript实现blob加密视频源地址的方法
- python爬虫抓文章_公众号文章抓取(python爬虫如何抓取微信公众号文章)
- python官网下载pip_python怎么下载pip
- wallys/IPQ4019/IPQ4029/Access Point Wireless Module Dual band 11AC Wave2 Module
- python 编译成exe vmp加密_加密软件VMProtect入门教程
- 计算机的基本数据结构与算法分析,数据结构与算法分析
- 基于STM32单片机设计指纹考勤机+上位机管理
- OC 获取view相对位置_【黑苹果系列】小白教程之DSD补丁篇 | 7分钟教你优雅定制最关键的OC补丁(clover通用)...
- ad18 bell封装,AD元件库中常用元件
- 2007年1月11日~2022年1月11日,我在 SAP 成都研究院这15年