Stap 11: Elektronica-links zijde schema en code
Hier is het schema voor het controlesysteem van de linker kant.
Er zijn een paar opmerkingen op het diagram, maar het is vrij eenvoudig. Wanneer onderdelen werden aangekocht voor het pak was de ID12 tag lezer alleen verkrijgbaar in een 5V-versie, die wordt aangedreven door de Arduino. Aangezien de servo's worden aangedreven door een 6V accu bleek het gemakkelijkste is om gewoon gebruiken een 9V batterij voor de Arduinos en 6V packs voor de servo's, omdat u moet isoleren van de voeding voor de Arduino te wijten aan de elektrische ruis gegenereerd door de servo's.
Nu dat de ID12 verkrijgbaar in een laag voltage-versie is het zou eenvoudiger om macht alles, van een accu 6V en gebruik een 3.3V Arduino Pro Mini en gebruik een 3,3 v DC/DC converter om geïsoleerde macht de Arduino te leveren. De Wave Shield werken echter alleen op 5V.
In de code zal je zien dat alle vier vinger RFID-tags staan maar slechts twee label IDs worden herkend in de code. Ik vond het gewoon makkelijker om lijst alle codes die mij watertje using voor het pak bouwen en vervolgens de afzonderlijke label-id voor specifieke functies uitkiezen. Opmerking dat zul je natuurlijk uw eigen label-ID's invoeren. Voor meer info over RFID-tag hebben lezers en identificerend label-ID's een blik bij dit geweldige Bildr artikel.
Merk op dat u moet wijzigen in de naam van het audiobestand van hip pod flare "SOUND1. WAV"voor de Wave Shield te spelen. U moet ook de servo-draairichting voor drie van de servo hip pod's omkeren aangezien ze zijn gegroepeerd in paren die een identieke signaal ontvangen.
Hier is de code-
#include
#include "Servo.h" / / de servo-bibliotheek
Servo podServo; Servo verplaatsen hip peulen
Servo leverServo; Servo verplaatsen hip pod hefbomen
Servo rotateServo; Servo draaien hip peulen
Servo leftflapServo; Servo te verplaatsen van links terug klep
Servo rightflapServo; Servo recht om terug te gaan klep
NewSoftSerial mySerial = NewSoftSerial (2, 3);
int RFIDResetPin = 13;
int ledPin1 = 6; controle pin voor linker heup pod LEDs
int ledPin2 = 5; controle pin voor recht hip pod LEDs
int servoPin1 = 10; controle pin links klep-servo
int servoPin2 = 11; controle pin voor juiste klep servo
int servoPin3 = 9; controle pin pod-servo
int servoPin4 = 8; controle pin voor hendel servo
int servoPin5 = 7; controle pin draaien-servo
int soundPin = 12; controle pin voor flare geluid
Registreer hier uw RFID-tags
Label1 char [13] = "440085E77452"; u moet deze voor uw eigen label wijzigen
tag2 char [13] = "440085FC330E";
tag3 char [13] = "440085F97840";
tag4 char [13] = "4400863914EF";
VOID Setup {}
Serial.begin(9600);
mySerial.begin(9600);
podServo.attach(servoPin3); de servo op pin 9 hecht aan de servo-object
leverServo.attach(servoPin4); de servo op pin 8 hecht aan de servo-object
rotateServo.attach(servoPin5); de servo op pin 7 hecht aan de servo-object
leftflapServo.attach(servoPin1); attches de servo op pin 10 op het servo-object
rightflapServo.attach(servoPin2); de servo op pin 11 hecht aan de servo-object
podServo.write(155); de pod servo tot 135 graden roteren
leverServo.write(145); de hendel servo tot 135 graden roteren
rotateServo.write(165); de pod rotatie servo tot 170 graden roteren
leftflapServo.write(170); het linker klepje servo tot 170 graden roteren
rightflapServo.write(10); de juiste klep servo tot 10 graden roteren
pinMode (ledPin1, OUTPUT); Hiermee stelt u de LED-pin als uitgang
pinMode (ledPin2, OUTPUT); Hiermee stelt u de LED-pin als uitgang
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
pinMode (soundPin, OUTPUT); Hiermee stelt u de correcte pin als uitvoer
digitalWrite (soundPin, laag); uitschakelen van geluid pin
pinMode (RFIDResetPin, uitvoer);
digitalWrite (RFIDResetPin, hoge);
}
void loop {}
char tagString [13];
int index = 0;
lezing van Boole = vals;
while(Serial.available()) {}
int readByte = Serial.read(); Lees volgende beschikbaar byte
if(readByte == 2) lezen = true; die beginnen van tag
if(readByte == 3) lezen = false; einde van tag
Als (lezen & & readByte! = 2 & & readByte! = 10 & & readByte! = 13) {}
opslaan van de tag
tagString [index] = readByte;
index ++;
}
}
checkTag(tagString); Controleer of het is een match
clearTag(tagString); Schakel de char van alle waarde
resetReader(); opnieuw instellen van de RFID-lezer
}
VOID checkTag (char tag[]) {}
///////////////////////////////////
Controleer de Lees tag tegen bekende tags
///////////////////////////////////
if(STRLEN(tag) == 0) keren; leeg, geen behoefte om te blijven
Als (compareTag (label, Label1)) {/ / als gematched Label1, dit doen
mySerial.print('A'); Label lezen over XBee stuurt
} else if (compareTag (label, tag2)) {/ / als gematched tag2, dit doen
podServo.write(90); de pod servo tot 90 graden draaien
delay(500); een halve seconde wachten
leverServo.write(95); de hendel servo tot 90 graden draaien
delay(1000);
rotateServo.write(5); de pod rotatie servo tot 10 graden roteren
delay(1500);
leverServo.write(145);
delay(500);
digitalWrite (soundPin, hoge); geluid op
delay(10); wacht tien milliseconden
digitalWrite (soundPin, laag); alarm uitschakelen
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50); 50 milliseconden wacht
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); uitschakelen van LEDs
digitalWrite (ledPin2, hoge); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, hoge); uitschakelen van LEDs
digitalWrite (ledPin2, hoge); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, hoge); uitschakelen van LEDs
digitalWrite (ledPin2, hoge); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, hoge); uitschakelen van LEDs
digitalWrite (ledPin2, hoge); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
delay(50);
digitalWrite (ledPin1, hoge); Zet LEDs
digitalWrite (ledPin2, hoge); Zet LEDs
delay(50);
digitalWrite (ledPin1, laag); uitschakelen van LEDs
digitalWrite (ledPin2, laag); uitschakelen van LEDs
leverServo.write(95); de hendel servo tot 90 graden draaien
delay(1500);
rotateServo.write(165); de pod servo tot 135 graden roteren
delay(1000);
leverServo.write(145);
delay(500);
podServo.write(155); de pod servo tot 135 graden roteren
delay(2000);
leftflapServo.write(125); het linker klepje servo naar 125 graden-full omhoog draaien
rightflapServo.write(55); de juiste klep servo tot 55 graden-full omhoog draaien
delay(500);
leftflapServo.write(170); het linker klepje servo tot 170 graden - volledige omlaag draaien
rightflapServo.write(10); de juiste klep servo naar 10 graden - volledige omlaag draaien
delay(500);
leftflapServo.write(125); linker klep volledig omhoog
delay(500);
leftflapServo.write(170); links van de klep volledig naar beneden
delay(500);
rightflapServo.write(55); juiste klep volledig omhoog
delay(500);
rightflapServo.write(10); klep volledig naar beneden rechts
} else {}
Serial.println(tag); voorlezen aan een onbekende tag
}
}
VOID lightLED (int pin) {}
///////////////////////////////////
LED op pin "pin" inschakelen voor 250ms
///////////////////////////////////
Serial.println(PIN);
digitalWrite (pin, hoge);
delay(250);
digitalWrite (pin, laag);
}
ongeldig resetReader() {}
///////////////////////////////////
Reset de RFID-lezer om opnieuw te lezen.
///////////////////////////////////
digitalWrite (RFIDResetPin, laag);
digitalWrite (RFIDResetPin, hoge);
delay(150);
}
VOID clearTag (char one[]) {}
///////////////////////////////////
de char-matrix duidelijk door het invullen met null - ASCII 0
Zal denken dat dezelfde tag is anders gelezen
///////////////////////////////////
for (int i = 0; ik < strlen(one); i ++) {}
een [i] = 0;
}
}
Booleaanse compareTag (char [een], char two[]) {}
///////////////////////////////////
Vergelijk twee waarde om te zien of hetzelfde,
killerid niet 100% werken, zodat we dit doen
///////////////////////////////////
if(STRLEN(One) == 0) geretourneerd als false; leeg
for (int i = 0; ik < 12; i ++) {}
Als (een [i]! = two[i]) return false;
}
return true; geen incongruenties
}
Hier is de code voor de WaveShield, hoffelijkheid van Adafruit-
#include
#include
#include
#include "WaveUtil.h"
#include "WaveHC.h"
Kaart van de SdReader; Dit object bevat de gegevens voor de kaart
FatVolume vol; Dit houdt de informatie voor de partitie op de kaart
FatReader wortel; Dit bevat de gegevens voor het bestandssysteem op de kaart
F FatReader; Dit bevat de gegevens voor het bestand we aan het spelen bent
WaveHC Golf; Dit is de enige Golf (audio) object, omdat we zullen slechts één filter tegelijk spelen
#define DEBOUNCE 100 / / button debouncer
deze handige functie geeft het aantal bytes in het RAM, momenteel gratis groot voor debugging!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
Als (__brkval (int) == 0) {}
FREE_MEMORY = ((int) & free_memory)-((int) & __bss_end);
}
else {}
FREE_MEMORY = ((int) & free_memory)-((int) __brkval);
}
Return free_memory;
}
VOID sdErrorCheck(void)
{
Als (! card.errorCode()) keren;
putstring ("\n\rSD I/O fout:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
while(1);
}
VOID Setup {}
seriële poort instellen
Serial.begin(9600);
putstring_nl ("WaveHC met 6 knoppen");
putstring ("vrije RAM:"); Dit kan helpen met het opsporen van fouten, uit RAM lopend is slecht
Serial.println(freeRam()); Als dit onder 150 bytes kan het problemen magie!
De pennen voor de DAC-besturingselement instellen Deze pennen zijn gedefinieerd in de bibliotheek
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
pin13 LED
pinMode (13, OUTPUT);
inschakelen van pull-up weerstanden op schakelaar pinnen (analoge ingangen)
digitalWrite (14, hoge);
digitalWrite (15, hoge);
digitalWrite (16, hoge);
digitalWrite (17, hoge);
digitalWrite (18, hoge);
digitalWrite (19, hoge);
Als (! card.init(true)) {//play met 4 MHz spi als 8MHz niet voor u werkt
Als (! card.init()) {//play met 8 MHz spi (standaard sneller!)
putstring_nl ("Card init. mislukt!"); Er ging iets mis, laat uitprinten waarom
sdErrorCheck();
while(1); vervolgens 'stoppen' - niets doen!
}
inschakelen optimaliseren lees - sommige kaarten kunnen timeout. Uitschakelen als u problemen ondervindt
card.partialBlockRead(true);
Nu gaan we voor een FAT-partitie!
uint8_t deel;
voor (deel = 0; deel < 5; deel ++) {/ / Wij hebben maximaal 5 "slots" om in te kijken
Als (vol.init (kaart, deel))
breken; We vonden een, laat borgtocht
}
Als (deel == 5) {/ / als we uiteindelijk niet het vinden van een :(
putstring_nl ("geen geldige FAT-partitie!");
sdErrorCheck(); Er ging iets mis, laat uitprinten waarom
while(1); vervolgens 'stoppen' - niets doen!
}
Laat de gebruiker te vertellen over wat we gevonden
putstring ("Using partitie");
Serial.Print (deel, DEC);
putstring (", type is vet");
Serial.println(vol.fatType(),DEC); FAT16 of FAT32?
Probeert te openen van de root directory
Als (! root.openRoot(vol)) {}
putstring_nl ("kan niet openen root dir!"); Er ging iets mis,
while(1); vervolgens 'stoppen' - niets doen!
}
Oef! Daar kregen we voorbij de harde delen.
putstring_nl("Ready!");
}
void loop {}
putstring("."); uncomment dit om te zien als de lus niet actief
schakelaar (check_switches()) {}
Case 1:
playcomplete ("SOUND1. WAV");
breken;
Case 2:
playcomplete ("SOUND2. WAV");
breken;
Case 3:
playcomplete ("SOUND3. WAV");
breken;
Case 4:
playcomplete ("SOUND4. WAV");
breken;
Case 5:
playcomplete ("SOUND5. WAV");
breken;
Case 6:
playcomplete ("SOUND6. WAV");
}
}
byte check_switches()
{
statische byte vorige [6];
statische lange tijd [6];
byte lezen;
byte gedrukt;
byte index;
ingedrukt = 0;
voor (byte index = 0; index < 6; ++ index) {}
lezen = digitalRead (14 + index);
Als (lezen == LOW & & Vorige [index] == HIGH & & millis() - tijd [index] > DEBOUNCE)
{
schakelaar ingedrukt
tijd [index] = millis();
ingedrukt = index + 1;
breken;
}
Vorige [index] = lezing;
}
retourneren van de schakeloptie-nummer (1-6)
terugkeer (gedrukt);
}
Speelt een volledige bestand van begin tot eind met geen pauze.
ongeldig playcomplete(char *name) {}
Bel onze helper vinden en spelen deze naam
playfile(name);
terwijl (wave.isplaying) {}
niets te doen tijdens het spelen van haar
}
nu zijn gedaan afspelen
}
ongeldig playfile(char *name) {}
Zie als de Golf-object is momenteel bezig met iets
Als (wave.isplaying) {/ / al het spelen van iets, dus stoppen met het!
Wave.stop(); Stop ermee
}
kijken in de root directory en open het bestand
Als (! f.open (root, naam)) {}
putstring kon niet ("open bestand"); Serial.Print(name); terugkeer;
}
OK lees het bestand en zet hem in een golf-object
Als (! wave.create(f)) {}
putstring_nl ("niet een geldig WAV"); terugkeer;
}
OK tijd om te spelen! Start het afspelen
Wave.Play();
}