Beverly-kross: lite krossning. 1 bit Arduino musik. (3 / 5 steg)
Steg 3: Att göra Arduino förstå vår musikaliska awesomeness
Hur jag förvara exempeldata på mikrokontroller
Som ni minns säkert från föregående steg att vi tog vår nedsamplas information och packat det in ett nätt litet paket av storleken på 1 byte eller 8 bitar.
Detta sparar utrymme på mikrokontroller som ni vet men du kanske undrar hur vi lagra det och få tillgång till denna information för uppspelning senare på arduino.
Ange avr/pgmspace.h:
#include < avr/pgmspace.h >
Denna header-fil tillåter oss att programmera våra exempeldata direkt i flashminnet på Arduino, yay!
Det är ganska lätt att använda bara med en liten bit av övervägande på hur vi läser uppgifter tillbaka.
prog_uchar onebitraw [PROGMEM] = {0XFF, 0XFF, 0XEF, 0XFF,...};
Jag antar att de 2 viktigaste punkterna att göra om denna bit av koden ovan är att vi använder prog_uchar som typ av data vi lagrar, detta är viktigt för oss att kunna läsa data tillbaka slut på minne när vi spelar provet. En annan märklig sak är att vi använder nyckelordet PROGMEM, detta bygger på sidhuvudfilen att jag nämnde avr/pgmspace.h och detta säger kompilatorn var att lagra denna samling av data.
prog_uchar berättar kompilatorn att vi lagrar data av typen unsigned char.
En röding är bara 1 byte, så den kan lagra ett värde mellan 0 och till 255, 8 bitar.
Vi anger osignerade eftersom vi lagrar endast positiva tal från 0 och uppåt. Detta är viktigt eftersom vi inte är riktigt lagra nummer som ni kanske minns vi faktiskt lagrar 8 ljudexempel i detta värde, detta slutar att omvandlas till ett numeriskt värde och vi kan flytta runt som om det är flera men verkligheten är inte riktigt vad det verkar men kompilatorn inte vet eller bryr sig om denna konfiguration. Om vi använder en signerad lagringsmetod skulle vi vara i rätt oreda.
Om du sugen på att veta mer om signerad, osignerade och två kompletterar sedan denna wiki artikel bör vara en intressant läsa för dig. http://en.wikipedia.org/wiki/Two's_complement
Pekare aritmetik är wayyy lättare än det låter
För Arduino att läsa tillbaka vår information från avsnittet PROGMEM minne kommer vi att behöva använda den funktion pgm_read_byte_near(); Det är mycket lätt att använda och det enda som försvårar det är att den kräver dig att använda pekare aritmetik som byte minne du vill ange... Som så:
pgm_read_byte_near (onebitraw + which_one);
I detta exempel jag lägga ut ovan ser du "onebitraw" som jag använder för att uttrycka lagring av våra ljud prover. Nu kan du vara förtrogen med använda array index som variabel [index] och detta är inte annorlunda förutom vi ersätta [index] med + index istället... Vettigt? Anledningen är att vi lagras våra ljuddata som ett byte, en efter en, så vi vet att var och en är helt enkelt en mer längs än den tidigare till den.
Se? Mycket enkel!