Gaitas lukturu Arduino savienojuma shēma. Darbojas pagrieziena rādītāji uz WS2812 un Arduino lentes

Šajā apmācībā mēs turpināsim strādāt ar gaismas diodēm, bet mēs palielināsim gaismas diožu skaitu līdz 5. Un mēs izveidosim skriešanas uguns efektu. Lai kontrolētu gaismas diodes, mēs izmantosim manipulācijas ar Arduino portiem. Mēs tieši ierakstīsim datus Arduino portos. Tas ir labāk nekā darbs ar īpašām kontrollera ieejām/izejām. Tas ļaus iestatīt gaismas diožu vērtības tikai ar vienu darbību.

Arduino UNO ir 3 porti:
B (digitālās ieejas/izejas no 8 līdz 13)
C (analogās ieejas)
D (digitālās ieejas/izejas no 0 līdz 7)

Katru portu kontrolē 3 reģistri. DDR reģistrs nosaka, vai kājiņa (tapa) būs ieeja vai izvade. Ar palīdzību PORT reģistrs tapu var iestatīt uz HIGH vai LOW. Ar palīdzību PIN reģistrs jūs varat lasīt Arduino kāju stāvokli, kad tās darbojas kā ievade.

Mēs izmantosim portu B. Pirmkārt, mums ir jāiestata visas B porta tapas kā digitālās izejas. Portam B ir tikai 6 kājas. Reģistra biti DDRB B portam ir jāiestata uz 1, ja kājiņa tiks izmantota kā IZVĒTE, un uz 0, ja kājiņa tiks izmantota kā IEVADE. Porta biti ir numurēti no 0 līdz 7, taču tie ne vienmēr satur visus 8 bitus. Piemērs:
DDRB = B00111110; // iestatiet porta B tapas no 1 līdz 5 kā izvadi un 0 kā ieeju.

Lūdzu, ņemiet vērā, ka mikroshēmu mikrokontrolleros ir pretējais. 0 bits - kāja darbojas kā izeja, bet 1 - kā ieeja.

Mūsu darbības uguns projektā mēs izmantosim 5 izejas:
DDRB = B00011111; // iestatiet porta B kājas no 0 līdz 4 kā izejas

Lai rakstītu vērtības portā B, jums jāizmanto PORTB reģistrs. Jūs varat iedegt pirmo LED ar komandu:
PORTB = B00000001;
pirmais un ceturtais:
PORTB = B00001001;

Tagad jūs varat redzēt, cik viegli mēs varam ieslēgt un izslēgt gaismas diodes. Tagad pastāstīsim par maiņu operatoriem

Ir 2 binārās maiņas operatori: kreisās maiņas operators >. Kreisās maiņas operators > pārbīda bitus pa labi.

Piemērs:
varA = 1; // 00000001
varA = 1 varA = 1 varA = 1

Tagad atgriezīsimies pie mūsu programmas, kas ir parādīta zemāk. Mums jāievada 2 mainīgie: pirmais uz augšu uz leju saturēs vērtību, kur pārvietoties - uz augšu vai uz leju, un otrā cilindrs kuras gaismas diodes apgaismot.

Funkcijā uzstādīt() mēs nosakām, kurām kājām jādarbojas kā izvadiem.

Programmas galvenajā cilpā () gaismas diodes tiek iedegtas pa vienai, palielinot cylon mainīgo, un, kad tiek sasniegts augstākais, mainīgais upDown tiek iestatīts uz 0 un gaismas diodes tiek iedegtas secībā.

/* Skrienoša uguns. 5 LED */ neparakstīts char upDown=1; // sākt ar kustību uz augšu unsigned char cylon=0; // nosaka LED secību void setup() ( DDRB = B00011111; // iestata portu B no 0 līdz 4 kā izejas ) void loop() ( if(upDown==1)( // ja ejam uz augšu, tad cylon++; if( cylon>=4) upDown=0 // kad sasniegts augstākais LED skaitlis, tad nākamajā cilpā ejam uz leju) else ( cylon--; if(cylon==0) upDown=1; // kad tiek sasniegts mazākais LED skaitlis, tad nākamajā ciklā mēs ejam uz augšu) PORTB = 1

Šajā eksperimentā mēs liekam gaismu, kas darbojas pa LED skalu.

EKSPERIMENTA DAĻU SARAKSTS

- 1 Arduino Uno dēlis;

- 1 bezlodēšanas plāksne;

- 1 LED skala;

- 10 rezistori ar nominālo vērtību 220 omi;

- 11 vīriešu-vīriešu vadi.

SĒTES DIAGRAMMA

DIAGRAMMA UZ PLĀCES

SKICE

lejupielādējiet Arduino IDE skici
// LED skala ir savienota ar tapu grupu, kas atrodas // rindā. Mēs dodam skaidrus nosaukumus pirmajai un pēdējai tapai #define FIRST_LED_PIN 2 #define LAST_LED_PIN 11 void setup() ( // skalā ir 10 gaismas diodes. Mēs varētu rakstīt pinMode 10 // reizes: katrai no tapām, bet šī uzpūtīs kodu un // padarīja tā maiņu problemātiskāku. // Tāpēc labāk ir izmantot cilpu. Mēs izpildām // pinMode katram tapam (= FIRST_LED_PIN) līdz pēdējam //. (<= 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); }

KODS SKAIDROJUMI

  • Izmantojot izteiksmi priekš mēs organizēsim cilpa ar skaitītāju . Šajā gadījumā, lai konfigurētu izvades portus. Lai izveidotu šādu cilpu, jums ir nepieciešams:
    • Inicializējiet skaitītāja mainīgo, piešķirot tam sākotnējo vērtību. Mūsu gadījumā: int pin = FIRST_LED_ PIN ;
    • Norādiet nosacījumu, līdz kuram cilpa atkārtosies. Mūsu gadījumā: pin<= LAST_LED_ PIN ;
    • Nosakiet noteikumu, saskaņā ar kuru skaitītājs mainīsies. Mūsu gadījumā ++pin(skatiet tālāk par operatoru ++ ).
  • Piemēram, jūs varat izveidot cilpu par (int i = 10; i > 0; i = i - 1). Šajā gadījumā:
    • Mainīgajam i tiek piešķirta vērtība 10 ;
    • Šī vērtība atbilst nosacījumam i > 0 ;
    • Tāpēc cilpā ievietots koda bloks tiek izpildīts pirmo reizi;
    • Nozīme i samazinās par vienu, saskaņā ar doto noteikumu, un iegūst vērtību 9 ;
    • Koda bloks tiek izpildīts otro reizi;
    • Viss atkārtojas atkal un atkal līdz nozīmei i vienāds 0 ;
    • Kad i kļūs vienādi 0 , stāvoklis i > 0 neizdosies un cilpa beigsies;
    • Kontrolieris pāries uz kodu pēc cilpas priekš ;
  • Ievietojiet kodu, kuru vēlaties izveidot starp pāriem cirtaini breketes {} , ja tajā ir vairāk nekā viena instrukcija;
  • Paziņojumā deklarētais skaitītāja mainīgais priekš, var izmantot cilpas iekšpusē. Piemēram, iekšā šis eksperiments pin secīgi ņem vērtības no 2 līdz 11 un, kad tās tiek nodotas pinMode, ļauj konfigurēt 10 portus ar vienu līniju, kas ievietota cilpā;
  • Skaitītāja mainīgie ir redzami tikai cilpas iekšpusē. Tie. ja tu vērsies pie pin pirms vai pēc cilpas kompilators ģenerēs kļūdu par nedeklarētu mainīgo;
  • Dizains i = i - 1 iepriekš sniegtajā skaidrojumā nav vienādojums! Mēs izmantojam piešķiršanas operatoru =, lai piešķirtu mainīgajam i ielieciet vērtību, kas vienāda ar pašreizējo vērtību i, samazināts par 1 ;
  • Izteiksme ++pin- tas ir tā sauktais operators pieaugums , attiecas uz mainīgo pin. Šī instrukcija radīs tādu pašu rezultātu kā pin = pin + 1;
  • Operators darbojas līdzīgi kā palielinājums samazinājums - - , kas samazina vērtību par vienu. Vairāk par to lasiet rakstā par aritmētiskajām operācijām;
  • Datu tips neparakstīts int izmanto, lai saglabātu neparakstītus veselus skaitļus, t.i. tikai nenegatīvs . Pateicoties papildu bitam, kas vairs netiek izmantots zīmes glabāšanai, mēs varam saglabāt vērtības līdz 65 535 ;
  • Funkcija millis atgriež milisekundes, kas pagājušas kopš mikrokontrollera ieslēgšanas vai pārstartēšanas. Šeit mēs to izmantojam, lai skaitītu laiku starp LED slēdžiem;
  • Izmantojot izteiksmi (ms/120) % 10 mēs nosakām, kurai no 10 gaismas diodēm tagad vajadzētu iedegties. Pārfrāzējot, mēs nosakām, kurš 120 ms segments pašlaik darbojas un kāds ir tā numurs pašreizējā desmit robežās. Segmenta kārtas numuru pievienojam porta numuram, kas pašreizējā komplektā parādās pirmais;
  • Tas, ko mēs darām, ir nodzēst LED ar digitalWrite (pin, LOW) tikai 10 ms pēc ieslēgšanas tas nav pamanāms ar aci, jo pavisam drīz atkal sarēķinās, kuru LED iedegt, un ieslēgsies - tikko izslēgtā vai nākamā.

JAUTĀJUMI, LAI PĀRBAUDĪTU SEVI

  1. Kāpēc šajā eksperimentā mēs savienojam LED skalu, neizmantojot tranzistoru?
  2. Ja mēs ieslēgtu gaismas diodes tikai pieslēgvietām 5, 6, 7, 8, 9, kas programmā būtu jāmaina?
  3. Kādu citu norādījumu var izmantot, lai veiktu darbību, kas līdzvērtīga ++pin ?
  4. Kāda ir atšķirība starp tipa mainīgie starpt Un neparakstīts int ?
  5. Ko funkcija atgriež? millis() ?
  6. Kā šajā eksperimentā aprēķināt porta numuru, kurā jāieslēdz gaismas diode?

UZDEVUMI NEATKARĪGAM RISINĀJUMAM

  1. Mainiet kodu tā, lai gaismas diodes pārslēgtos reizi sekundē.
  2. Neizslēdzot pieslēgvietas, pārliecinieties, ka gaisma darbojas tikai pa skalas četrām vidējām iedaļām.
  3. Pārstrādājiet programmu tā, lai tā vietā int pin = FIRST_LED_ PIN + (ms/120) % 10 gaismas kustību kontrolēja cikls priekš .
  4. Nemainot vadus, mainiet programmu tā, lai gaisma darbotos pretējā virzienā.

Šajā apmācībā mēs turpināsim strādāt ar gaismas diodēm, bet mēs palielināsim gaismas diožu skaitu līdz 5. Un mēs izveidosim skriešanas uguns efektu. Lai kontrolētu gaismas diodes, mēs izmantosim manipulācijas ar Arduino portiem. Mēs tieši ierakstīsim datus Arduino portos. Tas ir labāk nekā darbs ar īpašām kontrollera ieejām/izejām. Tas ļaus iestatīt gaismas diožu vērtības tikai ar vienu darbību.

Arduino UNO ir 3 porti:

  • B (digitālās ieejas/izejas no 8 līdz 13)
  • C (analogās ieejas)
  • D (digitālās ieejas/izejas no 0 līdz 7)

Katru portu kontrolē 3 reģistri. DDR reģistrs nosaka, vai tapa būs ieeja vai izeja. Izmantojot PORT reģistru, varat iestatīt tapu uz HIGH vai LOW. Izmantojot PIN reģistru, varat nolasīt Arduino tapu stāvokli, kad tie darbojas kā ievade.

Mēs izmantosim portu B. Pirmkārt, mums ir jāiestata visas B porta tapas kā digitālās izejas. Portam B ir tikai 6 kājas. Reģistra biti DDRB B portam ir jāiestata uz 1, ja kājiņa tiks izmantota kā IZVĒTE, un uz 0, ja kājiņa tiks izmantota kā IEVADE. Porta biti ir numurēti no 0 līdz 7, taču tie ne vienmēr satur visus 8 bitus.

Piemērs:

DDRB = B00111110; // iestatiet porta B tapas no 1 līdz 5 kā izvadi un 0 kā ieeju.

Lūdzu, ņemiet vērā, ka mikroshēmu mikrokontrolleros ir pretējais. 0 bits - kāja darbojas kā izeja, bet 1 - kā ieeja.

Mūsu darbības uguns projektā mēs izmantosim 5 izejas:

DDRB = B00011111; // iestatiet porta B kājas no 0 līdz 4 kā izejas

Lai rakstītu vērtības portā B, jums jāizmanto PORTB reģistrs. Jūs varat iedegt pirmo LED ar komandu:

PORTB = B00000001;
pirmais un ceturtais:
PORTB = B00001001;

Tagad jūs varat redzēt, cik viegli mēs varam ieslēgt un izslēgt gaismas diodes. Tagad pastāstīsim par maiņu operatoriem

Ir 2 binārās maiņas operatori: kreisās maiņas operators<< и оператор сдвига вправо >>. Kreisās maiņas operators<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> pārbīda bitus pa labi.

Piemērs:

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

Tagad atgriezīsimies pie mūsu programmas, kas ir parādīta zemāk. Mums jāievada 2 mainīgie: pirmais uz augšu uz leju saturēs vērtību, kur pārvietoties - uz augšu vai uz leju, un otrā cilindrs kuras gaismas diodes apgaismot.

Funkcijā uzstādīt() mēs nosakām, kurām kājām jādarbojas kā izvadiem.

Galvenajā programmas cilpā cilpa (), gaismas diodes iedegas pēc kārtas, palielinot mainīgo cilindrs, un, kad runa ir par pašu augšdaļu, tad mainīgais uz augšu uz leju tiek piešķirts 0, un gaismas diodes iedegas secīgi.

Shematiska diagramma

Shēma uz maizes dēļa

Piezīme

    Ņemiet vērā, ka šajā eksperimentā rezistori ir novietoti starp katodiem un zemi, atšķirībā no pulsāra eksperimenta.

    Gaismas diodes savienojam ar ciparu portiem, sākot ar portu 2. Varam izmantot portus 0 un 1, bet tie ir seriālā porta datu kanāli un katrai plates mirgošanai nāksies atvienot tiem pieslēgtās ierīces.

Skice

Neparakstīto int datu tips tiek izmantots, lai saglabātu neparakstītus veselus skaitļus, t.i. tikai nenegatīvs. Pateicoties papildu bitam, kas vairs netiek izmantots zīmes glabāšanai, šāda veida mainīgajā varam saglabāt vērtības līdz 65 535.

Izmantojot izteiksmi (ms / 120) % 10, mēs nosakām, kurai no 10 gaismas diodēm tagad vajadzētu iedegties. Pārfrāzējot, mēs nosakām, kurš 120 ms segments pašlaik darbojas un kāds ir tā numurs pašreizējā desmit robežās. Mēs pievienojam segmenta kārtas numuru porta numuram, kas pašreizējā komplektā parādās pirmais.

Tas, ka mēs nodzēšam LED, izmantojot digitalWrite(pin, LOW) tikai 10 ms pēc ieslēgšanas, nav acij pamanāms, jo pavisam drīz atkal sarēķinās, kuru LED iedegt, un ieslēgsies - tikko izslēgtais vai nākošais.

Jautājumi, lai pārbaudītu sevi

    Kāpēc šajā eksperimentā mēs savienojam LED skalu, neizmantojot tranzistoru?

    Ja mēs ieslēgtu gaismas diodes tikai pieslēgvietām 5, 6, 7, 8, 9, kas programmā būtu jāmaina?

    Kāda cita instrukcija var veikt darbību, kas līdzvērtīga ++pin ?

    Kāda ir atšķirība starp int un neparakstītajiem int mainīgajiem?

    Ko atgriež funkcija millis()?

    Kā šajā eksperimentā aprēķināt porta numuru, kurā jāieslēdz gaismas diode?

Gaismas lukturu izgatavošana no LED, izmantojot Arduino. Šajā gadījumā tiek izmantots Arduino Mega 2560, kas potenciāli spēj vadīt 54 LED skrejceliņu. Bet shēma un programma nemainīsies, ja izmantosit citus šāda veida Arduino platformas kontrollerus (UNO, Leonardo...)

Diagramma gaismas diožu savienošanai ar Arduino Mega 2560.

Šādi skice izskatās standarta Arduino programmēšanas lietojumprogrammas logā.

Programmas teksts gaitas lukturu ieviešanai Arduino platformā.

int first_out = 11; //pirmā diskrētā izvade

int last_out = 13; //pēdējā diskrētā izvade

//bloks ieeju-izeju un citu sākotnējo datu inicializācijai

pēdējais_izlaidums = pēdējais_izlaidums + 1; //pievienojiet vienību pareizai lietošanai cilpās

//arduino plates 11., 12. un 13. diskrēto tapu definēšana kā izejas

for (i = pirmais_ārējais; i< last_out; i++) { pinMode(i, OUTPUT); }

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

digitalWrite(t, HIGH); //nākamā gaismas diodes iedegšana

kavēšanās (500); //aizkavēšanās 500 ms

for (i = pirmais_ārējais; i< last_out; i++) { digitalWrite(i, LOW); }//гасим все светодиоды

Lai palielinātu vadāmo gaismas diožu skaitu vītnē, programmā jums vienkārši jāaizstāj first_out un last_out. Pirmais mainīgais saglabā kontroliera sākotnējo diskrēto izvadi, bet otrais ir pēdējais no izvadu grupas, kas nāk pēc kārtas. Piemēram, ja mēs vēlamies savienot 10 gaismas diodes vītnē, mēs ievadām šādas vērtības: first_out = 4, pēdējais_izkāpums = 13. Un Gaismas diodes uz tapām secībā no 4. līdz 13.. Labāk nepieskarieties diskrēto ieeju un izeju pirmajam un otrajam kontaktam, jo ​​tos traucē datoram pievienotais USB ports.