重力遥控智能小车完整制作教程重力遥控智能小车完整制作教程
智能小车并不是什么新鲜的DIY 制作,但绝对是很多电子爱好者一看见就心动的神物。
经过我几天的努力,通过大量淘宝网上的元器件价格的对比以及优化了几天的整体设计方案。最后终于开发出一款性价比超高的智能小车。我不敢说是成本最低,也不敢说是功能最强大,但从外观和可操作性来说相对于这个成本那已经是非常不错了,好了不多说废话了,上图吧,上教程吧。
第一步、准备好吃饭的家伙、当然是工具了。没有的可以长运的电子市场买,第一步、准备好吃饭的家伙、当然是工具了。没有的可以长运的电子市场买,当然也可去万能的淘宝网上买。当然也可去万能的淘宝网上买。
第二步、根据图片、根据图片、原理图、原理图、元件清单和实物图片购买元器件。元件清单和实物图片购买元器件。
.
重力感应遥控车元器件清单 重力感应遥控车元器件清单
流水号
Y1 LED1 LED2 R1 R2 R3 R4~R9 C1 C2、C5、C6 C3、C4 U5 JP2 U5 JP2 JP1 JP5 JP3 JP4 电机线 电源线 U1 HA1 U2, U3 VD1 S1 洞洞板 电池
名称
晶振11.0592M
封装
XTAL1-200 LED9-5MM LED9-5MM RES2-400 RES2-400 RES2-400 RES2-300 RAD0.2 RAD0.2 RAD0.2 网上购卖 网上购卖
数量
单价
1
0.2 0.1 0.1 0.01 0.01 0.01 0.01 0.1 0.05 0.05 10 4.7 0.2
总价
0.2 0.1 0.1 0.01 0.01 0.01 0.06 0.1 0.15 0.1 10 4.7 0.2
LED 发光二极管 LED 发光二极管 色环电阻10K 色环电阻1K 色环电阻1K 色环电阻300Ω 电解电容100UF 瓷片电容104 瓷片电容33pF 蓝牙从机模块ATK-HC05 超声波测距模块HC-SR04 蓝牙接口-7针插座 超声波测距-4针插座
电源2针插座 电源3针插座 左电机接口-2针插座 右电机接口-2针插座 XH2.54-2P 带线头子 XH2.54-3P 带线头子 单片机STC12C2052(带管座)
蜂鸣器 电机芯片L9110 整流二极管1N4007
拨动开关 34个洞 X 27个洞
中顺3000mAh 3.7V 锂电池(加保护板)
3.7V 升压到5V TP4056锂电池充电模块 YL-46稳压模块3.3V M3x6mm+6(配螺丝母) M3x20mm+6(配螺丝母) 下面是淘宝购买网址
1 1 1 1 1 6 1 3 2 1
1 2 1 1 1
HEADER7 HEADER4 HEADER3 HEADER3 HEADER2 HEADER2
1 1 3 1 1
0.3 0.3
DIP20-300 Buzzer1-300 DIP8-300 DIODE6-400
根据图纸格子数用斜
口钳剪 自行在网上购买 自行在网上购买 自行在网上购买 自行在网上购买 自行在网上购买 自行在网上购买 3.5 0.5 1.6 0.1 0.1 5 13.5 1.9 1.5 2 0.1 0.2 38
3.5 0.5 3.2 0.1 0.1 5 13.5 1.6 1.5 2 0.4 0.8 38
1 2 1 1 1 1 1 1 1 4 4 1
DC 升压模块 充电模块 U4 铜柱 铜柱 智能小车底盘
http://item.taobao.com/item.htm?id=[1**********]
总价 86
第三步、蓝牙模块的加工。蓝牙模块的加工。只要连接1、2、7、8、10、11这6个引脚。个引脚。
第四步、根据图纸有平口钳加工万能板。根据图纸有平口钳加工万能板。
控制板33*26个洞 电源板23*17个洞 用剪刀钻固定孔
测试是否刚好装上 小车底盘另外有安装教程
第五步、根据正面装配图安装元器件。根据正面装配图安装元器件。
第六步、根据反面焊接图进行走线。根据反面焊接图进行走线。
反面焊接图
反面焊接图无封装
.
第七步、安装焊接安装焊接电源板焊接电源板。电源板。
剪好的万能板 5V 升压模块 锂电池充电模块 把5V 升压模块的USB 头拆掉
模块贴上双面胶 反面安装上电池接口针座 用元件引脚将模块固定焊住
用导线连接起来 焊接好 接上锂电池
电源指示灯亮就连接正确 准备好电源线
二针插座接5V 模块输出,三针插座除红线外另外两根线一超接锂电池负极,红线接正极。
为什么有两个电源呢?因为单片机需要5V 的电压,所以二针插座接5V 模块给单片机供电。而电机电流非常大,5V 模块长时间工作会带不动发热,可能会烧掉。所直接接锂电池,由于锂电池是3.7V 的电压,比5V 小,电机转速会慢很多,这样小车的可操控性能反而会得到提高,不要一味的提高小车速度,速度太快了是很难控制的…………呵呵,自己去体会吧!
在板子上打两个洞,用扎带扎上,这样可以提高电源线的抗拉扯能力,防止拉断。
电池贴上双面胶,粘在小车底盘里面,用扎带扎上可以很牢固。
将电源板用铜柱固定在小车底盘中间层,电源部分就大功告成。
第八步、安装主控板和电机线。安装主控板和电机线。
用铜柱固定主控板 电机线穿过底盘并打个结防止拉扯断
焊接好电机线,一正一反的焊接 插好针座有要开机
插上超声波测距模块,一定要断电插。然后用USB 口下载程序,测试充电,红灯为正在充电,蓝灯为充满电。
第九步、连接蓝牙测试。连接蓝牙测试。
打开小车电源。
.
在设置里面选择蓝牙,然后搜索设备,这个蓝牙模块的默认名子是BLUE_SPP,然后选择连接,输入默认密码:1234 连接成功后会在已配对的设备中显示。OK ,蓝牙连接完成了。
. .
自己下载〈Android 小车遥控器〉和〈蓝牙遥控终端〉这两款软件。这两个软件都可以遥控。我在程序中已经可以很好的接收这两上软件的控制信号。
注意:蓝牙模块的名称BLUE_SPP都是一样的,密码也都是1234,但MAC 这个物理地址每一个模块都是不一样的。
如果可以遥控但行走的方向不对,只要把电机的线反过来连接就可以了。如果行走的不是直线,那就要换好一点的电机了,当然也可以在转的快一点的电机线上面串一个1欧姆左右的电阻就可以。好了,教程很详细,但也需要你们自己的努力,细心,坚持和爱思考的和改良的精神。祝各位DIY 大神们成功。
.
/*==============================================
项目名称:重力感应遥控车
功能说明:通过手机蓝牙遥控小车,可以重力控制和自动测距无人驾驶功能。
作 者:陈 俊
部 门:江西省电子信息技师学院 电子工程系
时 间:2014年9月18日
===============================================*/
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**************STC专用寄存器声明**************/
sbit EPCAI=IE^6;
sfr CCON = 0xD8;
sbit CCF0 = CCON^0;
sbit CCF1 = CCON^1;
sbit CF = CCON^7;
sbit CR = CCON^6;
sfr CMOD = 0xD9;
sfr CL = 0xE9;
sfr CH = 0xF9;
sfr CCAPM0 = 0xDA;
sfr CCAP0L = 0xEA;
sfr CCAP0H = 0xFA;
sfr IPH = 0xB7;
sfr AUXR = 0x8E;
sfr P3M0 = 0xb1;
sfr P3M1 = 0xb2;
sfr P1M0 = 0x91;
sfr P1M1 = 0x92;
/**************I/O定义**************/
sbit Tx=P3^7;//产生脉冲引脚,延时20us
sbit Rx=P1^0;//回波引脚
bit TimeUp=0;//定时器溢出标志位
uint Measureresult=0;
sbit ZUO_A=P1^7;//左电机A
sbit ZUO_B=P1^6;//左电机B
sbit YOU_A=P1^2;//右电机A
sbit YOU_B=P1^1;//右电机B
sbit zd_led=P3^2;//自动模式LED 指示灯
sbit fmp1=P3^3;
sbit fmp2=P3^4;//蜂鸣器
sbit key1=P3^5;//按键
/**************全局变量**************/
#define FOSC 11059200L
#define T100HZ (FOSC/12/100)
#define gr 50 //干扰值
uchar spp_data[6]={'0','0','0','\r','\n',0};
uchar juli_zhi=0;//距离值,单位是厘米
bit spp=1;//串口发送成功标志
uchar fangxiang=97;//方向变量
bit OS=1;//系统模式变量
uchar zd_os=0;//自动模式系统变量
uint value;
uchar os_js1=0;
uint os_js2=0;
uchar os_js3=0;
uchar os_js4=0;
uint sb_js=0;
uint sb_js1=0;
uchar hz;
bit sb_bz=0;// 声波报警开关,0为关,1为开
uchar fx_js=0;//方向计数随机值
bit fx_bz=0;//方向标志,0为左,1为右
bit fm_bz=1;
bit apk=0;
/**************函数声明**************/
void ckfs(uchar i);
void delay(uint xms);//x毫秒延时函数
void key();
void UartInit(void);//[email protected]串口初始化
uint Measure(void);
void init_PCA();//PCA定时器初始化 定时时间是10毫秒
void mode_0();//原地360度探测模式
void mode_1();//直线行走探测模式
void mode_2();//随机左右转弯模式
bit loop_tc();//循环有效值探测距离
void sbbj();//声波报警
void main()
{
P3M0=0;// 设置I/O口
P3M1=0x0c;// 设置I/O口
P1M0=0;
P1M1=0xc6;
init_PCA();
UartInit();//115200波特率,串口初始化
zd_led=0;
while(1)
{
if (OS==1)//遥控模式
{
zd_led=0;
if (os_js1>6)//每隔60毫秒检测一次距离
{
os_js1=0;
Measure();
}
}
else//遥控与自动混合模式
{
switch (zd_os)
{
case 0:mode_0(); b reak;//原地360度探测模式
case 1:mode_1(); b reak;//直线行走探测模式
case 2:mode_2(); b reak;//随机左右转弯模式
}
}
}
}
void ser() interrupt 4 //串口中断服务函数
{
EA=0;
if (TI==1)
{
ES=1;
EA=1;
return;
}
if (RI==1)fangxiang=SBUF; //将接受到的数据赋值给a
RI=0; //将接受中断标志位清0
if (apk==0)
{
switch(fangxiang)
{
case 65: ZUO_A=1,ZUO_B=0,YOU_A=0,YOU_B=1; break; // 发送的是A 前进指令 case 66: ZUO_A=0,ZUO_B=1,YOU_A=0,YOU_B=1; break; // 发送的是B 右转指令 case 67: ZUO_A=1,ZUO_B=0,YOU_A=1,YOU_B=0; break; // 发送的是C 左转指令 case 68: ZUO_A=0,ZUO_B=1,YOU_A=1,YOU_B=0; break; // 发送的是D 后退指令 case 97: //发送的是a 停止指令
case 98: //发送的是b 停止指令
case 99: //发送的是c 停止指令
case 100: ZUO_A=ZUO_B=YOU_A=YOU_B=0; break; //发送的是d 停止指令 case 'S': ZUO_A=ZUO_B=YOU_A=YOU_B=0,apk=1; break;
case 'E': ZUO_A=ZUO_B=YOU_A=YOU_B=0,fm_bz=1,OS=!OS,zd_os=0,fangxiang=97;
break;
case 'e': ZUO_A=ZUO_B=YOU_A=YOU_B=0,OS=1,fm_bz=1,fangxiang=97; break; //P1口是我的电机驱动的控制端
}
}
else
{
switch(fangxiang)
{
case 'A': ZUO_A=1,ZUO_B=0,YOU_A=0,YOU_B=1; break; //发送的是A 前进指令 case 'D': ZUO_A=0,ZUO_B=1,YOU_A=0,YOU_B=1; break; //发送的是D 右转指令 case 'C': ZUO_A=1,ZUO_B=0,YOU_A=1,YOU_B=0; break; //发送的是C 左转指令 case 'B': ZUO_A=0,ZUO_B=1,YOU_A=1,YOU_B=0; break; //发送的是B 后退指令 case 'S': ZUO_A=ZUO_B=YOU_A=YOU_B=0; break; //发送的是S 停止指令 case 'E': ZUO_A=ZUO_B=YOU_A=YOU_B=0,fm_bz=1,OS=0,zd_os=0,fangxiang='S'; break;
case 'e': ZUO_A=ZUO_B=YOU_A=YOU_B=0,fm_bz=1,OS=1,fangxiang='S'; break; case 97: //发送的是a 停止指令
case 98: //发送的是b 停止指令
case 99: //发送的是c 停止指令
case 100: ZUO_A=ZUO_B=YOU_A=YOU_B=0,apk=0; break; //发送的是d 停止指令 //P1口是我的电机驱动的控制端
}
}
ES=1;
}
void PCA_isr()interrupt 6 using 1//PCA定时中断服务函数,每隔1毫秒中断一次
{
CCF0=0;
CCAP0L=value;
CCAP0H=value>>8;
value=value+T100HZ;
key();
os_js1++;
fx_js++;
if (fx_js>100)//方向随机发生
{
fx_js=0;
fx_bz=!fx_bz;
}
if (os_js2>0)
{
os_js2++;
}
if (OS==0)
{
os_js3++;
if (os_js3>20)
{
os_js3=0;
zd_led=!zd_led;
}
}
if (fm_bz==1)
{
os_js4++;
fmp1=fmp2=1;
if (os_js4>10)
{
os_js4=0;
fmp1=fmp2=0;
fm_bz=0;
}
}
sbbj();//声波报警
}
void UartInit(void) //[email protected]串口初始化
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据, 可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc, 即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
PS=1; //将串口的优先级设为最高
IPH=IPH|0x10;
EA=1; // 打开总中断开关
ES=1; // 打开串口中断开关
}
/*void delay(uint xms)//x毫秒延时函数
{
uchar i;
while (xms--)
{
for (i=0;i
{
if (key1==0)return;
}
}
}*/
void key()//独立按键
{
static bit sw=0,qd=0;
key1=1;
if (key1==0)
{
if (sw==0)qd=1;
if (qd==1)
{
fm_bz=1;
sw=1;
qd=0;
OS=!OS;
ZUO_A=0,ZUO_B=0,YOU_A=0,YOU_B=0;
zd_os=0;
fangxiang=97;
}
}
else qd=0,sw=0;
}
uint Measure(void)
{
uchar Th0,Tl0;
ulong time0=0;
uchar Del20us=0; //延时变量,在超声波脉冲引脚中产生 20us 的方波
bit RxBack=1; //超声波返回标志位
// AUXR &= 0x7F; //定时器时钟12T 模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
Tx=0; //将超声波脉冲引脚电位拉低
Th0=0; //初始化变量值
Tl0=0; //初始化变量值
TimeUp=0; //初始化
while (EA==0);
TR0=0;//关定时器 0
TH0=0;//赋定时器初始值高 8 位为 0
TL0=0;//赋定时器初始值低 8 位为 0
Tx=1;//拉高超声波脉冲引脚电位
for(Del20us=50;Del20us>0;Del20us--);//延时 20us
Tx=0; //拉低超声波脉冲引脚电位,使之产生 20us 的方波信号,使超声波模块开始工作。 while(Rx==0);//等待回波引脚变 1;
TR0=1;//开定时器 0
ET0=1; //开定时器 0 中断
while(RxBack)
{
if(Rx==0||TimeUp==1){TR0=0;Th0=TH0;Tl0=TL0;TR0=1;RxBack=0;}
}
while(!TimeUp);//等待定时器溢出
time0=(Th0*256+Tl0);//取出定时器的值
Measureresult=((ulong)(344)*time0)/2000;//测量的结果单位为 mm
if(Measureresult900){Measureresult=1000;}
//过滤掉一些异常的数据,当测量出的距离不在 10-900mm 时返回值为 0
if (Measureresult
else spp_data[0]=Measureresult/100+48;
if (Measureresult
else spp_data[1]=Measureresult/10%10+48;
spp_data[2]=Measureresult%10+48;
ckfs(spp_data[0]);
ckfs(spp_data[1]);
ckfs(spp_data[2]);
ckfs(spp_data[3]);
ckfs(spp_data[4]);
ckfs(spp_data[5]);
if (Measureresult>320)
{
sb_bz=0,hz=1;
}
else
{
sb_bz=1;
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
}
return Measureresult;
}
void T0_time() interrupt 1
{
TimeUp=1;
}
void ckfs(uchar i)
{
SBUF=i;
while(!TI);
TI=0;
}
void init_PCA()//PCA定时器初始化 定时时间是1毫秒 {
CCON=0;
CL=CH=0;
CMOD=0;
value=T100HZ;
CCAP0L=value;
CCAP0H=value>>8;
value=value+T100HZ;
CCAPM0=0X49;
EA=EPCAI=CR=1;
}
void mode_0()//原地360度探测模式
{
while (loop_tc()==0&&OS==0)
{
os_js2=1;
while (os_js2
{
if (fangxiang>68)
{
ZUO_A=1,ZUO_B=0,YOU_A=1,YOU_B=0;//左转 }
}
os_js2=0;
ZUO_A=0,ZUO_B=0,YOU_A=0,YOU_B=0;//停止 }
}
void mode_1()//直线行走探测模式
{
if (Measure()>250&&OS==0)
{
if (fangxiang>68)
{
ZUO_A=1,ZUO_B=0,YOU_A=0,YOU_B=1;//前进 }
}
else
{
ZUO_A=0,ZUO_B=0,YOU_A=0,YOU_B=0;//停止 zd_os=2;
}
}
void mode_2()//随机左右转弯模式
{
if (fx_bz)
{
if (fangxiang>68)
{
ZUO_A=0,ZUO_B=1,YOU_A=0,YOU_B=1;//右转 }
}
else
{
if (fangxiang>68)
{
ZUO_A=1,ZUO_B=0,YOU_A=1,YOU_B=0;//左转 }
}
os_js2=1;
while (os_js2
os_js2=0;
ZUO_A=0,ZUO_B=0,YOU_A=0,YOU_B=0;//停止 zd_os=1;
}
bit loop_tc()//循环值探测有效距离
{
uint i[2];
bit loop=1;
while (loop)
{
i[0]=Measure();
os_js2=1;
while (os_js2
os_js2=0;
i[1]=Measure();
os_js2=1;
while (os_js2
os_js2=0;
if (i[0]>i[1])
{
if (i[0]-i[1]
else
{
if (i[1]-i[0]
}
if (i[0]>300)
{
zd_os=1;
return 1;
}
return 0;
}
void sbbj()//声波报警
{
if (sb_bz==1)
{
sb_js++;
if (sb_js>1000/hz)
{
sb_js=0;
fmp1=fmp2=1;
sb_js1=1;
}
else
{
if (sb_js1--==0)fmp2=fmp1=0; }
}
}
重力遥控智能小车完整制作教程重力遥控智能小车完整制作教程
智能小车并不是什么新鲜的DIY 制作,但绝对是很多电子爱好者一看见就心动的神物。
经过我几天的努力,通过大量淘宝网上的元器件价格的对比以及优化了几天的整体设计方案。最后终于开发出一款性价比超高的智能小车。我不敢说是成本最低,也不敢说是功能最强大,但从外观和可操作性来说相对于这个成本那已经是非常不错了,好了不多说废话了,上图吧,上教程吧。
第一步、准备好吃饭的家伙、当然是工具了。没有的可以长运的电子市场买,第一步、准备好吃饭的家伙、当然是工具了。没有的可以长运的电子市场买,当然也可去万能的淘宝网上买。当然也可去万能的淘宝网上买。
第二步、根据图片、根据图片、原理图、原理图、元件清单和实物图片购买元器件。元件清单和实物图片购买元器件。
.
重力感应遥控车元器件清单 重力感应遥控车元器件清单
流水号
Y1 LED1 LED2 R1 R2 R3 R4~R9 C1 C2、C5、C6 C3、C4 U5 JP2 U5 JP2 JP1 JP5 JP3 JP4 电机线 电源线 U1 HA1 U2, U3 VD1 S1 洞洞板 电池
名称
晶振11.0592M
封装
XTAL1-200 LED9-5MM LED9-5MM RES2-400 RES2-400 RES2-400 RES2-300 RAD0.2 RAD0.2 RAD0.2 网上购卖 网上购卖
数量
单价
1
0.2 0.1 0.1 0.01 0.01 0.01 0.01 0.1 0.05 0.05 10 4.7 0.2
总价
0.2 0.1 0.1 0.01 0.01 0.01 0.06 0.1 0.15 0.1 10 4.7 0.2
LED 发光二极管 LED 发光二极管 色环电阻10K 色环电阻1K 色环电阻1K 色环电阻300Ω 电解电容100UF 瓷片电容104 瓷片电容33pF 蓝牙从机模块ATK-HC05 超声波测距模块HC-SR04 蓝牙接口-7针插座 超声波测距-4针插座
电源2针插座 电源3针插座 左电机接口-2针插座 右电机接口-2针插座 XH2.54-2P 带线头子 XH2.54-3P 带线头子 单片机STC12C2052(带管座)
蜂鸣器 电机芯片L9110 整流二极管1N4007
拨动开关 34个洞 X 27个洞
中顺3000mAh 3.7V 锂电池(加保护板)
3.7V 升压到5V TP4056锂电池充电模块 YL-46稳压模块3.3V M3x6mm+6(配螺丝母) M3x20mm+6(配螺丝母) 下面是淘宝购买网址
1 1 1 1 1 6 1 3 2 1
1 2 1 1 1
HEADER7 HEADER4 HEADER3 HEADER3 HEADER2 HEADER2
1 1 3 1 1
0.3 0.3
DIP20-300 Buzzer1-300 DIP8-300 DIODE6-400
根据图纸格子数用斜
口钳剪 自行在网上购买 自行在网上购买 自行在网上购买 自行在网上购买 自行在网上购买 自行在网上购买 3.5 0.5 1.6 0.1 0.1 5 13.5 1.9 1.5 2 0.1 0.2 38
3.5 0.5 3.2 0.1 0.1 5 13.5 1.6 1.5 2 0.4 0.8 38
1 2 1 1 1 1 1 1 1 4 4 1
DC 升压模块 充电模块 U4 铜柱 铜柱 智能小车底盘
http://item.taobao.com/item.htm?id=[1**********]
总价 86
第三步、蓝牙模块的加工。蓝牙模块的加工。只要连接1、2、7、8、10、11这6个引脚。个引脚。
第四步、根据图纸有平口钳加工万能板。根据图纸有平口钳加工万能板。
控制板33*26个洞 电源板23*17个洞 用剪刀钻固定孔
测试是否刚好装上 小车底盘另外有安装教程
第五步、根据正面装配图安装元器件。根据正面装配图安装元器件。
第六步、根据反面焊接图进行走线。根据反面焊接图进行走线。
反面焊接图
反面焊接图无封装
.
第七步、安装焊接安装焊接电源板焊接电源板。电源板。
剪好的万能板 5V 升压模块 锂电池充电模块 把5V 升压模块的USB 头拆掉
模块贴上双面胶 反面安装上电池接口针座 用元件引脚将模块固定焊住
用导线连接起来 焊接好 接上锂电池
电源指示灯亮就连接正确 准备好电源线
二针插座接5V 模块输出,三针插座除红线外另外两根线一超接锂电池负极,红线接正极。
为什么有两个电源呢?因为单片机需要5V 的电压,所以二针插座接5V 模块给单片机供电。而电机电流非常大,5V 模块长时间工作会带不动发热,可能会烧掉。所直接接锂电池,由于锂电池是3.7V 的电压,比5V 小,电机转速会慢很多,这样小车的可操控性能反而会得到提高,不要一味的提高小车速度,速度太快了是很难控制的…………呵呵,自己去体会吧!
在板子上打两个洞,用扎带扎上,这样可以提高电源线的抗拉扯能力,防止拉断。
电池贴上双面胶,粘在小车底盘里面,用扎带扎上可以很牢固。
将电源板用铜柱固定在小车底盘中间层,电源部分就大功告成。
第八步、安装主控板和电机线。安装主控板和电机线。
用铜柱固定主控板 电机线穿过底盘并打个结防止拉扯断
焊接好电机线,一正一反的焊接 插好针座有要开机
插上超声波测距模块,一定要断电插。然后用USB 口下载程序,测试充电,红灯为正在充电,蓝灯为充满电。
第九步、连接蓝牙测试。连接蓝牙测试。
打开小车电源。
.
在设置里面选择蓝牙,然后搜索设备,这个蓝牙模块的默认名子是BLUE_SPP,然后选择连接,输入默认密码:1234 连接成功后会在已配对的设备中显示。OK ,蓝牙连接完成了。
. .
自己下载〈Android 小车遥控器〉和〈蓝牙遥控终端〉这两款软件。这两个软件都可以遥控。我在程序中已经可以很好的接收这两上软件的控制信号。
注意:蓝牙模块的名称BLUE_SPP都是一样的,密码也都是1234,但MAC 这个物理地址每一个模块都是不一样的。
如果可以遥控但行走的方向不对,只要把电机的线反过来连接就可以了。如果行走的不是直线,那就要换好一点的电机了,当然也可以在转的快一点的电机线上面串一个1欧姆左右的电阻就可以。好了,教程很详细,但也需要你们自己的努力,细心,坚持和爱思考的和改良的精神。祝各位DIY 大神们成功。
.
/*==============================================
项目名称:重力感应遥控车
功能说明:通过手机蓝牙遥控小车,可以重力控制和自动测距无人驾驶功能。
作 者:陈 俊
部 门:江西省电子信息技师学院 电子工程系
时 间:2014年9月18日
===============================================*/
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**************STC专用寄存器声明**************/
sbit EPCAI=IE^6;
sfr CCON = 0xD8;
sbit CCF0 = CCON^0;
sbit CCF1 = CCON^1;
sbit CF = CCON^7;
sbit CR = CCON^6;
sfr CMOD = 0xD9;
sfr CL = 0xE9;
sfr CH = 0xF9;
sfr CCAPM0 = 0xDA;
sfr CCAP0L = 0xEA;
sfr CCAP0H = 0xFA;
sfr IPH = 0xB7;
sfr AUXR = 0x8E;
sfr P3M0 = 0xb1;
sfr P3M1 = 0xb2;
sfr P1M0 = 0x91;
sfr P1M1 = 0x92;
/**************I/O定义**************/
sbit Tx=P3^7;//产生脉冲引脚,延时20us
sbit Rx=P1^0;//回波引脚
bit TimeUp=0;//定时器溢出标志位
uint Measureresult=0;
sbit ZUO_A=P1^7;//左电机A
sbit ZUO_B=P1^6;//左电机B
sbit YOU_A=P1^2;//右电机A
sbit YOU_B=P1^1;//右电机B
sbit zd_led=P3^2;//自动模式LED 指示灯
sbit fmp1=P3^3;
sbit fmp2=P3^4;//蜂鸣器
sbit key1=P3^5;//按键
/**************全局变量**************/
#define FOSC 11059200L
#define T100HZ (FOSC/12/100)
#define gr 50 //干扰值
uchar spp_data[6]={'0','0','0','\r','\n',0};
uchar juli_zhi=0;//距离值,单位是厘米
bit spp=1;//串口发送成功标志
uchar fangxiang=97;//方向变量
bit OS=1;//系统模式变量
uchar zd_os=0;//自动模式系统变量
uint value;
uchar os_js1=0;
uint os_js2=0;
uchar os_js3=0;
uchar os_js4=0;
uint sb_js=0;
uint sb_js1=0;
uchar hz;
bit sb_bz=0;// 声波报警开关,0为关,1为开
uchar fx_js=0;//方向计数随机值
bit fx_bz=0;//方向标志,0为左,1为右
bit fm_bz=1;
bit apk=0;
/**************函数声明**************/
void ckfs(uchar i);
void delay(uint xms);//x毫秒延时函数
void key();
void UartInit(void);//[email protected]串口初始化
uint Measure(void);
void init_PCA();//PCA定时器初始化 定时时间是10毫秒
void mode_0();//原地360度探测模式
void mode_1();//直线行走探测模式
void mode_2();//随机左右转弯模式
bit loop_tc();//循环有效值探测距离
void sbbj();//声波报警
void main()
{
P3M0=0;// 设置I/O口
P3M1=0x0c;// 设置I/O口
P1M0=0;
P1M1=0xc6;
init_PCA();
UartInit();//115200波特率,串口初始化
zd_led=0;
while(1)
{
if (OS==1)//遥控模式
{
zd_led=0;
if (os_js1>6)//每隔60毫秒检测一次距离
{
os_js1=0;
Measure();
}
}
else//遥控与自动混合模式
{
switch (zd_os)
{
case 0:mode_0(); b reak;//原地360度探测模式
case 1:mode_1(); b reak;//直线行走探测模式
case 2:mode_2(); b reak;//随机左右转弯模式
}
}
}
}
void ser() interrupt 4 //串口中断服务函数
{
EA=0;
if (TI==1)
{
ES=1;
EA=1;
return;
}
if (RI==1)fangxiang=SBUF; //将接受到的数据赋值给a
RI=0; //将接受中断标志位清0
if (apk==0)
{
switch(fangxiang)
{
case 65: ZUO_A=1,ZUO_B=0,YOU_A=0,YOU_B=1; break; // 发送的是A 前进指令 case 66: ZUO_A=0,ZUO_B=1,YOU_A=0,YOU_B=1; break; // 发送的是B 右转指令 case 67: ZUO_A=1,ZUO_B=0,YOU_A=1,YOU_B=0; break; // 发送的是C 左转指令 case 68: ZUO_A=0,ZUO_B=1,YOU_A=1,YOU_B=0; break; // 发送的是D 后退指令 case 97: //发送的是a 停止指令
case 98: //发送的是b 停止指令
case 99: //发送的是c 停止指令
case 100: ZUO_A=ZUO_B=YOU_A=YOU_B=0; break; //发送的是d 停止指令 case 'S': ZUO_A=ZUO_B=YOU_A=YOU_B=0,apk=1; break;
case 'E': ZUO_A=ZUO_B=YOU_A=YOU_B=0,fm_bz=1,OS=!OS,zd_os=0,fangxiang=97;
break;
case 'e': ZUO_A=ZUO_B=YOU_A=YOU_B=0,OS=1,fm_bz=1,fangxiang=97; break; //P1口是我的电机驱动的控制端
}
}
else
{
switch(fangxiang)
{
case 'A': ZUO_A=1,ZUO_B=0,YOU_A=0,YOU_B=1; break; //发送的是A 前进指令 case 'D': ZUO_A=0,ZUO_B=1,YOU_A=0,YOU_B=1; break; //发送的是D 右转指令 case 'C': ZUO_A=1,ZUO_B=0,YOU_A=1,YOU_B=0; break; //发送的是C 左转指令 case 'B': ZUO_A=0,ZUO_B=1,YOU_A=1,YOU_B=0; break; //发送的是B 后退指令 case 'S': ZUO_A=ZUO_B=YOU_A=YOU_B=0; break; //发送的是S 停止指令 case 'E': ZUO_A=ZUO_B=YOU_A=YOU_B=0,fm_bz=1,OS=0,zd_os=0,fangxiang='S'; break;
case 'e': ZUO_A=ZUO_B=YOU_A=YOU_B=0,fm_bz=1,OS=1,fangxiang='S'; break; case 97: //发送的是a 停止指令
case 98: //发送的是b 停止指令
case 99: //发送的是c 停止指令
case 100: ZUO_A=ZUO_B=YOU_A=YOU_B=0,apk=0; break; //发送的是d 停止指令 //P1口是我的电机驱动的控制端
}
}
ES=1;
}
void PCA_isr()interrupt 6 using 1//PCA定时中断服务函数,每隔1毫秒中断一次
{
CCF0=0;
CCAP0L=value;
CCAP0H=value>>8;
value=value+T100HZ;
key();
os_js1++;
fx_js++;
if (fx_js>100)//方向随机发生
{
fx_js=0;
fx_bz=!fx_bz;
}
if (os_js2>0)
{
os_js2++;
}
if (OS==0)
{
os_js3++;
if (os_js3>20)
{
os_js3=0;
zd_led=!zd_led;
}
}
if (fm_bz==1)
{
os_js4++;
fmp1=fmp2=1;
if (os_js4>10)
{
os_js4=0;
fmp1=fmp2=0;
fm_bz=0;
}
}
sbbj();//声波报警
}
void UartInit(void) //[email protected]串口初始化
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据, 可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc, 即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
PS=1; //将串口的优先级设为最高
IPH=IPH|0x10;
EA=1; // 打开总中断开关
ES=1; // 打开串口中断开关
}
/*void delay(uint xms)//x毫秒延时函数
{
uchar i;
while (xms--)
{
for (i=0;i
{
if (key1==0)return;
}
}
}*/
void key()//独立按键
{
static bit sw=0,qd=0;
key1=1;
if (key1==0)
{
if (sw==0)qd=1;
if (qd==1)
{
fm_bz=1;
sw=1;
qd=0;
OS=!OS;
ZUO_A=0,ZUO_B=0,YOU_A=0,YOU_B=0;
zd_os=0;
fangxiang=97;
}
}
else qd=0,sw=0;
}
uint Measure(void)
{
uchar Th0,Tl0;
ulong time0=0;
uchar Del20us=0; //延时变量,在超声波脉冲引脚中产生 20us 的方波
bit RxBack=1; //超声波返回标志位
// AUXR &= 0x7F; //定时器时钟12T 模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
Tx=0; //将超声波脉冲引脚电位拉低
Th0=0; //初始化变量值
Tl0=0; //初始化变量值
TimeUp=0; //初始化
while (EA==0);
TR0=0;//关定时器 0
TH0=0;//赋定时器初始值高 8 位为 0
TL0=0;//赋定时器初始值低 8 位为 0
Tx=1;//拉高超声波脉冲引脚电位
for(Del20us=50;Del20us>0;Del20us--);//延时 20us
Tx=0; //拉低超声波脉冲引脚电位,使之产生 20us 的方波信号,使超声波模块开始工作。 while(Rx==0);//等待回波引脚变 1;
TR0=1;//开定时器 0
ET0=1; //开定时器 0 中断
while(RxBack)
{
if(Rx==0||TimeUp==1){TR0=0;Th0=TH0;Tl0=TL0;TR0=1;RxBack=0;}
}
while(!TimeUp);//等待定时器溢出
time0=(Th0*256+Tl0);//取出定时器的值
Measureresult=((ulong)(344)*time0)/2000;//测量的结果单位为 mm
if(Measureresult900){Measureresult=1000;}
//过滤掉一些异常的数据,当测量出的距离不在 10-900mm 时返回值为 0
if (Measureresult
else spp_data[0]=Measureresult/100+48;
if (Measureresult
else spp_data[1]=Measureresult/10%10+48;
spp_data[2]=Measureresult%10+48;
ckfs(spp_data[0]);
ckfs(spp_data[1]);
ckfs(spp_data[2]);
ckfs(spp_data[3]);
ckfs(spp_data[4]);
ckfs(spp_data[5]);
if (Measureresult>320)
{
sb_bz=0,hz=1;
}
else
{
sb_bz=1;
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
if (Measureresult
}
return Measureresult;
}
void T0_time() interrupt 1
{
TimeUp=1;
}
void ckfs(uchar i)
{
SBUF=i;
while(!TI);
TI=0;
}
void init_PCA()//PCA定时器初始化 定时时间是1毫秒 {
CCON=0;
CL=CH=0;
CMOD=0;
value=T100HZ;
CCAP0L=value;
CCAP0H=value>>8;
value=value+T100HZ;
CCAPM0=0X49;
EA=EPCAI=CR=1;
}
void mode_0()//原地360度探测模式
{
while (loop_tc()==0&&OS==0)
{
os_js2=1;
while (os_js2
{
if (fangxiang>68)
{
ZUO_A=1,ZUO_B=0,YOU_A=1,YOU_B=0;//左转 }
}
os_js2=0;
ZUO_A=0,ZUO_B=0,YOU_A=0,YOU_B=0;//停止 }
}
void mode_1()//直线行走探测模式
{
if (Measure()>250&&OS==0)
{
if (fangxiang>68)
{
ZUO_A=1,ZUO_B=0,YOU_A=0,YOU_B=1;//前进 }
}
else
{
ZUO_A=0,ZUO_B=0,YOU_A=0,YOU_B=0;//停止 zd_os=2;
}
}
void mode_2()//随机左右转弯模式
{
if (fx_bz)
{
if (fangxiang>68)
{
ZUO_A=0,ZUO_B=1,YOU_A=0,YOU_B=1;//右转 }
}
else
{
if (fangxiang>68)
{
ZUO_A=1,ZUO_B=0,YOU_A=1,YOU_B=0;//左转 }
}
os_js2=1;
while (os_js2
os_js2=0;
ZUO_A=0,ZUO_B=0,YOU_A=0,YOU_B=0;//停止 zd_os=1;
}
bit loop_tc()//循环值探测有效距离
{
uint i[2];
bit loop=1;
while (loop)
{
i[0]=Measure();
os_js2=1;
while (os_js2
os_js2=0;
i[1]=Measure();
os_js2=1;
while (os_js2
os_js2=0;
if (i[0]>i[1])
{
if (i[0]-i[1]
else
{
if (i[1]-i[0]
}
if (i[0]>300)
{
zd_os=1;
return 1;
}
return 0;
}
void sbbj()//声波报警
{
if (sb_bz==1)
{
sb_js++;
if (sb_js>1000/hz)
{
sb_js=0;
fmp1=fmp2=1;
sb_js1=1;
}
else
{
if (sb_js1--==0)fmp2=fmp1=0; }
}
}