Światła do jazdy na Arduino. Uruchamianie kierunkowskazów na taśmie WS2812 i Arduino

Światła do jazdy na Arduino. Uruchamianie kierunkowskazów na taśmie WS2812 i Arduino

22.08.2023

Wykonujemy światła do jazdy z diod LED na Arduino. W tym przypadku wykorzystano Arduino Mega 2560, który potencjalnie jest w stanie sterować bieżnią z 54 diodami LED. Ale obwód i program nie ulegną zmianie, jeśli użyjesz innych kontrolerów z tego typu platformy Arduino (UNO, Leonardo...)

Schemat podłączenia diod LED do Arduino Mega 2560.

Tak wygląda szkic w oknie standardowej aplikacji do programowania Arduino.

Tekst programu do realizacji świateł drogowych na platformie Arduino.

int pierwsze_wyjście = 11; //pierwsze wyjście dyskretne

int ostatnie_wyjście = 13; //ostatnie dyskretne wyjście

//blok inicjujący wejścia/wyjścia i inne dane początkowe

last_out = last_out + 1; //dodaj jeden, aby poprawnie używać go w pętlach

//zdefiniuj 11., 12. i 13. dyskretny pin płytki Arduino jako wyjścia

for (i = pierwsze_wyjście; tj< last_out; i++) { pinMode(i, OUTPUT); }

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

digitalWrite(t, WYSOKI); //zapala następną diodę LED

opóźnienie (500); //opóźnienie 500ms

for (i = pierwsze_wyjście; tj< last_out; i++) { digitalWrite(i, LOW); }//гасим все светодиоды

Aby zwiększyć liczbę kontrolowanych diod LED w girlandzie, program będzie musiał po prostu zastąpić wartości zmiennych First_out i ostatnie_wyjście. Pierwsza zmienna przechowuje początkowe dyskretne wyjście sterownika, a druga zmienna przechowuje ostatnie z grupy kolejnych wyjść. Przykładowo jeśli chcemy połączyć w girlandę 10 diod LED to wpisujemy następujące wartości: pierwsze_wyjście = 4, ostatnie_wyjście = 13. I Diody LED do pinów w kolejności od 4 do 13. I lepiej nie dotykać pierwszego i drugiego pinu dyskretnych wejść-wyjść, ponieważ przeszkadza im port USB podłączony do komputera.

W tym samouczku będziemy kontynuować pracę z diodami LED, ale zwiększymy liczbę diod LED do 5. I zrobimy efekt działającego ognia. Do sterowania diodami LED posłużymy się manipulacją portem Arduino. Dane będziemy bezpośrednio zapisywać do portów Arduino. Jest to lepsze niż praca z określonymi wejściami/wyjściami kontrolera. Umożliwi to ustawienie wartości dla diod LED za pomocą jednej operacji.

Arduino UNO ma 3 porty:
B (cyfrowe wejścia/wyjścia od 8 do 13)
C (wejścia analogowe)
D (cyfrowe we/wy 0 do 7)

Każdy port jest kontrolowany przez 3 rejestry. Zarejestruj DDR określa, która noga (pin) będzie wejściem lub wyjściem. Za pomocą rejestru PORT można ustawić pin na stan WYSOKI Lub NISKI. Za pomocą rejestru PIN możesz odczytać stan nóg Arduino po ich wprowadzeniu.

Będziemy używać portu B. Najpierw musimy ustawić wszystkie piny portu B jako wyjścia cyfrowe. Port B ma tylko 6 pinów. Bity rejestru dla portu DDRB B muszą być ustawione na 1, jeśli odnoga ma być używana jako WYJŚCIE, i na 0, jeśli odnoga ma być używana jako WEJŚCIE. Bity portu są ponumerowane od 0 do 7, ale nie zawsze zawierają wszystkie 8 nóg.
Przykład:
DDRB = B00111110; // ustaw piny od 1 do 5 portu B jako wyjścia i 0 jako wejście.

Należy pamiętać, że w mikrokontrolerach Microchip jest odwrotnie. 0 bit - noga pracuje jako wyjście, a 1 - jako wejście.

W naszym projekcie Running Fire wykorzystamy 5 gniazd:
DDRB = B00011111; // ustaw piny od 0 do 4 portu B jako wyjścia

Aby zapisać wartości do portu B, należy skorzystać z rejestru PORTB.
Pierwszą diodę LED możesz zapalić komendą:
PORTB=B00000001;
pierwszy i czwarty:
PORTB=B00001001;

Teraz widzisz, jak łatwo możemy włączać i wyłączać diody LED. Porozmawiajmy teraz o operatorach zmianowych

Istnieją 2 operatory przesunięcia binarnego: operator przesunięcia w lewo<< и оператор сдвига вправо >>. Operator zmiany w lewo<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> przesuwa bity w prawo.

Przykład:
zmiennaA = 1; // 00000001
zmiennaA = 1<< 0; // 00000001
zmiennaA = 1<< 1; // 00000010
zmiennaA = 1<< 2; // 00000100

Wróćmy teraz do naszego programu, który pokazano poniżej.
Musimy wprowadzić 2 zmienne: pierwszy upDown będzie zawierał wartość miejsca, w którym należy się poruszać - w górę lub w dół, a drugi cylon, w którym zaświecą się diody LED.

W działaniu organizować coś() definiujemy, które nogi powinny działać jako wyjścia.

W głównej pętli programu pętla(), diody LED zapalają się kolejno poprzez zwiększenie zmiennej cylon, a gdy osiągnie najwyższy poziom, wówczas zmienna Góra dół przypisuje się wartość 0 i diody LED świecą kolejno w dół.

/* Biegnący ogień. 5 diod LED */ unsigned char upDown=1; // zacznij poruszać się w górę unsigned char cylon=0; // określa kolejność diod LED void setup() ( DDRB = B00011111; // ustaw port B 0 na 4 jako wyjścia ) void pętli() ( if(upDown==1)( // jeśli pójdziemy w górę, to cylon++; if ( cylon>=4) upDown=0; // gdy zostanie osiągnięty najwyższy numer diody LED, następnie w następnej pętli zejdziemy w dół ) else ( cylon--; if(cylon==0) upDown=1; // gdy najniższy Osiągnięto numer diody, następnie w kolejnym cyklu idziemy w górę) PORTB = 1<< cylon; //сдвиг delay(200); // пауза 200 мс }

W tym samouczku będziemy kontynuować pracę z diodami LED, ale zwiększymy liczbę diod LED do 5. I zrobimy efekt działającego ognia. Do sterowania diodami LED posłużymy się manipulacją portem Arduino. Dane będziemy bezpośrednio zapisywać do portów Arduino. Jest to lepsze niż praca z określonymi wejściami/wyjściami kontrolera. Umożliwi to ustawienie wartości dla diod LED za pomocą jednej operacji.

Arduino UNO ma 3 porty:

  • B (cyfrowe wejścia/wyjścia od 8 do 13)
  • C (wejścia analogowe)
  • D (cyfrowe we/wy 0 do 7)

Każdy port jest kontrolowany przez 3 rejestry. Rejestr DDR określa, czy noga (pin) będzie wejściem, czy wyjściem. Rejestr PORT może być użyty do ustawienia pinu na WYSOKI lub NISKI. Za pomocą rejestru PIN możesz odczytać stan nóg Arduino po ich wprowadzeniu.

Będziemy używać portu B. Najpierw musimy ustawić wszystkie piny portu B jako wyjścia cyfrowe. Port B ma tylko 6 pinów. Bity rejestru dla portu DDRB B muszą być ustawione na 1, jeśli odnoga ma być używana jako WYJŚCIE, i na 0, jeśli odnoga ma być używana jako WEJŚCIE. Bity portu są ponumerowane od 0 do 7, ale nie zawsze zawierają wszystkie 8 nóg.

Przykład:

DDRB = B00111110; // ustaw piny od 1 do 5 portu B jako wyjścia i 0 jako wejście.

Należy pamiętać, że w mikrokontrolerach Microchip jest odwrotnie. 0 bit - noga pracuje jako wyjście, a 1 - jako wejście.

W naszym projekcie Running Fire wykorzystamy 5 gniazd:

DDRB = B00011111; // ustaw piny od 0 do 4 portu B jako wyjścia

Aby zapisać wartości do portu B, należy skorzystać z rejestru PORTB. Pierwszą diodę LED możesz zapalić komendą:

PORTB=B00000001;
pierwszy i czwarty:
PORTB=B00001001;

Teraz widzisz, jak łatwo możemy włączać i wyłączać diody LED. Porozmawiajmy teraz o operatorach zmianowych

Istnieją 2 operatory przesunięcia binarnego: operator przesunięcia w lewo<< и оператор сдвига вправо >>. Operator zmiany w lewo<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> przesuwa bity w prawo.

Przykład:

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

Wróćmy teraz do naszego programu, który pokazano poniżej. Musimy wprowadzić 2 zmienne: pierwszą Góra dół będzie zawierać wartość miejsca przesunięcia - w górę lub w dół oraz drugą cylon jakie diody LED zaświecić.

W działaniu organizować coś() definiujemy, które nogi powinny działać jako wyjścia.

W głównej pętli programu pętla(), diody LED zapalają się kolejno poprzez zwiększenie zmiennej cylon, a gdy osiągnie najwyższy poziom, wówczas zmienna Góra dół przypisuje się wartość 0 i diody LED świecą kolejno w dół.

Arduino dla początkujących

W tym samouczku będziemy kontynuować pracę z diodami LED, ale zwiększymy liczbę diod LED do 5. I tak zrobimy działający efekt ognia. Do sterowania diodami LED posłużymy się manipulacją portem Arduino. Dane będziemy bezpośrednio zapisywać do portów Arduino. Jest to lepsze niż praca z określonymi wejściami/wyjściami kontrolera. Umożliwi to ustawienie wartości dla diod LED za pomocą jednej operacji.

Arduino UNO ma 3 porty:

  • B (cyfrowe wejścia/wyjścia od 8 do 13)
  • C (wejścia analogowe)
  • D (cyfrowe we/wy 0 do 7)

Każdy port jest kontrolowany przez 3 rejestry. Rejestr DDR określa, czy noga (pin) będzie wejściem, czy wyjściem. Rejestr PORT może być użyty do ustawienia pinu na WYSOKI lub NISKI. Za pomocą rejestru PIN możesz odczytać stan nóg Arduino po ich wprowadzeniu.

Będziemy używać portu B. Najpierw musimy ustawić wszystkie piny portu B jako wyjścia cyfrowe. Port B ma tylko 6 pinów. Bity rejestru dla portu DDRB B muszą być ustawione na 1, jeśli odnoga ma być używana jako WYJŚCIE, i na 0, jeśli odnoga ma być używana jako WEJŚCIE. Bity portu są ponumerowane od 0 do 7, ale nie zawsze zawierają wszystkie 8 nóg.

Przykład:

DDRB = B00111110; // ustaw piny od 1 do 5 portu B jako wyjścia i 0 jako wejście.

Należy pamiętać, że w mikrokontrolerach Microchip jest odwrotnie. 0 bit - noga pracuje jako wyjście, a 1 - jako wejście.

W naszym projekcie Running Fire wykorzystamy 5 gniazd:

DDRB = B00011111; // ustaw piny od 0 do 4 portu B jako wyjścia

Aby zapisać wartości do portu B, należy skorzystać z rejestru PORTB. Pierwszą diodę LED możesz zapalić komendą:

PORTB=B00000001;
pierwszy i czwarty:
PORTB=B00001001;

Teraz widzisz, jak łatwo możemy włączać i wyłączać diody LED. Porozmawiajmy teraz o operatorach zmianowych

Istnieją 2 operatory przesunięcia binarnego: operator przesunięcia w lewo<< и оператор сдвига вправо >>. Operator zmiany w lewo<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> przesuwa bity w prawo.

Przykład:

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

Wróćmy teraz do naszego programu, który pokazano poniżej. Musimy wprowadzić 2 zmienne: pierwszą Góra dół będzie zawierać wartość miejsca przesunięcia - w górę lub w dół oraz drugą cylon jakie diody LED zaświecić.

W działaniu organizować coś() definiujemy, które nogi powinny działać jako wyjścia.

W głównej pętli programu pętla(), diody LED zapalają się kolejno poprzez zwiększenie zmiennej cylon, a gdy osiągnie najwyższy poziom, wówczas zmienna Góra dół przypisuje się wartość 0 i diody LED świecą kolejno w dół.

Kod: /* Uruchomiony ogień. 5 diod LED */ unsigned char upDown=1; // zacznij poruszać się w górę unsigned char cylon=0; // określa kolejność diod LED void setup() ( DDRB = B00011111; // ustaw port B 0 na 4 jako wyjścia ) void pętli() ( if(upDown==1)( // jeśli pójdziemy w górę, to cylon++; if ( cylon>=4) upDown=0; // gdy zostanie osiągnięty najwyższy numer diody LED, następnie w następnej pętli zejdziemy w dół ) else ( cylon--; if(cylon==0) upDown=1; // gdy najniższy Osiągnięto numer diody, następnie w kolejnym cyklu idziemy w górę) PORTB = 1<< cylon; //сдвиг delay(200); // пауза 200 мс

W tym eksperymencie wykonujemy przebieg światła wzdłuż skali LED.

WYKAZ CZĘŚCI DO EKSPERYMENTU

- 1 płytka Arduino Uno;

- 1 płytka stykowa bez lutowania;

- 1 skala LED;

- 10 rezystorów o wartości nominalnej 220 omów;

- 11 przewodów męsko-męskich.

GŁÓWNY SCHEMAT

SCHEMAT NA PŁYCIE

NASZKICOWAĆ

pobierz szkic dla Arduino IDE
// skala LED jest podłączona do grupy pinów umieszczonych // w rzędzie. Nadanie przyjaznych nazw pierwszemu i ostatniemu pinowi #define FIRST_LED_PIN 2 #define LAST_LED_PIN 11 void setup() ( // na skali jest 10 diod LED. Moglibyśmy napisać pinMode 10 // razy: dla każdego z pinów, ale to by rozdęć kod i // utrudnić jego zmianę. // Dlatego lepiej zastosować pętlę. Wykonujemy // pinMode dla (eng. for) każdego pinu (zmienna pinu) // od pierwszego (= FIRST_LED_PIN) do ostatniego włącznie // ​​(<= 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ŚNIENIE KODU

  • Używając wyrażenia Do organizujemy pętla z licznikiem . W tym przypadku, aby skonfigurować porty wyjściowe. Aby wykonać taki cykl, potrzebujesz:
    • Zainicjuj zmienną licznika jej wartością początkową. W naszym przypadku: int pin = FIRST_LED_ SZPILKA ;
    • Określ warunek, do którego pętla będzie się powtarzać. W naszym przypadku: szpilka<= LAST_LED_ SZPILKA ;
    • Określ regułę, według której licznik będzie się zmieniał. W naszym przypadku ++pin(patrz poniżej operator ++ ).
  • Możesz na przykład zrobić pętlę for (int i = 10; i > 0; i = i - 1). W tym przypadku:
    • Zmienna i ma przypisaną wartość 10 ;
    • Wartość ta spełnia warunek ja > 0 ;
    • Dlatego blok kodu umieszczony w pętli jest wykonywany po raz pierwszy;
    • Oznaczający I zgodnie z podaną regułą zmniejsza się o jeden i przyjmuje wartość 9 ;
    • Blok kodu jest wykonywany po raz drugi;
    • Wszystko powtarza się w kółko, aż do znaczenia I równy 0 ;
    • Gdy I staje się równy 0 , stan ja > 0 nie zostanie wykonany, a wykonywanie pętli zakończy się;
    • Kontroler przeskoczy do kodu następującego po pętli Do ;
  • Umieść kod, który chcesz zapętlić, pomiędzy parą nawiasów klamrowych {} jeżeli zawiera więcej niż jedną instrukcję;
  • Zmienna licznika zadeklarowana w instrukcji Do, można używać wewnątrz pętli. Na przykład w tym eksperymencie szpilka kolejno przyjmuje wartości od 2 do 11 i jest przenoszony do tryb pin, umożliwia konfigurację 10 portów z jedną linią ułożoną w pętlę;
  • Zmienne licznikowe są widoczne tylko wewnątrz pętli. Te. jeśli zwrócisz się do szpilka przed pętlą lub po niej kompilator zgłosi błąd dotyczący niezadeklarowanej zmiennej;
  • Projekt ja = ja - 1 w powyższym wyjaśnieniu nie jest równaniem! Aby umieścić wartość w zmiennej, używamy operatora przypisania = I wstaw wartość równą bieżącej wartości I, zmniejszony o 1 ;
  • Wyrażenie ++pin– to tzw. operator przyrost , zastosowany do zmiennej szpilka. Ta instrukcja da taki sam wynik jak pin = pin + 1;
  • Operator działa podobnie jak przyrost ubytek - - Zmniejszenie wartości o jeden. Więcej na ten temat w artykule o operacjach arytmetycznych;
  • Typ danych bez znaku int używany do przechowywania liczb całkowitych bez znaku, tj. tylko nieujemne . Ze względu na dodatkowy bit, który nie jest obecnie używany do przechowywania znaku, możemy przechowywać wartości do 65 535 ;
  • Funkcjonować milis zwraca liczbę milisekund, które upłynęły od włączenia lub zresetowania mikrokontrolera. Tutaj używamy go do pomiaru czasu pomiędzy przełączeniami diod LED;
  • Używając wyrażenia (ms / 120) % 10 ustalamy, która z 10 diod powinna się teraz zaświecić. Parafrazując, określamy, który segment 120 ms jest teraz i jaki jest jego numer w bieżącej dziesiątce. Numer kolejny segmentu dodajemy do numeru portu, który w bieżącym zestawie pojawia się jako pierwszy;
  • Fakt, że wyłączamy diodę LED digitalWrite(pin, LOW) dopiero 10 ms od włączenia nie jest to zauważalne na oko, bo już wkrótce zostanie ponownie obliczone, która z diod LED ma się włączyć, i zostanie włączona - właśnie zgasła lub następna.

PYTANIA DO SPRAWDZENIA

  1. Dlaczego w tym eksperymencie podłączamy skalę LED bez użycia tranzystora?
  2. Gdybyśmy włączyli tylko diody na portach 5, 6, 7, 8, 9, co należałoby zmienić w programie?
  3. Jakiej innej instrukcji można użyć do wykonania akcji równoważnej ++pin ?
  4. Jaka jest różnica między zmiennymi typu wew I bez znaku int ?
  5. Co zwraca funkcja milis() ?
  6. Jak obliczyć numer portu, na którym chcemy włączyć diodę LED w tym eksperymencie?

ZADANIA DO NIEZALEŻNEGO ROZWIĄZANIA

  1. Zmień kod tak, aby diody LED przełączały się raz na sekundę.
  2. Nie wyłączając portów, upewnij się, że światło biegnie tylko wzdłuż środkowych czterech działek skali.
  3. Zmodyfikuj program tak, aby zamiast int pin = FIRST_LED_ SZPILKA + (ms / 120) % 10 cykl kontrolował ruch płomienia Do .
  4. Nie zamieniając przewodów zmień program tak aby światło szło w przeciwnym kierunku.



© 2023 globusks.ru - Naprawa i konserwacja samochodów dla początkujących