Prata pumpa kostym (3 / 6 steg)

Steg 3: Koden och Wav-filer

Koden är från Adafruit och det är respektabel parterna och har ändrats. Jag lade till en 4: e knapp och ljud byte. Jag ändrade de ljud byte till mitt eget och jag bytte ögonen från runda till triangeln.

Detta Instructable förutsätter att du redan vet hur man arbetar med arduino, (installera kod, biblioteket, etc)

KODEN.

Du kan antingen kopiera och klistra in koden nedan i till arduino ide eller klicka på filen.

Pumpa ansikte kostym
Denna skiss har något ändrats från ursprungliga
skaparen som nedan. Njut av!!
'wavface' exempel skiss för Adafruit I2C 8 x 8 LED ryggsäckar
och Wave sköld:
//
www.adafruit.com/products/870 www.adafruit.com/products/1049
www.adafruit.com/products/871 www.adafruit.com/products/1050
www.adafruit.com/products/872 www.adafruit.com/products/1051
www.adafruit.com/products/959 www.adafruit.com/products/1052
www.adafruit.com/products/94
//
Kräver Adafruit_LEDBackpack, Adafruit_GFX bibliotek och WaveHC
bibliotek.
//
Denna skiss visar animering ungefär synkroniseras till inspelat
tal. Det är ganska komplicerad och kan vara överväldigande att nybörjare
programmerare, som kanske vill börja med exemplet "matrix8x8"
och sedan "roboface" innan arbetet genom denna kod. Dessutom mycket
av de kommentarer som avser ansikte animeringen har skalats
här för korthetens... hänvisa till "roboface" skiss om du har någon
frågor hur den del fungerar.
//
Extra hårdvara krävs: ljud utlöses med hjälp av tre
normalt-öppen momentan knappar ansluten till Digital stift 6, 7, 8
och GND. (t.ex. www.adafruit.com/products/1009)
//
Adafruit investerar tid och resurser att tillhandahålla detta öppen källkod,
Vänligen stödja Adafruit och öppen hårdvara genom att köpa
produkter från Adafruit!
//
Skrivet av P. Burgess för Adafruit industrier, anpassade delar från
'PiSpeakHC' skiss ingår i WaveHC bibliotek.
BSD-licensen, alla texten ovan måste inkluderas i en omfördelning.

#include < Arduino.h >
#include < Wire.h >
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include < WaveHC.h >
#include < WaveUtil.h >

Dessa WAV-filer bör vara i rotnivån i SD-kortet:
PROGMEM röding
wav0 [] = "HALLOW~1.wav",
wav1 [] = "LOOKIN~1.wav",
wav2 [] = "THISPM~1.wav",
wav3 [] = "TRKORTRT.wav", / / lagt detta linje 8/3/13
* wavname [] = {wav0, wav1, wav2, wav3}; extra wav3 till denna linje 8/3/13
PROGMEM gör regelbundna framträdanden under denna kod, orsaken är att
SD kort biblioteket kräver gobs av dyrbara RAM (lämnar mycket lite till
vår egen skiss). PROGMEM låter oss lägga fast data i programmet flash-minne,
vilket är betydligt rymligare. Sträng tabeller är paritcularly otäcka.
Se www.arduino.cc/en/Reference/PROGMEM för mer info.

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 volymer rotmapp
FatReader fil. Det här objektet representerar WAV-fil för en fras
WaveHC våg; En enda våg objekt--bara en ljud spelas i taget
Makro att sätta felmeddelanden i flash-minnet
#define error(msg) error_P(PSTR(msg))

Eftersom de två öga delar matriser samma adress, bara fyra
Matrix-objekt behövs för fem bildskärmar:
#define MATRIX_EYES 0
#define MATRIX_MOUTH_LEFT 1
#define MATRIX_MOUTH_MIDDLE 2
#define MATRIX_MOUTH_RIGHT 3
Adafruit_8x8matrix matrix [4]. Matris med Adafruit_8x8matrix objekt

I stället tilldelar matrisen adresser sekventiellt i en loop, varje
har en plats i den här matrisen. Detta gör det lättare om du oavsiktligt
installera en eller flera matriser i fel fysiska position--
sortera adresserna i den här tabellen och du kan fortfarande hänvisar till
matriser av indexet ovan, ingen annan kod eller ledningar behöver förändras.
CONST uint8_t PROGMEM matrixAddr [] = {0x70, 0x71, 0x72, 0x73};

CONST uint8_t PROGMEM / / bitmappar lagras i programminnet
blinkImg [] [8] = {/ / öga animeringsbildrutor
{B00000001, / / helt öppna ögon
B00000011,
B00000111,
B00001111,
B00011111,
B00111111,
B01111111,
B11111111},
{B00000000,
B00000001,
B00000011,
B00000111,
B00001111,
B00011111,
B00111111,
B01111111},
{B00000000,
B00000000,
B00000001,
B00000011,
B00000111,
B00001111,
B00011111,
B00111111},
{B00000000,
B00000000,
B00000000,
B00000001,
B00000011,
B00000111,
B00001111,
B00011111},
{B00000000,
B00000000,
B00000000,
B00000000,
B00000001,
B00000011,
B00000111,
B00001111},
{B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000001,
B00000011,
B00000111},
{B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000001,
B00000011},
{B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000001},
{B00000000, / / helt stängt öga
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000}},
mouthImg [] [24] = {/ / mun animeringsbildrutor
{B00000000, B00000000, B00000000, / / mun position A
B00000000, B00000000, B00000000,
B01111111, B11111111, B11111110,
B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000},
{B00000000, B00000000, B00000000, / / mun läge B
B00000000, B00000000, B00000000,
B00111111, B11111111, B11111100,
B00000111, B00000000, B11100000,
B00000000, B11111111, B00000000,
B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000},
{B00000000, B00000000, B00000000, / / mun läge C
B00000000, B00000000, B00000000,
B00111111, B11111111, B11111100,
B00001000, B00000000, B00010000,
B00000110, B00000000, B01100000,
B00000001, B11000011, B10000000,
B00000000, B00111100, B00000000,
B00000000, B00000000, B00000000},
{B00000000, B00000000, B00000000, / / mun läge D
B00000000, B00000000, B00000000,
B00111111, B11111111, B11111100,
B00100000, B00000000, B00000100,
B00010000, B00000000, B00001000,
B00001100, B00000000, B00110000,
B00000011, B10000001, B11000000,
B00000000, B01111110, B00000000},
{B00000000, B00000000, B00000000, / / mun position E
B00000000, B00111100, B00000000,
B00011111, B11000011, B11111000,
B00000011, B10000001, B11000000,
B00000000, B01111110, B00000000,
B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000},
{B00000000, B00111100, B00000000, / / mun läge F
B00000000, B11000011, B00000000,
B00001111, B00000000, B11110000,
B00000001, B00000000, B10000000,
B00000000, B11000011, B00000000,
B00000000, B00111100, B00000000,
B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000}};

Animeringssekvenser motsvarar varje WAV. Första siffran i
varje par är en mun bitmapp index. Andra siffran är lastrummet
tid (i bilder). 255 markerar slutet av listan.
Det finns ingen "magic" här, programvaran är inte härleda mun
ståndpunkt från ljudet... tabellerna bestämdes för hand,
precis som animatörer gör det. Ytterligare förklaring här:
http://www.idleworm.com/How/Anm/03t/talk1.shtml

CONST uint8_t PROGMEM
seq1 [] = {0, 2, 2, 5, 5, 3, 3, 7, / / "Happy Halloween" / / ansluten till wav 0 ovan
4, 5, 3, 4, 2, 5, 4, 3, 255},

seq2 [] = {0, 1, 3, 5, 1, 5, 4, 2, / / "Hö, vad glor du på?" / / ansluten till wav 1 ovan
3, 2, 1, 2, 4, 4, 1, 3,
4, 2, 255},
seq3 [] = {0, 1, 1, 2, 3, 6, 2, 5, / / "som har två tummar och vill ha godis, denna pumpa" / / ansluten till wav 2 ovan
0, 1, 4, 4, 5, 2, 1, 5,
3, 6, 1, 4, 5, 3, 4, 2,
3, 6, 4, 2, 255},

seq4 [] = {3, 2, 2, 5, 5, 3, 3, 7, / / "Trick Or Treat" / / ansluten till wav 3 ovan
4, 5, 255},

* anim [] = {seq1, seq2, seq3, seq4}; lagt till seq 4 här 8/3/13

uint8_t
blinkIndex [PROGMEM] = {1, 2, 3, 4, 3, 2, 1}, / / Blink bitmapp sekvens
blinkCountdown = 100, / / nedräkningen till nästa blink (i bilder)
gazeCountdown = 75 / / nedräkningen till nästa öga rörelse
gazeFrames = 50, / / varaktighet av ögonrörelser (mindre = snabbare)
mouthPos = 0, / / aktuell bild nummer för mun
mouthCountdown = 10, / / nedräkningen till nästa mun ändra
newPos = 255, / / ny mun läge för aktuell bildruta
* seq, / / Animation sekvens för närvarande som spelas upp
IDX, / / Current array index i animeringssekvensen
prevBtn = 99, / / knapp # tryckte på förra loop() iteration
btnCount = 0; Antalet iterationer samma knapp har hållits
int8_t
eyeX = 3, eyeY = 3, / / Current öga position
newX = 3, newY = 3, / / nästa öga position
dX = 0, dY = 0; Avstånd från före ny position

void setup() {

Serial.BEGIN(9600);

PgmPrintln ("WAV ansikte");

IF(!Card.init()) fel ("kort init. misslyckades!");
IF(!Vol.init(Card)) fel ("ingen partition!");
IF(!root.openRoot(Vol)) fel kunde inte ("öppna dir");
PgmPrintln ("filer som hittas:");
root.ls();

Utsäde slumptalsgeneratorn från en oanvänd analog ingång:
randomSeed(analogRead(A0));

Initiera och initiera varje matrix-objekt:
för (uint8_t jag = 0; jag < 4; i ++) {
Matrix [i] = Adafruit_8x8matrix();
Matrix [i] .begin (pgm_read_byte (& matrixAddr[i]));
}

Aktiverar pull-up motstånd på fyra (ändrat till fyra) knappen ingångar.
Andra änden av varje knapp då ansluter till GND.
för (uint8_t jag = 6; jag < = 9; i ++) {//i < = 8 till 9 8/3/13
pinMode (i, ingång);
digitalWrite i, hög. Aktivera pullup
}
}

void loop() {

uint8_t i.

Rita ögongloben i nuvarande delstaten blinkyness (ingen elev).
Matrix[MATRIX_EYES].Clear();
Matrix [MATRIX_EYES] .drawBitmap (0, 0,
blinkImg [
(blinkCountdown < sizeof(blinkIndex))? För närvarande blinkar?
pgm_read_byte (& blinkIndex[blinkCountdown]): / / Ja, slå upp bitmapp #
0 / / Nej, Visa bitmapp 0
], 8, 8, LED_ON);
Dekrement blink counter. Slutet, ange slumpmässig tid för nästa blink.
om (--blinkCountdown == 0) blinkCountdown = random (5, 180);

om (--gazeCountdown < = gazeFrames) {
Ögonen är i rörelse - Rita elev vid mellanliggande position
Matrix [MATRIX_EYES] () .fillRect
newX - (dX * gazeCountdown / gazeFrames),
newY - (dY * gazeCountdown / gazeFrames),
2, 2, LED_OFF);
IF(gazeCountdown == 0) {/ / senast ram?
eyeX = newX; eyeY = newY; Ja. Det är nya gammal, sedan...
göra {/ / plocka slumpmässiga positioner tills en i ögat cirkeln
newX = random(7); newY = random(7);
dX = newX - 3. dY = newY - 3.
} medan ((dX * dX + dY * dY) > = 10); Tack Pythagoras
dX = newX - eyeX; Horisontella avståndet att flytta
dY = newY - eyeY; Vertikala avståndet att flytta
gazeFrames = random (3, 15); Varaktigheten av ögonrörelser
gazeCountdown = random (gazeFrames, 120); Räkna till slutet av nästa rörelse
}
} annat {
Inte i rörelse ännu--Rita elev vid nuvarande statiska position
Matrix [MATRIX_EYES] .fillRect (eyeX, eyeY, 2, 2, LED_OFF);
}

Scan knappar 6, 7, 8, 9 söker första knappen intryckt... lagt till #9 8/3/13
för (jag = 0; (jag < 4) & & (digitalRead(i+6) == hög); i++); (jag < 3 ändras till 4 8/3/13

IF(i < 4) {/ / något tryckte? Ja! (jag < 3 ändras till 4 8/3/13
IF(i == prevBtn) {/ / samma som förra gången vi kollade? Bra!
om (++ btnCount == 4) {/ / 3 pass till "Dämpningstid' knappen ingång / / == ändras från 3 till 4
playfile ((char *) pgm_read_word(&wavname[i])); Starta WAV
Slå upp animation sequence # motsvarande denna WAV...
SEQ = (uint8_t *) pgm_read_word(&anim[i]);
IDX = 0; Börja på första byte data
newPos = pgm_read_byte (& seq[idx++]); Första munnen pos
mouthCountdown = pgm_read_byte (& seq[idx++]); Håll tid för pos
}
} annat btnCount = 0; Annan knapp än före - start räkna över
prevBtn = i.
} annat prevBtn = 99. Inga knappar tryckte

om (newPos! = 255) {/ / är munnen i rörelse?
om (--mouthCountdown == 0) {/ / räkna ner ramar till nästa position
newPos = pgm_read_byte (& seq[idx++]); Ny mun position
IF(newPos == 255) {/ / slutet av listan?
mouthPos = 0; Ja, ange mun till neutralläge
} annat {
mouthPos = newPos; Ställ in munnen till ny position
mouthCountdown = pgm_read_byte (& seq[idx++]); Läs håll time
}
}
} annat mouthPos = 0; Mun inte i rörelse--inställd neutralläge

drawMouth(mouthImg[mouthPos]);

Uppdatera alla matriser i en snabb pass
för (uint8_t jag = 0; jag < 4; i ++) matrix[i].writeDisplay();

Delay(20);
}

Rita mun bild över tre intilliggande skärmar
void drawMouth (const uint8_t * img) {
för (uint8_t jag = 0; jag < 3; i ++) {
Matrix [MATRIX_MOUTH_LEFT + i].clear();
Matrix [MATRIX_MOUTH_LEFT + i] .drawBitmap (i * -8, 0, img, 24, 8, LED_ON);
}
}

void error_P (const char * str) {
PgmPrint ("fel:");
SerialPrint_P(str);
sdErrorCheck();
While(1);
}

skriva ut felmeddelande och stoppa om SD i/o-fel
void sdErrorCheck(void) {
om (! card.errorCode()) återvända;
PgmPrint ("\r\nSD I/O fel:");
Serial.Print(Card.ErrorCode(), HEX);
PgmPrint (",");
Serial.println(Card.errorData(), HEX);
While(1);
}

Öppna och börja spela en WAV-fil
void playfile (const char * namn) {
char filnamn [13]. 8.3 + NUL

IF(Wave.isplaying) wave.stop(); Stoppa någon som spelar WAV

strcpy_P (filnamn, namn); Kopiera namn ur PROGMEM i RAM

om (! file.open (rot, filnamn)) {
PgmPrint kunde inte ("öppna filen");
Serial.Print(filename);
hemkomst.
}
IF(!Wave.Create(File)) {
PgmPrintln ("inte en giltig WAV");
hemkomst.
}
Wave.Play();
}

Se Steg
Relaterade Ämnen

Prata pumpa

så min chef kom till mig en förra veckan och sa att han ville skrämma Bus eller treaters som kom till hans hem, och barnen som skulle komma att arbeta under en speciell Halloween Walk gemenskapen gör. Således föddes talande pumpa.Kort sagt, använde j...

Mutant Cyborg pumpa Halloween kostym v1.3

i år bestämde jag mig att göra undantag från tråkigt praktiken köpa standardiserade Halloween kostymer för mitt barn och bygga dem själv. Detta Instructable är för den som jag byggde för min son. Jag hoppas det inte är intressant bara för att det är...

Lätt pumpa dräkt för vuxna

så jag ville vara en pumpa till Halloween ganska länge och i år var det dags! Och vad bättre sätt för att vara en pumpa sedan göra din egen kostym? Så är det vad jag gjorde (med lite litte design hjälp). Detta borde vara är ganska lätt att göra allt...

Angry Bird kostym

Här är en Angry Bird kostym gjort för mina två och ett halvt år gamla. Detta var inspirerad av en Nemo kostym min son bar förra året. Jag gillade stilen på kostym men kunde inte hitta något jämförbart så vi bestämde sig för att göra våra egna. Detta...

Ettårskalas för Wilma pumpa

detta var den första Halloween att min dotter kunde komma med sin egen dräkt. Ett tag, det ändras varje vecka, sedan bosatte sig på "pumpa". Så, jag använde hennes pumpa-formade trick-or-treat hink som ett mönster för att göra henne en bärbar jä...

Hur man gör verkligt lätt hund kostymer till Halloween

Om du kan sy en rak linje, kan du göra en av dessa kostymer. Också, när du har läst denna sida och se hur lätt det är, gå vidare och göra en, ta ett foto och skicka det till oss. Vi älskar att få bilder att lägga upp på vår webbplats!I allmänhet, för...

Den stora pumpan Halloween kostym

med den stora pumpan är att i den ursprungliga berättelsen, han visar aldrig. Så du inte vet vad han ser ut. Vilket innebär ju att jag kan tolka den stora pumpan men jag vill!Det är vad fick mig att besluta att bygga en stor pumpa kostym i år: inga g...

Pumpa huvudet Halloween kostym

Halloween kanske ändå långt borta i år (31 oktober samma som varje år) men tack vare viss förvirring på min del som jag trodde att det var 6 veckor bort i stället för 10.Jag hade en diskussion med min fru om vad hennes dräkt skulle vara i år, vi kom...

Techno Destructo från GWAR kostym

för Halloween bestämde jag mig för att vara min favorit skurk från bandet GWAR, Techno Destructo. För dem som inte vet, GWAR är ett band som har funnits sedan 1980-talet som åtföljer deras konstig musik med teatriska scenen visar att funktionen carto...

Ljus upp kostym

denna kort tutorial går dig till och hur man gör en ljus upp kostym med elektroluminiscent wire (el wire). Denna kostym var i synnerhet skräddarsydd för DJ utför runt om i världen. Jag arbetat nära med formgivaren och el wire leverantör för att produ...

Att göra kostymer med min son Matt

så första kostym ändringarna gjordes... ljus upp bågreaktorn för en butik köpte kostym... fröet planterades. Sedan han klev upp nästa år och bad mig att göra honom Godzilla... kort varsel och för mycket att göra på jobbet begränsat mig lite men jag t...

En skrämmande drake kostym

Hej allaFörra veckan var karneval och min son beslutat att bära en "skrämmande drake kostym" (som han sa), och mitt arbete var att byggt upp... Detta... här... Tja, detta "bara" en drake kostym ;)Jag fick några nackdelar att göra detta...

Kostym horn

Välkommen till min tutorial för crafting kostym horn den billigt, enkelt och lightway sätt!Denna design är baserad på en fanart jag kommer cosplay, men du kan fritt experimentera med andra former och former och Använd samma steg för steg guideHa det...

Headless Horseman kostym

Senast var år Halloween kostym en fantastisk framgång. Jag lärde mig mycket, jag kommer att dela det med dig.Jag kommer detalj hur man rista, mögel och slush kasta din egen hård plast mask, sy en cape och göra ett trä prop svärd, jag bygger mitt svär...

Alien Xenomorph kostym

För de senaste åren har jag gjort ett par hemmagjord kostymer för mina pojkar varje Halloween. Förra året gjorde jag en Masterchief efter några av råd från denna webbplats och det visade sig ganska bra. I år min yngsta pojkar berättade de vill gå som...

Baby i en pumpa

detta gör för en bedårande foto, lätt Halloween kostym eller dörren hälsare för Bus eller treaters.Efter rengöring ut på insidan av en stor pumpa, klippte jag 2 hål nära botten. Jag fodrade insidan av pumpan med hushållspapper så det skulle vara mysi...

Väntar Baby Halloween-kostym

att göra denna kostym behöver du:1 t-shirt1 liten baby doll1 tub falska blod1 liten pumpaSkär 2 hål i tröjan för baby armarna... Håll hålen små så du måste tvinga armen genom.Dra armarna igenom, lägga till blod och en pumpa...GJORT!För att ge riktig...

Jack-O-Lantern kostym!

jag gjorde denna kostym för min brorson! Jag använde en cirkel kjol mönster. Du vill göra din mönster först.Måste du mäta din * midja / bröstet * lägga 2 inches och sedan dividera med 6.28 2pi.* För en kjol skulle du mäta din midja men eftersom denna...

Min Halloween kostym från 2011

detta är min stora pumpa Halloween kostym från 2011. Det består av en bambu T-formad stomme med plast soppåsar täcka den. Armarna är bambu stolpar igen behandlas i trasig soppåsar och händerna är (troll) handskar min granne lånade mig. Huvudet är en...