在這個項目中,我們將使用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
}
}
?
?
評論
查看更多