[Log] STM32 + Wii Nunchuck 左手把 教學

最近期中考剛考完(根本沒在看書),終於有點時間再來做一次實驗了!

這次我想做的是Wii的左手把(Nunchuck)的應用。這個左手把能做啥呢?功能可強了!他有一個三軸的加速感應器,一個類比遙感,和兩個按鈕。使用的通信協定是I2C,所以應該不難溝通。上網查了一下之後,已經很多人用在Arduino上了(但我討厭Arduino)。稍微研究了一下就寫了一個Library出來了,比我想像的簡單多了。而且在價錢上,網拍一個才賣NT$150,本來想買個兩個來玩玩(不知道可以做啥,但我想到的是鋼鐵擂台…)但基於我怕失敗所以只先買了一個。

89003--C_h

我寫的這個Example也很簡單,動作流程如下:

  1. 初始UART
  2. 初始Nunchuck
  3. 進入無窮回圈,並從Nunchuck讀取各種資料

只要發出讀取的指令,回傳資料如下:

Screen Shot 2013-04-24 at 8.41.07 PM

困難的地方在於加速感應器欄位是個10位元的資料,由於它使用的I2C設為8位元,所以必須把資料切開。也代表我們必須在第五個欄位動手腳,然後在把它跟對應的欄位和起來,於是我想到了這個辦法:

(data[2] << 2) | ((data[5] & 0x0C) >> 2)

這是讀取加速感應器X軸的資料後的處理。data[2]對應的是AX[9:2],而data[5]對應的是第五個欄位,必須要用一個and來遮蔽其他不用的資料,然後做完移位在和AX[9:2]相加。如此一來就可以得到一個完整的10位元資料了。

之後要我想要知道在X和Y軸相對應的角度,或者叫做Roll跟Pitch,於是我們用到一個公式:

atan2(getAX(), getAZ() ) * 180  /  M_PI

其實只是在計算X和Y之間的角度,使用到atan2函數,這個函數比atan函數好用多了,它可以自動幫你判斷相位,但因為回傳的資料為弳度,所以要乘以180/Pi。相對的我在類比遙感也做了同樣的換算,所以可以得知現在遙感的角度。

這裡是Library和Example Project

如果有任何問題請盡量提出,不管是不是和本文有關的都可以問喔!謝謝閱讀!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s