Cześć. Jako że to mój pierwszy wpis na majsterkowo zacznę od przedstawienia się. A więc jestem Piotrek i chodzę do III klasy technikum elektronicznego. W zeszłym roku podczas przeglądu przedświątecznego oświetlenia okazało się że moja( nie pierwszej młodości już) gwiazda nie działa. Niestety padł sterownik. A więc na szybko dzień przed wigilią powstał prosty przerzutnik na ne555 z przekaźnikiem. W tym roku postanowiłem wykonać bardziej ambitny układ sterowania. Tak oto powstała moja diodowa gwiazda.
Wykorzystane elementy:
Atmega 328P-PU ( http://nettigo.pl/products/atmega-328-uno-bootloader ) atmega ma już wgrany boootloader
Diody led 3mm
Diody led 5mm
Ekspandery PCF8574( http://nettigo.pl/products/pcf8574-8-bitowy-port-sterowany-i2c-twi )
Tranzystory BC-547
Duuużo rezystorów
BUDOWA GWIAZDY
Oryginalnie w gwieździe zamontowane były żarówki. Jako że chyba wszyscy znamy ich trwałość wymieniłem je na ledy. Mają one wiele zalet przede wszystkim do pracy potrzebują dużo niższego napięcia niż żarówki dzięki czemu są bezpieczniejsze (nie twierdze że oświetlenie żarówkowe jest niebezpieczne ale jednak 12V to nie 230V) ,mają mniejszy pobór prądu, mniejsze wymiary, są dużo trwalsze niż tradycyjne żarówki a także ze względu na mały pobór prądu i niskie napięcie bardzo łatwo sterować nimi za pomocą mikrokontrolerów. W pierwszej kolejności zdemontowałem żarówki z gwiazdy. Znajdowały się ona na ramce w uchwytach. Początkowo miałem zamontować diody o średnicy 10mm w oryginalnych uchwytach, zrezygnowałem jednak z tego pomysłu ponieważ ledy mają stosunkowo mały kąt świecenia i były by bardzo słabo widoczne. Aby zamontować diody musiałem się tych uchwytów pozbyć. A było ich dosyć sporo bo ok. 60 tak więc czekało mnie sporo cięcia. Wykorzystałem do tego multiszlifierkę. Oczywiście można wykorzystać do tego brzeszczot ale komu by się chciało tyle ciąć :) (zwłaszcza że plastik był stosunkowo twardy ). Następnie wygładziłem ramkę pilnikiem a potem wyczyściłem ją jeszcze drobnym papierem ściernym(użyłem papieru o gradacji ok.240). W tak przygotowanej ramce mogłem zamontować diody. Jako że ramka jest stosunkowo wąska musiałem kupić diody o średnicy 3mm. W gwieździe użyłem diód dyfuzyjnych(te mają średnicę 5mm) w kolorze czerwonym a także diód żółtych z soczewką przeźroczystą o kącie świecenia wynoszącym 30 stopni. W ogonie zamontowałem diody białe o kącie świecenia 120 stopni. Należało je teraz jakoś umieścić w ramce. Najlepiej było przewiercić otwory i zamontować w nich diody. Użyłem wiertła 3mm dzięki czemu diody “siedzą” w otworach bardzo ciasno i nie trzeba ich dodatkowo przyklejać. Ledy w ogonie zamontowałem tak aby anoda(dłuższa nóżka diody) była skierowana do góry dołu. Diody znajdują się w odległości 3cm od siebie( można je zrobić częściej na tyle jednak wystarczyło mi diód). W gwieździe znajduje się 30 diód(10 czerwonych,20 żółtych), w ogonie znajduje się ich aż 58 więc wiercenia było sporo. Na koniec zamontowałem tekturową podkładkę która znajdowało się oryginalnie w gwieździe(w niej też musiałem wiercić otwory :) ). Na tym zakończyłem przygotowanie ramki.
LUTOWANIE!!!
Ogon
Aby można było sterować diodami musiałem je ze sobą odpowiednio połączyć. Po długich przemyśleniach zdecydowałem się połączyć ledy w ogonie w “segmenty” w obrębie których diody będą połączone szeregowo ze wspólną katodą. Segmenty te są połączone ze sobą równolegle. Anody(dłuższe nóżki diód) zlutowałem ze sobą lecz tylko w dolnej części gwiazdy.
Segmenty zawierają 3 diody. Dwa segmentu na końcu ogona zawierają 4 diody. A jeden segment (dwie ostatnie diody w 3 części) zawiera tylko 2 diody.
Diody są zasilane prądem stałym o napięciu 12v. Aby się nie spaliły musiałem dobrać odpowiednie rezystory. Rezystor można dobrać korzystając z prawa Ohma lub korzystając z kalkulatorów dostępnych w Internecie. Nie chciałem aby diody świeciły zbyt mocno. W moim przypadku zadowalające efekty uzyskałem stosując rezystory R1-R16 o wartości 4,7kΩ. Rezystory R17i R18 mają wartość 1kΩ, natomiast rezystor R19 ma wartość 20kΩ.
Gwiazda
W gwieździe(nie śmiejcie się z moich bazgrołów :) ) zastosowałem trochę inne połączenia. Tutaj diody połączone są w 3 segmenty po 10 diód każdy w obrębie których diody połączone są równolegle. Segmenty natomiast połączone są ze sobą szeregowo.
Po zlutowaniu całość wygląda tak:
BOOTLOADER
Aby możliwe było zaprogramowanie mikrokontrolera w Arduino IDE trzeba wgrać na niego bootloader Arduino. Aby to wykonać musimy połączyć Arduino z atmegą według poniższego schematu:
W razie niejasności podaje opis połączeń:
13 – 19
12 – 18
11 – 17
10 – 1
ARDUINO – ATMEGA
Kondensatory C1,C2 powinny mieć wartość 22pF, kwarc natomiast 16 MHz.
Na Arduino wrzucamy program „Arduino ISP”.
Plik>Przykłady>Arduino ISP.
Jako programator wybieramy „Arduino as ISP”
Narzędzia>Programator>Arduino as ISP
Sprawdzamy jeszcze raz czy wszystko dobrze połączyliśmy i ustawiliśmy, jeśli tak klikamy
Narzędzia>Wypal bootloader
Jeśli wszystko podłączyliśmy dobrze to po chwili ujrzymy komunikat „Bootloader wypalony pomyślnie”(czy coś takiego :) )
Ten sposób działa na Arduino UNO nie wiem czy na innych płytkach wygląda to tak samo. Bootloader tym sposobem możemy wypalić tylko na mikrokontrolerze takim jaki znajduje się oryginalnie w UNO czyli Atmega 328P-PU.
STEROWNIK
Aby gwiazda wyglądała efektownie musiałem wymyślić do niej sterownik. Oto jego schemat:
„Mózgiem” urządzenia jest mikrokontroler Atmega 328P-PU. Komunikuje się on z dwoma ekspanderami PCF8574A. Komunikują się ona za pośrednictwem znanej i lubianej (przynajmniej przeze mnie J) magistrali I2C(lub TWI).Aby komunikacja przebiegała bez zakłóceń dla linii SDA i SCL zastosowałem rezystory podciągające o wartości 4,7K Ohm. Atmega steruje łącznie 21 tranzystorami BC-547, 16 za pośrednictwem ekspanderów i 5 bezpośrednio. Tranzystory połączone są w układzie wspólnego emitera i pełni rolę przełącznika. Aby nie uszkodzić tranzystora lub mikrokontrolera do bazy tranzystora należy podłączyć rezystor 220 Ohm. Jeśli na wyjściu ustawimy stan wysoki tranzystor zostanie otwarty i diody zaświecą się. Jeśli ustawimy stan niski tranzystor zamknie się i diody przestaną świecić. Ktoś może powiedzieć , że to samo możemy osiągnąć bez tranzystorów podpinając diody bezpośrednio do mikrokontrolera lub ekspandera. Tak, lecz musimy pamiętać o ograniczeniach prądowych. W przypadku Atmegi z wyjścia możemy pobierać maksymalnie 40mA, natomiast w przypadku PCF8574 jest to 25mA w stanie niskim i tylko 3mA w stanie wysokim. Wykorzystanie tranzystorów jest więc konieczne.
Połączenie tego wszystkiego na tzw. „pająka” było by raczej trudne dlatego musiałem zrobić płytkę.
Procesu tego nie będę opisywał ponieważ na Internecie jest mnóstwo poradników. Płytka powstała w programie EAGLE.
Po włączeniu programu ujrzałem taki oto widok:
Po ogarnięciu tego wszystkiego powstała taka oto płytka:
Aby ułatwić sobie lutowanie i poprawić wygląd płytki wykonałem warstwę opisową. Wykonujemy ją takim samym sposobem jak i odbijamy ścieżki z tą tylko różnicą ,że musimy zrobić wydruk w odbiciu lustrzanym. Gotowa płytka wygląda tak:
Ostatnim etapem było lutowanie. Gwiazdę ze sterownikiem połączyłem za pomocą przewodu znalezionego gdzieś w domu. Nie wiem co to był za przewód, ale miał 25 żył co wystarczyło w zupełności do mojego projektu(wykorzystałem 22 żyły).
Aby gwiazda działała należy ją jeszcze zasilić. Sprawę komplikuje fakt, że gwiazda zasilana jest 12V natomiast sterownik 5V. W planach miałem zastosowanie jednego zasilacza 12V i stabilizatora 7805 z braku czasu wykorzystałem dwa zasilacze. Jeden pochodził z wzmacniacza antenowego drugi natomiast ze starej komórki. Masy tych zasilaczy połączyłem.
OBUDOWA
Teraz pozostało tylko znaleźć obudowę dla sterownika i zasilaczy aby chronić je przed wodą i uszkodzeniami. W tym celu wykorzystałem pojemnik śniadaniowy znaleziony gdzieś w kuchni :). Pasował idealnie. Płytki zmontowałem w nim na klej na gorąco. Wiem, nie jest to zbyt dobre rozwiązanie ale czas mnie gonił. Świąt nie da się przesunąć :) .Całość prezentuje się następująco:
PROGRAM
Aby sterownik jak sama nazwa wskazuje sterował gwiazdą trzeba napisać program. Zanim jednak wziąłem się za pisanie musiałem wyznaczyć adresy układu PCF8574A. Jak możecie zauważyć na schemacie 2 układy „spięte” są razem i podłączone do portów I2C mikrokontrolera. Aby Atmega odróżniała te układy i do każdego wysyłała odpowiednie dane układom nadaje się adresy. Układy te wykorzystują 7 bitowy adres. Pierwsze 4 bity nadane są fabrycznie i w przypadku PCF8574A wynoszą 0111. Kolejne 3 bity nadajemy my. Pierwszy układ w moim przypadku piny adresowe A0,A1,A2 ma podpięte do masy a więc wartość bitowa ostatnich 3 bitów wynosi 000. Całościowy adres binarny dla pierwszego układu wynosi więc 0111000. Ostatnim krokiem jest zamiana adresu binarnego(dwójkowego) na hexadecymalny (szesnastkowy). Najprościej skorzystać z konwertera systemów liczbowych, lecz najlepiej zrobić to samemu:
Dzielimy liczbę na 2 części aby wyglądała tak:
011 | 1000
Teraz zamieniamy otrzymane cyfry:
011=120+121+022=11+1*2+0=1+2 = 3
1000=020+021+022+123=0+0+0+1*8 = 8
Wystarczy teraz tylko ponownie „złączyć” cyfry i otrzymamy liczbę 38. Dopisujemy teraz 0x i mamy adres naszego układu 0x38.
Drugi układ ma pierwszy pin adresowy A0 podłączony do 5V,pozostałe piny adresowe A1,A2 podpięte są do masy dlatego adresu drugiego układu wynosi 0111000. Po zamianie na szesnastkowy system liczbowy okaże się że adres drugiego układu to 0x39.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#include <PCF8574.h> #include <Wire.h> PCF8574 expander1; PCF8574 expander2; int i; void onInterrupt() { expander1.checkForInterrupt(); expander2.checkForInterrupt(); } void setup() { expander1.begin(0x38); expander2.begin(0x39); pinMode(2, INPUT); digitalWrite(2, HIGH); expander1.enableInterrupt(2, onInterrupt); } void loop() { i=0; do{ expander2.digitalWrite(i,HIGH); delay(100); i++; }while(i!=8); i=0; do{ expander1.digitalWrite(i,HIGH); delay(100); i++; }while(i!=8); digitalWrite(9,HIGH); digitalWrite(10,HIGH); digitalWrite(11,HIGH); delay(100); i=0; do{ expander2.digitalWrite(i,LOW); delay(100); i++; }while(i!=8); i=0; do{ expander1.digitalWrite(i,LOW); delay(100); i++; }while(i!=8); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(100); } |
Część programu dotycząca obsługi ekspanderów pochodzi ze strony
http://starter-kit.nettigo.pl/2011/11/pcf8574-czyli-jak-latwo-zwiekszyc-liczbe-pinow-w-arduino/
Natomiast pętla loop to już moje dzieło. Jak widzicie program jest bardzo prosty.
Jest to nic innego jak cztery pętle do..while. W pierwszej pętli zapalam segmenty zaczynając od segmentu 0 ( i=0; ). W pierwszej pętli zapalam kolejno segmenty na pierwszym ekspanderze. Jako że jest ich 8 pętla wykona się 8 razy. Kolejna pętla zapala kolejno segmenty na drugim ekspanderze. Potem zapalam diody z końca ogona, które podpięte są do atmegi. Następne dwie pętle wyłączają diody, pierwsza pętla na pierwszym ekspanderze, druga pętla na drugim. Ostatnim krokiem programu jest wygaszenie ostatnich segmentów ogona
Całość prezentuje się następująco:
Uff..koniec. Jeśli dotarliście po końca to gratuluje wam wytrwałości :) . Zachęcam was do oceny i komentowania mojego projektu.
Jak dla mnie świetnie. Jednak mogłeś zamontować cały sterownik po drugiej strony gwiazdy. Znacznie mniej żył w kablu = mniejsze ryzyko uszkodzenia kabla .
No ale i tak wyszło super. Daje 5.
Dobrze wytłumaczone, daję 5!
Ciekawe rozwiązanie. Około 30 lat temu zrobiłem tak działający sterownik, użyłem układów 7400 i dwa 74164. Zastosowałem żarówki 220v i triaki, ze względu na duże koszty i trudną dostępność bez optoizolacji (wspólna masa). Nie polecam tej metody, to była taka niebezpiecza “elektronika ekstremalna” ;)
Projekt z pewnością cieszy przechodniów i należy się pochwała :). Trzy
drobne uwagi :) Bootloader UNO można wgrać samodzielnie (korzystając ze środowiska Arduino), cena
pustej Atmegi 328 np na all to 8zł (zdecydowanie taniej). Zamiast 2 PCFów można użyć jednego MCP23017 (6,90zł na wspomnianym nettigo). “HIGH level output current” dla PCF8547 to jedynie maksymalnie 0,3mA, a nie jak podaje Autor 3mA.
@tmarcin: PCF ma różne obciążenie portów w zależności od stanu.
Drugi układ ma pierwszy pin adresowy A0 podłączony do 5V,pozostałe piny
adresowe A1,A2 podpięte są do masy dlatego adresu drugiego układu wynosi
0111000. Po zamianie na szesnastkowy system liczbowy okaże się że adres
drugiego układu to 0x39.
fajnie wyszło :)