Étape 3: programmation
Ce qu’il fait
- Le programme va commencer vers le haut, allumez votre interrupteur d’éclairage. Puis attendez cinq secondes avant de l’éteindre à nouveau. Vous allez subir votre propre interrupteur rave.
- Il y a aussi quelques modes démo dans le programme comme le montre cette vidéo.
Pour plus d’informations sur la façon de câbler chaque mode démo s’il vous plaît se référer au code. Voici un résumé des pièces utilisées.
- Demo Mode 1 - bouton - Simple Micro interrupteur trouvé (ici)
- Capteur de proximité de démo Mode 2 - capteur de proximité - IR trouvée (ici)
- Demo Mode 3 - Photo résistance trouvée (ici)
Comment faire pour télécharger le code de votre Arduino
Option 1 - téléchargement et décompression
- Télécharger le fichier zip joint (05_SESW_Test.zip)
- Décompressez-le dans votre répertoire de sketch Arduino (par défaut /My Documents/Arduino /)
- Lancer l’environnement Arduino et charge le croquis (_SESW_Test)
- Télécharger et commencer à jouer
Option 2 - copie et collage
- Copiez le code de l’Arduino par en dessous
- Collez-le dans l’environnement de développement Arduino.
- Télécharger et commencer à jouer
Comment faire pour utiliser Servo interrupteurs dans votre propre Code
- Copiez et collez les sections du programme de test entre (/ / interrupteur de Servo - (SESW) préambule commencer) et (/ / interrupteur Servo - fin du préambule (SESW)) vers le haut de votre croquis
- Copiez et collez les sections du programme de test entre (/ / interrupteur de Servo - START de Routines (SESW)) et (/ / interrupteur Servo - (SESW) Routines fin) au fond de votre croquis
- appeler servoSwitchSetup() ; dans votre routine setup()
- puis d’utiliser turnOn() et turnOff()
- des ajustements sont possibles pour soutenir plus de commutateurs servo.
Annexe 1 - Arduino Code (_SESW_Test)
DÉBUT du préambule NUNCHUCK - pour plus de renseignements détaillés, veuillez consulter la source originale de cette http://www.windmeadow.com/node/42 code / /---/ * * détails câblage * blanc - moulu * rouge - v - 5 volts + 3.3 semble fonctionner * vert - données - analogique 4 * jaune - horloge - analogique 5 * / #include #include #undef int #include uint8_t outbuf [6] ; Tableau pour stocker les arduino sortie cnt int = 0 ; compteur utilisé pour nunchuck comunication int ledPin = 13 ; int nunchuckValues [] = {0,0,0,0,0,0,0,0,0,0} ; Un tableau pour stocker les valeurs de nuncheck / * * l’index de chaque valeur dans le tableau [] nunchuckValues * ie. XSTICK valeur est stockée au nunchuckValues [XSTICK] (0) * / levier de commande #define XSTICK 0 //The valeurs #define YSTICK 1 #define XAXIS 2 //The trois accéléromètre #define YAXIS 3 #define ZAXIS 4 #define ZBUTTON 5 //Front bouton valeurs (0 pressée) #define CBUTTON 6 #define XAXISDELTA 7 //Change dans les données provenant de la dernière lecture ; #define YAXISDELTA 8 #define ZAXISDELTA 9 //Nunchuck G calcul des constantes / * * pour la mise à l’échelle les valeurs brutes du nunchuck en valeurs de G * on trouvera des détails sur l’étalonnage et les maths au * http://www.wiili.org/index.php/Motion_analysis x_0 Points zéro (copié de http://www.wiili.org/index.php/Motion_analysis) = (x_1 + x_2) / 2\, y_0 = (y_1 + y_3) / 2\, z_0 = (z_2 + z_3) / 2\ G un points x = \frac{x_{raw}-x_0} {x_3 - x_0} y = \frac{y_{raw}-y_0} {y_2 - y_0} z = \frac{z_{raw}-z_0} {z_1 - z_0} * / / * pas tous d'entre eux sont utilisés et pourraient être supprimés (gardé pour faire du interpretting mathématique * plus facile 0-zéro valeur G 1-valeur lors de la pose sur la table 2-valeur au repos sur le nez * 3-valeur au repos sur le côté (côté gauche vers le haut) * / #define X0 500 #define X1 500 # définir X2 500 #define X3 711 #define Y0 465 #define Y1 481 #define Y2 621 #define Y3 449 #define Z0 578 #define Z1 785 #define 575 Z2 #define //END Z3 582 du NUNCHUCK préambule - pour plus de renseignements détaillés, veuillez consulter la source originale de cette http://www.windmeadow.com/node/42 code / /---/ /---/ / START de ARDUINO contrôlée SERVO ROBOT (Serbes) préambule #include #define LEFTSERVOPIN 10 #define RIGHTSERVOPIN 9 #define MAXSPEED 10 //due à la façon de travaillent de servos de rotation en continu la vitesse maximale est atteint à une valeur bien inférieure à 90 (cette valeur changera selon vos servos) (pour les servos de parallaxe) Servo leftServo ; Servo rightServo ; int leftSpeed = 100 ; définit la vitesse du robot (servos gauche) //a pourcentage entre - MAXSPEED et MAXSPEED int rightSpeed = 100 ; définit la vitesse du robot (les deux servos) //a pourcentage entre - MAXSPEED et MAXSPEED int vitesse = 100 ; utilisé pour la commande simple (pourcentage de //a goForward, goBackward, goLeft et goRight entre 0 et MAXSPEED / / fin d’ARDUINO contrôlée SERVO ROBOT (Serbes) préambule / /---lastPrint long ; //a long variable pour stocker à la fois l’état de la wiimote est dernier imprimé #define PRINTINTERVAL 1000 //the nombre de millisecondes entre la sortie de l’état de nunchuck sur le pourcentage //A usb port #define 20 zone morte du centre qui est interprétée comme étant toujours nulle void setup() {Serial.begin(9600) ; //Starts le port série (utilisé pour le débogage Cependant les servos rend nerveux) nunchuck_init () ; Envoyer le nunchuck initialisation du handshake serbSetup() ; Ajoute les servos et prépare tous Serbes liés variables lastPrint = millis() ; } void loop() {readNunchuck() ; //Reads l’état actuel des boutons de la Wiimote et accéléromètres si ()! getNunValue(ZBUTTON)) {moveWiiAcelerometer() ; //moves la deoending de la wii sur les valeurs d’accélération Wiimote} else {moveWiiJoystick();} if((millis() - lastPrint) > PRINTINTERVAL) {//If une seconde s’est écoulé depuis les dernières valeurs de nunchuck impression imprimer printData() ; valeurs nunchuck //print Serial.println() ; //add une entrée lastPrint = millis() ; //store l’heure actuelle comme lastPrint}} void moveWiiAcelerometer() {moveDifferential(getYGs() * (float)100,getXGs()*(float)100);} void moveWiiJoystick() {moveDifferential(map(getNunValue(YSTICK) , 30,220,-100,100),map(getNunValue(XSTICK),30,220,-100,100)) ; } //Takes dans une direction et une vitesse d’entrée (comme une manette de jeu) et il se traduit par vitesse commandes void moveDifferential (int speed1, int direction1) {speed1 = deadBandFilter(speed1) ; direction1 = deadBandFilter(direction1) ; setSpeedLeft (speed1 + direction1); setSpeedRight (speed1 - direction1);} int deadBandFilter (int value) {si (valeur > zone morte - & & valeur < zone morte) {valeur = 0;} d’autre {if(value > 0) {valeur = valeur - zone morte * 100 / (100-zone morte);} d’autre {valeur = valeur + zone morte * 100 / (100-zone morte);}} return value;} //START de ROUTINES NUNCHUCK / /---//Calculates et retourne l’accélération xAxis en Gs flotter getXGs() {retour ((float)getNunValue(XAXIS) - X0) / (X 3 - X 0);} //Calculates et retourne l’accélération yAxis dans Gs flotteur getYGs() {retour ((float)getNunValue(YAXIS)-Y0) / (Y2 - Y0);} //Calculates et retourne l’accélération zAxis dans Gs flotteur getZGs() {retour ((float)getNunValue(YAXIS)-Z0) / (Z1 - Z0);} //START de NUNCHUCK lecture CODE - pour davantage de renseignements détaillés, veuillez visiter le //of source original ce http://www.windmeadow.com/node/42 code / /---void readNunchuck() {Wire.requestFrom (0 x 52 , 6); demander des données à nunchuck tandis que (Wire.available ()) {outbuf [cnt] = nunchuk_decode_byte (Wire.receive ()); / / recevoir octet comme un entier digitalWrite (ledPin, HIGH); / / définit la LED sur le cnt ++;} / / si nous avons reçu les 6 octets, puis aller les imprimer si (cnt > = 5) {nunchuckValues [XSTICK] = outbuf [0]; nunchuckValues [YSTICK] = outbuf [1]; int tempNun_xAxis = outbuf [2] * 2 * 2; int tempNun_yAxis = outbuf [3] * 2 * 2; int tempNun_zAxis = outbuf [4] * 2 * 2; nunchuckValues [ZBUTTON] = 0; nunchuckValues [CBUTTON] = 0; / / outbuf byte [5] contient les bits pour les touches z et c / / il contient également les bits les moins significatifs pour les données de l’accéléromètre / / donc nous devons vérifier chaque bit de l’octet outbuf [5] si ((outbuf [5] >> 0) & 1) {nunchuckValues [ZBUTTON] = 1;} //checking si Z touche (0 = pressé 1 = non enfoncé) si ((outbuf [5] >> 1) & 1) {nunchuckValues [CBUTTON] = 1;} //checking C touche (0 = pressé 1 = non enfoncé) si ((outbuf [5] >> 2) & 1) {tempNun_xAxis += 2;} //adding deuxième bit le moins significatif à x_axis si ((outbuf [5] >> 3) & 1) {tempNun_xAxis += 1;} //adding moins significatif bit à x_axis si ((outbuf [5] >> 4) & 1) {tempNun_yAxis += 2;} //adding deuxième moins importante bit à y_axis si ((outbuf [5] >> 5) & 1) {tempNun_yAxis += 1;} //adding moins significatif bit à x_axis si ((outbuf [5] >> 6) & 1) {tempNun_zAxis += 2;} //adding deuxième moins importante peu à z_ axe si ((outbuf [5] >> 7) & 1) {tempNun_zAxis += 1;} ///adding moins significatif sur x_axis nunchuckValues [XAXISDELTA] = tempNun_xAxis - nunchuckValues [XAXIS] ; nunchuckValues [XAXIS] = tempNun_xAxis ; nunchuckValues [YAXISDELTA] = tempNun_yAxis - nunchuckValues [YAXIS] ; nunchuckValues [YAXIS] = tempNun_yAxis ; nunchuckValues [ZAXISDELTA] = tempNun_zAxis - nunchuckValues [ZAXIS] ; nunchuckValues [ZAXIS] = tempNun_zAxis ; } cnt = 0 ; send_zero () ; Envoyer la demande pour les octets suivants} int getNunValue(int valueIndex) {return nunchuckValues [valueIndex];} void nunchuck_init () {Wire.begin (); / / bus i2c jointure avec adresse 0 x 52 Wire.beginTransmission (0 x 52); / / transmettre à un périphérique 0 x 52 Wire.send (0 x 40); / / envoie l’adresse de mémoire Wire.send (0 x 00); / / envoie envoyé un zéro. Wire.endTransmission () ; arrêt transmettant} void send_zero () {Wire.beginTransmission (0 x 52); / / transmettre à un périphérique 0 x 52 Wire.send (0 x 00); / / envoie un octet Wire.endTransmission (); / / arrêter la transmission} / / Encode les données pour mettre en forme que la plupart des pilotes wiimote sauf / / nécessaire uniquement si vous utilisez un de la wiimote réguliers pilotes char nunchuk_decode_byte (char x) {x = (x ^ 0 x 17) + 0 x 17 ; return x;} //END du NUNCHUCK CODE - pour plus de renseignements détaillés, veuillez consulter la source de //original de cette http://www.windmeadow.com/node/42 code / /---/ /---//START ROUTINES d’ARDUINO contrôlée SERVO ROBOT (Serbes) / * * met en place votre arduino pour régler votre Serbes utilisant les routines inclus * / void serbSetup() {pinMode (LEFTSERVOPIN, OUTPUT); setSpeed(speed) ; //sets le servo de droite signal Broche //to sortie leftServo.attach(LEFTSERVOPIN) ; //sets la servocommande gauche signal Broche //to sortie pinMode (RIGHTSERVOPIN, sortie) //attaches laissé servo rightServo.attach(RIGHTSERVOPIN) ; //attaches bon servo goStop();} / * * définit la vitesse du robot entre 0-(stopped) et 100-(pleine vitesse) * NOTE : vitesse ne changera pas la vitesse actuelle, vous devez changer de vitesse * puis appeler une des méthodes aller avant que des changements se produisent. * / void setSpeed (int newSpeed) {si (newSpeed > = 100) {newSpeed = 100;} //if vitesse est supérieure à 100 //make il if 100 (newSpeed < = 0) {newSpeed = 0;} //if vitesse est inférieure que de faire de 0 //it 0 Vitesse = newSpeed * MAXSPEED / 100 ; //scales la vitesse //between 0 et MAXSPEED} / * * définit la vitesse de la rightServo de robots entre-100-(reversed) et 100-(forward) * NOTE : les appels à cette routine prendront effet immédiatement * / void setSpeedRight (int newSpeed) {si (newSpeed > = 100) {newSpeed = 100;} //if vitesse est supérieure à 100 //make il if 100 (newSpeed < = -100) {newSpeed = -100;} //if vitesse est inférieure à -100 font //it -100 rightSpeed = newSpeed * MAXSPEED / 100 ; //scales la vitesse d’être //between - MAXSPEED et MAXSPEED rightServo.write (90 - rightSpeed); //sends la nouvelle valeur à l’asservissement} / * * définit la vitesse de la leftServo de robots entre-100-(reversed) et 100-(forward) * NOTE : les appels à cette routine prendront effet immédiatement * / void setSpeedLeft (int newSpeed) {si (newSpeed > = 100) {newSpeed = 100;} //if vitesse est supérieure à 100 //make il if 100 (newSpeed < = -100) {newSpeed = -100;} //if vitesse est inférieure à -100 font //it -100 leftSpeed = newSpeed * MAXSPEED / 100 ; //scales la vitesse d’être //between - MAXSPEED et MAXSPEED leftServo.write (90 + leftSpeed); //sends la nouvelle valeur à l’asservissement} / * * envoie le robot envoie * / void goForward() {leftServo.write (90 + vitesse); rightServo.write (90 - vitesse);} / * * envoie le robot en arrière * / void goBackward() {leftServo.write (90 - vitesse); rightServo.write (90 + vitesse);} / * * envoie le robot à droite * / void goRight() {leftServo.write (90 + vitesse); rightServo.write (90 + vitesse);} / * * envoie le robot gauche * / void goLeft() {leftServo.write (90 - vitesse); rightServo.write (90 - vitesse);} / * * s’arrête le robot * / void goStop() {leftServo.write(90) ; rightServo.write(90);} //END ROUTINES d’ARDUINO contrôlée SERVO ROBOT (Serbes) / /---//START épuisé ROUTINES (peut supprimer si ne pas utilisez) / /---//Prints la Wiimote en dernière lecture données (doit appeler NUN_readNunchuck() ; avant d’appeler printData() Sub {Serial.print ("XJoy =") ; Serial.Print (getNunValue(XSTICK), DEC) ; Serial.Print ("\t") ; Serial.Print ("YJoy =") ; Serial.Print (getNunValue(YSTICK), DEC) ; Serial.Print ("\t") ; Serial.Print ("XGs =") ; Serial.Print (getXGs() * 1000, DEC) ; Serial.Print ("\t") ; Serial.Print ("YGs =") ; Serial.Print (getYGs() * 1000, DEC) ; Serial.Print ("\t") ; Serial.Print ("ZGs =") ; Serial.Print (getZGs() * 1000, DEC) ; Serial.Print ("\t") ; Serial.Print ("ZBut =") ; Serial.Print (getNunValue(ZBUTTON), DEC) ; Serial.Print ("\t") ; Serial.Print ("YBut =") ; Serial.Print (getNunValue(CBUTTON), DEC) ; Serial.Print ("\t") ; } //END OF PRINT ROUTINES //--------------------------------------------------------------------