Běžící světla na arduinu. Běžící blinkry na WS2812 a pásce Arduino

Běžící světla na arduinu. Běžící blinkry na WS2812 a pásce Arduino

22.08.2023

Výroba běžících světel z LED pomocí Arduina. V tomto případě je použito Arduino Mega 2560, které je potenciálně schopné ovládat běžecký pás s 54 LED diodami. Ale obvod a program se nezmění, pokud použijete jiné ovladače z platformy Arduino tohoto typu (UNO, Leonardo...)

Schéma připojení LED k Arduino Mega 2560.

Takto vypadá skica v okně standardní programovací aplikace Arduino.

Text programu pro implementaci běžících světel na platformě Arduino.

int first_out = 11; //první diskrétní výstup

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

//blok pro inicializaci vstupů-výstupů a dalších počátečních dat

last_out = last_out + 1; //přidat jednotku pro správné použití ve smyčkách

//definování 11., 12. a 13. diskrétního pinu desky Arduino jako výstupů

pro (i = první_ven; i< last_out; i++) { pinMode(i, OUTPUT); }

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

digitalWrite(t, HIGH); //rozsvícení další LED

zpoždění(500); //zpoždění 500 ms

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

Chcete-li zvýšit počet ovladatelných LED diod v girlandě, v programu budete muset jednoduše nahradit hodnoty first_out a last_out. První proměnná ukládá počáteční diskrétní výstup regulátoru a druhá je poslední ze skupiny výstupů, které přicházejí v řadě. Chceme-li například připojit 10 LED diod do girlandy, zadáme následující hodnoty: first_out = 4, last_out = 13. A LED na piny v pořadí od 4. do 13. Je lepší se nedotýkat prvního a druhého kolíku diskrétních vstupů a výstupů, protože jsou rušeny portem USB připojeným k počítači.

V tomto tutoriálu budeme pokračovat v práci s LED, ale zvýšíme počet LED na 5. A vytvoříme efekt běžícího ohně. Pro ovládání LED použijeme manipulace s porty Arduino. Budeme přímo zapisovat data na porty Arduino. To je lepší než pracovat se specifickými vstupy/výstupy ovladače. To vám umožní nastavit hodnoty pro LED pouze jednou operací.

Arduino UNO má 3 porty:
B (digitální vstupy/výstupy 8 až 13)
C (analogové vstupy)
D (digitální vstupy/výstupy 0 až 7)

Každý port je řízen 3 registry. registr DDR určuje, zda noha (pin) bude vstup nebo výstup. Pomocí registru PORT můžete nastavit pin do stavu VYSOKÝ nebo NÍZKÝ. Pomocí registru PIN můžete číst stav pinů Arduina, když fungují jako vstup.

Použijeme port B. Nejprve musíme nastavit všechny piny portu B jako digitální výstupy. Port B má pouze 6 nohou. Bity registru pro DDRB B-port musí být nastaveny na 1, pokud bude větev používána jako OUTPUT, a na 0, pokud větev bude použita jako INPUT. Bity portu jsou číslovány od 0 do 7, ale ne vždy obsahují všech 8 bitů.
Příklad:
DDRB = B00111110; // nastaví piny 1 až 5 portu B jako výstup a 0 jako vstup.

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

V našem běžícím požárním projektu použijeme 5 výstupů:
DDRB = B00011111; // nastaví nohy portu B od 0 do 4 jako výstupy

Pro zápis hodnot do portu B musíte použít registr PORTB.
První LED můžete rozsvítit příkazem:
PORTB = B00000001;
první a čtvrtý:
PORTB = B00001001;

Nyní můžete vidět, jak snadno můžeme LED zapínat a vypínat. Nyní vám povíme něco o směnových operátorech

Existují 2 binární směnoví operátoři: levý směnový operátor<< и оператор сдвига вправо >>. Operátor levé směny<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> posouvá bity doprava.

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

Nyní se vraťme k našemu programu, který je zobrazen níže.
Musíme zadat 2 proměnné: první upDown bude obsahovat hodnotu, kam se má pohybovat - nahoru nebo dolů, a druhý válec bude obsahovat, které LED diody se mají rozsvítit.

Ve funkci založit() určujeme, které nohy by měly fungovat jako výstupy.

V hlavní smyčce programu smyčka(), LED se postupně rozsvěcují zvýšením proměnné cylon, a když už úplně nahoře, tak proměnná nahoruDolů je přiřazena 0 a LED se postupně rozsvěcují.

/* Běžící oheň. 5 LED */ unsigned char upDown=1; // začátek s pohybem nahoru unsigned char cylon=0; // určuje pořadí LED void setup() ( DDRB = B00011111; // nastaví port B z 0 na 4 jako výstupy ) void loop() ( if(upDown==1)( // pokud půjdeme nahoru, tak cylon++; if( cylon>=4) upDown=0; // když je dosaženo nejvyššího čísla LED, pak v dalším cyklu půjdeme dolů ) else ( cylon--; if(cylon==0) upDown=1; // když je dosaženo nejnižšího čísla LED, pak v dalším cyklu stoupáme) PORTB = 1<< cylon; //сдвиг delay(200); // пауза 200 мс }

V tomto tutoriálu budeme pokračovat v práci s LED, ale zvýšíme počet LED na 5. A vytvoříme efekt běžícího ohně. Pro ovládání LED použijeme manipulace s porty Arduino. Budeme přímo zapisovat data na porty Arduino. To je lepší než pracovat se specifickými vstupy/výstupy ovladače. To vám umožní nastavit hodnoty pro LED pouze jednou operací.

Arduino UNO má 3 porty:

  • B (digitální vstupy/výstupy 8 až 13)
  • C (analogové vstupy)
  • D (digitální vstupy/výstupy 0 až 7)

Každý port je řízen 3 registry. Registr DDR určuje, zda bude pin vstupem nebo výstupem. Pomocí registru PORT můžete nastavit pin na HIGH nebo LOW. Pomocí registru PIN můžete číst stav pinů Arduina, když fungují jako vstup.

Použijeme port B. Nejprve musíme nastavit všechny piny portu B jako digitální výstupy. Port B má pouze 6 nohou. Bity registru pro DDRB B-port musí být nastaveny na 1, pokud bude větev používána jako OUTPUT, a na 0, pokud větev bude použita jako INPUT. Bity portu jsou číslovány od 0 do 7, ale ne vždy obsahují všech 8 bitů.

Příklad:

DDRB = B00111110; // nastaví piny 1 až 5 portu B jako výstup a 0 jako vstup.

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

V našem běžícím požárním projektu použijeme 5 výstupů:

DDRB = B00011111; // nastaví nohy portu B od 0 do 4 jako výstupy

Pro zápis hodnot do portu B musíte použít registr PORTB. První LED můžete rozsvítit příkazem:

PORTB = B00000001;
první a čtvrtý:
PORTB = B00001001;

Nyní můžete vidět, jak snadno můžeme LED zapínat a vypínat. Nyní vám povíme něco o směnových operátorech

Existují 2 binární směnoví operátoři: levý směnový operátor<< и оператор сдвига вправо >>. Operátor levé směny<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> posouvá bity doprava.

Příklad:

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

Nyní se vraťme k našemu programu, který je zobrazen níže. Musíme zadat 2 proměnné: první nahoruDolů bude obsahovat hodnotu kam se posunout - nahoru nebo dolů a druhou cylon které LED mají svítit.

Ve funkci založit() určujeme, které nohy by měly fungovat jako výstupy.

V hlavní smyčce programu smyčka(), LED se postupně rozsvěcují zvýšením proměnné cylon, a když už úplně nahoře, tak proměnná nahoruDolů je přiřazena 0 a LED se postupně rozsvěcují.

Arduino pro začátečníky

V této lekci budeme pokračovat v práci s LED, ale zvýšíme počet LED na 5. A uděláme efekt běžícího ohně. Pro ovládání LED použijeme manipulace s porty Arduino. Budeme přímo zapisovat data na porty Arduino. To je lepší než pracovat se specifickými vstupy/výstupy ovladače. To vám umožní nastavit hodnoty pro LED pouze jednou operací.

Arduino UNO má 3 porty:

  • B (digitální vstupy/výstupy 8 až 13)
  • C (analogové vstupy)
  • D (digitální vstupy/výstupy 0 až 7)

Každý port je řízen 3 registry. Registr DDR určuje, zda bude pin vstupem nebo výstupem. Pomocí registru PORT můžete nastavit pin na HIGH nebo LOW. Pomocí registru PIN můžete číst stav pinů Arduina, když fungují jako vstup.

Použijeme port B. Nejprve musíme nastavit všechny piny portu B jako digitální výstupy. Port B má pouze 6 nohou. Bity registru pro DDRB B-port musí být nastaveny na 1, pokud bude větev používána jako OUTPUT, a na 0, pokud větev bude použita jako INPUT. Bity portu jsou číslovány od 0 do 7, ale ne vždy obsahují všech 8 bitů.

Příklad:

DDRB = B00111110; // nastaví piny 1 až 5 portu B jako výstup a 0 jako vstup.

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

V našem běžícím požárním projektu použijeme 5 výstupů:

DDRB = B00011111; // nastaví nohy portu B od 0 do 4 jako výstupy

Pro zápis hodnot do portu B musíte použít registr PORTB. První LED můžete rozsvítit příkazem:

PORTB = B00000001;
první a čtvrtý:
PORTB = B00001001;

Nyní můžete vidět, jak snadno můžeme LED zapínat a vypínat. Nyní vám povíme něco o směnových operátorech

Existují 2 binární směnoví operátoři: levý směnový operátor<< и оператор сдвига вправо >>. Operátor levé směny<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> posouvá bity doprava.

Příklad:

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

Nyní se vraťme k našemu programu, který je zobrazen níže. Musíme zadat 2 proměnné: první nahoruDolů bude obsahovat hodnotu kam se posunout - nahoru nebo dolů a druhou cylon které LED mají svítit.

Ve funkci založit() určujeme, které nohy by měly fungovat jako výstupy.

V hlavní smyčce programu smyčka(), LED se postupně rozsvěcují zvýšením proměnné cylon, a když už úplně nahoře, tak proměnná nahoruDolů je přiřazena 0 a LED se postupně rozsvěcují.

Kód: /* Spuštěná palba. 5 LED */ unsigned char upDown=1; // začátek s pohybem nahoru unsigned char cylon=0; // určuje pořadí LED void setup() ( DDRB = B00011111; // nastaví port B z 0 na 4 jako výstupy ) void loop() ( if(upDown==1)( // pokud půjdeme nahoru, tak cylon++; if( cylon>=4) upDown=0; // když je dosaženo nejvyššího čísla LED, pak v dalším cyklu půjdeme dolů ) else ( cylon--; if(cylon==0) upDown=1; // když je dosaženo nejnižšího čísla LED, pak v dalším cyklu stoupáme) PORTB = 1<< cylon; //сдвиг delay(200); // пауза 200 мс

V tomto experimentu vytvoříme světlo běžící podél LED stupnice.

SEZNAM DÍLŮ K EXPERIMENTU

- 1 deska Arduino Uno;

- 1 nepájené prkénko na krájení;

- 1 LED stupnice;

- 10 rezistorů s nominální hodnotou 220 Ohmů;

- 11 vodičů samec-samec.

KRUHOVÝ DIAGRAM

DIAGRAM NA PLÁŠTĚ

SKICA

Stáhněte si skicu pro Arduino IDE
// LED stupnice je připojena ke skupině pinů umístěných // v řadě. Prvnímu a poslednímu kolíku dáme jasné názvy #define FIRST_LED_PIN 2 #define LAST_LED_PIN 11 void setup() ( // na stupnici je 10 LED. Můžeme napsat pinMode 10 //krát: pro každý z pinů, ale toto nafouklo by kód a // jeho změna byla problematičtější. // Takže je lepší použít smyčku. Pro každý pin (proměnná pinu) // od prvního (= FIRST_LED_PIN) po poslední včetně // provedeme // pinMode (<= 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); }

VYSVĚTLENÍ KÓDU

  • Použití výrazu pro budeme organizovat smyčka s počítadlem . V tomto případě pro konfiguraci výstupních portů. K vytvoření takové smyčky potřebujete:
    • Inicializujte proměnnou čítače přiřazením počáteční hodnoty. V našem případě: int pin = FIRST_LED_ KOLÍK ;
    • Určete podmínku, do které se bude smyčka opakovat. V našem případě: kolík<= LAST_LED_ KOLÍK ;
    • Určete pravidlo, podle kterého se bude počítadlo měnit. V našem případě ++pin(o operátorovi viz níže ++ ).
  • Můžete například vytvořit smyčku for (int i = 10; i > 0; i = i - 1). V tomto případě:
    • Proměnné i je přiřazena hodnota 10 ;
    • Tato hodnota splňuje podmínku i > 0 ;
    • Proto je blok kódu umístěný ve smyčce proveden poprvé;
    • Význam i se podle daného pravidla sníží o jednu a převezme hodnotu 9 ;
    • Blok kódu se provede podruhé;
    • Vše se opakuje znovu a znovu až do smyslu i rovnat se 0 ;
    • Když i se stane rovným 0 , stav i > 0 selže a smyčka skončí;
    • Ovladač skočí na kód po smyčce pro ;
  • Umístěte kód, který chcete vytvořit smyčkou, mezi pár složených závorek {} , pokud obsahuje více než jeden pokyn;
  • Proměnná čítače deklarovaná v příkazu pro, lze použít uvnitř smyčky. Například v tomto experimentu kolík postupně nabývá hodnot od 2 do 11 a při předání do pinMode, umožňuje nakonfigurovat 10 portů s jednou linkou umístěnou ve smyčce;
  • Proměnné čítače jsou viditelné pouze uvnitř smyčky. Tito. pokud se obrátíte na kolík před nebo po cyklu, kompilátor vygeneruje chybu o nedeklarované proměnné;
  • Design i = i - 1 ve výše uvedeném vysvětlení není rovnice! K přiřazení k proměnné používáme operátor přiřazení = i dát hodnotu rovnou aktuální hodnotě i, sníženo o 1 ;
  • Výraz ++pin- jedná se o tzv operátor přírůstek , aplikovaný na proměnnou kolík. Tato instrukce poskytne stejný výsledek jako pin = pin + 1 ;
  • Operátor funguje podobně jako inkrementace dekrementovat - - , což snižuje hodnotu o jednu. Přečtěte si o tom více v článku o aritmetických operacích;
  • Datový typ nepodepsaný int slouží k ukládání celých čísel bez znaménka, tzn. pouze nezáporné . Díky extra bitu, který se již nepoužívá k ukládání znaménka, můžeme uložit hodnoty až 65 535 ;
  • Funkce milis vrací počet milisekund, které uplynuly od zapnutí nebo restartu mikrokontroléru. Zde jej používáme k počítání času mezi spínači LED;
  • Použití výrazu (ms / 120) % 10 určíme, která z 10 LED má nyní svítit. Abychom to parafrázovali, určíme, který 120 ms segment právě běží a jaký je jeho počet v rámci aktuální desítky. Pořadové číslo segmentu přidáme k číslu portu, který se v aktuální sadě objeví jako první;
  • Co děláme, je zhasnutí LED digitalWrite (pin, LOW) pouhých 10 ms po zapnutí to není okem patrné, protože velmi brzy se znovu spočítá, kterou LED má rozsvítit, a rozsvítí se - právě zhasnutá nebo další.

OTÁZKY K VYZKOUŠENÍ

  1. Proč v tomto experimentu zapojujeme LED stupnici bez použití tranzistoru?
  2. Pokud bychom rozsvítili pouze LEDky na portech 5, 6, 7, 8, 9, co by bylo potřeba v programu změnit?
  3. Jakou jinou instrukci lze použít k provedení akce ekvivalentní ++pin ?
  4. Jaký je rozdíl mezi typovými proměnnými int A nepodepsaný int ?
  5. Co funkce vrací? milis() ?
  6. Jak v tomto experimentu vypočítáme číslo portu, na kterém se má rozsvítit LED?

ÚKOLY PRO SAMOSTATNÉ ŘEŠENÍ

  1. Změňte kód tak, aby se kontrolky LED přepínaly jednou za sekundu.
  2. Bez vypínání portů se ujistěte, že světlo běží pouze podél prostředních čtyř dílků stupnice.
  3. Přepracujte program tak, aby místo toho int pin = FIRST_LED_ KOLÍK + (ms / 120) % 10 pohyb světla byl řízen cyklem pro .
  4. Bez prohození vodičů změňte program tak, aby světlo svítilo v opačném směru.



© 2023 globusks.ru - Opravy a údržba automobilů pro začátečníky