Dijagram ožičenja arduino svjetla za trčanje. Pokretanje žmigavca na WS2812 traci i Arduinu

U ovom tutorijalu nastavićemo da radimo sa LED diodama, ali ćemo povećati broj LED dioda na 5. I napravićemo efekat vatrene vatre. Za kontrolu LED dioda koristit ćemo manipulaciju Arduino portom. Direktno ćemo zapisivati ​​podatke na Arduino portove. Ovo je bolje od rada sa specifičnim ulazima/izlazima kontrolera. Ovo će vam omogućiti da postavite vrijednosti za LED diode jednom operacijom.

Arduino UNO ima 3 porta:
B (Digitalni I/Os 8 do 13)
C (analogni ulazi)
D (Digitalni I/O 0 do 7)

Svaki port je kontrolisan sa 3 registra. Registrirajte DDR određuje šta će noga (pin) biti ulaz ili izlaz. Uz pomoć register PORT možete postaviti pin na HIGH ili LOW. Uz pomoć registrovati PIN možete pročitati stanje Arduino nogu kada se unose.

Koristićemo port B. Prvo, moramo postaviti sve pinove porta B kao digitalne izlaze. Port B ima samo 6 pinova. Bitovi registra za DDRB B port moraju biti postavljeni na 1 ako se krak koristi kao OUTPUT i na 0 ako se krak koristi kao INPUT. Port bitovi su označeni brojevima od 0 do 7, ali ne sadrže uvijek svih 8 krakova. primjer:
DDRB = B00111110; // postavlja port B pinove 1 do 5 kao izlaze i 0 kao ulaz.

Imajte na umu da je u Microchip mikrokontrolerima suprotno. 0 bit - noga radi kao izlaz, a 1 - kao ulaz.

U našem tekućem požarnom projektu koristit ćemo 5 utičnica:
DDRB = B00011111; // postavlja port B pinove 0 do 4 kao izlaze

Da biste upisali vrijednosti na port B, morate koristiti registar PORTB. Prvu LED diodu možete upaliti naredbom:
PORTB=B00000001;
prvi i cetvrti:
PORTB=B00001001;

Sada vidite kako lako možemo uključiti i isključiti LED diode. Hajde sada da pričamo o operaterima smene

Postoje 2 operatora binarnog pomaka: operator lijevog pomaka >. Operator lijevog pomaka > pomiče bitove udesno.

primjer:
varA = 1; // 00000001
varA = 1 varA = 1 varA = 1

Sada se vratimo na naš program, koji je prikazan ispod. Moramo uvesti 2 varijable: prvu gore doljeće sadržavati vrijednost gdje se treba kretati - gore ili dolje, i drugu cylon koje LED diode upaliti.

U funkciji postaviti() definiramo koje noge trebaju raditi kao izlaz.

U glavnoj petlji loop() programa, LED diode svijetle naizmjenično povećavajući cylon varijablu, a kada dođe do gornje, varijabla upDown je postavljena na 0 i LED diode svijetle redom.

/* Vatra. 5 LED dioda */ unsigned char upDown=1; // počinjemo se kretati gore unsigned char cylon=0; // određuje red LED void setup() ( DDRB = B00011111; // postavlja port B 0 na 4 kao izlaze ) void loop() ( if(upDown==1)( // ako idemo gore, onda cylon++; ako ( cylon>=4) upDown=0; // kada se dostigne najveći broj LED dioda, onda u sljedećoj petlji ide dolje) else ( cylon--; if(cylon==0) upDown=1; // kada je najmanji LED broj je dostignut, a zatim u sljedećem ciklusu idemo gore) PORTB = 1

U ovom eksperimentu pravimo da svjetlo prolazi duž LED skale.

SPISAK DELOVA ZA EKSPERIMENT

- 1 Arduino Uno ploča;

- 1 matična ploča bez lemljenja;

- 1 LED vaga;

- 10 otpornika nominalne vrijednosti 220 Ohm;

- 11 muško-muških žica.

GLAVNI DIJAGRAM

DIJAGRAM NA MASNOJ ploci

SKICA

preuzmite skicu za Arduino IDE
// LED vaga je povezana sa grupom pinova koji se nalaze // u nizu. Dajte smislena imena prvom i posljednjem pinu #define FIRST_LED_PIN 2 #define LAST_LED_PIN 11 void setup() ( // ima 10 LED dioda u skali. Mogli bismo napisati pinMode 10 // puta: za svaki od pinova, ali to bi naduti kod i // ga učiniti problematičnijim. // Stoga je bolje koristiti petlju. Izvodimo // pinMode za (eng. for) svaki pin (pin varijablu) // od prvog (= FIRST_LED_PIN) do posljednjeg uključivo // (<= 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); }

OBJAŠNJENJA KODOVA

  • Koristeći izraz za organizujemo petlja sa brojačem . U ovom slučaju, za konfiguriranje portova za izlaz. Da biste napravili takav ciklus, potrebno vam je:
    • Inicijalizirajte varijablu brojača njenom početnom vrijednošću. u našem slučaju: int pin = FIRST_LED_ PIN ;
    • Odredite uslov do kojeg će se petlja ponavljati. u našem slučaju: pin<= LAST_LED_ PIN ;
    • Odredite pravilo po kojem će se brojač promijeniti. U našem slučaju ++pin(vidi ispod za operatera ++ ).
  • Na primjer, možete napraviti petlju za (int i = 10; i > 0; i = i - 1). U ovom slučaju:
    • Varijabli i je dodijeljena vrijednost 10 ;
    • Ova vrijednost zadovoljava uslov i > 0 ;
    • Stoga se blok koda smješten u petlju izvršava prvi put;
    • Značenje i smanjuje se za jedan, prema datom pravilu, i uzima vrijednost 9 ;
    • Blok koda se izvršava drugi put;
    • Sve se ponavlja iznova i iznova do značenja i jednaka 0 ;
    • Kada i postaje jednako 0 , stanje i > 0 neće biti izvršena, a izvršenje petlje će se završiti;
    • Kontroler će skočiti na kod koji slijedi nakon petlje za ;
  • Stavite kod koji želite da petljate između para vitičastih zagrada {} ako sadrži više od jedne instrukcije;
  • Varijabla brojača deklarirana u naredbi za, može se koristiti unutar petlje. Na primjer, u ovom eksperimentu pin sekvencijalno preuzima vrijednosti od 2 do 11 i, prenosi se na pinMode, omogućava vam da konfigurišete 10 portova sa jednom linijom postavljenom u petlju;
  • Promenljive brojača su vidljive samo unutar petlje. One. ako se okrenete pin prije ili poslije petlje, kompajler će izbaciti grešku o nedeklariranoj varijabli;
  • Dizajn i = i - 1 u objašnjenju iznad nije jednačina! Koristimo operator dodjeljivanja = da stavimo u varijablu i staviti vrijednost jednaku trenutnoj vrijednosti i, umanjeno za 1 ;
  • Izraz ++pin- ovo je tzv. operater prirast , primijenjen na varijablu pin. Ova instrukcija će dati isti rezultat kao pin = pin + 1;
  • Operator radi slično kao inkrement dekrement - - Smanjenje vrijednosti za jedan. Više o tome u članku o aritmetičkim operacijama;
  • Tip podataka unsigned int koristi se za pohranjivanje neoznačenih cijelih brojeva, tj. samo nenegativan . Zbog dodatnog bita, koji se sada ne koristi za pohranjivanje znaka, možemo pohraniti vrijednosti do 65 535 ;
  • Funkcija millis vraća broj milisekundi koje su prošle otkako je mikrokontroler uključen ili resetovan. Ovdje ga koristimo za mjerenje vremena između LED prekidača;
  • Koristeći izraz (ms / 120) % 10 određujemo koja od 10 LED dioda sada treba upaliti. Da parafraziramo, određujemo koji je segment od 120 ms sada i koji je njegov broj unutar trenutnih deset. Dodamo redni broj segmenta broju porta koji se prvi pojavljuje u trenutnom skupu;
  • Činjenica da gasimo LED sa digitalWrite(pin, LOW) samo 10 ms nakon uključivanja nije vidljivo oku, jer vrlo brzo će se ponovo izračunati koja od LED dioda da se upali, i ona će se upaliti - tek ugašena ili sljedeća.

PITANJA DA SE PROVERITE

  1. Zašto u ovom eksperimentu povezujemo LED vagu bez upotrebe tranzistora?
  2. Kada bismo upalili samo LED diode na portovima 5, 6, 7, 8, 9, šta bi trebalo promijeniti u programu?
  3. Koja druga instrukcija se može koristiti za izvođenje radnje ekvivalentne ++pin ?
  4. Koja je razlika između varijabli tipa int i unsigned int ?
  5. Šta funkcija vraća millis() ?
  6. Kako izračunati broj porta na kojem želimo uključiti LED u ovom eksperimentu?

ZADACI ZA SAMOSTALNO RJEŠENJE

  1. Promijenite kod tako da se LED diode mijenjaju jednom u sekundi.
  2. Bez isključivanja priključaka, uvjerite se da svjetlo ide samo duž srednja četiri dijela skale.
  3. Izmijenite program tako da umjesto int pin = FIRST_LED_ PIN + (ms / 120) % 10 kretanje plamena je kontrolisano ciklusom za .
  4. Bez zamjene žica promijenite program tako da svjetlo ide u suprotnom smjeru.

U ovom tutorijalu nastavićemo da radimo sa LED diodama, ali ćemo povećati broj LED dioda na 5. I napravićemo efekat vatrene vatre. Za kontrolu LED dioda koristit ćemo manipulaciju Arduino portom. Direktno ćemo zapisivati ​​podatke na Arduino portove. Ovo je bolje od rada sa specifičnim ulazima/izlazima kontrolera. Ovo će vam omogućiti da postavite vrijednosti za LED diode jednom operacijom.

Arduino UNO ima 3 porta:

  • B (Digitalni I/Os 8 do 13)
  • C (analogni ulazi)
  • D (Digitalni I/O 0 do 7)

Svaki port je kontrolisan sa 3 registra. DDR registar određuje da li će noga (pin) biti ulaz ili izlaz. PORT registar se može koristiti za postavljanje pina na HIGH ili LOW. Koristeći PIN registar, možete očitati stanje Arduino nogu kada se unose.

Koristićemo port B. Prvo, moramo postaviti sve pinove porta B kao digitalne izlaze. Port B ima samo 6 pinova. Bitovi registra za DDRB B port moraju biti postavljeni na 1 ako se krak koristi kao OUTPUT i na 0 ako se krak koristi kao INPUT. Port bitovi su označeni brojevima od 0 do 7, ali ne sadrže uvijek svih 8 krakova.

Primjer:

DDRB = B00111110; // postavlja port B pinove 1 do 5 kao izlaze i 0 kao ulaz.

Imajte na umu da je u Microchip mikrokontrolerima suprotno. 0 bit - noga radi kao izlaz, a 1 - kao ulaz.

U našem tekućem požarnom projektu koristit ćemo 5 utičnica:

DDRB = B00011111; // postavlja port B pinove 0 do 4 kao izlaze

Da biste upisali vrijednosti na port B, morate koristiti registar PORTB. Prvu LED diodu možete upaliti naredbom:

PORTB=B00000001;
prvi i cetvrti:
PORTB=B00001001;

Sada vidite kako lako možemo uključiti i isključiti LED diode. Hajde sada da pričamo o operaterima smene

Postoje 2 operatora binarnog pomaka: operator lijevog pomaka<< и оператор сдвига вправо >>. Rukovalac lijeve smjene<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> pomiče bitove udesno.

primjer:

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

Sada se vratimo na naš program, koji je prikazan ispod. Moramo uvesti 2 varijable: prvu gore doljeće sadržavati vrijednost gdje se treba kretati - gore ili dolje, i drugu cylon koje LED diode upaliti.

U funkciji postaviti() definiramo koje noge trebaju raditi kao izlaz.

U glavnoj programskoj petlji petlja(), LED diode svijetle redom povećanjem varijable cylon, a kada dostigne najviši, onda varijabla gore dolje je dodijeljena 0 i LED diode svijetle redom prema dolje.

dijagram strujnog kola

Šema na matičnoj ploči

Bilješka

    Imajte na umu da su u ovom eksperimentu otpornici postavljeni između katoda i uzemljenja, za razliku od eksperimenta s pulsarom.

    LED diode spajamo na digitalne portove počevši od porta 2. Možemo koristiti portove 0 i 1, ali to su kanali podataka serijskog porta i za svako treptanje ploče morat ćemo isključiti uređaje spojene na njih.

Skica

Unsigned int tip podataka se koristi za pohranjivanje nepotpisanih cijelih brojeva, tj. samo nenegativan. Zbog dodatnog bita, koji se sada ne koristi za pohranjivanje znaka, možemo pohraniti vrijednosti do 65,535 u varijablu ovog tipa.

Sa izrazom (ms / 120) % 10 određujemo koja od 10 LED dioda sada treba upaliti. Da parafraziramo, određujemo koji je segment od 120 ms sada i koji je njegov broj unutar trenutnih deset. Redni broj segmenta dodajemo broju porta koji je prvi u trenutnom skupu.

Činjenica da gasimo LED sa digitalWrite(pin, LOW) samo 10 ms nakon uključivanja nije uočljiva oku, jer. vrlo brzo će se ponovo izračunati koju od LED dioda uključiti, i ona će se uključiti - samo ugašena ili slijedeća.

Pitanja za testiranje

    Zašto u ovom eksperimentu povezujemo LED vagu bez upotrebe tranzistora?

    Kada bismo upalili samo LED diode na portovima 5, 6, 7, 8, 9, šta bi trebalo promijeniti u programu?

    Koja druga instrukcija može izvesti ekvivalent ++pin?

    Koja je razlika između varijabli tipa int i unsigned int?

    Šta vraća funkcija millis()?

    Kako izračunati broj porta na kojem želimo uključiti LED u ovom eksperimentu?

Radimo svjetla za trčanje od LED dioda na Arduinu. U ovom slučaju se koristi Arduino Mega 2560, koji je potencijalno sposoban pokretati traku za trčanje od 54 LED diode. Ali sklop i program se neće promijeniti ako koristite druge kontrolere sa ove vrste Arduino platforme (UNO, Leonardo...)

Dijagram ožičenja za LED diode na Arduino Mega 2560.

Ovako izgleda skica u prozoru standardne Arduino programske aplikacije.

Tekst programa za implementaciju trkaćih svjetala na Arduino platformi.

int first_out = 11; //prvi diskretni izlaz

int last_out = 13; //zadnji diskretni izlaz

//blok za inicijalizaciju ulaza/izlaza i drugih početnih podataka

zadnji_izlaz = zadnji_izlaz + 1; //dodajte jedan za ispravnu upotrebu u petljama

//definirajte 11., 12. i 13. diskretne pinove Arduino ploče kao izlaze

za (i = prvi_izlaz; i< last_out; i++) { pinMode(i, OUTPUT); }

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

digitalWrite(t, HIGH); //upali sljedeću LED diodu

kašnjenje (500); //kašnjenje 500ms

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

Da bi povećao broj kontroliranih LED dioda u vijencu, program će jednostavno morati zamijeniti vrijednosti varijabli first_out i last_out. Prva varijabla pohranjuje početni diskretni izlaz kontrolera, a druga varijabla pohranjuje posljednji od grupe uzastopnih izlaza. Na primjer, ako želimo spojiti 10 LED dioda u vijenac, unosimo sljedeće vrijednosti: first_out = 4, last_out = 13. I LED diode do igle redom od 4. do 13. I bolje je ne dirati prvi i drugi pin diskretnih ulaza-izlaza, jer im ometa usb port spojen na računar.