Co to jest bargraf? Bar - słupek lub kolumna, graf - wykres. Zbudowany przeze mnie układ umożliwia sterowanie bargrafem złożonym z 8 diod LED poprzez jeden z portów wejściowych kostki NXT. Układ może być przydatny wszędzie tam, gdzie potrzebne jest wyświetlenie czegoś, zwłaszcza w trudnych warunkach oświetleniowych, gdy ekran LCD jest nieczytelny. Możliwe jest wyświetlanie postępu jakiegoś procesu, liczby lub stanu wewnętrznego programu. Można również sygnalizować różne zdarzenia operatorowi, który nie patrzy na ekran.

Sercem układu jest chip PCF8574. Jest to 8-bitowy ekspander I/O współpracujący z interfejsem I²C. Magistrala I²C jest wykorzystywana przez Lego do odczytu czujników cyfrowych, takich jak czujnik ultradźwiękowy. Ja wykorzystałem ją do komunikacji i sterowania diodami LED. Wyjściem z tego układu jest 8 portów cyfrowych wyjścia/wejścia. Ja wykorzystałem funkcję wyjścia każdego portu. Poprzez wysłanie odpowiedniej komendy z programu do czipu, mogę włączyć lub wyłączyć każdy z nich. Porty te nie mogą jednak bezpośrednio sterować diodami LED, gdyż nie zapewniają dostatecznej ilości prądu. Konieczne było zastosowanie układu ULN2803, który wzmacnia sygnał z portów umożliwiając zapalenie diody. Na wejście tego chipu podawany jest bezpośrednio sygnał z ekspandera, na wyjściu znajduje się bargraf diodowy. Zastosowany bargraf ma 10 diod. Sterować programowo można jedynie ośmioma, więc kontrolę nad pozostałymi dwoma pozostawiłem użytkownikowi. Zapalenie ich jest możliwe poprzez zworki. Każda z diod LED potrzebuje opornik. Do diod sterowanych cyfrowo zastosowałem drabinkę rezystorową 8x510Ω, w celu uszczęności miejsca. Dwie diody sterowane zworkami mają osobne rezystory 510Ω. W układie został również zawarty kondensator 100nF oraz dwa rezystory pull-up niezbędne dla linii komunikacyjnych I²C.

W celu oszczędności miejsca, zdecydowałem że w tym i przyszłych projektach nie będę korzystał z wtyczek RJ-12, podobnych do tych standardowych Lego. W zamian zastosuję zwykłe wtyki typu goldpin. Jedyna wada takiego rozwiązania to możliwość podłączenia wtyczki na odwrót. Nie jest to problemem, gdy właściwą stronę oznaczymy na przykład kawałkiem taśmy.

Teraz kilka słów o sterowaniu układem. Czip PCF8574 ma 8 programowalnych adresów. W moim projekcie wybrałem najmniejszy - 0x40. Aby ustalić stan diod należy wysłać poprzez magistralę I2C najpierw ten adres, a następnie bajt (8 bitów) ustalających stan każdej diody. 1 - dioda świeci, 0 - nie. W języku NXC wygląda to tak:
byte x[] = {0x40, 0x01}; I2CWrite(S1, 0, x); Pierwsza linijka tworzy tablicę dwóch bajtów. Pierwszy jest adresem i nie powinien być zmieniany. Drugi jest liczbą szesnastkową 01, czyli binarnie 00000001, oznaczającą zapalenie pierwszej diody. W drugiej linijce znajduje się wywołanie funkcji I2CWrite, która odbłuży komunikację z układem. Pobiera ona 3 argumenty: pierwszy - do którego portu podłączony jest układ (tutaj do pierwszego), drugi powinien mieć wartość 0, trzeci jest nazwą poprzednio utworzonej tablicy bajtów. Należy pamiętać, aby przed jakimikolwiek operacjami wykorzystującymi układ odpowiednio ustawić parametry sensora w programie. Służy do tego funkcja
SetSensorLowspeed(S1); Parametrem tej funkcji jest znów numer portu wejścia do którego podłączony jest układ.

Po lewej znajduje się schemat połączeń elektrycznych układu, a także maska płytki drukowanej oraz opis rozmieszczenia na niej elementów. Kliknij na obraz aby go powiększyć. Każdy może wykonać taki układ samodzielnie. Klikając tutaj możesz pobrać plik projektu płytki w programie KiCad.

Poniżej znajduje się film prezentujący działający układ, oraz kod programu wykorzystanego w tym teście. Zapraszam do komentowania!

Wideo

Galeria

Kod programu

//author: Krzysztof Kapusta, All rights reserved #define BIT1 0x01 #define BIT2 0x02 #define BIT3 0x04 #define BIT4 0x08 #define BIT5 0x10 #define BIT6 0x20 #define BIT7 0x40 #define BIT8 0x80 byte BIT[] = {BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, BIT8}; #define PORT S1 #define ADDR 0x40 task main() { byte buf[2] = {ADDR, 0}; SetSensorLowspeed(PORT); for (int i = 0; i<5; i++) { for (int b = 0; b < 8; b++) { buf[1] = BIT[b]; I2CWrite(PORT, 0, buf); Wait(MS_100); } } for (int i = 0; i<3; i++) { byte con = 0x00; for (int b = 7; b>=0; b--) { for (int x = 0; x<b+1; x++) { buf[1] = con | BIT[x]; I2CWrite(PORT, 0, buf); Wait(MS_70); } con |= BIT[b]; } } for (int i = 0; i<5; i++) { for (int b = 0; b<8; b++) { buf[1] = BIT[b]; I2CWrite(PORT, 0, buf); Wait(MS_40); } for (int b = 7; b>=1; b--) { buf[1] = BIT[b]; I2CWrite(PORT, 0, buf); Wait(MS_40); } buf[1] = BIT[1]; I2CWrite(PORT, 0, buf); Wait(MS_40); } for (int i = 0; i<1; i++) { buf[1] = 0x00; do { I2CWrite(PORT, 0, buf); Wait(MS_50); buf[1]++; } while (buf[1] != 0x00); } for (int i = 0; i<5; i++) { buf[1] = 0xff; I2CWrite(PORT, 0, buf); Wait(MS_400); buf[1] = 0x00; I2CWrite(PORT, 0, buf); Wait(MS_400); } for (int i = 0, int b = 3; i<100; i++) { buf[1] = BIT[abs(b%8)]; I2CWrite(PORT, 0, buf); if (Random(2) == 0) b++; else b--; Wait(MS_50); } for (int i = 0, int b1 = 3, int b2 = 6; i<100; i++) { buf[1] = BIT[abs(b1%8)] | BIT[abs(b2%8)]; I2CWrite(PORT, 0, buf); if (Random(2) == 0) b1++; else b1--; if (Random(2) == 0) b2--; else b2++; Wait(MS_50); } for (int i = 0; i<2; i++) { for (int b = 7; b>=0; b--) { buf[1] = BIT[b]; I2CWrite(PORT, 0, buf); Wait((b+1)*40); } } buf[1] = 0x00; for (int i = 0; i<20; i++) { I2CWrite(PORT, 0, buf); buf[1] |= BIT[Random(8)]; Wait(MS_200); } }

Pokaż/ukryj cały kod

DOWNLOAD

Komentarze

Brak komentarzy. Bądź pierwszy! Dodaj komentarz!

Dodaj swój komentarz