簡介
Wii Nunchuk當中含有一顆三軸加速度計 可以分別測量出X軸、Y軸、Z軸的加速度值。
Nunchuk是使用IIC的通訊協定,只需兩條資料線:SDA(Serial Data Line)串列資料線與SCL(Serial Clock Line),便可以將數個裝置經由並聯同一條匯流排將資料傳回主控端。
IIC參考資料:http://zh.wikipedia.org/wiki/I%C2%B2C
Wii Nunchuk使用了IIC傳回了六組字元資料,這些資料包含了:搖桿X軸數值、搖桿Y軸數值、三軸加速度數值 和C、Z的按鈕狀態。
所需材料
1.兩輪移動載具
2.Wii Nunchuk
3.Arduino UNO
4.L298馬達驅動模組
5.Wii轉接板
6. 5~12V電池
7.Xbee Shield (未來擴充無線遙控功能)
8.Xbee模組 (未來擴充無線遙控功能)
L298馬達驅動模組
Motor 1、Motor2的端子座分別為左右馬達
電源輸入部分:
VCC:5~12V的電源輸入
GND:接地
+5: VCC經過內部穩壓IC會穩壓成5V
(此電源可以供應給Arduino)
IN1~IN4為馬達控制訊號 控制左右馬達正反轉
以下為訊號輸入的真值表
Wii Nunchuk
Wii Nunchuk轉接板
轉接板上有四隻公接腳,而轉接板上有5個接點是與Wii Nunchuk連接,請注意看方向:
Zigbee無線模組
未來擴充無線遙控功能再加以探討
L298馬達驅動模組連接
IN1--------> Arduino D3 左馬達正轉
IN2--------> Arduino D4 左馬達反轉
IN3--------> Arduino D6 右馬達正轉
IN4--------> Arduino D5 右馬達反轉
Wii Nunchuk與Arduino連接
SCL-------->Arduino A0
SDL-------->Arduino A1
+ -------->Arduino A2
GND-------->Arduino A3
完成
WiiChuck.h Library
程式碼:
#ifndef WiiChuck_h#define WiiChuck_h#include "Arduino.h"#include "Wire.h"#include "math.h"// these may need to be adjusted for each nunchuck for calibration#define ZEROX 510#define ZEROY 490#define ZEROZ 460#define RADIUS 210 // probably pretty universal#define DEFAULT_ZERO_JOY_X 124#define DEFAULT_ZERO_JOY_Y 132//Set the power pins for the wiichuck, otherwise it will not be powered up#define pwrpin PORTC3#define gndpin PORTC2#define SDApin PORTC0#define SCLpin PORTC1
遙控車 程式碼:
#include "math.h" #include "Wire.h" #include "WiiChuck.h" //WiiChuck Library #define MAXANGLE 90 //定義最大角 #define MINANGLE -90 //定義最小角 int ledPin = 13; //宣告LED為pin13 int maa = 3; //宣告左馬達正轉訊號為pin3 int mab = 4; //宣告左馬達反轉訊號為pin4 int mba = 5; //宣告右馬達反轉訊號為pin5 int mbb = 6; //宣告右馬達正轉訊號為pin6 WiiChuck chuck = WiiChuck(); int angleStart, currentAngle; int tillerStart = 0; //宣告起始歸0 double angle; void setup() { Serial.begin(9600); //RS-232輸出鲍率設定 chuck.begin(); //WiiChuck通訊開啟 chuck.update(); pinMode(ledPin, OUTPUT); pinMode(maa, OUTPUT); pinMode(mab, OUTPUT); pinMode(mba, OUTPUT); pinMode(mbb, OUTPUT); } void loop() { delay(100); chuck.update(); //更新數值 Serial.print("x "); Serial.print(chuck.readRoll()); Serial.print(" "); Serial.print("y "); Serial.print(chuck.readPitch()); Serial.print("\n"); if(chuck.readPitch()>100) //後退判斷 { digitalWrite(ledPin,HIGH); digitalWrite(mab,HIGH); digitalWrite(mbb,HIGH); delay(20);} else if(chuck.readPitch()<20) //前進判斷 { digitalWrite(ledPin,HIGH); digitalWrite(maa,HIGH); digitalWrite(mba,HIGH); delay(20);} else if(chuck.readRoll()<-50) //左轉判斷 { digitalWrite(ledPin,HIGH); digitalWrite(maa,HIGH); digitalWrite(mbb,HIGH); delay(20);} else if(chuck.readRoll()>60) //右轉判斷 { digitalWrite(ledPin,HIGH); digitalWrite(mab,HIGH); digitalWrite(mba,HIGH); delay(20);} else //停止轉判斷 { digitalWrite(ledPin,LOW); digitalWrite(maa,LOW); digitalWrite(mbb,LOW); digitalWrite(mab,LOW); digitalWrite(mba,LOW); delay(20);} }
沒有留言:
張貼留言