Spustené svetlá na arduino. Spustené smerovky na páske WS2812 a Arduino

Spustené svetlá na arduino. Spustené smerovky na páske WS2812 a Arduino

22.08.2023

Vyrábame bežiace svetlá z LED diód na Arduine. V tomto prípade je použitý Arduino Mega 2560, ktorý je potenciálne schopný poháňať bežiaci pás s 54 LED diódami. Ale obvod a program sa nezmenia, ak použijete iné ovládače z tohto typu platformy Arduino (UNO, Leonardo...)

Schéma zapojenia LED k Arduino Mega 2560.

Takto vyzerá skica v okne štandardnej programovacej aplikácie Arduino.

Text programu na implementáciu bežiacich svetiel na platforme Arduino.

int first_out = 11; //prvý diskrétny výstup

int last_out = 13; //posledný diskrétny výstup

//blok na inicializáciu vstupov/výstupov a iných počiatočných údajov

last_out = last_out + 1; //pridať jeden pre správne použitie v slučkách

//definujte 11., 12. a 13. diskrétny kolík dosky Arduino ako výstupy

pre (i = first_out; i< last_out; i++) { pinMode(i, OUTPUT); }

pre (t = first_out; t< last_out; t++) { //перебираем номера дискретных выходов 11,12,13 поочереди

digitalWrite(t, HIGH); //rozsvieti sa ďalšia LED

oneskorenie(500); //oneskorenie 500 ms

pre (i = first_out; i< last_out; i++) { digitalWrite(i, LOW); }//гасим все светодиоды

Ak chcete zvýšiť počet ovládaných LED diód v girlande, program bude musieť jednoducho nahradiť hodnoty premenných first_out a last_out. Prvá premenná ukladá počiatočný diskrétny výstup regulátora a druhá premenná ukladá posledný zo skupiny po sebe idúcich výstupov. Napríklad, ak chceme pripojiť 10 LED diód do girlandy, zadáme nasledujúce hodnoty: first_out = 4, last_out = 13. A LED na kolíky v poradí od 4. do 13. A je lepšie nedotýkať sa prvého a druhého kolíka diskrétnych vstupov-výstupov, pretože s nimi ruší port USB pripojený k počítaču.

V tomto návode budeme pokračovať v práci s LED, ale zvýšime počet LED na 5. A urobíme efekt bežiaceho ohňa. Na ovládanie LED diód použijeme manipuláciu s portom Arduino. Dáta budeme zapisovať priamo na porty Arduino. Je to lepšie ako pracovať so špecifickými vstupmi/výstupmi ovládača. To vám umožní nastaviť hodnoty pre LED jednou operáciou.

Arduino UNO má 3 porty:
B (digitálne I/O 8 až 13)
C (analógové vstupy)
D (digitálny vstup/výstup 0 až 7)

Každý port je riadený 3 registrami. Zaregistrujte DDR určuje, čo noha (pin) bude vstupom alebo výstupom. Pomocou registra PORT môžete nastaviť pin do stavu VYSOKÝ alebo NÍZKA. Pomocou registra PIN môžete čítať stav nôh Arduina, keď sú zadané.

Použijeme port B. Najprv musíme nastaviť všetky piny portu B ako digitálne výstupy. Port B má iba 6 pinov. Bity registra pre port DDRB B musia byť nastavené na 1, ak sa má vetva použiť ako VÝSTUP, a na 0, ak sa má vetva použiť ako VSTUP. Bity portov sú očíslované od 0 do 7, ale nie vždy obsahujú všetkých 8 nôh.
Príklad:
DDRB = B00111110; // nastavíme piny 1 až 5 portu B ako výstupy a 0 ako vstup.

Upozorňujeme, že v mikrokontroléroch Microchip je opak pravdou. 0 bit - noha funguje ako výstup a 1 - ako vstup.

V našom projekte bežiaceho požiaru použijeme 5 výstupov:
DDRB = B00011111; // nastavíme piny 0 až 4 portu B ako výstupy

Ak chcete zapisovať hodnoty do portu B, musíte použiť register PORTB.
Prvú LED diódu môžete rozsvietiť príkazom:
PORTB=B00000001;
prvý a štvrtý:
PORTB=B00001001;

Teraz vidíte, ako ľahko môžeme zapnúť a vypnúť LED diódy. Teraz si povedzme o operátoroch zmien

K dispozícii sú 2 binárni operátori posunu: operátor ľavého posunu<< и оператор сдвига вправо >>. Operátor ľavej zmeny<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> posunie bity doprava.

Príklad:
varA = 1; // 00000001
varA = 1<< 0; // 00000001
varA = 1<< 1; // 00000010
varA = 1<< 2; // 00000100

Teraz späť k nášmu programu, ktorý je uvedený nižšie.
Musíme zaviesť 2 premenné: prvý upDown bude obsahovať hodnotu, kam sa má pohybovať - ​​hore alebo dole, a druhý cylon, ktoré LED majú svietiť.

Vo funkcii nastaviť() definujeme, ktoré nohy by mali fungovať ako výstupy.

V hlavnej programovej slučke slučka(), LED sa postupne rozsvietia zvýšením premennej cylon, a keď dosiahne najvyššie, potom premennú hore dole je priradená 0 ​​a LED diódy sa postupne rozsvecujú smerom nadol.

/* Spustený oheň. 5 LED */ unsigned char upDown=1; // začnite sa pohybovať hore unsigned char cylon=0; // určuje poradie LED void setup() ( DDRB = B00011111; // nastaví port B 0 až 4 ako výstupy ) void loop() ( if(upDown==1)( // ak ideme hore, tak cylon++; ak ( cylon>=4) upDown=0; // keď je dosiahnuté najvyššie číslo LED, potom v ďalšej slučke ísť dole ) else ( cylon--; if(cylon==0) upDown=1; // keď je najnižšie Dosiahne sa číslo LED, potom v ďalšom cykle ideme hore) PORTB = 1<< cylon; //сдвиг delay(200); // пауза 200 мс }

V tomto návode budeme pokračovať v práci s LED, ale zvýšime počet LED na 5. A urobíme efekt bežiaceho ohňa. Na ovládanie LED diód použijeme manipuláciu s portom Arduino. Dáta budeme zapisovať priamo na porty Arduino. Je to lepšie ako pracovať so špecifickými vstupmi/výstupmi ovládača. To vám umožní nastaviť hodnoty pre LED jednou operáciou.

Arduino UNO má 3 porty:

  • B (digitálne vstupy/výstupy 8 až 13)
  • C (analógové vstupy)
  • D (digitálny vstup/výstup 0 až 7)

Každý port je riadený 3 registrami. Register DDR určuje, či bude noha (pin) vstup alebo výstup. Register PORT sa dá použiť na nastavenie pinu na HIGH alebo LOW. Pomocou registra PIN môžete čítať stav nôh Arduina, keď sú zadané.

Použijeme port B. Najprv musíme nastaviť všetky piny portu B ako digitálne výstupy. Port B má iba 6 pinov. Bity registra pre port DDRB B musia byť nastavené na 1, ak sa má vetva použiť ako VÝSTUP, a na 0, ak sa má vetva použiť ako VSTUP. Bity portov sú očíslované od 0 do 7, ale nie vždy obsahujú všetkých 8 nôh.

Príklad:

DDRB = B00111110; // nastavíme piny 1 až 5 portu B ako výstupy a 0 ako vstup.

Upozorňujeme, že v mikrokontroléroch Microchip je opak pravdou. 0 bit - noha funguje ako výstup a 1 - ako vstup.

V našom projekte bežiaceho požiaru použijeme 5 výstupov:

DDRB = B00011111; // nastavíme piny 0 až 4 portu B ako výstupy

Ak chcete zapisovať hodnoty do portu B, musíte použiť register PORTB. Prvú LED diódu môžete rozsvietiť príkazom:

PORTB=B00000001;
prvý a štvrtý:
PORTB=B00001001;

Teraz vidíte, ako ľahko môžeme zapnúť a vypnúť LED diódy. Teraz si povedzme o operátoroch zmien

K dispozícii sú 2 binárni operátori posunu: operátor ľavého posunu<< и оператор сдвига вправо >>. Operátor ľavej zmeny<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> posunie bity doprava.

Príklad:

VarA = 1; // 00000001
varA = 1<< 0; // 00000001
varA = 1<< 1; // 00000010
varA = 1<< 2; // 00000100

Teraz späť k nášmu programu, ktorý je uvedený nižšie. Musíme zaviesť 2 premenné: prvú hore dole bude obsahovať hodnotu kam sa má posunúť - hore alebo dole a druhú cylon aké LED diódy rozsvietiť.

Vo funkcii nastaviť() definujeme, ktoré nohy by mali fungovať ako výstupy.

V hlavnej programovej slučke slučka(), LED sa postupne rozsvietia zvýšením premennej cylon, a keď dosiahne najvyššie, potom premennú hore dole je priradená 0 ​​a LED diódy sa postupne rozsvecujú smerom nadol.

Arduino pre začiatočníkov

V tomto návode budeme pokračovať v práci s LED, ale zvýšime počet LED na 5. A urobíme efekt bežiaceho ohňa. Na ovládanie LED diód použijeme manipuláciu s portom Arduino. Dáta budeme zapisovať priamo na porty Arduino. Je to lepšie ako pracovať so špecifickými vstupmi/výstupmi ovládača. To vám umožní nastaviť hodnoty pre LED jednou operáciou.

Arduino UNO má 3 porty:

  • B (digitálne vstupy/výstupy 8 až 13)
  • C (analógové vstupy)
  • D (digitálny vstup/výstup 0 až 7)

Každý port je riadený 3 registrami. Register DDR určuje, či bude noha (pin) vstup alebo výstup. Register PORT sa dá použiť na nastavenie pinu na HIGH alebo LOW. Pomocou registra PIN môžete čítať stav nôh Arduina, keď sú zadané.

Použijeme port B. Najprv musíme nastaviť všetky piny portu B ako digitálne výstupy. Port B má iba 6 pinov. Bity registra pre port DDRB B musia byť nastavené na 1, ak sa má vetva použiť ako VÝSTUP, a na 0, ak sa má vetva použiť ako VSTUP. Bity portov sú očíslované od 0 do 7, ale nie vždy obsahujú všetkých 8 nôh.

Príklad:

DDRB = B00111110; // nastavíme piny 1 až 5 portu B ako výstupy a 0 ako vstup.

Upozorňujeme, že v mikrokontroléroch Microchip je opak pravdou. 0 bit - noha funguje ako výstup a 1 - ako vstup.

V našom projekte bežiaceho požiaru použijeme 5 výstupov:

DDRB = B00011111; // nastavíme piny 0 až 4 portu B ako výstupy

Ak chcete zapisovať hodnoty do portu B, musíte použiť register PORTB. Prvú LED diódu môžete rozsvietiť príkazom:

PORTB=B00000001;
prvý a štvrtý:
PORTB=B00001001;

Teraz vidíte, ako ľahko môžeme zapnúť a vypnúť LED diódy. Teraz si povedzme o operátoroch zmien

K dispozícii sú 2 binárni operátori posunu: operátor ľavého posunu<< и оператор сдвига вправо >>. Operátor ľavej zmeny<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> posunie bity doprava.

Príklad:

varA = 1; // 00000001
varA = 1<< 0; // 00000001
varA = 1<< 1; // 00000010
varA = 1<< 2; // 00000100

Teraz späť k nášmu programu, ktorý je uvedený nižšie. Musíme zaviesť 2 premenné: prvú hore dole bude obsahovať hodnotu kam sa má posunúť - hore alebo dole a druhú cylon aké LED diódy rozsvietiť.

Vo funkcii nastaviť() definujeme, ktoré nohy by mali fungovať ako výstupy.

V hlavnej programovej slučke slučka(), LED sa postupne rozsvietia zvýšením premennej cylon, a keď dosiahne najvyššie, potom premennú hore dole je priradená 0 ​​a LED diódy sa postupne rozsvecujú smerom nadol.

Kód: /* Spustený oheň. 5 LED */ unsigned char upDown=1; // začnite sa pohybovať hore unsigned char cylon=0; // určuje poradie LED void setup() ( DDRB = B00011111; // nastaví port B 0 až 4 ako výstupy ) void loop() ( if(upDown==1)( // ak ideme hore, tak cylon++; ak ( cylon>=4) upDown=0; // keď je dosiahnuté najvyššie číslo LED, potom v ďalšej slučke ísť dole ) else ( cylon--; if(cylon==0) upDown=1; // keď je najnižšie Dosiahne sa číslo LED, potom v ďalšom cykle ideme hore) PORTB = 1<< cylon; //сдвиг delay(200); // пауза 200 мс

V tomto experimente robíme svetlo bežiace pozdĺž LED stupnice.

ZOZNAM ČASTÍ PRE EXPERIMENT

- 1 doska Arduino Uno;

- 1 nepájkovaná doska na krájanie;

- 1 LED stupnica;

- 10 rezistorov s nominálnou hodnotou 220 Ohm;

- 11 vodičov samec-samec.

ZÁKLADNÁ SCHÉMA

DIAGRAM NA PRACOVISKU

SKICA

stiahnite si skicu pre Arduino IDE
// LED stupnica je pripojená k skupine kolíkov umiestnených // v rade. Priraďovanie priateľských názvov prvému a poslednému kolíku #define FIRST_LED_PIN 2 #define LAST_LED_PIN 11 void setup() ( // na stupnici je 10 LED. Mohli by sme napísať pinMode 10 // krát: pre každý z kolíkov, ale toto by nafúkli kód a // sťažili jeho zmenu. // Preto je lepšie použiť slučku. // pinMode pre (angl. for) vykonávame každý pin (premenná pinu) // od prvého (= FIRST_LED_PIN) po posledný vrátane // ​​(<= LAST_LED_PIN), всякий раз продвигаясь к следующему // (++pin увеличивает значение pin на единицу) // Так все пины от 2-го по 11-й друг за другом станут выходами for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin) pinMode(pin, OUTPUT); } void loop() { // получаем время в миллисекундах, прошедшее с момента // включения микроконтроллера unsigned int ms = millis(); // нехитрой арифметикой вычисляем, какой светодиод // должен гореть именно сейчас. Смена будет происходить // каждые 120 миллисекунд. Y % X — это остаток от // деления Y на X; плюс, минус, скобки — как в алгебре. int pin = FIRST_LED_PIN + (ms / 120) % 10; // включаем нужный светодиод на 10 миллисекунд, затем — // выключаем. На следующем проходе цикла он снова включится, // если гореть его черёд, и мы вообще не заметим отключения digitalWrite(pin, HIGH); delay(10); digitalWrite(pin, LOW); }

VYSVETLENIA KÓDOV

  • Použitie výrazu pre organizujeme slučka s počítadlom . V tomto prípade konfigurujte porty pre výstup. Na vytvorenie takéhoto cyklu potrebujete:
    • Inicializujte premennú počítadla jej počiatočnou hodnotou. V našom prípade: int pin = FIRST_LED_ PIN ;
    • Zadajte podmienku, do ktorej sa bude cyklus opakovať. V našom prípade: špendlík<= LAST_LED_ PIN ;
    • Určte pravidlo, podľa ktorého sa počítadlo zmení. V našom prípade ++pin(pre operátora pozri nižšie ++ ).
  • Môžete napríklad urobiť slučku pre (int i = 10; i > 0; i = i - 1). V tomto prípade:
    • Premennej i je priradená hodnota 10 ;
    • Táto hodnota spĺňa podmienku i > 0 ;
    • Preto sa blok kódu umiestnený v slučke vykoná prvýkrát;
    • Význam i zníži o jednu podľa daného pravidla a nadobudne hodnotu 9 ;
    • Blok kódu sa vykoná druhýkrát;
    • Všetko sa opakuje stále dookola až do zmyslu i rovný 0 ;
    • Kedy i sa stáva rovným 0 , stav i > 0 nevykoná sa a vykonávanie cyklu sa skončí;
    • Ovládač skočí na kód po slučke pre ;
  • Vložte kód, ktorý chcete zacykliť, medzi pár zložených zátvoriek {} ak obsahuje viac ako jeden pokyn;
  • Premenná počítadla deklarovaná vo výpise pre, možno použiť vo vnútri slučky. Napríklad v tomto experimente špendlík postupne nadobúda hodnoty od 2 do 11 a prenáša sa do pinMode, umožňuje nakonfigurovať 10 portov s jednou linkou umiestnenou v slučke;
  • Premenné počítadla sú viditeľné iba vo vnútri slučky. Tie. ak sa obrátite na špendlík pred alebo po slučke kompilátor vyhodí chybu o nedeklarovanej premennej;
  • Dizajn i = i - 1 vo vyššie uvedenom vysvetlení nie je rovnica! Na vloženie do premennej používame operátor priradenia = i dať hodnotu rovnajúcu sa aktuálnej hodnote i, znížená o 1 ;
  • Výraz ++pin- ide o tzv. operátor prírastok , aplikovaný na premennú špendlík. Táto inštrukcia poskytne rovnaký výsledok ako pin = pin + 1 ;
  • Operátor funguje podobne ako pri prírastku dekrementovať - - Zníženie hodnoty o jednu. Viac o tom v článku o aritmetických operáciách;
  • Dátový typ unsigned int slúži na ukladanie celých čísel bez znamienka, t.j. iba nezáporné . Vďaka extra bitu, ktorý sa teraz nepoužíva na uloženie znamienka, môžeme uložiť hodnoty až 65 535 ;
  • Funkcia milis vráti počet milisekúnd, ktoré uplynuli od zapnutia alebo resetovania mikrokontroléra. Tu ho používame na časovanie času medzi prepínačmi LED;
  • Použitie výrazu (ms / 120) % 10 určíme, ktorá z 10 LED má teraz svietiť. Aby sme to parafrázovali, určíme, ktorý 120 ms segment je teraz a aký je jeho počet v rámci aktuálnej desiatky. Poradové číslo segmentu pridáme k číslu portu, ktorý sa v aktuálnej množine objaví ako prvý;
  • Skutočnosť, že LED diódu vypneme digitalWrite (pin, LOW) len 10 ms po zapnutí nie je okom badateľná, pretože velmi skoro sa prepocita, ktora z LED rozsvietit, a rozsvieti sa - len zhasne alebo dalsia.

OTÁZKY, KTORÉ SI PRESVEDČITE

  1. Prečo v tomto experimente zapájame LED stupnicu bez použitia tranzistora?
  2. Ak by sme rozsvietili iba LED na portoch 5, 6, 7, 8, 9, čo by bolo potrebné v programe zmeniť?
  3. Akú inú inštrukciu možno použiť na vykonanie akcie ekvivalentnej ++pin ?
  4. Aký je rozdiel medzi typovými premennými int A unsigned int ?
  5. Čo funkcia vracia milis() ?
  6. Ako vypočítame číslo portu, na ktorom chceme v tomto experimente zapnúť LED diódu?

ÚLOHY NA SAMOSTATNÉ RIEŠENIE

  1. Zmeňte kód tak, aby sa LED diódy prepínali raz za sekundu.
  2. Bez vypnutia portov sa uistite, že svetlo beží len pozdĺž stredných štyroch dielikov stupnice.
  3. Upravte program tak, aby namiesto int pin = FIRST_LED_ PIN + (ms / 120) % 10 pohyb plameňa bol riadený cyklom pre .
  4. Bez výmeny vodičov zmeňte program tak, aby svetlo svietilo v opačnom smere.



© 2023 globusks.ru - Oprava a údržba automobilov pre začiatočníkov