如何使用8051微控制器和蓝牙模块构建一个Android手机控制的机器人

机器人

518人已加入

描述

在这个项目中,我们将使用8051微控制器和蓝牙模块构建一个Android手机控制的机器人。该机器人是使用直流电机设计的,直流电机的方向将由从安卓应用程序收到的命令控制。机器人的状态被发送回安卓应用程序。该项目还将帮助HC-05蓝牙模块与8051微控制器的接口.

所需组件:

8051 微控制器 (AT89S52)

HC-05 蓝牙模块

L293D 电机驱动器

机器人底盘

直流电机 (2)

轮子 (2)

脚轮

跳线

蓝牙终端安卓应用

电路图:

8051

 

8051

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 蓝牙模块:

8051

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的引脚说明。

8051

 

8051

引脚说明

 

引脚编号 名字 功能
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 关闭 关闭 停止

 

8051

蓝牙终端应用程序允许我们模拟蓝牙终端。此应用程序支持双向通信,此应用程序与大多数设备兼容。

以下步骤显示了如何安装和使用此应用。

1.在您的安卓手机上下载并安装蓝牙终端应用程序。

2.安装应用程序后,打开应用程序并打开蓝牙。

3.选择设备,然后单击连接选项。连接成功后,我们可以开始向HC-05模块发送数据。

8051

8051

查看下面的代码说明,了解 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

}

}
 


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分