internetul Windows. Android

Programul Arduino Uno pentru a crea lumini de rulare. Rularea semnalelor de pornire pe panglica WS2812 și Arduino

În această lecție, vom continua să lucrăm cu LED-uri, dar numărul de LED-uri va crește la 5. și va face efectul de a alerga focul. Pentru a controla LED-urile, vom folosi manipulări cu porturile Arduino. Vom înregistra direct datele în porturile Arduino. Este mai bine decât să lucrați cu intrări / ieșiri specifice ale controlerului. Acest lucru vă va permite să stabiliți valori pentru LED-uri folosind singure operația.

Arduino Uno are 3 porturi:

  • B (intrări digitale / ieșire de la 8 la 13)
  • C (intrare analogică)
  • D (intrări digitale / ieșire de la 0 la 7)

Fiecare port este controlat de 3 registre. Registrul DDR definește modul în care va fi intrarea sau ieșirea piciorului (PIN). Cu registrul portuar, puteți instala PIN în starea înaltă sau joasă. Cu registrul PIN, puteți citi starea picioarelor Arduino atunci când lucrează la intrare.

Vom folosi portul B. În primul rând, trebuie să instalăm toate picioarele portului B ca ieșiri digitale. Portul B are doar 6 picioare. Înregistrarea biților pentru DDRB in port trebuie instalată în 1 dacă piciorul este utilizat ca ieșire (ieșire) și în 0 dacă piciorul este utilizat ca intrare (intrare). Biturile de porturi sunt numerotate de la 0 la 7, dar nu conțin întotdeauna toate cele 8 picioare.

Exemplu:

DDRB \u003d B00111110; // Setați porturile portului în C 1 la 5 ca o ieșire și 0 ca intrare.

Rețineți că microcontrolerele microcip sunt opuse. 0 Bit-picior funcționează ca o ieșire și 1 - ca o intrare.

În proiectul nostru de incendiu, vom folosi 5 puncte de vânzare:

DDRB \u003d B00011111; // Setați porturile portului de la 0 la 4 ca o ieșire

Pentru a înregistra valori în port, trebuie să utilizați înregistrarea PORTB. Bucla Primul LED poate fi echipa:

PORTB \u003d B00000001;
Primul și al patrulea:
PORTB \u003d B00001001;

Acum vedeți cât de ușor putem activa și dezactiva LED-urile. Acum vă spun despre operatorii de schimbare

Există 2 operatori de schimbare binară: a plecat operatorul de forfecare<< и оператор сдвига вправо >\u003e. Shift Operatorul la stânga<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >\u003e Schimbă biții spre dreapta.

Exemplu:

Varo \u003d 1; // 00000001.
Vara \u003d 1.<< 0; // 00000001
Vara \u003d 1.<< 1; // 00000010
Vara \u003d 1.<< 2; // 00000100

Acum, înapoi la programul nostru, care este prezentat mai jos. Trebuie să introducem 2 variabile: primul sus jos. va conține o valoare în care să se miște - în sus sau în jos, iar al doilea cylon. Ceea ce LEDS să se aprindă.

În funcțiune înființat () Definim ce picioare ar trebui să funcționeze ca ieșire.

În ciclul principal al programului buclă (), LED-urile la lumină se aprind prin creșterea variabilei cylon., și când vine vorba de cea mai mare, apoi variabila sus jos. ASIGNS 0 și LED-urile se aprind la rândul lor.

În acest experiment, forțăm lumina să ruleze prin scala LED-urilor.

Lista pieselor pentru experiment

- 1 bord Arduino Uno;

- 1 tablă de dumping inclusă;

- 1 scară LED;

- 10 rezistori cu o valoare nominală de 220 ohmi;

- 11 fire Papa Papa.

Schema schematică

Schema asupra bărbatului

SCHIȚĂ

descărcați schița pentru Arduino IDE
// Scala LED este conectată la un grup de pini situați // la rând. Dăm nume clare la prima și ultima lovitură #define primul_led_pin 2 #define last_led_pin 11 VOID Setup () (// în scara de 10 LED-uri. Am putea scrie Pinmode 10 // Times: pentru fiecare dintre pinii, dar ar fi lovit codul și // a făcut-o să se schimbe mai problematică. // ForeI mai bine este de a folosi ciclul. Noi interpretăm // pinmode pentru (engleză pentru) fiecare pina (PIN variabil) // de la primul (\u003d First_led_pin ) la ultimul incluziune // (<= 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); }

Explicație pentru coda

  • Folosind o expresie pentru Noi organizăm ciclu cu contor . În acest caz, pentru a seta porturile la ieșire. Pentru a face un astfel de ciclu, aveți nevoie de:
    • Inițializați contorul variabil, atribuind valoarea inițială. În cazul nostru: int pin \u003d primul_led_ Pin. ;
    • Specificați starea, până când realizarea căreia va fi repetată ciclu. În cazul nostru: pin.<= LAST_LED_ Pin. ;
    • Determinați regula prin care contorul va fi modificat. În cazul nostru ++ PIN. (Vezi mai jos pentru operator ++ ).
  • De exemplu, puteți face un ciclu pentru (int i \u003d 10; i\u003e 0; i \u003d i - 1) . În acest caz:
    • Variabila i este atribuită valoare 10 ;
    • Această valoare satisface condiția i\u003e 0. ;
    • Prin urmare, blocul de cod plasat în ciclu este efectuat pentru prima dată;
    • Valoare i. scade pe unitate în funcție de regula specificată și ia valoarea 9 ;
    • Blocul de cod este efectuat pentru a doua oară;
    • Totul se repetă din nou și din nou până la valoarea i. egal 0 ;
    • Cand i. va fi egal 0 , Condiție i\u003e 0. nu sa finalizat, iar executarea ciclului se va termina;
    • Controlerul va merge la codul după ciclu pentru ;
  • Plasați codul care trebuie să fie buclat, între o pereche de paranteze curbate {} dacă are mai mult de o instrucțiune;
  • Variabila contorului declarată în operator pentru pot fi utilizate în interiorul ciclului. De exemplu, în acest experiment pin. ia în mod constant valori de la 2 la 11 și, fiind transmise la pinmode. Vă permite să ajustați 10 porturi într-o singură linie plasată în ciclu;
  • Variabilele sunt vizibile numai în interiorul ciclului. Acestea. Dacă vă întoarceți pin. Înainte sau după ciclu, compilatorul va da o eroare la variabila nedeclarată;
  • Proiecta i \u003d i - 1 Explicația de mai sus nu este ecuația! Folosim operatorul de atribuire \u003d pentru a fi în variabila i. Plasați valoarea egală cu valoarea curentă i. redus cu 1 ;
  • Expresie ++ PIN. - Aceasta este așa-numita. operator creştere aplicată la variabila pin. . Această instrucțiune va da același rezultat ca PIN \u003d PIN + 1;
  • Similar operatorului de lucru de increment dekenent. - - Reducerea valorii pe unitate. Mai multe informații despre acest lucru în articol despre operațiunile aritmetice;
  • Tipul de date. nesemnat int. Folosit pentru a stoca întregi fără semn, adică numai non-negativ . Datorită bițiului suplimentar, care nu mai este folosit pentru a stoca semnul, putem stoca într-o variabilă de acest tip de valoare la 65 535 ;
  • Funcţie millis. Returnează numărul de milisecunde care au trecut de la includerea sau repornirea microcontrolerului. Aici îl folosim pentru a se referi la timpul între comutarea LED-urilor;
  • Folosind o expresie (MS / 120)% 10 Definim care dintre cele 10 LED-uri ar trebui să ardă acum. Prafraging, definim ce lungime de 120 ms lungime și care este numărul său în interiorul curentului zece. Adăugăm un număr de segment al segmentului la numărul portului, care în setul curent proege mai întâi;
  • Ceea ce gaim a condus cu ajutorul digitalWrite (PIN, scăzut) În total, 10 ms după pornirea nu este vizibilă pentru ochi, deoarece Foarte curând va fi calculat din nou care dintre LED-urile să pornească și va fi activat - doar răscumpărat sau cel următor.

Întrebări pentru verificarea dvs.

  1. De ce în acest experiment le conectăm la scala LED fără a utiliza tranzistorul?
  2. Dacă am inclus LED-uri numai pe porturile 5, 6, 7, 8, 9, ceea ce ar fi necesar să se schimbe în program?
  3. Cu ajutorul căruia alte instrucțiuni puteți efectua un echivalent de acțiune ++ PIN. ?
  4. Care este diferența dintre variabilele de tipuri int. și nesemnat int. ?
  5. Ceea ce returnează funcția milis () ?
  6. Cum în acest experiment, calculăm numărul de port pe care trebuie să activați LED-ul?

Sarcini pentru auto-decizie

  1. Schimbați codul astfel încât LED-urile să comute o dată pe secundă.
  2. Nu opriți porturile, astfel încât luminile au fugit numai prin intermediul a patru diviziuni ale scalei.
  3. La distanță programul astfel încât în \u200b\u200bschimb int pin \u003d primul_led_ Pin. + (MS / 120)% 10 Mișcarea luminii a condus ciclul pentru .
  4. Fără a schimba firele, schimbați programul astfel încât lumina să fie în direcția opusă.

Schema schematică

Schemă pe strat

Notă

    Rețineți că, în acest experiment, rezistențele sunt instalate între catozi și terenuri, spre deosebire de experimentul pulsar.

    Conectăm LED-urile la porturile digitale, pornind de la portul 2. Putem folosi porturile 0 și 1, dar ele sunt canale de canale de transmisie de date și pentru fiecare placă de reflexie va trebui să dezactiveze dispozitivele conectate la acestea.

Schiță

Tipul de date INS nesemnat este utilizat pentru a stoca întregi fără semne, adică numai non-negativ. Datorită biți-ului suplimentar, care nu este utilizat în prezent pentru a stoca semnul, putem stoca într-o variabilă de acest tip de valoare la 65.535.

Folosind expresia (MS / 120)% 10, determinăm care dintre cele 10 LED-uri ar trebui să ardă acum. Prafraging, definim ce lungime de 120 ms lungime și care este numărul său în interiorul curentului zece. Adăugăm numărul segmentului segmentului la numărul portului, care în setul curent proedează mai întâi.

Faptul că suntem stins de LED cu digitalwrite (PIN, scăzut) în doar 10 ms după pornirea nu este vizibilă pentru ochi, deoarece Foarte curând va fi calculat din nou care dintre LED-urile să pornească și va fi activat - doar răscumpărat sau cel următor.

Întrebări pentru verificarea dvs.

    De ce în acest experiment le conectăm la scala LED fără a utiliza tranzistorul?

    Dacă am inclus LED-uri numai pe porturile 5, 6, 7, 8, 9, ceea ce ar fi necesar să se schimbe în program?

    Cu alte instrucțiuni, puteți efectua o acțiune echivalentă cu ++ PIN?

    Care este diferența dintre variabilele int și nesemnate?

    Ce returnează funcția Millis ()?

    Cum în acest experiment, calculăm numărul de port pe care trebuie să activați LED-ul?

În această lecție, vom continua să lucrăm cu LED-uri, dar numărul de LED-uri va crește la 5. și va face efectul de a alerga focul. Pentru a controla LED-urile, vom folosi manipulări cu porturile Arduino. Vom înregistra direct datele în porturile Arduino. Este mai bine decât să lucrați cu intrări / ieșiri specifice ale controlerului. Acest lucru vă va permite să stabiliți valori pentru LED-uri folosind singure operația.

Arduino Uno are 3 porturi:
B (intrări digitale / ieșire de la 8 la 13)
C (intrare analogică)
D (intrări digitale / ieșire de la 0 la 7)

Fiecare port este controlat de 3 registre. Registrul DDR. Determină modul în care piciorul va fi (PIN) intrare sau ieșire. Cu registrul portuar, puteți instala PIN într-o stare Înalt sau Scăzut.. Cu registrul PIN, puteți citi starea picioarelor Arduino atunci când lucrează la intrare.

Vom folosi portul B. În primul rând, trebuie să instalăm toate picioarele portului B ca ieșiri digitale. Portul B are doar 6 picioare. Înregistrarea biților pentru DDRB in port trebuie instalată în 1 dacă piciorul este utilizat ca ieșire (ieșire) și în 0 dacă piciorul este utilizat ca intrare (intrare). Biturile de porturi sunt numerotate de la 0 la 7, dar nu conțin întotdeauna toate cele 8 picioare.
Exemplu:
DDRB \u003d B00111110; // Setați porturile portului în C 1 la 5 ca o ieșire și 0 ca intrare.

Rețineți că microcontrolerele microcip sunt opuse. 0 Bit-picior funcționează ca o ieșire și 1 - ca o intrare.

În proiectul nostru de incendiu, vom folosi 5 ieșiri:
DDRB \u003d B00011111; // Setați porturile portului de la 0 la 4 ca o ieșire

Pentru a înregistra valori în port, trebuie să utilizați înregistrarea PORTB.
Bucla Primul LED poate fi echipa:
PORTB \u003d B00000001;
Primul și al patrulea:
PORTB \u003d B00001001;

Acum vedeți cât de ușor putem activa și dezactiva LED-urile. Acum vă spun despre operatorii de schimbare

Există 2 operatori de schimbare binară: a plecat operatorul de forfecare<< и оператор сдвига вправо >\u003e. Shift Operatorul la stânga<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >\u003e Schimbă biții spre dreapta.

Exemplu:
varo \u003d 1; // 00000001.
Vara \u003d 1.<< 0; // 00000001
Vara \u003d 1.<< 1; // 00000010
Vara \u003d 1.<< 2; // 00000100

Acum, înapoi la programul nostru, care este prezentat mai jos.
Trebuie să introducem 2 variabile: Prima updată va conține o valoare în care să se miște - în sus sau în jos, iar al doilea cilon care le-a condus lumina.

În funcțiune înființat () Definim ce picioare ar trebui să funcționeze ca ieșire.

În ciclul principal al programului buclă (), LED-urile la lumină se aprind prin creșterea variabilei cylon., și când vine vorba de cea mai mare, apoi variabila sus jos. ASIGNS 0 și LED-urile se aprind la rândul lor.

/ * Focul de fugă. 5 LED-uri * / nesemnate Updown \u003d 1; // începeți cu mișcarea Up Nesemnate Char Cylon \u003d 0; // determină secvența de configurare a VOID a LED-urilor (DDRB \u003d B00011111; // setați portul B de la 0 la 4 ca ieșire) buclă void () (dacă (Updown \u003d\u003d 1) (// Dacă mergem în sus, atunci Cylon ++; dacă (dacă Cylon\u003e \u003d 4) Updown \u003d 0; // Când se atinge cel mai mare număr LED, apoi în următorul. Ciclul coboară) altceva (Cylon \u003d\u003d 0) Updown \u003d 1; // Când se atinge cel mai mic număr LED, acesta în următorul. Ciclul se ridică) PORTB \u003d 1<< cylon; //сдвиг delay(200); // пауза 200 мс }

Să facem niște LED-uri mai puțin periculoase. Să creăm cu linia de LED-uri din Arduino care clipește de la stânga la dreapta și spre stânga, și nu folosesc una, ci opt bucăți. Să facem o clipă de LED-uri într-un ciclu de secvență infinit 1-2-3-4-5-6-7-3-7-2-3-3 - ... cu a întârzierea într-o singură dă un sec.
Vei avea nevoie:

  • Setările standard Arduino (computer, cablu, uno sau compatibil)
  • 8 diode emise de lumină.
  • 8 rezistențe 360 \u200b\u200bohm 0,25 W. Rezistoarele sunt necesare pentru a limita LED-urile curente.
  • Faceți plata și firul de conectare
Propun să fac o întârziere variabilă. Deci o puteți schimba cu ușurință .
În proiectul inițial "LED-ul intermitent", descris în cartea băncilor Massimo, a fost utilizat digital de ieșire 13. De data aceasta puteți utiliza contacte digitale de la 2 la 9. Partea hardware este simplă - Conectați firul din fiecare contact digital la Anodul LED, apoi conectați rezistorul de sârmă de conectare 360 \u200b\u200bOm și catodul al LED-urilor la Pământ. Consultați schema de mai jos:

Acum, sarcina dvs. este de a scrie cod! Dar, înainte de a face acest lucru, trebuie să scrieți un plan de lucru sau un algoritm. De exemplu, pentru acest exercițiu, ați putea scrie ceva de genul ...

0,1 algoritmul programului.
Instalați că toate contactele pe care le vom folosi ca ieșire Creați o variabilă pentru stocarea duratei întârzierii în milisecunde Începem ciclul infinit repetat porniți contactul 2, așteptați timpul de întârziere set, întoarceți-l porniți contactul 3, așteptați timpul de întârziere set, opriți-l Repetați aceste operații pentru alte ieșiri - de la 4 la 9 Apoi faceți același lucru, dar în direcția opusă contactului 3 Sfârșitul unui ciclu nesfârșit Ce ți s-a întâmplat? Nu există nici un teribil, dacă nu ai nimic. Deci învățați. Dar pentru a vă salva timpul de mai jos, arată codul pentru această schemă..

int del \u003d 100; // stabilește un timp de întârziere implicit, 100 de milisecunde (o zecime dintr-o secundă)
VOID SETUP ()
{
// inițializați știfturile digitale ca iesiri:
// mai târziu, vor fi mai ușor modalități de a face acest lucru
Pinmode (2, ieșire);
Pinmode (3, ieșire);
Pinmode (4, ieșire);
Pinmode (5, ieșire);
Pinmode (6, ieșire);
Pinmode (7, ieșire);
Pinmode (8, ieșire);
Pinmode (9, ieșire);
}
// metoda buclă () repetă pe o perioadă nedeterminată până când opriți alimentarea
buclă void ()
{
Digital (2, mare); // Porniți LED-ul pe PIN 2
Întârzierea (del); // așteptați (lungimea determinată de valoarea "del")
Digital (2, scăzut); // Opreste-l

Întârzierea (del); // Aștepta.


Întârzierea (del); // Aștepta.


Întârzierea (del); // Aștepta.


Întârzierea (del); // Aștepta.


Întârzierea (del); // Aștepta.


Întârzierea (del); // Aștepta.

Digitalwrite (9, mare); // Porniți LED-ul pe PIN 9
Întârzierea (del); // Aștepta.
Digital (9, scăzut); // Opreste-l
Digital (8, mare); // Porniți LED-ul pe PIN 8
Întârzierea (del); // Aștepta.
Digital (8, scăzut); // Opreste-l
Digital (7, mare); // Porniți LED-ul pe PIN 7
Întârzierea (del); // Aștepta.
Digital (7, scăzut); // Opreste-l
Digital (6, mare); // Porniți LED-ul pe PIN 6
Întârzierea (del); // Aștepta.
Digitalwrite (6, scăzut); // Opreste-l
Digital (5, mare); // Porniți LED-ul pe PIN 5
Întârzierea (del); // Aștepta.
Digital (5, scăzut); // Opreste-l
Digital (4, mare); // Porniți LED-ul pe PIN 4
Întârzierea (del); // Aștepta.
Digital (4, scăzut); // Opreste-l
Digital (3, mare); // Porniți LED-ul pe PIN 3
Întârzierea (del); // Aștepta.
Digitalwrite (3, scăzut); // Opreste-l