使用伺服電機在機器人技術中很常見,以實現精確控制。在這里,在本教程中,我們將向您展示如何通過藍牙連接將伺服電機與Arduino UNO和Android設備無線使用。我們已經使用 Arduino 控制了伺服,這次我們使用Arduino 和藍牙控制伺服電機。
所需材料
Arduino UNO
HC-05 或 HC-06 藍牙模塊
伺服電機
來自Playstore的Roboremo應用程序
面包板
連接線
HC-06 藍牙模塊
藍牙可以在以下兩種模式下運行:
命令模式
操作模式
在命令模式下,我們將能夠配置藍牙屬性,例如藍牙信號的名稱,密碼,操作波特率等。操作模式是我們能夠在PIC微控制器和藍牙模塊之間發送和接收數據的模式。因此,在本教程中,我們將只玩弄操作模式。命令模式將保留默認設置。設備名稱將是HC-05(我正在使用HC-06),密碼將是0000或1234,最重要的是,所有藍牙模塊的默認波特率為9600。
模塊采用 5V 電源供電,信號引腳工作在 3.3V,因此模塊本身存在一個 3.3V 穩壓器。因此,我們不必擔心。在六個引腳中,只有四個將在操作模式下使用。引腳連接表如下所示
?
S.No | HC-05/HC-06 上的引腳 | MCU 上的引腳名稱 | PIC 中的引腳編號 |
1 | Vcc | Vdd | 31圣針 |
2 | Vcc | 格德 | 32德·針 |
3 | 德克薩斯 | RC6/Tx/CK | 25千針 |
4 | 接收 | RC7/Rx/DT | 26千針 |
5 | 州 | 數控 | 數控 |
6 | 英文(使能) | 數控 | 數控 |
?
電路圖
此Arduino藍牙伺服電機控制項目的電路圖如下:
?
配置 Roboremo 應用程序以控制伺服:
第 1 步:-從Android Play商店下載Roboremo應用程序并將其安裝在智能手機中。安裝后,您將看到如圖1所示的應用程序窗口,通過單擊“菜單”按鈕,您將看到如下所示的圖2所示窗口:
?
第 2 步:-然后單擊連接按鈕,您將看到下面圖3所示的窗口,然后您必須選擇“藍牙RFCOMM”,然后您將能夠將HC-06藍牙模塊與Android應用程序“Roboremo”連接。
第 3 步:-連接到HC-06藍牙模塊后,返回圖2窗口,然后單擊“編輯ui”以根據需要創建用戶界面。
當單擊“編輯ui”時,您將再次看到圖1所示的窗口,然后單擊屏幕上的任意位置,您將看到如圖4所示的應用程序窗口,然后選擇“按鈕”以獲取按鈕結構。
第 4 步:-選擇按鈕后,您將在屏幕上看到一個按鈕結構進行編輯。您可以調整結構的大小并將其移動到屏幕上的任意位置。現在,要設置通過藍牙單擊時發送的值,您有“設置按下操作”(如圖 6 所示)并鍵入要從該特定按鈕發送的值。就像,我們正在發送“1”通過按 Roboremo android 應用程序中的“開始”按鈕來旋轉伺服。
您可以在后面給出的表格中檢查所有值,單擊不同的按鈕發送。
?
第 5 步:-最后,我們有用戶界面來使用智能手機控制伺服電機。
代碼和說明
最后給出了通過藍牙的Arduino控制伺服電機的完整代碼。
Arduino具有伺服電機庫,它處理所有與PWM相關的東西來旋轉伺服器,您只需要輸入要旋轉的角度,并且有功能servo1.write(angle); 這會將伺服器旋轉到所需的角度。
因此,這里我們首先定義伺服電機的庫,軟件串行庫用于定義Rx和Tx引腳。
#include
#include
在下面的代碼中,我們正在初始化 Rx 和 Tx 的 Arduino 引腳,為伺服和其他東西定義變量。
Servo myServo; int TxD = 11; int RxD = 10; int servoposition; int servopos; int new1; SoftwareSerial bluetooth(TxD, RxD);
現在,將所有變量和組件設置為初始階段。在這里,我們將伺服器連接到 9千Arduino的引腳,并使伺服的初始位置為0度。串行和藍牙通信的波特率也已設置為 9600。
void setup() {
int pos=0;
myServo.attach(9);
myServo.write(0);
Serial.begin(9600); ? ? ? // start serial communication at 9600bps
bluetooth.begin(9600);
}
在空回路功能中,Arduino將一直檢查輸入的值,并根據從智能手機接收的值旋轉伺服。所有值都將使用串行通信接收。
如果值為 0,則伺服將旋轉到 0 度。同樣,如果我們從藍牙應用程序發送 45、90、135 和 180,則伺服將分別旋轉到 45、90、135 和 180 度角。
void loop() {
if (bluetooth.available()){
String value = bluetooth.readString();
servoposition = value.toInt();
if (value.toInt() == 0){
Serial.println(servoposition);
myServo.write(0);
}
if (value.toInt() == 45){
Serial.println(servoposition);
myServo.write(45);
}
if (value.toInt() == 90){
Serial.println(servoposition);
myServo.write(90);
}
if (value.toInt() == 135){
Serial.println(servoposition);
myServo.write(135);
}
if (value.toInt() == 180){
Serial.println(servoposition);
myServo.write(180);
}
如果我們通過按開始按鈕發送值“1”,則伺服將連續旋轉,直到按下停止按鈕。在這里,我們在按下停止按鈕時發送“2”,Arduino 將讀取該按鈕,它將中斷 while 循環并停止伺服。
while(value.toInt()==1){
if (bluetooth.available())
{
value = bluetooth.readString();
Serial.println(value);
if (value.toInt()==2)
{Serial.println("YYY"); break; }
}
servopos++;
delay(30);
Serial.println(servopos);
myServo.write(servopos);
if (servopos ==180 )
{servopos=0;break;}?
}?
}
}
使用藍牙的伺服電機控制工作:
在這個項目中,我們使用Android應用程序“Roboremo”控制伺服電機。在此應用程序的界面中,我們創建了 5 個按鈕來控制伺服電機,如前所述。下表給出了每個按鈕的工作:
?
S.No。 | 按鈕名稱 | 發送值 | 描述 |
1. | 開始 | 1 | 此按鈕用于開始將伺服從 0? 旋轉到 180?。 |
2. | 停 | 2 | 此按鈕用于隨時停止舵機。 |
3. | 0? | 0 | 此按鈕用于將舵機旋轉到 0?。 |
4. | 90? | 90 | 此按鈕用于將舵機旋轉到 90?。 |
5. | 180? | 180 | 此按鈕用于將舵機旋轉到 180?。 |
?
因此,通過按下Android應用程序Roboremo上的這些按鈕,數據將通過智能手機的藍牙發送到HC-06藍牙模塊。從HC-06模塊數據由Arduino接收,Arduino以特定按鈕的代碼中定義的角度旋轉伺服。我們還對角度 45 和 135 進行了編碼,但由于 Roboremo 應用程序的限制,您只能創建 5 個按鈕,因此我們跳過了兩個按鈕。
因此,這就是您可以使用藍牙將數據從智能手機發送到Arduino以無線控制伺服的方法。
#include
#include
Servo myServo;
int TxD = 11;
int RxD = 10;
int servoposition;
int servopos;
int new1;
SoftwareSerial bluetooth(TxD, RxD);
void setup() {
int pos=0;
myServo.attach(9);
myServo.write(0);
Serial.begin(9600); // start serial communication at 9600bps
bluetooth.begin(9600);
}
void loop() {
if (bluetooth.available())
{
String value = bluetooth.readString();
servoposition = value.toInt();
if (value.toInt() == 0)
{
Serial.println(servoposition);
myServo.write(0);
}
if (value.toInt() == 45)
{
Serial.println(servoposition);
myServo.write(45);
}
if (value.toInt() == 90)
{
Serial.println(servoposition);
myServo.write(90);
}
if (value.toInt() == 135)
{
Serial.println(servoposition);
myServo.write(135);
}
if (value.toInt() == 180)
{
Serial.println(servoposition);
myServo.write(180);
}
while(value.toInt()==1){
if (bluetooth.available())
{
value = bluetooth.readString();
Serial.println(value);
if (value.toInt()==2)
{Serial.println("YYY"); break; }
}
servopos++;
delay(30);
Serial.println(servopos);
myServo.write(servopos);
if (servopos ==180 )
{servopos=0;break;}
}
}
}
評論
查看更多