Stap 4: Elektronica en programmering
Nu dat ik de monteurs gedaan had ik nodig had om het verplaatsen te maken. Ik gebruikte een Arduino Pro Mini om de ingangen en servo bewegingen en en een Arduino Pro met een Adafruit Wave Shield om de geluidseffecten. Er is een kleine board dat drie transistoren op it heeft-de transistors zet de helm laser zicht en leiden tot het kanon LED en geluidseffect. De Raad van bestuur heeft ook een 3.3V regelgever voor de stroomvoorziening voor de helm laser zicht.
Het kanon LED is een heldere blauwe Luxeon dat wordt aangestuurd door een constante huidige "Buck Toot" bestuurder. Om te voorkomen dat eventuele problemen servo lawaai de Arduinos worden aangedreven door een 9V batterij en alles wordt aangedreven door vier "AA" alkaline batterijen. Ik kon heb gebruikt NiCad, NiMH of LiPo Accu's, maar sinds we dergelijke volgens een strak schema waren wilde ik de jongens om hoeft te maken over gespecialiseerde batterijpakken of lange heffing keer-ze vervangende batterijen in elke supermarkt krijgen konden.
Controle ingangen zou drie kleine vinger tip tactiele schakelaars. De schakelaars zijn aan/uit, dus als Jamie een van hen duwde een geluid zich over en voorbij herhalen zou totdat het was uitgeschakeld. Ook het kanon zou blijven verplaatsen via het heeft geprogrammeerd volgorde totdat deze is uitgeschakeld. De vinger tip schakelaars waren verbonden met de rugzak met behulp van een ethernet-kabel die langs de lange zijde van Jamie's arm zou worden uitgevoerd en de schakelopties zou zitten in de vingers van de handschoen.
De elektronica werden op een 1/8" dikke aluminiumplaat met behulp van kunststof koelbloedig en 4-40 schroeven gemonteerd.
De volledige schakelvoorbeeld is afgebeeld en ik heb ook het geluid bestanden-één geluid voor het kanon is, behoort de Predator "te klikken op" geluid en het laatste geluid is het gebrul van de Predator.
De Arduinos zijn geprogrammeerd met behulp van een FTDI fundamentele breakout. Ik schreef een handleiding voor het programmeren van de Arduino hier-
Hier is de code voor de Arduino Pro Mini- dit regelt de kanon bewegingen:
#include < Servo.h > / / de servo-bibliotheek
Servo servo1; Hiermee maakt u een exemplaar van het servo-object om te bepalen van een servo
Servo servo2;
Servo servo3;
int servoPin1 = 9; controle pin voor servo
int servoPin2 = 8;
int servoPin3 = 7;
int ledPin1 = 11; controle pin voor LED
int ledPin2 = 12; controle pin voor laser zicht
int soundPin1 = 10; controle pin voor geluidskaart
VOID Setup {}
servo1.attach(servoPin1); de servo op pin hecht aan de servo-object
servo2.attach(servoPin2);
servo3.attach(servoPin3);
pinMode (ledPin1, OUTPUT); Hiermee stelt u de LED-pin als uitvoer
pinMode (ledPin2, OUTPUT);
pinMode (soundPin1, OUTPUT); Hiermee stelt u de correcte pin als uitvoer
digitalWrite (ledPin1, laag); Hiermee stelt u de LED pin LOW (uitgeschakeld)
digitalWrite (ledPin2, laag);
digitalWrite (soundPin1, laag);
}
void loop {}
digitalWrite (ledPin2, hoge); Hiermee stelt u de LED pin HIGH (verandert het op)
servo3.write(170); werpt kanon arm
servo1.write(140); kanon omhoog draait
delay(2000);
servo2.write(40); kanon uit de buurt van hoofd draait
delay(2000);
servo2.write(110); kanon naar hoofd draait
digitalWrite (ledPin1, hoge);
digitalWrite (soundPin1, hoge);
delay(10);
digitalWrite (ledPin1, laag);
digitalWrite (soundPin1, laag);
delay(4000);
servo2.write(60); kanon uit de buurt van hoofd draait
servo1.write(120); kanon omhoog draait
delay(1000);
digitalWrite (ledPin1, hoge);
digitalWrite (soundPin1, hoge);
delay(10);
digitalWrite (ledPin1, laag);
digitalWrite (soundPin1, laag);
delay(3000);
servo2.write(120); kanon naar hoofd draait
servo1.write(150); kanon naar beneden draait
delay(2000);
digitalWrite (ledPin1, hoge);
digitalWrite (soundPin1, hoge);
delay(10);
digitalWrite (ledPin1, laag);
digitalWrite (soundPin1, laag);
delay(1000);
servo1.write(140);
delay(3000);
servo1.write(170);
delay(500);
servo2.write(90);
delay(1000);
servo3.write(10);
digitalWrite (ledPin2, laag);
delay(5000);
}
Hier is de code voor de Wave Shield - (hoffelijkheid van Adafruit)
#include < FatReader.h >
#include < SdReader.h >
#include < avr/pgmspace.h >
#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();
}