重力感应智能小车完整制作过程

重力遥控智能小车完整制作教程重力遥控智能小车完整制作教程

智能小车并不是什么新鲜的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; }

}

}


相关文章

  • 毕业设计 智能循迹小车
  • 摘 要 本文论述了基于单片机的智能循迹小车的控制过程.智能循迹是基于自动引导机器人系统,用以实现小车自动识别路线,以及选择正确的路线.智能循迹小车是一个运用传感器.单片机.电机驱动及自动控制等技术来实现按照预先设定的模式下,不受人为管理时能 ...查看


  • 2016年贵州省贵阳市中考物理试卷(答案和解析)
  • 2016年贵州省贵阳市中考物理试卷 参考答案与试题解析 一.选择题:本题包括6个小题,每小题3分,共18分.每小题只有一个选项符合题意 1.(3分)(2016•贵阳)水是大自然的精灵,瞬息万变中向我们展示了它神秘的特性.如图所示的四个场景中 ...查看


  • 飞思卡尔-智能车入门
  • 从外观上看,智能车系统主要表现为由一系列的硬件组成,包括组成车体的底盘.轮胎.舵机装置.马达装置.道路检测装置.测速装置和控制电路板等.硬件是智能车系统的基础,没有一个好的硬件平台,智能车就无法运行.而软件部分则是整个智能车系统的灵魂,软件 ...查看


  • 山西省太原市2015届高三一模物理试卷
  • 山西省太原市2015届高考物理一模试卷 一.选择题(每小题6分,共48分,1-5小题只有一个选项正确,6-8有多个选项正确) 1.从太阳和其他星体发射出的高能粒子流,在射向地球时,由于地磁场的存在,改变了运动方向,对地球起到了保护作用.如图 ...查看


  • 中考物理实验知识点
  • 实验一.平面镜成像.光的反射实验专题 在"探究平面镜成像的特点" 的实验中 1. 小明选择玻璃板代替平面镜进行实验的目的是便于准确确定像的位置:实验中 应选较薄的玻璃板(选填"较厚"或"较薄 ...查看


  • 电场中圆周运动的临界问题的处理
  • 一. 机械能综合 1. 如图所示, 光滑的水平轨道与竖直放置的光滑半圆形轨道顺接, 圆半径为R . 一小球由D 点出发向A 运动, 通过B 点时加速度大小为 (1) 小球刚通过A 点时对轨道的压力. (2) 小球通过B 点时对轨道的压力. ...查看


  • 第五届上海市大学生工程训练综合能力竞赛命题
  • 第五届上海市大学生工程训练综合能力竞赛命题 1.竞赛主题 本届竞赛主题为"自动辨识无碳小车竞赛". 要求经过一定的前期准备后,在比赛现场完成一台符合本命题要求的可运行的机械装置,并进行现场竞争性运行考核.每个参赛作品需要 ...查看


  • 高二物理会考实验专题
  • 高二物理会考--实验专题  DIS测小车位移或加速度 1.在图12所示的DIS实验中,把运动传感器的发射部分A固定在小车上,其接收部分B固定在导轨右端.现让小车在导轨上作直线运动,在计算机屏幕上得到了小车运动的s-t. v-t图像如图13 ...查看


  • 智能循迹小车___设计报告
  • 竞速智能循迹小车设 计报告 参赛队伍-- 参赛人--胡沁玫,万超 目录 摘要:„„„„„„„„„„„„„„„„„„ 引言:„„„„„„„„„„„„„„„„„„ 设计方案:„„„„„„„„„„„„„„„„ 报告内容安排:„„„„„„„„„„„ ...查看


热门内容