2014年4月24日 星期四

【S4A韌體】修改S4A控制Wii左手做法說明



之前曾用Arduino程式語言以wii左手(wiichuck)來控制伺服馬達,那在S4A有辦法使用wii左手嗎?




經過測試後是可以在S4A中來使用wii左手,但是要修改S4A的韌體。


(有關Wii左手連接Arduino方式的詳細說明請參考另一篇文章【Arduino程式實作】機器娃娃 )


【修改構想】

修改的方式有點像攔截 S4A的輸出,只是相反的動作

一開始一樣從原來S4A的構想去思考,如下圖架構:




再來就是在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應用程式,留待之後有空再發展。



沒有留言:

張貼留言