Permalänk
Medlem

Arduino och nunchuck

Jag har kopplat ihop en arduino uno och en wii nunchuck och jag kan se dataströmmen i seriel monitor i arduinoi ide.

Jag vill koppla in en eller flera servo motorer som följer nunchuckens rörelse.

Någon som har gjort ett liknande projekt och kanske har färdig kod? Eller som kan ge mig tips på hur jag ska göra?

joyX: -7, joyYX: -6, accX: 166, accY: -20, accZ: 32, btnZ: 0, btnC: 0

Permalänk
Medlem

Jag hittade kod som styr två servos med en arduino med en nunchuck.

Klistar in koden här om någon gör ett liknande projekt.

/ auteur officiel Alexis Couronne skitoo.net
// Modified by mrlndr for arduinoarts

#include <Servo.h>
Servo servo1;
Servo servo2;
#include <Wire.h>

// Doit être ajusté en fonction de chaque nunchuck
#define ZEROX 530
#define ZEROY 530
#define ZEROZ 530

// adresse I2C du nunchuck
#define WII_NUNCHUK_I2C_ADDRESS 0x52

// définition d'une variable counter
int counter;

// définition d'un tableau de données
uint8_t data[6];

void setup()
{
// on attache le servomoteur à la pin 11 (PWM)
servo1.attach(11);
servo2.attach(12);

// initialisation du nunchuck
Wire.begin();

Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
Wire.write(0xF0);
Wire.write(0x55);
Wire.endTransmission();

Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
Wire.write(0xFB);
Wire.write(0x00);
Wire.endTransmission();
}

void loop()
{
// on demande 6 octets au nunchuck
Wire.requestFrom(WII_NUNCHUK_I2C_ADDRESS, 6);

counter = 0;
// tant qu'il y a des données
while(Wire.available())
{
// on récupère les données
data[counter++] = Wire.read();
}

// on réinitialise le nunchuck pour la prochaine demande
Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
Wire.write(0x00);
Wire.endTransmission();

if(counter >= 5)
{
// on extrait les données
double accelX = ((data[2] << 2) + ((data[5] >> 2) & 0x03) - ZEROX);
double accelY = ((data[3] << 2) + ((data[5] >> 4) & 0x03) - ZEROY);
double accelZ = ((data[4] << 2) + ((data[5] >> 6) & 0x03) - ZEROZ);

// données d'accélération de l'axe Y
// on limite la valeur entre -180 et 180
int value = constrain(accelY, -180, 180);
// on mappe cette valeur pour le servomoteur soit entre 0 et 180
value = map(value, -180, 180, 0, 180);
// on écrit sur le servomoteur la valeur
servo1.write(180-value);

// données d'accélération de l'axe X
value = constrain(accelX, -180, 180);
value = map(value, -180, 180, 0, 180);
servo2.write(180-value);

// un petit delai pour pas saturer le servomoteur
delay(80);
}
}

by mrlndr