Bygga en replika Predator kostym (4 / 10 steg)
Steg 4: Elektronik och programmering
Nu när jag hade mekanikerna gjort behövde jag göra det flytta. Jag använde en Arduino Pro Mini för att hantera ingångar och servo rörelser och och en Arduino Pro med en Adafruit våg sköld att hantera ljudeffekter. Det finns en liten styrelse som har tre transistorer på it-transistorerna slå lasersikte hjälm och utlösa kanon LED och ljudeffekt. Styrelsen har också en 3,3 v regulator att ge ström för hjälm lasersikte.
Kanon LED är en ljust blå Luxeon som drivs av en ständig aktuell "Buck Toot" drivrutin. För att undvika servo bullerproblem i Arduinos drivs av ett 9V batteri och allt annat drivs av fyra "AA" alkaliska batterier. Jag kunde ha använt NiCd, NiMH eller LiPo batterier men eftersom vi var på ett tight schema jag ville inte killarna att oroa specialiserade batterier eller lång avgift gånger-de kunde få ersättningsbatterier i någon livsmedelsbutik.
Kontroll insatsvaror skulle vara tre små finger spets taktil switchar. Växlarna är av/på så om Jamie sköt en av dem ett ljud skulle upprepa sig om och om igen tills den var avstängd. Jämväl kanonen skulle fortsätta att flytta genom har det programmerad sekvens tills den var avstängd. Växlarna finger spets var anslutna till ryggsäcken med en ethernet-kabel som skulle köras ned längden på Jamies arm och växlarna skulle sitta inne i handsken fingrarna.
Elektroniken var monterade till en 1/8" tjock aluminiumplåt med plast standoffs och 4-40 skruvar.
Fullständig kopplingsschema visas och jag har inkluderat ljudet filer-ett ljud är för kanonen, en är rovdjur "klickande" ljud och sista ljudet är Predator bruset.
Arduinos programmeras med hjälp av en FTDI grundläggande breakout. Jag skrev upp en guide till programmering Arduino här-
Här är koden för Arduino Pro Mini- denna kontroller kanon rörelser:
#include < Servo.h > / / include servo biblioteket
Servo servo1; skapar en instans av objektet servo att styra en servo
Servo servo2;
Servo servo3;
int servoPin1 = 9; kontroll stift för servo
int servoPin2 = 8;
int servoPin3 = 7.
int ledPin1 = 11; kontroll stift för LED
int ledPin2 = 12; kontroll stift för lasersikte
int soundPin1 = 10; kontroll stift för ljud ombord
void setup() {
servo1.attach(servoPin1); tillmäter objektet servo servo på stift
servo2.attach(servoPin2);
servo3.attach(servoPin3);
pinMode (ledPin1, produktionen); Anger den LED stiftet som utdata
pinMode (ledPin2, produktionen);
pinMode (soundPin1, produktionen); ställer in ljud PIN-koden som utgång
digitalWrite (ledPin1, låg); Anger den LED stiftet låg (stänger av)
digitalWrite (ledPin2, låg);
digitalWrite (soundPin1, låg);
}
void loop() {
digitalWrite (ledPin2, hög); Anger den LED pin HIGH (vänder det på)
servo3.write(170); höjer kanon arm
servo1.write(140); roterar kanon uppåt
Delay(2000);
servo2.write(40); roterar kanon från huvud
Delay(2000);
servo2.write(110); roterar kanon mot huvudet
digitalWrite (ledPin1, hög);
digitalWrite (soundPin1, hög);
Delay(10);
digitalWrite (ledPin1, låg);
digitalWrite (soundPin1, låg);
Delay(4000);
servo2.write(60); roterar kanon från huvud
servo1.write(120); roterar kanon uppåt
Delay(1000);
digitalWrite (ledPin1, hög);
digitalWrite (soundPin1, hög);
Delay(10);
digitalWrite (ledPin1, låg);
digitalWrite (soundPin1, låg);
Delay(3000);
servo2.write(120); roterar kanon mot huvudet
servo1.write(150); roterar kanon nedåt
Delay(2000);
digitalWrite (ledPin1, hög);
digitalWrite (soundPin1, hög);
Delay(10);
digitalWrite (ledPin1, låg);
digitalWrite (soundPin1, låg);
Delay(1000);
servo1.write(140);
Delay(3000);
servo1.write(170);
Delay(500);
servo2.write(90);
Delay(1000);
servo3.write(10);
digitalWrite (ledPin2, låg);
Delay(5000);
}
Här är koden för den våg sköld - (med tillstånd av Adafruit)
#include < FatReader.h >
#include < SdReader.h >
#include < avr/pgmspace.h >
#include "WaveUtil.h"
#include "WaveHC.h"
SdReader kort; Detta objekt innehåller information för kortet
FatVolume vol; Detta innehåller information för partitionen på kortet
FatReader rot. Detta innehåller information för filsystemet på kortet
FatReader f; Detta innehåller information för filen vi är spelar
WaveHC våg; Detta är enda våg (audio)-objektet, eftersom vi bara kommer att spela en i taget
#define DÄMPNINGSTID 100 / / knappen debouncer
Denna behändiga funktionen returnerar antalet byte för närvarande gratis i RAM, bra för felsökning!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
om ((int) __brkval == 0) {
free_memory = ((int) & free_memory)-((int) & __bss_end);
}
annat {
free_memory = ((int) & free_memory)-((int) __brkval);
}
återvända free_memory;
}
void sdErrorCheck(void)
{
om (! card.errorCode()) återvända;
putstring ("\n\rSD I/O fel:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
While(1);
}
void setup() {
Ställ in serieporten
Serial.BEGIN(9600);
putstring_nl ("WaveHC med 6 knappar");
putstring ("fri slå ned:"); Detta kan hjälpa till med felsökning, slut RAM är dålig
Serial.println(freeRam()); om detta är under 150 byte kan det stava problem!
Ställa in produktionen stift för DAC kontroll. Detta stift definieras i biblioteket
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
pin13 LED
pinMode (13, OUTPUT);
Aktivera pull-up motstånd på switch stift (analoga ingångar)
digitalWrite (14, hög).
digitalWrite (15, hög).
digitalWrite (16, hög).
digitalWrite (17, hög),
digitalWrite (18, hög).
digitalWrite (19, hög).
om (! card.init(true)) {//play med 4 MHz spi om 8MHz inte fungerar för dig
om (! card.init()) {//play med 8 MHz spi (standard snabbare!)
putstring_nl ("kort init. misslyckades!"); Något gick fel, kan skriva ut varför
sdErrorCheck();
While(1); sedan 'stoppa' - gör ingenting!
}
Aktivera optimera Läs - vissa kort kan timeout. Inaktivera om du har problem
card.partialBlockRead(true);
Nu söker vi en FAT-partition!
uint8_t del;
för (del = 0; del < 5; del ++) {/ / vi har upp till 5 platser att titta i
om (vol.init (kort, del))
bryta; Vi hittade en, låter borgen
}
om (del == 5) {/ / om vi slutade inte att hitta en :(
putstring_nl ("ingen giltig FAT-partition!");
sdErrorCheck(); Något gick fel, kan skriva ut varför
While(1); sedan 'stoppa' - gör ingenting!
}
Kan tala om för användaren om vad vi hittade
putstring ("använda partition");
Serial.Print (del, DEC);
putstring (", typ är FAT");
Serial.println(Vol.fatType(),dec); FAT16 eller FAT32?
Försök öppna rotkatalogen
om (! root.openRoot(vol)) {
putstring_nl kan inte ("öppna rotfästa dir!"); Något gick fel,
While(1); sedan 'stoppa' - gör ingenting!
}
Usch! Vi fick tidigare de hårda delarna.
putstring_nl("ready!");
}
void loop() {
putstring("."); avkommentera här för att se om slingan inte är kör
Switch (check_switches()) {
fall 1:
playcomplete ("SOUND1. WAV");
bryta;
fall 2:
playcomplete ("SOUND2. WAV");
bryta;
fall 3:
playcomplete ("SOUND3. WAV");
bryta;
fall 4:
playcomplete ("SOUND4. WAV");
bryta;
fall 5:
playcomplete ("SOUND5. WAV");
bryta;
fall 6:
playcomplete ("SOUND6. WAV");
}
}
byte check_switches()
{
statiska byte tidigare [6].
statiska lång tid [6].
byte läsning;
byte pressade,
byte index.
tryckte = 0;
för (byte index = 0; index < 6. ++ index) {
läsning = digitalRead (14 + indexet);
om (läser == låg & & föregående [index] == hög & & millis() - tid [index] > DÄMPNINGSTID)
{
Switch tryckte
tid [index] = millis();
tryckte = index + 1.
bryta;
}
föregående [index] = behandlingen.
}
returnera switch nummer (1-6)
avkastning (pressad);
}
Spelar en full fil från början till slut med ingen paus.
void playcomplete(char *name) {
Ring vår hjälpare för att hitta och spela detta namn
playfile(Name);
samtidigt (wave.isplaying) {
göra ingenting samtidigt dess spelar
}
dess gjort spelar nu
}
void playfile(char *name) {
se om objektet våg för närvarande gör något
om (wave.isplaying) {/ / redan spelar något, så sluta det!
Wave.stop(); Sluta
}
titta i rotkatalogen och öppna filen
om (! f.open (rot, namn)) {
putstring kunde inte ("öppna filen"); Serial.Print(Name); hemkomst.
}
OK läsa filen och förvandla det till en våg objekt
om (! wave.create(f)) {
putstring_nl ("inte en giltig WAV"); hemkomst.
}
OK dags att spela! starta uppspelningen
Wave.Play();
}