制作:安卓手机遥控小车

市面上的智能小车已经很多了,循迹的,避障的,手机遥控的,种类繁多,我们芝麻DIY终于也推出一款小车,很遗憾,它只有一个功能,那就是手机wifi遥控,本文介绍该小车的组成部分,解释部分源码。

虽然我们的功能很简单,但这同时也是我们最大的优点,我们的电路结构非常简易,十分适合手工操作,硬件包括:STC15单片机一块,ESP8266串口转WIFI模块一个,L9110s两路电机驱动模块一个,还有电阻,排针插座,线缆等其他一些小部件。

当我们收到货以后,可以先把小车的底盘安装好,底盘请按照说明文件或者上图安装,然后就是电机和L9110s模块的连接了,我们为了保证手机遥控方向的统一,可以按下面的说明接线:

模块 —————–小车

OA1——————左侧电机左触点(左触点是指将电机有焊点一面面向自己,左边那一个焊点)

OB1——————左侧电机右触点

OA2——————右侧电机左触点

OB2——————右侧电机右触点

20161012001

下面是我们的整体电路原理图:

对于单片机中的程序,我们可以看到,当单片机串口接收到字符的时候,进入命令判断程序,第一个字符必须为‘-’才能被识别为是手机发来的程序,然后是一个Switch,case语句用于判断不同动作:

//========================================================================
// 函数: void main(void)
// 描述: 主程序.
// 参数: 无.
// 返回: 无.
// 版本: V1.0, 2016-10-12
//========================================================================
void main(void)
{

InternalRAM_enable();
// ExternalRAM_enable();
Timer0_1T();
Timer0_AsTimer();
Timer0_16bitAutoReload();
Timer0_Load(Timer0_Reload);
Timer0_InterruptEnable();
PT0 = 1; //定时器0高优先级中断
Timer0_Run();
EA = 1; //打开总中断 open global interrupt switch
Timer1Init();
UART_INIT(); //UART模块的初始变量

while (1)
{
if (B_Rx_OK) //接收完的标志位, 收到数据块系统设置1, 用户处理数据后必须清0
{
if(Rx_Cnt > 0) //确认有数据
{
if(RxBuf[0]=='-'){ //收到第一个字符为'-',表明是手机发送的,避免误码
a = RxBuf[1];
b = (int)a;
switch(b) {
case 49 : go_ahead();break; //1,前进
case 50 : go_back();break;
case 51 : P25=!P25;break; //3,后退
case 52 : turn_left();break;
case 53 : turn_right();break;
case 54 : go_stop();break; } //6,停止
TxString("-OKAY!\r\n"); //单片机回复收到
}
else{
P1=0x00;
}
Rx_Cnt = 0; //清除字节数
B_Rx_OK = 0; //清除接收完成标志
}
}
}
}

借助wifi转串口模块,我们可以轻易的将TCP/IP数据包转化为串口数据,因此我们在安卓端编程时就非常方便,使用SOCKET可以轻易地向模块的特定端口发送数据。图中的安卓程序,每点击以下按钮,就会进入子线程,新建一个socket对象,发送按钮对应的数据,如按住‘前进’按钮,发送‘-1’,松开按钮,发送‘-6’.

注意,本小车不配备电池,大家需要使用自己的电源供电,一般的手机移动电源就可以,在放置电源的时候,一定要将电源放在小车的中心位置,不然容易使小车重心偏移,导致在行驶过程中单侧轮胎容易打滑,或者路线弯曲。