Linijka świetlna na Arduino i expanderze PCF8574

INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(

Witam! Jest to mój pierwszy post na forum więc proszę o wyrozumiałość! Będzie on dotyczył wykonania prostej, 6’o diodowej linijki świetlnej za pomocą Arduino. Wszystkie potrzebne materiały znajdują się w StarterKicie ElektroPrzewodnika Zakupionym w Botlandzie. Zaczynajmy!

 

 

 

Co będzie nam potrzebne?

  • Arduino (w moim przypadku Leonardo),
  • 6 diod,
  • rezystory, których wartości dobieramy zależnie od diody,
  • expander PCF8574,
  • płytka stykowa (opcjonalne).

Dobór rezystorów

Bardzo ważny krok, często jednak pomijany. Dobranie nieodpowiedniego rezystora może skutkować trwałym uszkodzeniem diody! Rezystancję można obliczyć samemu, korzystając z prawa Ohma, lecz po co to robić skoro mamy specjalny kalkulator.

Kod programu

Może wydawać się zagmatwany, jednak wcale taki nie jest! Składa się praktycznie tylko z poleceń

digitalWrite()

i

delay()

Gdy go dokładnie przejrzymy okaże się banalnie prosty!

void setup() {
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);

}

void loop() {
digitalWrite(2, HIGH);
delay(230);
digitalWrite(3, HIGH);
delay(230);
digitalWrite(4, HIGH);
delay(230);
digitalWrite(5, HIGH);
delay(230);
digitalWrite(6, HIGH);
delay(230);
digitalWrite(7, HIGH);
delay(230);

digitalWrite(2, LOW);
delay(230);
digitalWrite(3, LOW);
delay(230);
digitalWrite(4, LOW);
delay(230);
digitalWrite(5, LOW);
delay(230);
digitalWrite(6, LOW);
delay(230);
digitalWrite(7, LOW);
delay(230);

digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
delay(200);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
delay(200);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
delay(200);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
delay(200);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
delay(200);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
delay(200);

digitalWrite(3, HIGH);
delay(230);
digitalWrite(5, HIGH);
delay(230);
digitalWrite(7, HIGH);
delay(230);
digitalWrite(2, HIGH);
delay(230);
digitalWrite(4, HIGH);
delay(230);
digitalWrite(6, HIGH);
delay(230);
}

Oczywiście, można byłoby wykorzystać funkcje własne, lecz nie jest to konieczne. Efektem działania programu jest sekwencyjne mruganie diod. Po wykonaniu wszystkich poleceń program zapętla się w nieskończoność.

Pozostaje tylko pytanie, czemu nie użyłem pinów 1 i 2? Odpowiedzi można udzielać w komentarzach!

Ekspander PCF8574

Jest to układ scalony służący do powielenia pinów cyfrowych naszego mikrokontrolera. Istnieją dwie różne wersje scalaka. PCF8574 ma 7 wyjść, a PCF8575 – 16. To jedyna znacząca różnica.  Najpierw podpinamy expander (nota katalogowa) Urządzenie pracuje na magistrali I2C Znajdują się na nim także 3 piny analogowe, lecz te służą do ustalenia adresu. Ten możemy odczytać za pomocą tego programu. Po prostu wgrywamy go do płytki, po czym uruchamiamy monitor portu szeregowego. Wyświetlą się nam wszystkie adresy urządzeń podpiętych do magistrali I2C. Zapamiętajmy adres naszego expandera. Do obsługi układu potrzebujemy odpowiedniej biblioteki.

Nowy kod programu

Jak zmieni się kod? Otóż, praktycznie wcale! Wystarczy tylko zaimportować bibliotekę “PCF8574” i “Wire.h” (ta druga jest domyślnie w Arduino IDE).

#include <Wire.h>
#include <PCF8574.h>

PCF8574 expander;

void setup() {
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
expander.begin(0x27);

}

void loop() {
expander.digitalWrite(2, HIGH);
delay(230);
expander.digitalWrite(3, HIGH);
delay(230);
expander.digitalWrite(4, HIGH);
delay(230);
expander.digitalWrite(5, HIGH);
delay(230);
expander.digitalWrite(6, HIGH);
delay(230);
expander.digitalWrite(7, HIGH);
delay(230);

expander.digitalWrite(2, LOW);
delay(230);
expander.digitalWrite(3, LOW);
delay(230);
expander.digitalWrite(4, LOW);
delay(230);
expander.digitalWrite(5, LOW);
delay(230);
expander.digitalWrite(6, LOW);
delay(230);
expander.digitalWrite(7, LOW);
delay(230);

expander.digitalWrite(2, HIGH);
expander.digitalWrite(3, HIGH);
expander.digitalWrite(4, HIGH);
expander.digitalWrite(5, HIGH);
expander.digitalWrite(6, HIGH);
expander.digitalWrite(7, HIGH);
delay(200);
expander.digitalWrite(2, LOW);
expander.digitalWrite(3, LOW);
expander.digitalWrite(4, LOW);
expander.digitalWrite(5, LOW);
expander.digitalWrite(6, LOW);
expander.digitalWrite(7, LOW);
delay(200);
expander.digitalWrite(2, HIGH);
expander.digitalWrite(3, HIGH);
expander.digitalWrite(4, HIGH);
expander.digitalWrite(5, HIGH);
expander.digitalWrite(6, HIGH);
expander.digitalWrite(7, HIGH);
delay(200);
expander.digitalWrite(2, LOW);
expander.digitalWrite(3, LOW);
expander.digitalWrite(4, LOW);
expander.digitalWrite(5, LOW);
expander.digitalWrite(6, LOW);
expander.digitalWrite(7, LOW);
delay(200);
expander.digitalWrite(2, HIGH);
expander.digitalWrite(3, HIGH);
expander.digitalWrite(4, HIGH);
expander.digitalWrite(5, HIGH);
expander.digitalWrite(6, HIGH);
expander.digitalWrite(7, HIGH);
delay(200);
expander.digitalWrite(2, LOW);
expander.digitalWrite(3, LOW);
expander.digitalWrite(4, LOW);
expander.digitalWrite(5, LOW);
expander.digitalWrite(6, LOW);
expander.digitalWrite(7, LOW);
delay(200);

expander.digitalWrite(3, HIGH);
delay(230);
expander.digitalWrite(5, HIGH);
delay(230);
expander.digitalWrite(7, HIGH);
delay(230);
expander.digitalWrite(2, HIGH);
delay(230);
expander.digitalWrite(4, HIGH);
delay(230);
expander.digitalWrite(6, HIGH);
delay(230);
}

Co dodaliśmy? Otóż doszła tutaj linijka:

PCF8574 expander;

Deklaruje ona użycie naszego expandera.

expander.begin(0x27);

Ta uruchamia układ scalony. W nawiasie podajemy adres, odczytany wcześniej.

Przed każdym zapaleniem lub zgaszeniem diody pojawia się przedrostek :

expander.

zaznacza on, że wykonujemy operację na pinie expandera, a nie czystego mikrokontrolera. Pamiętajmy, żeby przepiąć piny z Arduino do układu. Oczywiście, piny na które podpinamy diody można dowolnie modyfikować.

Zakończenie

Dziękuję za przeczytanie tego posta do końca! Mam nadzieję, że objaśnił on Wam korzystanie z expandera. Przepraszam za brak zdjęć, ale nie miałem w jaki sposób ich wykonać (uszkodzony aparat :/ ). Zachęcam do komentowania, oceniania, i odpowiadanie na zagadkę! Do zobaczenia w następnym poście!

INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(

Ocena: 1/5 (głosów: 1)

Podobne posty

Jeden komentarz

Odpowiedz

anuluj

Masz uwagi?