在这个项目中,我们将使用8051微控制器和蓝牙模块构建一个Android手机控制的机器人。该机器人是使用直流电机设计的,直流电机的方向将由从安卓应用程序收到的命令控制。机器人的状态被发送回安卓应用程序。该项目还将帮助HC-05蓝牙模块与8051微控制器的接口.
所需组件:
8051 微控制器 (AT89S52)
HC-05 蓝牙模块
L293D 电机驱动器
机器人底盘
直流电机 (2)
轮子 (2)
脚轮
跳线
蓝牙终端安卓应用
电路图:
8051 微控制器:
8051微控制器是一种8位微控制器,具有128字节的片上RAM,4K字节的片上ROM,两个定时器,一个串行端口和四个8位端口。8052微控制器是8051微控制器的扩展。在这个项目中,我们使用AT89S52微控制器。下表显示了8051名家庭成员的比较。
特征 | 8051 | 8052 |
只读存储器(以字节为单位) | 4K | 8K |
内存(字节) | 128 | 256 |
定时器 | 2 | 3 |
I/O 引脚 | 32 | 32 |
串行端口 | 1 | 1 |
中断源 | 6 | 8 |
HC-05 蓝牙模块:
HC-05 是一个串行蓝牙模块.可以使用 AT 命令对其进行配置。它可以在三种不同的配置(主、从、环回)下工作。在我们的项目中,我们将它用作从属。HC-05模块的特点包括:
典型灵敏度为-80dBm。
默认波特率:9600bps,8个数据位,1个停止位,无奇偶校验。
自动配对 PIN 码:“1234”默认 PIN 码
它有 6 个引脚。
Vcc 和 Gnd 引脚用于为 HC-05 供电。
Tx 和 Rx 引脚用于与微控制器通信。
用于激活 HC-05 模块的使能引脚。当它为低时,模块被禁用
状态引脚行为状态指示灯。当它未与任何其他蓝牙设备配对/连接时,LED 会持续闪烁。当它与任何其他蓝牙设备连接/配对时,LED 会以 2 秒的恒定延迟闪烁。
L293D 电机驱动器 IC:
L293D 是一款双 H 桥电机驱动器 IC。它充当电流放大器,L293D 的输出驱动直流电机。它包含两个内置的H桥电路。在共模运行模式下,它可以在两个方向上同时驱动两个直流电机。下表显示了L293D IC的引脚说明。
引脚说明
引脚编号 | 名字 | 功能 |
1 | 启用 1,2 | 电机 1 的使能引脚 |
2 | 输入 1 | 输入 1 用于电机 1 |
3 | 产出 1 | 电机 1 的输出 1 |
4 | 格德 | 接地 (0V) |
5 | 格德 | 接地 (0V) |
6 | 产出 2 | 电机 2 的输出 1 |
7 | 输入 2 | 输入 2 用于电机 1 |
8 | Vcc 2 | 电机电源电压(5V) |
9 | 启用 3,4 | 电机 1 的使能引脚 |
10 | 输入 3 | 输入 1 用于电机 2 |
11 | 产出 4 | 电机 1 的输出 2 |
12 | 格德 | 接地 (0V) |
13 | 格德 | 接地 (0V) |
14 | 产出 4 | 电机 2 的输出 2 |
15 | 输入 4 | 输入 2 用于电机 2 |
16 | Vcc 1 | 电源电压 (5V) |
安卓手机控制机器人的工作:
在这个智能手机控制的机器人中,android应用程序的用户通过HC-05模块将数据发送到8051微控制器。在8051微控制器中比较接收到的数据,并做出相应的决定。下表显示了不同接收字符的电机方向和机器人状态。
接收的字符 | 电机 1 | 电机 2 | 机器人现状 |
f | 向前 | 向前 | 向前迈进 |
b | 向后 | 向后 | 向后移动 |
r | 向前 | 向后 | 向右移动 |
l | 向后 | 向前 | 向左移动 |
s | 关闭 | 关闭 | 停止 |
蓝牙终端应用程序允许我们模拟蓝牙终端。此应用程序支持双向通信,此应用程序与大多数设备兼容。
以下步骤显示了如何安装和使用此应用。
1.在您的安卓手机上下载并安装蓝牙终端应用程序。
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
sbit m1f=P2^0; // in1 pin of motor1
sbit m1b=P2^1; // in2 pin of motor1
sbit m2f=P2^2; // in1 pin of motor2
sbit m2b=P2^3; // in2 pin of motor2
接下来,我们必须定义一些在程序中使用的函数。延迟功能用于创建指定的时间延迟。Txdata功能用于通过串口传输数据。Rxdata功能用于从串口接收数据。
void delay(unsigned int) ; //function for creating delay
char rxdata(void); //function for receiving a character through serial port of 8051
void txdata(unsigned char); //function for sending a character through serial port of 8051
在代码的这一部分中,我们将配置8051微控制器进行串行通信。TMOD寄存器加载了定时器1模式2(自动重新加载)的0x20。SCON 寄存器加载了 8 个数据位、1 个停止位和接收启用的0x50。TH1寄存器加载了波特率为每秒9600位的0xfd。TR1=1 用于启动计时器。
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TR1=1;
在代码的这一部分中,rxdata 函数的返回字符存储在变量 's' 中以供进一步使用。
s=rxdata(); //receive serial data from hc-05 bluetooth module
在代码的这一部分中,我们必须将接收到的字符与不同方向的预分配字符进行比较。如果接收到的字符是“f”,则机器人必须向前移动。这是通过使 m1f、m2f 引脚高而 m1b、m2b 引脚低来实现的。完成此操作后,接下来我们必须将机器人的状态发送到Android应用程序。这是在 txdata 功能的帮助下完成的。对收到的不同字符重复相同的过程,并做出相应的决定。表1显示了机器人不同运动方向的m1f,m1b,m2f,m2b的不同值。
if(s=='f') //move both the motors in forward direction
{
m1f=1;
delay(1);
m1b=0;
delay(1);
m2f=1;
delay(1);
m2b=0;
delay(1);
for(i=0;msg1[i]!='';i++) //send status of robot to android app through bluetooth
{
txdata(msg1[i]);
}
}
M1F | M1B | M2F | M2B | 电机 1 旋转 | 电机 2 旋转 | 机器人现状 |
1 | 0 | 1 | 0 | 向前 | 向前 | 前进 |
0 | 1 | 0 | 1 | 反向 | 反向 | 向后移动 |
1 | 0 | 0 | 1 | 向前 | 反向 | 向右移动 |
0 | 1 | 1 | 0 | 反向 | 向前 | 向左移动 |
0 | 0 | 0 | 0 | 停止 | 停止 | 停止 |
这是您可以通过使用 8051 微控制器控制四个电机来向任何方向旋转机器人汽车。
/*this program is for controlling a robot using bluetooth and android app*/
#include
unsigned char ch1;
unsigned char s;
sbit m1f=P2^0; // in1 pin of motor1
sbit m1b=P2^1; // in2 pin of motor1
sbit m2f=P2^2; // in1 pin of motor2
sbit m2b=P2^3; // in2 pin of motor2
void delay(unsigned int) ; //function for creating delay
char rxdata(void); //function for receiving a character through serial port of 8051
void txdata(unsigned char); //function for sending a character through serial port of 8051
void main(void)
{
unsigned char i;
unsigned char msg1[]={"robot is moving forward"};
unsigned char msg2[]={"robot is moving backward"};
unsigned char msg3[]={"robot is moving right"};
unsigned char msg4[]={"robot is moving left"};
unsigned char msg5[]={"robot is stopped"};
TMOD=0x20; //timer 1 , mode 2 , auto reload
SCON=0x50; //8bit data , 1 stop bit , REN enabled
TH1=0xfd; //timer value for 9600 bits per second(bps)
TR1=1;
while(1) //repeat forever
{
s=rxdata(); //receive serial data from hc-05 bluetooth module
if(s=='f') //move both the motors in forward direction
{
m1f=1;
delay(1);
m1b=0;
delay(1);
m2f=1;
delay(1);
m2b=0;
delay(1);
for(i=0;msg1[i]!='';i++)
{
txdata(msg1[i]);
}
}
else if(s=='b')
{
m1f=0;
delay(1);
m1b=1;
delay(10);
m2f=0;
delay(10);
m2b=1;
delay(10);
for(i=0;msg2[i]!='';i++)
{
txdata(msg2[i]);
}
}
else if(s=='r')
{
m1f=1;
delay(1);
m1b=0;
delay(10);
m2f=0;
delay(10);
m2b=1;
delay(10);
for(i=0;msg3[i]!='';i++)
{
txdata(msg3[i]);
}
}
else if(s=='l')
{
m1f=0;
delay(1);
m1b=1;
delay(1);
m2f=1;
delay(1);
m2b=0;
delay(1);
for(i=0;msg4[i]!='';i++)
{
txdata(msg4[i]);
}
}
else if(s=='s')
{
m1f=0;
delay(1);
m1b=0;
delay(1);
m2f=0;
delay(1);
m2b=0;
delay(1);
for(i=0;msg5[i]!='';i++)
{
txdata(msg5[i]);
}
}
txdata('n');
}
}
char rxdata()
{
while(RI==0); //wait till RI becomes HIGH
RI=0; //make RI low
ch1=SBUF; //copy received data
return ch1; //return the received data to main function.
}
void txdata(unsigned char x)
{
SBUF=x; //copy data to be transmitted to SBUF
while(TI==0); //wait till TI becomes high
TI=0; //mae TI low for next transmission
}
void delay(unsigned int z)
{
unsigned int p ,q;
for(p=0 ; p
{
for(q=0 ; q<1375 ; q++); //repeat for 1375 times
}
}