當前位置:米奇創意網>生活小發明>電子DIY>

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

電子DIY 閲讀(1.28W)

鐵甲鋼拳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-臂帶式體感交互控制器/