當前位置:製作窩 >

創意生活 >電子DIY >

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】手工電子DIY教程

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】手工電子DIY教程

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】

在用手柄玩了一段時間格鬥機器人之後,製作過程參見前兩期的文章,這次本人在控制器方面又進行了一次升級。不再使用類似遊戲機的手柄,而是自制了一個臂帶式體感互動控制器。【原址:鐵甲鋼拳3-臂帶式體感互動控制器/】

主要材料

  Arduino UNO 或DFduino UNO  Xbee感測器擴充套件板 V5
  電池盒  電池 5(與電池盒匹配)
  numchuck聯結器及連線線  MMA7361加速度感測器
  護膝  Wii 副手柄numchuck
  DFduino wireless無線模組

所需工具:

  如圖

製作步驟:

第1步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第2張

大家一定覺得這個名字太抽象了,具體的說就是用加速度感測器來獲取手臂的姿態,然後通過無線的方式來控制機器人或者其他的東東。

我用到的器材如下

第2步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第3張

1Arduino UNO 或DFduino UNO1
2Xbee感測器擴充套件板 V51
3電池盒1
4電池5(與電池盒匹配)
5numchuck聯結器及連線線1
6MMA7361加速度感測器1
7護膝1
8Wii 副手柄numchuck1
9DFduino wireless無線模組1

第3步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第4張

先來說說硬體的連線,首先將護膝帶在左手手腕上,為什麼選擇一個護膝而不是直接用一個護腕呢,這是因為護膝內和手臂的空間比較大,製作起來比較方便。而如果是用護腕則是完全勒在手腕上的。

將護膝帶到虎口位置即可,並將虎口的位置縫合起來,使其更像一個手套。同時把Arduino控制板和加速度感測器縫在護膝上,如圖2所示,加速度感測器的連線線從護膝內穿過。

第4步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第5張

第2步,將Xbee感測器擴充套件板V5插在Arduino控制板上,同時將加速度感測器的連線線連線到A0、A1和A2上,分別對應X、Y、Z三個軸向,並且把Numchuck聯結器用連線線連到感測器擴充套件板上,連線是要注意引腳的定義,聯結器的d端對應A4,c端對應A5。

第5步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第6張

第3步,將電池盒連線在感測器擴充套件板的電源輸入端,並把其固定在護膝內,手臂內側。

第6步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第7張

第4步,將之前遙控器內的DFduino wireless無線模組拆下並安裝在感測器擴充套件板上。

第7步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第8張

最後將Wii的副手柄numchuck接上,並將其握在右手內。這樣,我們的臂帶式體感互動控制器硬體部分就算完成了。

第8步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第9張

接下來說說軟體部分。這個遙控器的控制思路是這樣的,當我水平伸出手臂時,機器人作出擺臂的動作,如圖7所示;當我向前揮動手臂時,機器人做出打拳的動作

第9步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第10張

水平伸出手臂

第10步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第11張

而機器人的移動依靠numchuck手柄上的搖桿,同時配合手柄上的Z鍵和C鍵完成機器人的移動。控制動作和機器人的動作對應關係如下表。

序號動作說明觸發指令控制動作
1機器人前進一步1搖桿向前
2機器人後退一步2搖桿向後
3機器人左轉15搖桿向左
4機器人右轉14搖桿向右
5機器人向左滑動一步8按下Z鍵同時搖桿向左
6機器人向右滑動一步7按下Z鍵同時搖桿向右
7機器人下蹲12按下Z鍵同時搖桿向後
8機器人起身13按下Z鍵同時搖桿向前
9左拳6左手向前伸
10右拳5右手向前伸
11左臂擺動4左手水平抬起
12右臂擺動3右手水平抬起
13向前倒下後起身9按下C鍵同時搖桿向前
14向後倒下後起身16按下C鍵同時搖桿向後
Wii的副手柄numchuck的使用《無線電》雜誌的2010年第12期和2012年第6期都有介紹過,這裡就簡單的說明一下。Arduino使用這個副手柄需要單獨下載一個WiiChuck庫檔案,有了這個庫檔案,在程式碼中直接呼叫ccelAxisX()、ccelAxisY()之類的函式就可以直接獲得搖桿的值、手柄內加速的的值以及按鈕的值。這裡我還要對C鍵和Z鍵作一個說明,我手上的這個numchuck手柄,當Z鍵和C鍵都沒有按下時,兩者返回的都是1;當按下C鍵時,C鍵返回值為0,Z鍵返回值為1;但當按下Z鍵時,兩者返回的值都是0;當C鍵和Z鍵都按下時,Z鍵的返回值為0,C鍵的返回值為1。

這裡著重的說一下MMA7361加速度感測器的使用,如圖9所示。加速度感測器是一種能夠測量加速力的電子感測器。通過測量由於重力引起的加速度,可以計算出裝置相對於水平面的傾斜角度,分析出裝置移動的方式。

第11步:

鐵甲鋼拳3——臂帶式體感互動控制器【轉譯】 第12張

MMA7361加速度感測器基於Freescale(飛思卡爾)公司生產的微型電容式三軸加速度感測器MMA7361晶片。該晶片採用訊號調理、單極低通濾波器和溫度補償技術,提供±1.5g/6g兩個量程,使用者可在這2個靈敏度中選擇,該器件還帶有低通濾波並已做0g補償。

感測器有3個模擬量的三芯介面,分別表示X、Y、Z三個軸的加速度值,同時預留排針焊接孔。前面已經說過,我們分別將X、Y、Z三個軸向的加速度值輸出引腳連線到A0、A1和A2。



我們使用的是1.5g的量程,上圖中給出了靜態加速度感測器幾種狀態下的各個軸向加速度的值,由於量程是從-1.5g到+1.5g,所以當加速度為0g時,引腳輸出的電壓大致為1.65V,再因為有重力的關係,所以方向向下的軸向上加速度值是1g(根據方向的不同可能是+1g或-1g)。我們可以通過如下的程式碼將感測器輸出的模擬量值轉換為電壓值(以X軸為例)。

vol_x=analogRead(A0)*5.0/1024;
然後根據1.5g量程下的靈敏度——800mV/g,通過電壓值換算出軸向上當前的加速度值,程式碼如下。

g_x =(vol_x-1.76)/0.8
但在實際的應用中,由於感測器的差異,當在0g是輸出的電壓值可能不是1.65V,所以在使用加速度感測器之前需要對其進行校準,以當前0g時輸出的電壓值作準。

但在這裡不用這麼麻煩,只需要通過判斷返回的模擬量值是否在一個區間內就能夠推斷出感測器當前大致的姿態,進而傳送命令控制機器人。

詳細程式碼如下。

1.#include <math.h>
2.#include <stdlib.h>
3.#include "Wire.h"
4.#include "WiiChuck.h"
5.
huck wii = WiiChuck();
7.
sensorAccelX,sensorAccelY,sensorAccelZ;
sensorAccelWiiX,sensorAccelWiiY,sensorAccelWiiZ;
sensorJoyX,sensorJoyY;
buttonC,buttonZ;


void setup()
{
(); //初始化Wii手柄
n(57600);
}

void loop()
{
//獲取加速度感測器的模擬量值
sensorAccelX = analogRead(A0);
sensorAccelY = analogRead(A1);
sensorAccelZ = analogRead(A2);

//獲取Wii手柄的各個引數
if (true == ())
{
sensorAccelWiiX = ccelAxisX();
sensorAccelWiiY = ccelAxisY();
sensorAccelWiiZ = ccelAxisZ();

sensorJoyX = oyAxisX();
sensorJoyY = oyAxisY();

buttonZ = uttonZ();
buttonC = uttonC();
}


//通過各個引數值推斷當前兩手的姿態,進而控制機器人

//在未按下Z和C鍵時通過搖桿控制機器人移動
if((buttonZ == 1) && (buttonC == 1))
{
if(sensorJoyY > 200)
{
e(1);//向機器人傳送1,機器人將做出前進的動作
}
else if((sensorJoyY < 76) && (sensorJoyY > 40))
{
e(2); //向機器人傳送2,機器人將做出後退的動作
}

if((sensorJoyX < 76) && (sensorJoyX > 40))
{
e(15); //向機器人傳送15,機器人將做出左轉的動作
}
else if(sensorJoyX > 200)
{
e(14); //向機器人傳送14,機器人將做出右轉的動作
}
}

//按下Z鍵時控制機器人的左右平移和蹲下起身
if(buttonZ == 0)
{
if(sensorJoyY > 200)
{
e(13); //向機器人傳送13,機器人將做出起身的動作
}
else if((sensorJoyY < 76) && (sensorJoyY > 40))
{
e(12); //向機器人傳送12,機器人將做出蹲下的動作
}

if((sensorJoyX < 76) && (sensorJoyX > 40))
{
e(8); //向機器人傳送8,機器人將做出左移的動作
}
else if(sensorJoyX > 200)
{
e(7); //向機器人傳送7,機器人將做出右移的動作
}
}


//按下C鍵時控制機器人在跌倒的情況下爬起來
if((buttonZ == 1) && (buttonC == 0))
{
if(sensorJoyY > 200)
{
e(9); //向機器人傳送9,機器人將從前爬起
}
else if((sensorJoyY < 76) && (sensorJoyY > 40))
{
e(16); //向機器人傳送16,機器人將從後爬起
}
}


//通過加速度感測器控制機器人左臂的動作
if(sensorAccelX > 500)
{
e(4); //向機器人傳送4,機器人將做出左擺的動作
}
if(sensorAccelZ > 450)
{
e(6); //向機器人傳送6,機器人將做出左拳的動作
}


//通過Wii手柄控制機器人右臂的動作
if(sensorAccelWiiY < 154)
{
117. e(3); //向機器人傳送3,機器人將做出右擺的動作
118. }
119. if(sensorAccelWiiX < 115)
120. {
121. e(5); //向機器人傳送5,機器人將做出右拳的動作
122. }
123.
y(200);
125.}

小貼士:

原址:鐵甲鋼拳3-臂帶式體感互動控制器/

  • 文章版權屬於文章作者所有,轉載請註明 https://zhizuowo.com/shenghuo/dianzidiy/2gy5d.html