在这个项目中,我们将使用8051微控制器和蓝牙模块构建一个Android Phone控制的机器人。机器人是使用直流电动机设计的,直流电动机的方向将由从android应用程序接收的命令控制。机器人的状态会发送回Android应用。该项目还将帮助HC-05蓝牙模块与8051微控制器接口。我们已经使用蓝牙模块通过8051控制家用电器。
所需组件:
- 8051微控制器(AT89S52)
- HC-05蓝牙模块
- L293D电机驱动器
- 机器人底盘
- 直流电动机(2)
- 轮圈(2)
- 脚轮
- 跳线
- 蓝牙终端android应用
电路原理图:
8051单片机:
8051微控制器是一个8位微控制器,具有128字节的片上RAM,4K字节的片上ROM,两个定时器,一个串行端口和四个8位端口。8052微控制器是8051微控制器的扩展。在这个项目中,我们使用AT89S52微控制器。下表显示了8051家庭成员的比较。
特征 |
8051 |
8052 |
ROM(以字节为单位) |
4K |
8K |
RAM(字节) |
128 |
256 |
计时器 |
2 |
3 |
I / O引脚 |
32 |
32 |
串行端口 |
1个 |
1个 |
中断源 |
6 |
8 |
HC-05蓝牙模块:
HC-05是串行蓝牙模块。可以使用AT命令进行配置。它可以在三种不同的配置(主控,从属,回送)中工作。在我们的项目中,我们将其用作奴隶。HC-05模块的功能包括:
- 典型的-80dBm灵敏度。
- 默认波特率:9600bps,8个数据位,1个停止位,无奇偶校验。
- 自动配对密码:默认密码为“ 1234”
- 它具有6个引脚。
- Vcc和Gnd引脚用于为HC-05供电。
- Tx和Rx引脚用于与微控制器通信。
- 使能引脚用于激活HC-05模块。低电平时,模块被禁用
- 状态引脚动作状态指示器。未与其他任何蓝牙设备配对/连接时,LED持续闪烁。当它与任何其他蓝牙设备连接/配对时,LED会以2秒的恒定延迟闪烁。
L293D电机驱动器IC:
L293D是双H桥电机驱动器IC。它用作电流放大器,L293D的输出驱动直流电动机。它包含两个内置的H桥电路。在普通操作模式下,它可以同时在两个方向上驱动两个直流电动机。下表显示了L293D IC的引脚说明。以下是一些使用L293D电动机驱动器的项目。
引脚说明
销号 |
名称 |
功能 |
1个 |
启用1,2 |
电机1的使能引脚 |
2 |
输入1 |
电机1的输入1 |
3 |
输出1 |
电机1的输出1 |
4 |
nd |
地线(0V) |
5 |
nd |
地线(0V) |
6 |
输出2 |
电机1的输出2 |
7 |
输入2 |
电机1的输入2 |
8 |
Vcc 2 |
电机电源电压(5V) |
9 |
启用3,4 |
电机1的使能引脚 |
10 |
输入3 |
电机2的输入1 |
11 |
输出4 |
电机2的输出1 |
12 |
nd |
地线(0V) |
13 |
nd |
地线(0V) |
14 |
输出4 |
电机2的输出2 |
15 |
输入4 |
电机2的输入2 |
16 |
Vcc 1 |
电源电压(5V) |
Android手机控制机器人的工作方式:
在此智能手机控制的机器人中,Android应用程序的用户通过HC-05模块将数据发送到8051微控制器。在8051微控制器中比较接收到的数据,并据此做出决定。下表显示了不同接收字符的电机方向和机器人状态。
收到的字符 |
马达1 |
马达2 |
机器人状态 |
F |
前锋 |
前锋 |
前进 |
b |
落后 |
落后 |
向后移动 |
[R |
前锋 |
落后 |
向右移动 |
升 |
落后 |
前锋 |
向左移动 |
s |
关 |
关 |
已停止 |
该蓝牙终端应用程序允许我们来模拟一个蓝牙终端。此应用程序支持双向通信,并且与大多数设备兼容。
以下步骤显示了如何安装和使用此应用程序。
1.在您的Android手机上下载并安装蓝牙终端应用程序。该应用程序可以从下面的链接下载。
play.google.com/store/apps/details?id=ptah.apps.bluetoothterminal
2.安装应用程序后,打开应用程序并打开蓝牙。
3.选择设备,然后单击连接选项。连接成功后,我们就可以开始向HC-05模块发送数据了。
检查下面的代码说明,以了解8051微控制器如何发送和接收字符以旋转所需的电动机。
代码说明:
在该项目的结尾给出了该项目的完整C程序和演示视频。该代码分为多个有意义的小块,并在下面进行说明。
对于与8051微控制器连接的L293D,我们必须定义将L293D连接到8051微控制器的引脚。电动机1的In1引脚连接到P2.0,电动机1的In2引脚连接到P2.1,电动机2的In1引脚连接到P2.2,电动机2的In2引脚连接到P2.3
比特m1f = P2 ^ 0; //电机1的in1引脚sbit m1b = P2 ^ 1; //电机1的in2引脚sbit m2f = P2 ^ 2; //电机2的in1引脚sbit m2b = P2 ^ 3; //电机2的in2引脚
接下来,我们必须定义一些在程序中使用的功能。 延迟 功能用于创建指定的时间延迟。 Txdata 功能用于通过串行端口传输数据。 Rxdata 函数用于从串行端口接收数据。
void delay(unsigned int); //创建延迟的函数char rxdata(void); //通过8051的串口接收字符的函数void txdata(unsigned char); //通过8051串口发送字符的功能
在这部分代码中,我们将配置8051微控制器进行串行通信。TMOD寄存器中的0x20用于定时器1,模式2(自动重载)。SCON寄存器装载了0x50的8个数据位,1个停止位并允许接收。TH1寄存器装入0xfd,波特率为每秒9600位。TR1 = 1用于启动计时器。
TMOD = 0x20; SCON = 0x50;TH1 = 0xfd;TR1 = 1;在此部分代码中, rxdata 函数的返回字符存储在变量s中,以 备将来 使用。
s = rxdata(); //从hc-05蓝牙模块接收串行数据
在代码的这一部分中,我们必须将接收到的字符与针对不同方向的预分配字符进行比较。如果收到的字符是“ f”,则机器人必须向前移动。这可以通过将 m1f,m2f 引脚 设为 高电平并将 m1b,m2b 引脚 设为 低电平来实现。完成此操作后,接下来我们必须将机器人的状态发送到android应用。这是在 txdata 函数的帮助下 完成的 。对接收到的不同字符重复相同的过程,并据此做出决定。表1显示了针对机器人不同运动方向的m1f,m1b,m2f,m2b的不同值。
if(s =='f')//向前移动两个电动机{m1f = 1; delay(1); m1b = 0;delay(1); m2f = 1; delay(1); m2b = 0;delay(1); for(i = 0; msg1!='\ 0'; i ++)//通过蓝牙将机器人的状态发送到android应用{txdata(msg1); }}
1楼 |
m1b |
平方米 |
m2b |
电机1转 |
电机2旋转 |
机器人状态 |
1个 |
0 |
1个 |
0 |
前锋 |
前锋 |
向前进 |
0 |
1个 |
0 |
1个 |
逆转 |
逆转 |
向后移动 |
1个 |
0 |
0 |
1个 |
前锋 |
逆转 |
向右移动 |
0 |
1个 |
1个 |
0 |
逆转 |
前锋 |
向左移动 |
0 |
0 |
0 |
0 |
停止了 |
停止了 |
停止了 |
这就是您可以通过使用8051微控制器控制四个电机来向任何方向旋转机器人汽车。如果您没有Android手机,也可以使用带有8051的DTMF来控制此机器人。
还要在此处检查所有机器人项目。