Etape 11 : Schéma côté gauche Electronics et code
Voici le schéma pour le système de contrôle du côté gauche.
Il y a quelques notes sur le diagramme, mais c’est assez simple. Lorsque les pièces ont été achetées pour le costume au lecteur de tag ID12 n’était disponible dans une version 5V, qui est alimentée par l’Arduino. Étant donné que les servos sont alimentés par une batterie de 6V que c’était plus facile de simplement utiliser une pile 9V pour les packs Arduinos et 6V pour les servos car vous avez besoin d’isoler l’alimentation électrique de l’Arduino à cause du bruit électrique généré par les servos.
Maintenant que le ID12 est disponible dans une version basse tension, il serait plus simple alimenter tout d’un bloc de batterie 6V et utiliser 3.3V Arduino Pro Mini et utiliser 3.3V convertisseur DC/DC isolés alimenter l’Arduino. Le bouclier de vague cependant fonctionnera seulement sur 5V.
Dans le code, vous verrez que toutes les étiquettes RFID de quatre doigts sont répertoriés, mais seulement deux ID de la balise est reconnus dans le code. J’ai trouvé plus facile de liste toutes les balises que j’utilisais pour le costume de construire et isoler ensuite la balise individuelle IDs pour des fonctions spécifiques. Notez que vous aurez bien sûr d’entrer vos propres codes d’ID tag. Pour plus d’informations sur l’étiquette d’IRF lecteurs et codes d’identification identification tag jeter un oeil à cet excellent article de Bildr.
Notez que vous devrez changer le nom du fichier audio pod hanche flare à "SOUND1. "WAV" pour le bouclier de vague pour le lire. Vous devez également d’inverser le sens de rotation du servo pour trois des servos pod hanche puisqu’ils sont groupés par paires qui reçoivent un signal identique.
Voici le code-
#include
#include « Servo.h » / / inclure la bibliothèque de servo
Servo podServo ; servo pour déplacer les gousses de la hanches
Servo leverServo ; servo pour déplacer les leviers de la hanche pod
Servo rotateServo ; servo pour faire pivoter les gousses de la hanches
Servo leftflapServo ; servo pour déplacer le rabat arrière gauche
Servo rightflapServo ; servo de passer tout de suite Rabat
NewSoftSerial mySerial = NewSoftSerial (2, 3) ;
int RFIDResetPin = 13 ;
int ledPin1 = 6 ; broche de commande pour pod hanche gauche LED
int ledPin2 = 5 ; broche de commande pour pod hanche droite LEDs
int servoPin1 = 10 ; broche de commande pour le servo d’aileron gauche
int servoPin2 = 11 ; broche de commande pour le servo d’aileron droit
int servoPin3 = 9 ; broche de commande servo de pod
int servoPin4 = 8 ; broche de commande servo de levier
int servoPin5 = 7 ; broche de commande servo de tourner
int soundPin = 12 ; broche de commande pour son flare
Enregistrer vos tags RFID ici
char tag1 [13] = « 440085E77452 » ; vous aurez besoin de changer cela pour votre propre étiquette
char tag2 [13] = « 440085FC330E » ;
char tag3 [13] = « 440085F97840 » ;
char tag4 [13] = « 4400863914EF » ;
void setup() {}
Serial.Begin(9600) ;
mySerial.begin(9600) ;
podServo.attach(servoPin3) ; attache le servo sur la broche 9 à l’objet de servo
leverServo.attach(servoPin4) ; s’adapte sur le servo sur la broche 8 l’objet de servo
rotateServo.attach(servoPin5) ; s’adapte sur le servo sur la broche 7 l’objet servo
leftflapServo.attach(servoPin1) ; attches le servo sur la broche 10 à l’objet de servo
rightflapServo.attach(servoPin2) ; attache le servo sur la broche 11 à l’objet de servo
podServo.write(155) ; faire pivoter le servo pod à 135 degrés
leverServo.write(145) ; faire pivoter le servo de levier à 135 degrés
rotateServo.write(165) ; faire pivoter le servo de rotation pod à 170 degrés
leftflapServo.write(170) ; faire pivoter le servo d’aileron gauche à 170 degrés
rightflapServo.write(10) ; faire pivoter le servo d’aileron droit à 10 degrés
pinMode (ledPin1, sortie) ; définit l’axe de la LED en tant que sortie
pinMode (ledPin2, sortie) ; définit l’axe de la LED en tant que sortie
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
pinMode (soundPin, sortie) ; définit l’axe de son en sortie
digitalWrite (soundPin, basse) ; éteindre son code pin
pinMode (RFIDResetPin, sortie) ;
digitalWrite (RFIDResetPin, élevé) ;
}
void loop() {}
char tagString [13] ;
int index = 0 ;
lecture booléen = false ;
{while(Serial.available())}
readByte int = Serial.read() ; lire l’octet disponible suivant
if(ReadByte == 2) lecture = true ; Date du début de la balise
if(ReadByte == 3) lecture = false ; fin de balise
Si (lecture & & readByte! = 2 & & readByte! = 10 & & readByte! = 13) {}
stocker la balise
tagString [index] = readByte ;
index ++ ;
}
}
checkTag(tagString) ; vérifier si c’est un match
clearTag(tagString) ; Désactivez le char de toute valeur
resetReader() ; réinitialiser le lecteur RFID
}
void checkTag (char tag[]) {}
///////////////////////////////////
Vérifier la lecture tag contre tags connus
///////////////////////////////////
if(strlen(tag) == 0) return ; vide, inutile de continuer
Si (compareTag (tag, tag1)) {/ / si appariés tag1, procédez comme suit
mySerial.print('A') ; envoie la balise relire XBee
} else if (compareTag (tag, tag2)) {/ / si appariés tag2, procédez comme suit
podServo.write(90) ; faire pivoter le servo pod à 90 degrés
Delay(500) ; attendre une demi-seconde
leverServo.write(95) ; faire pivoter le servo de levier à 90 degrés
Delay(1000) ;
rotateServo.write(5) ; faire pivoter le servo de rotation pod à 10 degrés
Delay(1500) ;
leverServo.write(145) ;
Delay(500) ;
digitalWrite (soundPin, HIGH) ; couper son sur
Delay(10) ; attendre dix millisecondes
digitalWrite (soundPin, basse) ; tourner son off
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ; attendre 50 millisecondes
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; désactiver les LEDs
digitalWrite (ledPin2, HIGH) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; désactiver les LEDs
digitalWrite (ledPin2, HIGH) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; désactiver les LEDs
digitalWrite (ledPin2, HIGH) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; désactiver les LEDs
digitalWrite (ledPin2, HIGH) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
Delay(50) ;
digitalWrite (ledPin1, HIGH) ; allumer les LEDs
digitalWrite (ledPin2, HIGH) ; allumer les LEDs
Delay(50) ;
digitalWrite (ledPin1, basse) ; désactiver les LEDs
digitalWrite (ledPin2, basse) ; désactiver les LEDs
leverServo.write(95) ; faire pivoter le servo de levier à 90 degrés
Delay(1500) ;
rotateServo.write(165) ; faire pivoter le servo pod à 135 degrés
Delay(1000) ;
leverServo.write(145) ;
Delay(500) ;
podServo.write(155) ; faire pivoter le servo pod à 135 degrés
Delay(2000) ;
leftflapServo.write(125) ; faire pivoter le servo rabat gauche à 125 degrés-complet
rightflapServo.write(55) ; faire pivoter le servo du volet droit à 55 degrés-complet
Delay(500) ;
leftflapServo.write(170) ; tourner le servo d’aileron gauche à 170 degrés - complet vers le bas
rightflapServo.write(10) ; tourner le servo d’aileron droit à 10 degrés - complet vers le bas
Delay(500) ;
leftflapServo.write(125) ; volet gauche complet vers le haut
Delay(500) ;
leftflapServo.write(170) ; Rabat a laissé complètement vers le bas
Delay(500) ;
rightflapServo.write(55) ; volet droit complet vers le haut
Delay(500) ;
rightflapServo.write(10) ; Rabat à droite complet vers le bas
} else {}
Serial.println(tag) ; lecture de n’importe quelle balise inconnue
}
}
void lightLED (int NIP) {}
///////////////////////////////////
Allumer la LED sur la broche « pin » pour 250 ms
///////////////////////////////////
Serial.println(pin) ;
digitalWrite (tige, haute) ;
Delay(250) ;
digitalWrite (broches, faible) ;
}
void resetReader() {}
///////////////////////////////////
Réinitialiser le lecteur RFID à relire.
///////////////////////////////////
digitalWrite (RFIDResetPin, basse) ;
digitalWrite (RFIDResetPin, élevé) ;
Delay(150) ;
}
Sub clearTag (char one[]) {}
///////////////////////////////////
effacer le tableau de char en le remplissant avec null - ASCII 0
Pensera même balise a été lue autrement
///////////////////////////////////
pour (int i = 0; i < strlen(one); i ++) {}
un [i] = 0 ;
}
}
Boolean compareTag (char [un], char two[]) {}
///////////////////////////////////
comparer deux valeurs pour voir s’il y a même,
strcmp ne fonctionne pas 100 %, si nous faisons cela
///////////////////////////////////
if(strlen(One) == 0) return false ; vide
pour (int i = 0; i < 12; i ++) {}
Si (un [i]! = two[i]) return false ;
}
retourne la valeur true ; aucune incompatibilités
}
Voici le code pour le WaveShield, avec la permission de Adafruit-
#include
#include
#include
#include « WaveUtil.h »
#include « WaveHC.h »
Carte de SdReader ; Cet objet conserve les informations de la carte
Vol FatVolume ; Il conserve les informations pour la partition sur la carte
FatReader racine ; Il conserve les informations pour le système de fichiers sur la carte
FatReader f ; Il conserve les informations pour le fichier que nous allons jouer
WaveHC vague ; C’est le seul objet (audio) de la vague, puisque nous allons jouer seulement un à la fois
#define DEBOUNCE 100 / / bouton debouncer
Cette fonction pratique retournera le nombre d’octets actuellement libres en RAM, grand pour le débogage !
int freeRam(void)
{
extern int __bss_end ;
extern int * __brkval ;
int free_memory ;
Si ((int) __brkval == 0) {}
free_memory = ((int) & free_memory)-((int) & __bss_end) ;
}
else {}
free_memory = ((int) & free_memory)-((int) __brkval) ;
}
Return free_memory ;
}
Sub sdErrorCheck(void)
{
Si (! card.errorCode()) retourner ;
putstring ("\n\rSD I/O erreur:") ;
Serial.Print(Card.ErrorCode(), HEX) ;
putstring (",") ;
Serial.println(Card.ErrorData(), HEX) ;
while(1) ;
}
void setup() {}
mettre en place le port série
Serial.Begin(9600) ;
putstring_nl ("WaveHC avec 6 boutons") ;
putstring ("RAM libre:") ; Ce qui peut aider avec le débogage, manquer de RAM est mauvais
Serial.println(freeRam()) ; s’il s’agit moins de 150 octets Il peut épeler ennuis !
Définissez les broches de sortie pour le contrôle de la DAC. Ce broches sont définis dans la bibliothèque
pinMode (sortie 2) ;
pinMode (3, sortie) ;
pinMode (sortie 4) ;
pinMode (5, sortie) ;
pin13 LED
pinMode (13, sortie) ;
activez les résistances de pull-up sur les broches commutateur (entrées analogiques)
digitalWrite (14, HIGH) ;
digitalWrite (15, HIGH) ;
digitalWrite (16, HIGH) ;
digitalWrite (17, HIGH) ;
digitalWrite (18, HIGH) ;
digitalWrite (19, haute) ;
Si (! card.init(true)) {//play avec 4 MHz spi si 8MHz ne fonctionne pas pour vous
Si (! card.init()) {//play avec spi 8 MHz (par défaut plus rapide!)
putstring_nl ("carte init. a échoué!") ; Quelque chose a mal tourné, permet d’imprimer les raisons pour lesquelles
sdErrorCheck() ;
while(1) ; puis « arrêter » - ne rien faire !
}
Enable optimiser la lecture - certaines cartes peuvent timeout. Désactiver si vous rencontrez des problèmes
card.partialBlockRead(true) ;
Maintenant, on va chercher une partition FAT !
uint8_t partie ;
pour (partie = 0; partie < 5; partie ++) {/ / nous avons jusqu'à 5 emplacements de regarder dans
Si (vol.init (carte, partie))
rupture ; Nous avons trouvé un, laisse en liberté sous caution
}
Si (partie == 5) {/ / si nous avons fini ne pas trouver un:(
putstring_nl ("aucun FAT partition valide!") ;
sdErrorCheck() ; Quelque chose a mal tourné, permet d’imprimer les raisons pour lesquelles
while(1) ; puis « arrêter » - ne rien faire !
}
Permet d’indiquer à l’utilisateur sur ce que nous avons trouvé
putstring ("partition à l’aide") ;
Serial.Print (partie, DEC) ;
putstring (", est de type FAT") ;
Serial.println(vol.fatType(),DEC) ; FAT16 ou FAT32 ?
Essayez d’ouvrir le répertoire racine
Si (! root.openRoot(vol)) {}
putstring_nl ("Impossible d’ouvrir le répertoire racine!") ; Quelque chose a mal tourné,
while(1) ; puis « arrêter » - ne rien faire !
}
Ouf ! Nous avons passé les parties difficiles.
putstring_nl("Ready!") ;
}
void loop() {}
putstring(".") ; Décommentez pour voir si la boucle n’est pas en cours d’exécution
commutateur (check_switches()) {}
cas 1 :
playcomplete ("SOUND1. « « « WAV ») ;
rupture ;
cas 2 :
playcomplete ("SOUND2. « « « WAV ») ;
rupture ;
cas 3 :
playcomplete "(solide3. « « « WAV ») ;
rupture ;
cas 4 :
playcomplete "(SOUND4. « « « WAV ») ;
rupture ;
cas no 5 :
playcomplete "(SOUND5. « « « WAV ») ;
rupture ;
cas 6 :
playcomplete "(SOUND6. « « « WAV ») ;
}
}
check_switches() octets
{
public static octet précédent [6] ;
public static long temps [6] ;
octet lu ;
octet pressé ;
index de l’octet ;
pressé = 0 ;
pour (indice d’octet = 0; index < 6; ++ index) {}
lecture = digitalRead (14 + index) ;
Si (lecture == LOW & & précédent [index] == HIGH & & millis() - temps [index] > DEBOUNCE)
{
interrupteur enfoncé
temps [index] = millis() ;
pressé = index + 1 ;
rupture ;
}
précédent [index] = lecture ;
}
retourner l’interrupteur numéro (1-6)
retour (pressé) ;
}
Lit un fichier complet de bout en bout avec aucune pause.
void playcomplete(char *name) {}
Appelez notre aide pour trouver et jouer ce nom
playfile(Name) ;
alors que {(wave.isplaying)
ne rien faire pendant sa lecture
}
maintenant sa fait jouer
}
void playfile(char *name) {}
voir si l’objet vague est en train de faire quelque chose
Si (wave.isplaying) {/ / déjà jouer quelque chose, alors arrêtez d’elle !
Wave.Stop() ; Arrête
}
Regardez dans le répertoire racine et ouvrir le fichier
Si (! f.open (racine, nom)) {}
putstring ("Impossible d’ouvrir le fichier") ; Serial.Print(Name) ; retour ;
}
OK, lire le fichier et le transformer en un objet vague
Si (! wave.create(f)) {}
putstring_nl ("pas un valide" WAV") ; retour ;
}
OK le temps de jouer ! Démarrer la lecture
Wave.Play() ;
}