曾經想過通過簡單地使用 Arduino 而不是任何其他編程(如 OpenCV、視覺基礎 C# 等)來構建面部跟蹤機械臂或機器人嗎?然后繼續閱讀,在這個項目中,我們將通過融合Arduino和Android的強大功能來實現人臉檢測。在這個項目中,移動相機將在伺服系統的幫助下隨著你的臉一起移動。在這里使用Android手機的優勢在于,您無需投資攝像頭模塊,整個圖像檢測工作可以在手機本身中完成,您不需要將Arduino連接到計算機即可正常工作。在這里,我們使用藍牙模塊與Arduino進行無線通信。
本項目中使用的Android應用程序是使用處理Android創建的,您可以通過下載APK文件直接安裝該應用程序(進一步閱讀鏈接),或者戴上編程帽,使用教程中進一步給出的處理代碼制作自己的更具吸引力的Android應用程序。
在本教程結束時,您將擁有一個迷你傾斜和跨度機械臂,可以跟蹤您的臉部并隨之移動。您可以使用它(進一步發展)來錄制您的視頻博客視頻,甚至可以使用手機的后置攝像頭自拍,因為它將您的臉正好定位在手機屏幕的中心。所以!!聽起來很有趣?檢查本教程末尾的演示視頻以查看其工作情況。讓我們看看如何構建一個...
我已經盡力使這個項目盡可能簡單,任何對硬件或編碼有最少知識的人都可以使用此指南使這個項目立即工作。但是,一旦你做到了,我建議你落后于代碼,這樣你就可以真正知道是什么讓這個東西工作以及如何工作。
所需材料:
3D 打印所需部件(可選):
為了平移和傾斜我們的手機,我們需要一些機械結構,如移動支架和一些伺服支架。你可以用紙板做一個,因為我有一臺3D打印機,我決定3D打印這些零件。
3D打印是一個了不起的工具,在構建原型項目或試驗新的機械設計時可以做出很多貢獻。如果您還沒有發現3D打印機的好處或它是如何工作的,你可以閱讀3D打印初學者指南。
如果您擁有或可以使用3D打印機,則可以使用可以從此處下載的STL文件直接打印和組裝它們。但是,像手機支架這樣的一些部件可能需要根據手機的尺寸進行一些修改。我為我的MOTO G手機設計了它。我使用我的一臺非常基本的打印機來打印所有零件。打印機是來自3ding的FABX v1,價格實惠,打印量為10立方厘米。便宜的價格伴隨著低打印分辨率和沒有SD卡或打印恢復功能的權衡。我正在使用名為Cura的軟件來打印STL文件。下面給出了我用于打印材料的設置,您可以使用相同的設置或根據您的打印機更改它們。
打印所有必需的材料后,您可以使用螺釘和一些熱膠將它們固定到位。組裝完成后,它應該如下所示。
原理圖和硬件:
此智能手機面部跟蹤項目的電路如下圖所示:
該電路由兩個伺服電機組成,其中一個用于向左/向右移動手機,另一個用于向上/向下傾斜手機。伺服器必須移動的方向將由Arduino Nano指示,Arduino Nano本身從藍牙(HC-05)模塊獲取信息。整個電路由9V電池供電。
該電路可以很容易地連接到您的面包板上,或者您也可以像我在這里所做的那樣將它們焊接在小型 Perf 板上。
設置您的安卓應用程序:
正如我之前所說,這個項目背后的主要大腦是這個Android應用程序。這個安卓應用程序是使用處理安卓開發的。您可以直接在手機上安裝此應用程序,然后按照以下步驟啟動它。
- 從這里下載APK文件。
- 打開上面顯示的電路的電源。
- 在手機設置中搜索名為“HC-05”的藍牙模塊
- 如果您將其命名為“HC-05”以外的其他名稱,請將其更改回HC-05,因為只有這樣應用程序才能工作。
- 使用密碼“1234”或“0000”與您的藍牙模塊配對。
- 現在,以縱向模式啟動應用程序。您應該會看到相機屏幕,并在屏幕頂部看到“連接到:HC-05”。
- 嘗試將相機移到臉部上方,其頂部應會出現一個綠色框,其位置也將顯示在屏幕的左上角,如下所示。
您可以通過引入許多不需要編寫自己的Android應用程序即可獲得的進步,從而將這個Arduino面部跟蹤項目提升到一個新的水平。創建一個Android應用程序可能聽起來很困難,但相信我,在Processing的幫助下,您可以立即學習它。
對 Arduino 進行編程:
安卓應用程序將檢測人臉及其在屏幕上的位置;然后,它將根據面部的位置決定應該移動的方向,以便面部到達屏幕中心。然后通過藍牙模塊將此方向發送到Arduino。
該項目的Arduino程序相當簡單,我們只需要根據從藍牙模塊接收的值控制兩個伺服電機的方向。完整的代碼可以在本教程的末尾找到,我還在下面解釋了幾個重要的行。
下面的代碼行建立串行連接,引腳 D12 作為 RX,D11 作為 TX。因此,引腳 D12 必須連接到 BT 模塊的 TX,引腳 D11 必須連接到 BT 模塊的 RX。
SoftwareSerial cam_BT(12, 11); // RX, TX
然后我們以 9600 的波特率初始化藍牙模塊.確保您的模塊也以相同的波特率工作。否則相應地更改它。
cam_BT.begin(9600); //start the Bluetooth communication at 9600 baudrate
cam_BT.println("Ready to take commands");
下面一行讀取通過藍牙模塊傳入的內容.此外,數據保存在變量“藍牙數據”中。
if (cam_BT.available()) //Read whats coming in through Bluetooth
{
BluetoothData=cam_BT.read();
Serial.print("Incoming from BT:");
Serial.println(BluetoothData);
}
根據從藍牙接收的數據,控制電機方向。要向左轉動電機,電機會從其先前的位置遞減 2 的值。如果您需要手臂移動得更快,您可以將此值增加到 4 或 6。但是,它可能會產生一些顛簸,使相機不穩定。
if (BluetoothData==49) //Turn Left
{pos1+=2; servo1.write(pos1);}
if (BluetoothData==50) //Turn Right
{pos1-=2; servo1.write(pos1);}
if (BluetoothData==51) //Turn Up
{pos2-=2; servo2.write(pos2);}
if (BluetoothData==52) //Turn Down
{pos2+=2; servo2.write(pos2);}
加工:
一旦我們準備好了我們的硬件,代碼和Android應用程序,就該采取一些行動了。只需為您的 Arduino 供電并打開安卓應用程序。應用程序將自動連接到 HC-05 (必須命名為 HC-05) 藍牙模塊,并等待檢測到人臉.只需將手機放在我們的手機支架中并坐在它前面即可。您應該注意到伺服電機移動手機,以便將臉部放置在屏幕中央。現在在相機的范圍內四處走動,您的手機將跟隨您的動作。您也可以通過放置和移動任何圖片來嘗試。
/*Arduino Code for Face Tracking Arduino
* Coded by Circuitdigest.com
* On 25-05-2017
*/
/*CONNECTION DETIALS
* Arduino D11 -> RX of BT Module
* Arduino D12 -> Tx of BT
* Servo1 -> pin 3 of arduino Nano to pan
* Servo2 -> pin 5 of arduino Nano to tilt
*/
#include //header to drive servo motors
#include // import the serial library
SoftwareSerial cam_BT(12, 11); // RX, TX
int ledpin=13; // led on D13 will show blink on / off
int BluetoothData; // the data given from Computer
//lets declare the servo objects
Servo servo1;
Servo servo2;
long gmotor,gnum1,gnum2;
int pos;
int flag=0;
int pos1 = 40;
int pos2 = 90;
void setup() {
servo1.attach(3);
servo2.attach(5);;
//**Initial position of all four servo motors**//
servo1.write(pos1);
servo2.write(pos2);
//**initialised**//
cam_BT.begin(9600); //start the Bluetooth communication at 9600 baudrate
cam_BT.println("Ready to take commands");
Serial.begin(57600);
Serial.println("Face tracking programming by CircuitDigest.com");
}
//***Function for each Servo actions**//
void call(int motor, int num1, int num2) // The values like Motor number , from angle and to angle are received
{
Serial.println("Passing values...");
flag =0;
switch (motor)
{
case 1: // For motor one
{
Serial.println("Executing motor one");
if(num1// Clock wise rotation
{
for ( pos =num1; pos<=num2; pos+=1)
{
servo1.write(pos);
delay( 20);
}
}
if(num1>num2) // Anti-Clock wise rotation
{
for ( pos =num1; pos>=num2; pos-=1)
{
servo1.write(pos);
delay( 20);
}
}
break;
}
////////JUST DUPLICATE FOR OTHER SERVOS////
case 2: // For motor 2
{
Serial.println("Executing motor two");
if(num1for ( pos =num1; pos<=num2; pos+=1)
{
servo2.write(pos);
delay( 20);
}
}
if(num1>num2)
{
for ( pos =num1; pos>=num2; pos-=1)
{
servo2.write(pos);
delay( 20);
}
}
break;
}
}
}
void loop() {
if(Serial.available()>0) //Read whats coming in through Serial
{
gmotor= Serial.parseInt();
Serial.print(" selected Number-> ");
Serial.print(gmotor);
Serial.print(" , ");
gnum1= Serial.parseInt();
Serial.print(gnum1);
Serial.print(" degree , ");
gnum2= Serial.parseInt();
Serial.print(gnum2);
Serial.println(" degree ");
flag=1;
}
if (cam_BT.available()) //Read whats coming in through Bluetooth
{
BluetoothData=cam_BT.read();
Serial.print("Incoming from BT:");
Serial.println(BluetoothData);
}
if (flag ==1)
call(gmotor,gnum1,gnum2); //call the respective motor for action
if (BluetoothData==49) //Turn Left
{pos1+=2; servo1.write(pos1);}
if (BluetoothData==50) //Turn Right
{pos1-=2; servo1.write(pos1);}
if (BluetoothData==51) //Turn Up
{pos2-=2; servo2.write(pos2);}
if (BluetoothData==52) //Turn Down
{pos2+=2; servo2.write(pos2);}
flag=0;
BluetoothData=0;
}
-
機器人
+關注
關注
211文章
28390瀏覽量
206951 -
人臉檢測
+關注
關注
0文章
80瀏覽量
16457 -
Arduino
+關注
關注
188文章
6469瀏覽量
186966
發布評論請先 登錄
相關推薦
評論