2012年10月19日 星期五

Wii Nunchuk 遙控車製作


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

沒有留言:

張貼留言