Futólámpák arduino kapcsolási rajza. Működő irányjelzők WS2812 szalagon és Arduino-n

Ebben az oktatóanyagban továbbra is LED-ekkel fogunk dolgozni, de a LED-ek számát 5-re növeljük. És a futótűz hatását keltjük. A LED-ek vezérléséhez Arduino port manipulációt fogunk használni. Az adatokat közvetlenül az Arduino portokra írjuk. Ez jobb, mintha meghatározott vezérlő bemenetekkel/kimenetekkel dolgozna. Ez lehetővé teszi a LED-ek értékeinek egyetlen művelettel történő beállítását.

Az Arduino UNO 3 porttal rendelkezik:
B (digitális I/Ok 8–13)
C (analóg bemenetek)
D (digitális I/O 0–7)

Minden portot 3 regiszter vezérel. Regisztrálja a DDR-t meghatározza, hogy a láb (csap) mi legyen bemenet vagy kimenet. Segítséggel regisztrálja a PORT-ot a tűt HIGH vagy LOW értékre állíthatja. Segítséggel PIN kód regisztrálása leolvashatja az Arduino lábak állapotát, amikor beviszik őket.

A B portot fogjuk használni. Először is be kell állítanunk a B port összes érintkezőjét digitális kimenetként. A B portnak csak 6 érintkezője van. A DDRB B port regiszterbitjeit 1-re kell állítani, ha a lábat OUTPUT-ként kívánja használni, és 0-ra, ha a ágat INPUT-ként kívánja használni. A portbitek 0-tól 7-ig vannak számozva, de nem mindig tartalmazzák mind a 8 lábat. Példa:
DDRB = B00111110; // a B port 1-től 5-ig tartó lábait állítsa be kimenetként és 0-t bemenetként.

Kérjük, vegye figyelembe, hogy a Microchip mikrokontrollereknél ennek az ellenkezője igaz. 0 bit - a láb kimenetként működik, és 1 - bemenetként.

Futótűz projektünkben 5 aljzatot fogunk használni:
DDRB = B00011111; // a B port 0-tól 4-ig tartó lábait állítsa be kimenetként

Ahhoz, hogy értékeket írhasson a B portra, a PORTB regisztert kell használnia. Az első LED-et a következő paranccsal világíthatja meg:
PORTB=B00000001;
első és negyedik:
PORTB=B00001001;

Most láthatja, milyen egyszerűen tudjuk be- és kikapcsolni a LED-eket. Most beszéljünk a műszakoperátorokról

2 bináris shift operátor létezik: a balra eltolás operátor >. A bal oldali eltolás operátor > jobbra tolja a biteket.

Példa:
varA = 1; // 00000001
varA = 1 varA = 1 varA = 1

Most térjünk vissza programunkhoz, amely alább látható. 2 változót kell bevezetnünk: az elsőt fel le tartalmazni fogja a mozgás helyének értékét – felfelé vagy lefelé, és a másodikat cylon milyen LED-eket kell világítani.

Funkcióban beállít() meghatározzuk, hogy mely lábak működjenek kimenetként.

A main loop() programban a LED-ek egyenként világítanak a cylon változó növelésével, és amikor eléri a legfelsőt, az upDown változó 0-ra áll, és a LED-ek felváltva világítanak.

/* Futótűz. 5 LED */ előjel nélküli char upDown=1; // felfelé lépés megkezdése unsigned char cylon=0; // meghatározza a LED sorrendjét void setup() ( DDRB = B00011111; // a B portot 0-ról 4-re állítja kimenetként ) void loop() ( if(upDown==1)( // ha felfelé megyünk, akkor cylon++; if ( cylon>=4) upDown=0; // ha elérjük a legmagasabb LED-számot, akkor a következő körben megy le ) else ( cylon--; if(cylon==0) upDown=1; // amikor a legalacsonyabb A LED számát elérjük, majd a következő ciklusban felfelé megyünk) PORTB = 1

Ebben a kísérletben egy LED-skálán futó fényt készítünk.

A KÍSÉRLET ALKATRÉSZEK LISTÁJA

- 1 Arduino Uno tábla;

- 1 forrasztás nélküli kenyértábla;

- 1 LED mérleg;

- 10 ellenállás 220 Ohm névleges értékkel;

- 11 apa-apa vezeték.

ALAPVETŐ DIAGRAM

DIAGRAM A kenyértáblán

VÁZLAT

vázlat letöltése az Arduino IDE-hez
// a LED skála egy sorban // elhelyezkedő tűcsoporthoz van csatlakoztatva. Barátságos elnevezések megadása az első és az utolsó lábnak #define FIRST_LED_PIN 2 #define LAST_LED_PIN 11 void setup() ( // 10 LED van a skálán. PinMode 10 //-szer írhatnánk: mindegyik lábra, de ez felfújta a kódot és // problémásabbá tette a megváltoztatását. // Ezért jobb ciklust használni. A // pinMode for (eng. for) minden pin (pin változó) // az elsőtől (= FIRST_LED_PIN) az utolsóig // ​​(<= 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); }

KÓDMAGYARÁZATOK

  • A kifejezés használatával számára szervezünk hurok számlálóval . Ebben az esetben a kimeneti portok konfigurálásához. Egy ilyen ciklus elkészítéséhez szüksége van:
    • Inicializálja a számlálóváltozót a kezdeti értékével. A mi esetünkben: int pin = FIRST_LED_ PIN kódot ;
    • Adja meg a feltételt, ameddig a ciklus ismétlődik. A mi esetünkben: pin<= LAST_LED_ PIN kódot ;
    • Határozza meg azt a szabályt, amely szerint a számláló megváltozik. A mi esetünkben ++tű(lásd alább a kezelőt ++ ).
  • Például hurkot készíthet for (int i = 10; i > 0; i = i - 1). Ebben az esetben:
    • Az i változó értéket kap 10 ;
    • Ez az érték kielégíti a feltételt i > 0 ;
    • Ezért a ciklusba helyezett kódblokk kerül végrehajtásra első alkalommal;
    • Jelentése én az adott szabály szerint eggyel csökken, és felveszi az értéket 9 ;
    • A kódblokk másodszor is végrehajtódik;
    • Minden újra és újra megismétlődik a jelentésig én egyenlő 0 ;
    • Mikor én egyenlővé válik 0 , állapot i > 0 nem kerül végrehajtásra, és a ciklus végrehajtása véget ér;
    • A vezérlő a ciklust követő kódra ugrik számára ;
  • Tedd a kódot, amelyet hurkolni szeretnél, egy pár göndör kapcsos zárójel közé {} ha egynél több utasítást tartalmaz;
  • Az utasításban deklarált számlálóváltozó számára, hurkon belül használható. Például ebben a kísérletben pin szekvenciálisan 2 és 11 közötti értékeket vesz fel, és átkerül a következőre pinMode, lehetővé teszi 10 port konfigurálását egy hurokban elhelyezett sorral;
  • A számlálóváltozók csak a cikluson belül láthatók. Azok. ha felé fordulsz pin a ciklus előtt vagy után a fordító hibát dob ​​egy nem deklarált változóról;
  • Tervezés i = i - 1 a fenti magyarázatban nem egyenlet! A = hozzárendelési operátort használjuk a változókba való beillesztéshez én az aktuális értékkel egyenlő értéket adjon meg én, csökkentve 1 ;
  • Kifejezés ++tű- ez az ún. operátor növekedés , változóra alkalmazva pin. Ez az utasítás ugyanazt az eredményt adja, mint pin = pin + 1;
  • Az operátor a növekményhez hasonlóan működik csökkenése - - Az érték eggyel csökkentése. Erről bővebben az aritmetikai műveletekről szóló cikkben;
  • Adattípus aláíratlan int előjel nélküli egész számok tárolására szolgál, pl. csak nem negatív . Az előjel tárolására ma már nem használt extra bitnek köszönhetően maximum értékeket tudunk tárolni 65 535 ;
  • Funkció millis a mikrokontroller bekapcsolása vagy alaphelyzetbe állítása óta eltelt ezredmásodpercek számát adja vissza. Itt a LED-váltások közötti idő időzítésére használjuk;
  • A kifejezés használatával (ms/120) % 10 meghatározzuk, hogy a 10 LED közül melyik világítson most. Átfogalmazva, meghatározzuk, hogy melyik 120 ms-os szegmens van most, és mi a száma az aktuális tízen belül. A szegmens sorszámát hozzáadjuk az aktuális halmazban elsőként megjelenő port számához;
  • Az, hogy ezzel kikapcsoljuk a LED-et digitalWrite(tű, LOW) csak 10 ms bekapcsolás után, szemnek nem észrevehető, mert hamarosan újra kiszámolják, hogy melyik LED-et kell bekapcsolni, és be fog kapcsolni - éppen kialszik vagy a következő.

KÉRDÉSEK MAGAD ELLENŐRZÉSÉRE

  1. Miért kapcsoljuk be ebben a kísérletben a LED skálát tranzisztor nélkül?
  2. Ha csak az 5-ös, 6-os, 7-es, 8-as, 9-es portokon kapcsolnánk be a LED-eket, mit kellene módosítani a programban?
  3. Milyen más utasítással lehet egyenértékű műveletet végrehajtani ++tű ?
  4. Mi a különbség a típusváltozók között intés aláíratlan int ?
  5. Mit ad vissza a függvény millis() ?
  6. Hogyan számítjuk ki a port számát, amelyen a LED-et fel akarjuk kapcsolni ebben a kísérletben?

FELADATOK AZ ÖNÁLLÓ MEGOLDÁSHOZ

  1. Módosítsa a kódot úgy, hogy a LED-ek másodpercenként egyszer kapcsoljanak.
  2. A portok kikapcsolása nélkül győződjön meg arról, hogy a lámpa csak a skála középső négy felosztása mentén fut.
  3. Módosítsa a programot úgy, hogy ahelyett int pin = FIRST_LED_ PIN kódot + (ms/120) % 10 a láng mozgását a ciklus szabályozta számára .
  4. A vezetékek felcserélése nélkül változtassa meg a programot úgy, hogy a lámpa az ellenkező irányba működjön.

Ebben az oktatóanyagban továbbra is LED-ekkel fogunk dolgozni, de a LED-ek számát 5-re növeljük. És a futótűz hatását keltjük. A LED-ek vezérléséhez Arduino port manipulációt fogunk használni. Az adatokat közvetlenül az Arduino portokra írjuk. Ez jobb, mintha meghatározott vezérlő bemenetekkel/kimenetekkel dolgozna. Ez lehetővé teszi a LED-ek értékeinek egyetlen művelettel történő beállítását.

Az Arduino UNO 3 porttal rendelkezik:

  • B (digitális I/Ok 8–13)
  • C (analóg bemenetek)
  • D (digitális I/O 0–7)

Minden portot 3 regiszter vezérel. A DDR regiszter határozza meg, hogy a láb (pin) bemenet vagy kimenet lesz-e. A PORT regiszter segítségével a lábat HIGH vagy LOW értékre lehet állítani. A PIN-regiszter segítségével leolvashatja az Arduino lábak állapotát a bevitelkor.

A B portot fogjuk használni. Először is be kell állítanunk a B port összes érintkezőjét digitális kimenetként. A B portnak csak 6 érintkezője van. A DDRB B port regiszterbitjeit 1-re kell állítani, ha a lábat OUTPUT-ként kívánja használni, és 0-ra, ha a ágat INPUT-ként kívánja használni. A portbitek 0-tól 7-ig vannak számozva, de nem mindig tartalmazzák mind a 8 lábat.

Példa:

DDRB = B00111110; // a B port 1-től 5-ig tartó lábait állítsa be kimenetként és 0-t bemenetként.

Kérjük, vegye figyelembe, hogy a Microchip mikrokontrollereknél ennek az ellenkezője igaz. 0 bit - a láb kimenetként működik, és 1 - bemenetként.

Futótűz projektünkben 5 aljzatot fogunk használni:

DDRB = B00011111; // a B port 0-tól 4-ig tartó lábait állítsa be kimenetként

Ahhoz, hogy értékeket írhasson a B portra, a PORTB regisztert kell használnia. Az első LED-et a következő paranccsal világíthatja meg:

PORTB=B00000001;
első és negyedik:
PORTB=B00001001;

Most láthatja, milyen egyszerűen tudjuk be- és kikapcsolni a LED-eket. Most beszéljünk a műszakoperátorokról

2 bináris shift operátor létezik: balra eltolás operátor<< и оператор сдвига вправо >>. Bal váltókezelő<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> biteket jobbra tolja.

Példa:

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

Most térjünk vissza programunkhoz, amely alább látható. 2 változót kell bevezetnünk: az elsőt fel le tartalmazni fogja a mozgás helyének értékét – felfelé vagy lefelé, és a másodikat cylon milyen LED-eket kell világítani.

Funkcióban beállít() meghatározzuk, hogy mely lábak működjenek kimenetként.

A fő programhurokban hurok(), a LED-ek felváltva világítanak a változó növelésével cylon, és amikor eléri a legfelsőt, akkor a változó fel le 0-t kap, és a LED-ek felváltva világítanak lefelé.

kördiagramm

Séma a kenyérsütőtáblán

jegyzet

    Vegye figyelembe, hogy ebben a kísérletben ellenállásokat helyeznek el a katódok és a föld között, ellentétben a pulzár kísérlettel.

    A LED-eket a 2-es porttól kezdve csatlakoztatjuk a digitális portokhoz. Használhatjuk a 0-s és 1-es portokat, de ezek soros port adatcsatornák, és minden kártya villogása esetén ki kell kapcsolnunk a hozzájuk csatlakozó eszközöket.

Vázlat

Az unsigned int adattípus előjel nélküli egész számok tárolására szolgál, pl. csak nem negatív. Az előjel tárolására ma már nem használt extra bitnek köszönhetően egy ilyen típusú változóban 65 535-ig tárolhatunk értékeket.

Az (ms / 120) % 10 kifejezéssel meghatározzuk, hogy a 10 LED közül melyiknek kell most világítania. Átfogalmazva, meghatározzuk, hogy melyik 120 ms-os szegmens van most, és mi a száma az aktuális tízen belül. A szegmens sorszámát hozzáadjuk annak a portnak a számához, amelyik az első az aktuális halmazban.

Az, hogy a LED-et digitalWrite(pin, LOW)-val a bekapcsolás után alig 10 ms-mal kikapcsoljuk, szemmel nem észrevehető, mert. hamarosan újra kiszámolják, hogy melyik LED-et kell bekapcsolni, és be fog kapcsolni - éppen kialszik vagy legközelebb.

Kérdések, amelyekkel tesztelheti magát

    Miért kapcsoljuk be ebben a kísérletben a LED skálát tranzisztor nélkül?

    Ha csak az 5-ös, 6-os, 7-es, 8-as, 9-es portokon kapcsolnánk be a LED-eket, mit kellene módosítani a programban?

    Milyen más utasítás hajthatja végre a ++pin -nek megfelelőt?

    Mi a különbség az int típusú és az előjel nélküli int változók között?

    Mit ad vissza a millis() függvény?

    Hogyan számítjuk ki a port számát, amelyen a LED-et fel akarjuk kapcsolni ebben a kísérletben?

Futólámpákat készítünk LED-ekből az Arduino-n. Ebben az esetben egy Arduino Mega 2560-at használnak, amely potenciálisan 54 LED-es futópad meghajtására képes. De az áramkör és a program nem változik, ha más vezérlőket használ az ilyen típusú Arduino platformról (UNO, Leonardo...)

A LED-ek kapcsolási rajza az Arduino Mega 2560-hoz.

Így néz ki a vázlat a szabványos Arduino programozó alkalmazás ablakában.

A futófények Arduino platformon való megvalósítására vonatkozó program szövege.

int first_out = 11; //első diszkrét kimenet

int last_out = 13; //utolsó diszkrét kimenet

//blokk a bemenetek/kimenetek és egyéb kezdeti adatok inicializálásához

utolsó_ki = utolsó_ki + 1; //adjunk hozzá egyet a ciklusokban való helyes használat érdekében

//definiálja az Arduino kártya 11., 12. és 13. diszkrét lábát kimenetként

for (i = első_ki; i< last_out; i++) { pinMode(i, OUTPUT); }

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

digitalWrite(t, HIGH); //meggyújtja a következő LED-et

késleltetés(500); //késés 500 ms

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

A füzérben lévő vezérelt LED-ek számának növeléséhez a programnak egyszerűen le kell cserélnie a first_out és a változók értékeit. last_out. Az első változó a vezérlő kezdeti diszkrét kimenetét, a második változó pedig az egymást követő kimenetek utolsó csoportját tárolja. Például, ha egy füzérbe 10 LED-et szeretnénk csatlakoztatni, akkor a következő értékeket adjuk meg: első_ki = 4, utolsó_ki = 13. És LED-ek a tűkhöz sorrendben a 4-től a 13-ig. És jobb, ha nem érinti meg a különálló bemenetek-kimenetek első és második érintkezőjét, mivel a számítógéphez csatlakoztatott USB-port zavarja őket.