Étape 4: Le logiciel
Maintenant pour le vrai plaisir : communication I2C !
Wii Nunchuks communiquent par un langage appelé I2C, qui n’est pas incroyablement compliqué, mais nous avons une bibliothèque Arduino pour faire face à cela, la bibliothèque de fils.
Voici mon code, faites ce que vous voulez de lui !
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
#include //include la bibliothèque de fils
#include
Servo LR ; servo pour mouvement gauche-droite
Servo UD ; servo pour le mouvement haut-bas
Bang de servo ; servo pour le tir des bandes de caoutchouc
char de nunchuck = 0xA4 >> 1 ; définit l’adresse nunchuck comme 0xA4 (sur le plan opérationnel 0 x 52)
uint8_t nunData [6] ; pour le stockage des données
chunk int ; pour garder une trace de l’octet taille des blocs de données
joyX int ;
int joyY ;
accelX int ; Assurez-vous d’ajouter deux bits à cause du protocole sur l’emballage de la nunchuck
int accelY ;
int accelZ ;
octet Zbutt ; petit dernier d’isolats de numData [5]
octet Cbutt ;
void setup() {}
LR.attach(9) ;
UD.attach(10) ;
Bang.Attach(11) ;
Serial.Begin(19200) ;
Wire.Begin() ; démarre la communication I2C
Initialize() ; met en place le nunchuck
Delay(100) ;
}
void initialize() {}
Wire.beginTransmission (0 x 52) ; transmettre à un périphérique 0 x 52
Wire.Send (0 x 40) ; envoie l’adresse mémoire
Wire.Send (0 x 00) ; envoie a envoyé un zéro.
Wire.endTransmission () ; arrêter la transmission
}
void loop() {}
Wire.requestFrom (nunchuck, 6) ; m’envoyer ces données !
Chunk = 0 ;
while(Wire.available()) {//while il existe des données à envoyer
nunData [morceau] = decode(Wire.receive()) ; stocke les données de valeur « morceau » de nunData, ainsi que décode
Chunk ++ ;
}
makeVars() ;
Convert() ; empaqueter les données du capteur
Delay(50) ;
}
void convert() {//tells nunchuck pour « emballer » les données du capteur
Wire.beginTransmission(nunchuck) ; dire le nunchuck à l’écoute
Wire.Send(0x00) ; envoie zéro
Wire.endTransmission() ; ARRÊTER
}
void makeVars() {}
joyX int = nunData [0] ;
int joyY = nunData [1] ;
accelX int = nunData [2] * 2 * 2 ; Assurez-vous d’ajouter deux bits à cause du protocole sur l’emballage de la nunchuck
int accelY = nunData [3] * 2 * 2 ;
int accelZ = nunData [4] * 2 * 2 ;
octet Zbutt = (nunData [5] >> 0) & 1 ; petit dernier d’isolats de numData [5]
octet Cbutt = (nunData [5] >> 1) & 1 ;
accelX = accelX + (nunData [5] >> 2) + 2 * (nunData [5] >> 3) ; Ajoute les deux bits manquants à chaque valeur d’accel (manque de morceaux trouvés à 6 octets)
accelY = accelY + (nunData [5] >> 4) + 2 * (nunData [5] >> 5) ;
accelZ = accelZ + (nunData [5] >> 6) + 2 * (nunData [5] >> 7) ;
int horiz = carte (joyX, 78, 102, 230, 23) ; Il fait donc il y a une petite zone dans le milieu où le joystick ne sera pas actionner n’importe quoi (direction X)
Si (abs (horiz - 90) < = 2) {}
Horiz = 90 ;
}
ElseIf (horiz > 90) {}
Horiz-= 2 ;
}
ElseIf (horiz < 90) {}
Horiz += 2 ;
}
int vert = carte (joyY, 28, 231, 80, 100) ; Il fait donc il y a une petite zone dans le milieu où le joystick ne déclencher quoi que ce soit (direction Y)
Si (abs (vert - 90) < = 2) {}
vert = 90 ;
}
ElseIf (vert > 90) {}
sinople-= 2 ;
}
ElseIf (vert < 90) {}
vert = 2 ;
}
shoot int = 90 ; crée de la valeur de servo tir
Si ((Zbutt == 0) & & (Cbutt! = 0)) {//if Z est enfoncé, tournez le bouton tir servocommande avant lentement
tirer = 95 ;
}
Si ((Cbutt == 0) & & (Zbutt! = 0)) {//if C est enfoncée, faites tourner rapidement le servo arrière de tir
tirer = 82 ;
}
LR.send(horiz) ; Envoyer toutes les valeurs de servo
UD.send(vert) ;
Bang.Send(Shoot) ;
}
décode les char (octet x) {//decodes valeur de la sonde (désigné par une déclaration antérieure)
x = (x ^ 0 x 17) + 0 x 17 ; Je n’ai aucune idée ce que cela signifie...
Return x ;
}
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]