之前曾用Arduino程式語言以wii左手(wiichuck)來控制伺服馬達,那在S4A有辦法使用wii左手嗎?
經過測試後是可以在S4A中來使用wii左手,但是要修改S4A的韌體。
(有關Wii左手連接Arduino方式的詳細說明請參考另一篇文章【Arduino程式實作】機器娃娃 )
【修改構想】
修改的方式有點像攔截 S4A的輸出,只是相反的動作
(攔截輸出可參考另一篇【S4A韌體】修改S4A控制矩陣LED做法說明)
再來就是在S4A中加入Library來取得特定硬體的輸入值(此例是Wii左手)
並且將原有的輸入攔截,改成Library取得的輸入值即可。如下圖:
因Wii左手的搖桿、三軸加速度計及2個按鈕,且搖桿及加速度計的值均在0~1024之間,所以有了以下的修改計畫:
搖桿X軸輸入值 ---> S4A中的Analog0
搖桿Y軸輸入值 ---> S4A中的Analog1
X軸的加速度輸入值 ---> S4A中的Analog2
Y軸的加速度輸入值 ---> S4A中的Analog3
Z軸的加速度輸入值 ---> S4A中的Analog4
按鈕C ---> S4A中的Digital2
按鈕Z ---> S4A中的Digital3
接下來是實作改程式碼
【韌體修改說明】
以下S4A韌體為1.5版
在S4A韌體開頭有修改的部份如下:
-----------------------------------------------------
#include "Wiichuck.h" #include <Wire.h> Wiichuck wii; bool statusC=0,statusZ=0;
一開始是引入library,並產生一個控制物件wii
還有 statusC及statusZ是儲存按鈕的變數。
接下來下方是在setup()中,做wii左手的初始化
-----------------------------------------------------
wii.init();
wii.calibrate();
-----------------------------------------------------
接著,S4A韌體中處理類比及數位輸入的函數是
sendSensorValues(),將在此攔截輸入值
首先從library取得輸入值,並存入之後會傳
送的陣列(sensorValue),原有的韌體程式碼會
將Wii左手的輸入傳回給電腦的S4A
-----------------------------------------------------
if(wii.poll()){
sensorValues[0] = wii.joyX();
sensorValues[1] = wii.joyY();
sensorValues[2] = wii.accelX();
sensorValues[3] = wii.accelY();
sensorValues[4] = wii.accelZ();
sensorValues[5] = 0 ; //disabled
statusC = wii.buttonC();
statusZ = wii.buttonZ();
}
-----------------------------------------------------
還有別忘了按鈕的輸入也要傳回電腦
-----------------------------------------------------
ScratchBoardSensorReport(6, statusC?1023:0);
ScratchBoardSensorReport(7, statusZ?1023:0);
-----------------------------------------------------這樣S4A的韌體的修改算告一段落。
修改的S4A韌體可在此下載
(為方便使用,已內含WiiChuck library)
(有修改過的code均有加上---add---的註解)
【S4A使用說明】
因為修改後的韌體就是為了特定硬體專用,原本想修改S4A的界面,可是一直無法修改S4A那一塊sensor board左側字而作罷(如Analog0改為JoyX,Analog1改為JoyY等),這就交給高手去試了。在使用時,要記得輸入值分別是代表那個值,詳細如下圖。
如此就可在S4A中使用了,不論是與動畫互動,或是控制其他S4A的硬體均可。
(如果想要像機器娃娃一樣,控制2個伺服馬達,還要再修改韌體,請參考江昭漢老師的S4A控制二個以上RC伺服機)
實際的S4A應用程式,留待之後有空再發展。
沒有留言:
張貼留言