别想多了,我咋可能买得起车。
事情是这样的,前几天我过生日,从我刚开始起步做公众号那会关注到今天的一位忠实读者亲手制作了一辆基于 51 单片机手机蓝牙遥控小车以及两个好玩的小东西来作为送给我的生日礼物,在这里我要非常感谢送我这个礼物的读者。
收到货后,发了个朋友圈记录了一下,后来有很多朋友私信我说:想要这遥控小车,有请教这遥控小车如何做的?需要哪些材料等等,索性今天就整理一篇文章来跟大家说说。
在说之前,先来给大家介绍一下我的这位读者,也方便大家了解认识。
我称他为:明佬,他是广东某学院大三学生,电气工程与自动化专业,擅长嵌入式开发、单片机产品开发设计、爱好计算机编程等,曾获得广东省大学生电子设计竞赛一等奖。
该说不说的,这身板一看就像是练过的男人。
他曾经参加广东省比赛的代表作:
实物图
废话不多说,进入正题。
材料准备 Android手机
车架主体
51单片机最小系统
2路输入输出电机驱动模块TB6612FNG×2
hc-05主从一体蓝牙模块
USB转TTL模块
OLED显示模块
杜邦线若干
Step 1:配置蓝牙模块
Hc-05蓝牙模块
USB转TTL模块
将 USB 模块与蓝牙模块相连,RXD 与 TXD 交叉连接 Vvc 接 5V,GND 接 GND;
按住蓝牙模块按键再给模块上电,LED 灯慢闪说明进入 AT 模式。打开串口调试软件 sscom32,AT 模式默认波特率 38400,勾选发送就行,输入 AT 发送显示 OK 表示模块正常。
常用 AT 指令:
AT+NAME=Ming,设置蓝牙名称为:Ming
AT+PSWD=1234,设置配对密码为:1234
AT+UART=4800,设置波特率为:4800
设置完毕重新上电,蓝牙模块快闪等待配对,配对成功后慢闪。
Step 2:连接电机驱动模块
VM 驱动电机电压,pwm 调速,可置1,stby 置1,vcc 可不接,GND 需与单片机共地。
定义 P2 口为 4 个电机驱动输入。
Step 3:连接蓝牙模块到单片机串口 TXD 接单片机 P30(RXD) 引脚
RXD 接单片机 P31(TXD) 引脚
Step 4:连接oled模块到单片机 oled 模块 4 引脚采用 IIC 通信
定义 SCL 为 P07 引脚,SDA 为 P06 引脚
Step 5:编写程序代码烧录可执行文件到单片机 Main函数:
#include <reg52.h>
#include "Bluetooth.h"
#include "mode.h"
#include "oled.h"
#include "Motor drive.h"
sbit LED0=P0^0;//LED引脚定义
sbit LED1=P0^1;
void main()
{
unsigned char i;
OLED_Init(); //OLED初始化
OLED_CLS();//清屏
UsartConfiguration();//定时器初始化
TI = 0; //串口发送标准位
LED0=0;LED1=0;//LED引脚初始化
for(i=0; i<8; i++)//显示8个字符
{
OLED_P16x16Ch(i*16,0,i+0);//(从0开始,第一行显示,从第0个字模开始显示)
}
for(i=0; i<7; i++)
{
OLED_P16x16Ch(i*16,2,i+20);//(从0开始,第二行显示,从第20个字模开始显示)
}
for(i=0; i<7; i++)
{
OLED_P16x16Ch(i*16,4,i+27);
}
OLED_P8x16Str(24,6,"Jack Tian");//8×16显示Jack Tian
delay(2000);//延时一会
OLED_CLS();
for(i=0; i<6; i++)
{
OLED_P16x16Ch(i*16+16,0,i+8);
}
for(i=0; i<3; i++)
{
OLED_P16x16Ch(i*16+16,2,i+14);
}
OLED_P8x16Str(64,2,"IT");
for(i=0; i<2; i++)
{
OLED_P16x16Ch(i*16+80,2,i+18);
}
for(i=0; i<2; i++)
{
OLED_P16x16Ch(i*16+48,4,i+8);
}
OLED_P8x16Str(32,6,"Hc220066");
蓝牙模块函数:
#define uchar unsigned char
uchar receiveData;//定义变量
void UsartConfiguration()//定时器初始化函数
{
SCON=0X50; //设置工作方式为1
TMOD=0X20; // 设置计算器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的(晶振为11.0592MHz) ,一定要设置好波特率
TL1=0XF3;
ES=1; //打开接收中断
EA=1; // 打开总中断
TR1=1; //打开计算器1
}
Oled模块函数:
*oled模块128*64点阵操作函数
* 1. void delay(unsigned int z) -- 延时函数,毫秒
* 2. void IIC_Start() -- 开启I2C总线
* 3. void IIC_Stop() -- 关闭I2C总线
* 4. void Write_IIC_Byte(unsigned char IIC_Byte) -- 通过I2C总线写一个byte的数据
* 5. void OLED_WrDat(unsigned char dat) -- 向OLED屏写数据
* 6. void OLED_WrCmd(unsigned char cmd) -- 向OLED屏写命令
* 7. void OLED_Set_Pos(unsigned char x, unsigned char y) -- 设置显示坐标
* 8. void OLED_Fill(unsigned char bmp_dat) -- 全屏显示(显示BMP图片时才会用到此功能)
* 9. void OLED_CLS(void) -- 复位/清屏
* 10. void OLED_Init(void) -- OLED屏初始化程序,此函数应在操作屏幕之前最先调用
* 11. void OLED_P6x8Str(unsigned char x, y,unsigned char ch[]) -- 6x8点整,用于显示ASCII码的最小阵列,不太清晰
* 12. void OLED_P8x16Str(unsigned char x, y,unsigned char ch[]) -- 8x16点整,用于显示ASCII码,非常清晰
* 13. void OLED_P16x16Ch(unsigned char x, y, N) -- 16x16点整,用于显示汉字的最小阵列,可设置各种字体、加粗、倾斜、下划线等
* 14. void Draw_BMP(unsigned char x0, y0,x1, y1,unsigned char BMP[]) -- 将128x64像素的BMP位图在取字软件中算出字表,然后复制到codetab中,此函数调用即可
字模存放:
unsigned char code F16x16[] =
{
0x10,0x88,0xC4,0x33,0x80,0x9E,0x90,0x9F,0x90,0x9E,0x20,0xD8,0x17,0xF0,0x10,0x00,
0x01,0x00,0xFF,0x80,0x40,0x3E,0x02,0x02,0x3E,0x10,0x88,0x67,0x18,0x67,0x80,0x00,/*"微",8*/
0x00,0x80,0x60,0xF8,0x07,0x00,0x04,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x04,0x00,
0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xF9,0x49,0x49,0x49,0x49,0x49,0xF9,0x00,0x00,/*"信",9*/
0x00,0x80,0x40,0x20,0x18,0x06,0x80,0x00,0x07,0x18,0x20,0x40,0x80,0x00,0x00,0x00,
0x01,0x00,0x20,0x70,0x28,0x26,0x21,0x20,0x20,0x24,0x38,0x60,0x00,0x01,0x01,0x00,/*"公",10*/
0x80,0x80,0x40,0x20,0xD0,0x08,0x04,0x03,0x04,0x08,0xD0,0x20,0x40,0x80,0x80,0x00,
0x80,0x40,0x20,0x18,0x07,0x08,0xB0,0x40,0x20,0x18,0x07,0x18,0x20,0x40,0x80,0x00,/*"众",11*/
0x80,0x80,0x80,0xBE,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xBE,0x80,0x80,0x80,0x00,
0x00,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x44,0x84,0x44,0x3C,0x00,0x00,0x00,0x00,/*"号",12*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",13*/
0x00,0x08,0x08,0x88,0x48,0x28,0x18,0xFF,0x18,0x28,0x48,0x88,0x08,0x08,0x00,0x00,
0x82,0x42,0x31,0x00,0x00,0x10,0x60,0x07,0x10,0x60,0x00,0x00,0x11,0xE2,0x02,0x00,/*"杰",14*/
0x00,0x02,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x02,0x7E,0x02,0x02,0x00,0x00,
0x01,0x01,0x01,0x3D,0x25,0x25,0x25,0x25,0x3D,0x41,0x81,0x7F,0x01,0x01,0x01,0x00,/*"哥",15*/
0x00,0xF8,0x0C,0x0B,0x08,0x08,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0xF8,0x00,0x00,
0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x43,0x80,0x40,0x3F,0x00,0x00,/*"的",16*/
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"I",17*/
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,/*"T",17*/
0x00,0x10,0x10,0x10,0x10,0x10,0x11,0x16,0x10,0x90,0x50,0x30,0x10,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x10,0x28,0x44,0x42,0x41,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"之",18*/
0x10,0x10,0xF1,0x96,0x90,0x90,0x10,0x08,0xE7,0x24,0x24,0xE4,0x14,0x14,0x04,0x00,
0x80,0x60,0x1F,0x40,0x80,0x7F,0x00,0x00,0xFF,0x40,0x20,0x03,0x0C,0x32,0x41,0x00,/*"旅",19*/
};
电机驱动函数:
/*电机驱动引脚定义*/
sbit L0=P2^0;//后轮AIN2
sbit L1=P2^1;//后轮AIN1
sbit L2=P2^2;//后轮BIN1
sbit L3=P2^3;//后轮BIN2
sbit L4=P2^4;//前轮AIN2
sbit L5=P2^5;//前轮AIN1
sbit L6=P2^6;//前轮BIN1
sbit L7=P2^7;//前轮BIN2
void Forward()//前进
{
P2=0XAA;//1010 1010
}
Step 6:设置安卓手机 下载蓝牙串口
连接蓝牙,设置键盘发送数据
连上蓝牙测试
遥控小车成品视频
姓氏 mini 炫酷小彩灯成品视频
以上就是他的成品代表作。
由于经过创作者的同意,只能显示部分代码,如果你有脑洞大开的需求,想通过我这位读者帮忙设计新作品,你尽管提,剩下的可以交给他来做,我可以帮你牵线联系他。
前提是能在实现的情况下,不能提的需求不合理了,对不?
但是也有完成的一定周期与制作材料费用等等,具体可以通过本公众号后台回复:wx,进行联系。