簡介
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);}
}