1 marca, 2021 Autor admin Wyłączony

Arduino i pulpit sterowniczy cz. 2

Podchodząc do budowy pulpitu, a zwłaszcza jego elektroniki i programu, w sposób modułowy, mamy już opracowaną koncepcję obsługi guzików, opisaną w pierwszej części. Teraz pora na kolejny krok, czyli koncepcję obsługi diod LED.

Diody będą powiązane głównie z klawiszami odpowiadającymi za przekładanie rozjazdów i będą obrazowały na pulpicie ustawienie rozjazdu. Docelowo na pulpicie znajdować się będą 24 przyciski sterujące 24 zwrotnicami. Niezbędnych jest zatem 48 diod sygnalizacyjnych. Dodatkowo wykorzystane będzie 5 diod do ustawiania sygnałów na semaforach świetlnych. Diody te będą tylko wzorcem, który będzie wybierany przełącznikiem obrotowym i po wybraniu odpowiedniego sygnału (pokazywanego przez te 5 diod) zaakceptowany i „wysłany” do konkretnego semafora za pomocą przypisanego mu przycisku. Ale o tem potem, teraz skupmy się na podłączeniu 48+5 diod LED.

Do tego celu mogę wykorzystać jeden układ MCP23017 opisywany wcześniej, obsługujący 24+5 diod. Dlaczego 24 a nie 48? Otóż każda zwrotnica posiada parę diod, które zapalone są naprzemiennie i nigdy nie świecą obie na raz. Można zatem sterować jedną diodą a stan drugiej uzależnić od stanu pierwszej.

Wszystkie diody (te zwrotnicowe) mogę pogrupować w matrycę – powiedzmy dla przykładu 3×3 diod i połączyć je z MCP23017 wg poniższego schematu.

Gdzie, dla przejrzystości, rzędy będą wyjściami PortuA a kolumny wyjściami PortuB układu MCP23017. A co z drugą parą diod w tandemie? Każdą diodę na w/w schemacie rozszerzam o poniższą konfigurację.

W ten sposób sterowana będzie „DIODA” a „DRUGADIODA” zawsze przybierze stan przeciwny. Kwestia która dioda oznaczać ma który kierunek jest kwestią dopasowania w pulpicie i uwzględnienia w oprogramowaniu. Przykład działania przedstawia poniższy film.

Sterowany górny rząd. Rząd dolny zapalany „automatycznie” z przeciwnym stanem

Do wysterowania 48 diodami wystarczy matryca 5×5, a więc 10 linii podłączonych do MCPO23017. Zajmuje to po 5 bitów każdego z portów. Pozostałe wolne bity będą wykorzystane do wysterowania 5 diod sygnalizatorów, ale o tym w następnych częściach.

Kod programu? Nie wkleję całego kodu programu, gdyż jest to fragment całości a działanie MCP23017 zostało opisane w pierwszej części.

Istotną różnicą jest tylko to, że porty układu MCP23017 konfiguruję jako wyjścia, tj.

//ustawienia portów MCP23017
//ustawienie portu A jako OUTPUT
i2c_start(MCP <<1 | I2C_WRITE);
i2c_write(0x00);i2c_write(0);
i2c_stop();
//zerowanie portu A
i2c_start(MCP <<1 | I2C_WRITE);
i2c_write(0x12);i2c_write(0);
i2c_stop();


//ustawienie portu B jako OUTPUT
i2c_start(MCP <<1 | I2C_WRITE);
i2c_write(0x01);i2c_write(0);
i2c_stop();
//zerowanie portu B
i2c_start(MCP <<1 | I2C_WRITE);
i2c_write(0x13);i2c_write(0);
i2c_stop();

A samo ustawienie stanu wysokiego określonej kolumny i wiersza zrealizować można następująco:

void zapis(byte rej, byte wart)
{
i2c_start(MCP <<1 | I2C_WRITE);

i2c_write(rej);
i2c_write(wart);
i2c_stop();
}

void led(byte r, byte c, byte w)
{
bitWrite(row, r, w);
zapis(0x12,row);
bitWrite(col, c, !w);
zapis(0x13,col);
}

W ten sposób wywołując funkcję np. led(1,1,1) zapalam diodę w wierszu 1 i kolumnie 1 a gaszę ją wywołaniem led(1,1,0).
Dla ułatwienia wszystkie polecenia związane z zapisem danych do MCP23017 „wyciągnąłem” do jednej funkcji.
Warto zwrócić uwagę, że dioda zostanie zapalona jeśli port wierszy (PortA) będzie posiadał stan wysoki a drugi (PortB) stan niski. Dlatego dla określonej diody jej „row” ustawiany jest w stan wysoki (jedynka na odpowiednim bicie) a „col” diody ustawiamy w stan niski, przeciwny do poprzedniego (czyli !w), poprzez zapis zera na odpowiednim bicie.

c.d.n.