材料清单:
普通遥控车一辆 30元 (遥控坏不坏的都行只要电机没问题)
蓝牙串口模块一个 25元 (淘宝有卖)
电烙铁一把 价格略,买一把够用好多年(焊锡、松香少量)
STC的单片机一个 4元 (推荐用个STC89C52RC,虽然大点)
安卓手机一台带蓝牙 价格略
L298N电机驱动模块 14元(淘宝有卖)
18650锂电池2节 15元(淘宝,最好连电池盒也一起买了。当然买14500电池更好,跟5号电池一样大,直接放在车子的电池盒。注意电压是3.7V的)
TTL下载线 15元(用来下载程序到单片机中,算是很常见的一个东西了,没有的话就淘宝吧)
电阻电容之类的若干 (主要是给单片机做最小系统,不想费劲的话就买个STC89C52RC的最小系统板10元)
导线若干
先上张完成图:
动力比较足,用电池压住后轮,不然打滑严重。
思路:
手机发送控制指令
经蓝牙发送至蓝牙串口模块
串口模块把数据通过单片机串口送入单片机
单片机处理数据,作出反应,是该前进还是后退
介绍下电机驱动模块
我们使用的是AB/CD两组直流电机驱动口。无视图上的步进电机。
在本次制作中AB口驱动后轮的电机,控制小车前后动作;
CD口驱动前轮方向电机,控制小车左右动作。
信号输入端口inA/inB/inC/inD,给一个高电平+5,就可以驱动相应的电机正反转
稍微介绍下STC89C52RC
P1.4接inA,P1.5接inB,P1.6接inC,P1.7接inD。单片机最小系统要么买个小板子,要么找STC官网的PDF看,这里就不贴了。
P3.0和P3.1作为下载口与蓝牙串口的通讯口。
单片机晶振使用11. 0592M的。
P3.2接LED正极,LED负极接地,这个LED的作用是判断单片机是否正常运行,在程序里设定LED一亮一灭,正常运行的话,LED会一亮一灭。
程序结构如下 :
drive.c
#include "drive.h"
void Wleft()
{
W_1 = 1;
B_1 = 0;
L_1 = 1;
R_1 = 0;
}
void Wright()
{
W_1 = 1;
B_1 = 0;
L_1 = 0;
R_1 = 1;
}
void Bleft()
{
W_1 = 0;
B_1 = 1;
L_1 = 1;
R_1 = 0;
}
void Bright()
{
W_1 = 0;
B_1 = 1;
L_1 = 0;
R_1 = 1;
}
void Forward()
{
W_1 = 1;
B_1 = 0;
L_1 = 0;
R_1 = 0;
}
void Backward()
{
W_1 = 0;
B_1 = 1;
L_1 = 0;
R_1 = 0;
}
void Stop()
{
W_1 = 0;
B_1 = 0;
L_1 = 0;
R_1 = 0;
}
main.c
#include<reg52.h>
#include "drive.h"
#define uchar unsigned char
sbit led_pin = P3^2; //定义led所接的引脚
uchar k;
uchar rxcode[1];
void led() interrupt 1 //led闪烁函数,由定时器T0产生中断,大约1.5秒闪烁一下
{
uchar i;
i++;
if(i==15)
{
led_pin = !led_pin;
i=0;
}
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
}
void com() interrupt 4 //串口中断函数,当蓝牙传命令过来的时候执行
{
RI = 0;
rxcode[k]=SBUF; //把收到的命令放到全局变量里面
k++;
if(k==1)
k=0;
}
void com_init() //串口初始化函数,波特率9600bps
{
TMOD = 0x21;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
REN = 1;
SM0 = 0;
SM1 = 1;
ES = 1;
EA = 1;
}
void led_init() //定时器0初始化函数,用于led闪烁
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
ET0 = 1;
TR0 = 1;
}
void main() //主函数
{
Stop();
com_init(); //串口初始化
led_init(); //led闪烁定时器初始化
while(1) //死循环,等待蓝牙传命令过来
{
switch(rxcode[0]) //判断收到的命令是干嘛的
{
case 2:Forward();break; //前进
case 1:Backward();break; //后退
case 4:Wright();break; //前右
case 3:Wleft();break; //前左
case 5:Bright();break; //后右
case 6:Bleft();break; // 后左
case 0:Stop();break; //停止
}
}
}
drive.h
#ifndef __DRIVE_H__
#define __DRIVE_H__
#include <reg52.h>
//定义L298N所接的引脚
sbit R_1 = P1^7;
sbit L_1 = P1^6;
sbit B_1 = P1^5;
sbit W_1 = P1^4;
void Wleft();
void Wright();
void Bleft();
void Bright();
void Forward();
void Backward();
void Stop();
#endif
编译生成HEX文件
打开 STC-ISP,准备把程序写入到单片机
+5接在单片机供电,gnd接地,RX,TX对应P3.0 P3.1
TTL下载器就是这个
选择好固件,串口号,点击下载,再给单片机上电
如果用最小系统板的话 大概是这个样子
如果没有错误的话会出现这个
Chinese:正在尝试与 MCU/单片机 握手连接 ...
MCU Type is: STC89C52RC
MCU Firmware Version: 4.3C
Chinese:MCU 固件版本号: 4.3C
Double speed / 双倍速: 12T/单倍速
振荡放大器增益: full gain
下次下载时 P1.0/P1.1 与下载无关
内部扩展AUX-RAM: 允许访问(强烈推荐)
下次下载用户应用程序时将数据Flash区擦除: NO
用户软件启动内部看门狗后: 复位关看门狗
ALE pin 仍为 ALE
内部时钟频率:11.049428M.
外部时钟频率:11.049428M.
Chinese:正在重新连接 ...
Current Baud is: / 当前波特率为: 19200 bps.
We are erasing MCU flash...
正在擦除应用程序区... ( 00:01 )
正在下载... ( 开始时间: 14:40:06 )
Program OK / 下载 OK
Verify OK / 校验 OK
erase times/擦除时间 : 00:01
program times/下载时间: 00:01
Encrypt OK/ 已加密
这样就可以了。把硬件都装上
最好在驱动模块的输出串个5欧姆的水泥电阻,不然动力太足。
这样就OK了。只要使用蓝牙串口发送1就可以前进,2就可以后退。3、4、5、6.安卓的程序需要的话可以喊我,这里传不上来。
大体上就是这样的思路。具体做的话,元件的安装、电路板的安放都需要根据小车的实际情况来。