Arduino Kogebog Uddrag: Store Tabeller af Data i Programhukommelse - 💡 Fix My Ideas

Arduino Kogebog Uddrag: Store Tabeller af Data i Programhukommelse

Arduino Kogebog Uddrag: Store Tabeller af Data i Programhukommelse


Forfatter: Ethan Holmes, 2019

Hvis du nogensinde har lavet et Arduino-baseret projekt, der involverer et stort antal tekststrenge, vil du hurtigt finde standardproblemet Arduino's 2K SRAM meget begrænsende. En løsning er at gemme teksten i programhukommelsen i stedet, hvilket ved 32Kb er meget mere rigeligt.

I foråret 2011 arbejdede jeg på et projekt med kunstnere Steve Hanson og Elliot Clapp, der var en del af Apexarts "Lad det ende som denne" gruppeshow, kurateret af Todd Zuniga. Steve lavede et generativt spørgeskema, der spurgte gallerihandlere og præsenterede dem med deres sidste ord. En interaktiv push-button-konsol og LCD blev bygget af Elliot (billedet ovenfor) og vi byggede sagen ved at bruge en billig Arduino-variant fra Modern Device. Det komplette projekt er dokumenteret i Make: Projects wiki.

Steve's poetiske sidste ord tog næsten 16K hukommelse op, som blev opbevaret i Arduino's programmagasin. Nedenfor er et uddrag fra Arduino Cookbook af Michael Margolis, der forklarer, hvordan man gemmer og får adgang til et stort databord i programhukommelsen.

17.3 Lagring og hentning af numeriske værdier i programhukommelsen

Problem

Du har mange konstante numeriske data og vil ikke allokere dette til RAM.

Opløsning

Gem numeriske variabler i programhukommelsen (flashhukommelsen, der bruges til at gemme Arduino-programmer).

Denne skitse justerer en fading LED for den ikke-lineære følsomhed af menneskesyn. Den lagrer værdierne, der skal bruges i en tabel med 256 værdier i programhukommelsen i stedet for RAM.

Skissen er baseret på Opskrift 7.2; se kapitel 7 for et ledningsdiagram og diskussion om kørelys. At køre denne skitse resulterer i en jævn ændring i lysstyrken med LED på pin 5 i forhold til LED på pin 3:

/ * ProgmemCurve sketch * bruger tabel i Progmem til at konvertere lineær til eksponentiel output * Se Opskrift 7.2 og Figur 7-2 * / #include // behov for PROGMEM // tabel med eksponentielle værdier // genereret for værdier af i fra 0 til 255 -> x = runde (pow (2.0, i / 32.0) - 1); const byte tabel [] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55, 56, 58, 59, 60, 62, 63, 64, 66, 67, 69, 70, 72, 73, 75, 77, 78, 80, 82, 84, 86, 88, 90, 91, 94, 96, 98, 100, 102, 104, 107, 109, 111, 114, 116, 119, 122, 124, 127, 130, 133, 136, 139, 142, 145, 148, 151, 155, 158, 161, 165, 169, 172, 176, 180, 184, 188, 192, 196, 201, 205, 210, 214, 219, 224, 229, 234, 239, 244, 250}; const int rawLedPin = 3; // denne LED er fodret med råværdier const int adjustedLedPin = 5; // denne LED drives fra bordet int lysstyrke = 0; int stigning = 1; void setup () {// stifter drevet af analogWrite behøver ikke at blive angivet som output} void loop () {hvis (lysstyrke> 254) {increment = -1; // tæl ned efter at have nået 255} ellers hvis (lysstyrke <1) {increment = 1; // tælle op efter at have faldet tilbage til 0} lysstyrke = lysstyrke + stigning; // increment (eller decrement sign er minus) // skriv lysstyrkeværdien til LED'erne analogWrite (rawLedPin, lysstyrke); // dette er den røde værdi int adjustedBrightness = pgm_read_byte (& table [brightness]); // justeret værdi analogWrite (justeretLedPin, justeretBrightness); forsinkelse (10); // 10ms for hver trinændring betyder 2,55 sekunder at falme op eller ned}

Diskussion

Når du skal bruge et komplekst udtryk til at beregne en række værdier, der regelmæssigt gentages, er det ofte bedre at forudregulere værdierne og inkludere dem i en tabel af værdier (normalt som et array) i koden. Dette sparer tid for at beregne værdierne gentagne gange, når koden kører. Ulempen vedrører den hukommelse, der er nødvendig for at placere disse værdier i RAM. RAM er begrænset på Arduino, og det meget større programhukommelsesrum kan bruges til at gemme konstante værdier. Dette er især nyttigt for skitser, der har store arrayer af tal.

Øverst på skissen er tabellen defineret med følgende udtryk:

const byte bord [] PROGMEM = {0,. . .

PROGMEM fortæller kompilatoren, at værdierne skal lagres i programhukommelsen i stedet for RAM. Resten af ​​udtrykket svarer til at definere en konventionel matrix (se kapitel 2).

De lavniveaudefinitioner, der er nødvendige for at bruge PROGMEM, er indeholdt i en fil ved navn pgmspace.h, og skissen indeholder dette som følger:

#omfatte

For at justere lysstyrken for at gøre blækket ensartet, tilføjer denne opskrift følgende linjer til LED-udgangskoden, der anvendes i opskrift 7.2:

int adjustedBrightness = pgm_read_byte (& bord [lysstyrke]); analogWrite (justeretLedPin, justeretBrightness);

Den variable justeretBrightness er indstillet fra en værdi, der læses fra programhukommelsen. Udtrykket pgm_read_byte (& table [brightness]); betyder at returnere adressen til posten i tabelmatrixen ved indekspositionen angivet ved lysstyrke. Hver indtastning i tabellen er en byte, så en anden måde at skrive dette udtryk på er:

pgm_read_byte (tabel + lysstyrke);

Hvis det ikke er klart, hvorfor & bord [lysstyrke] svarer til tabel + lysstyrke, så rolig; Brug hvilket udtryk der giver dig større mening.

Et andet eksempel er fra Opskrift 6.5, som brugte et bord til at konvertere en infrarød sensor til afstand. Her er skitsen fra denne opskrift konverteret til at bruge et bord i programhukommelsen i stedet for RAM:

/ * ir-distance_Progmem skitse * udskriver distance og ændringer LED flash hastighed * afhængig af afstand fra IR sensor * bruger progmem til tabel * / #include // brug for ved brug af Progmem // tabel poster er afstande i trin på 250 millivolts const int TABLE_ENTRIES = 12; const int firstElement = 250; // første indgang er 250 mV const int interval = 250; // millivolts mellem hvert element // Følgende er definitionen af ​​tabellen i Programhukommelse const int distanceP [TABLE_ENTRIES] PROGMEM = {150,140,130,100,60,50, 40,35,30,25,20,15}; // Denne funktion læser fra Programhukommelse på det givne indeks int getTableEntry (int indeks) {int value = pgm_read_word (& distanceP [index]); returværdi; }

Den resterende kode svarer til Opskrift 6.5, bortset fra at getTableEntry-funktionen bruges til at hente værdien fra programhukommelsen i stedet for at få adgang til en tabel i RAM. Her er den reviderede getDistance-funktion fra denne opskrift:

int getDistance (int mV) {hvis (mV> interval * TABLE_ENTRIES) returnerer getTableEntry (TABLE_ENTRIES-1); // den mindste afstand ellers {int indeks = mV / interval; float frac = (mV% 250) / (float) interval; return getTableEntry (indeks) - ((getTableEntry (indeks) - getTableEntry (indeks + 1)) * frac); }}


I Maker Shed:

Arduino Cookbook Opret dine egne robotter, legetøj, fjernbetjeninger, alarmer, detektorer og meget mere med Arduino og denne vejledning. Arduino laver kunstnere og designere en række fantastiske genstande og prototyper, der interagerer med den fysiske verden. Med denne kogebog kan du dykke lige ind og eksperimentere, takket være mere end hundrede tips og teknikker, uanset hvad dit færdighedsniveau. Her finder du de eksempler og råd, du skal begynde, udvide og forbedre dine projekter med det samme.



Du Kan Være Interesseret

Swap-O-Rama-Rama på Bay Area Maker Faire 2015

Swap-O-Rama-Rama på Bay Area Maker Faire 2015


10 sjove projekter for en 3-dages weekend

10 sjove projekter for en 3-dages weekend


Drej EEG Data og en Raspberry Pi i Brainwave Games

Drej EEG Data og en Raspberry Pi i Brainwave Games


Fundet objekter Kom til livet i Brooklyn Artist's Fantastic Studio

Fundet objekter Kom til livet i Brooklyn Artist's Fantastic Studio