piątek, 24 sierpnia 2012

Gra "teleturniej"

           W obliczu tego że przez dłuższy czas posiadałem kilka niepotrzebnych mikrokontroklerów Attiny2313 i dwa duże wyświetlacze LED postanowiłem je w jakiś twórczy sposób wykorzystać. W ten sposób wpadł mi do głowy pomysł na zbudowanie urządzenia przeznaczonego do przeprowadzania teleturniejów. Głównym jego zadaniem miało być wskazywanie który z graczy pierwszy zgłosił się do odpowiedzi na pytanie. Jednak jak się okazało zostało mi jeszcze sporo miejsca dlatego wprowadziłem parę efektów wizualnych , zapamiętywanie i dokonywanie zmian w aspekcie punktów posiadanych przez danego gracza (w przedziale od 0 - 99) ,a także funkcje pozwalającą wskazać przez urządzenie gracza który wygrał rozgrywkę (bądź też kilku zwycięzców  przypadku remisu) i możliwość uruchomienia sygnalizacji dźwiękowej po skończeniu czasu na odpowiedź (działa to w ten sposób że gdy ustawimy np. 5s to gdy dany gracz
zgłosi się to po 5s dojdzie do "piknięcia" sygnalizującego koniec czasu). Program napisałem w BASCOMIE.

Prezentowane urządzenie jest układem bardzo prostym ale oryginalnym. Nie znalazłem bowiem w internecie

tego typu projektu dlatego postanowiłem go tutaj przedstawić

Kontroler działa na wewnętrznym oscylatorze 8Mhz (m.in. dlatego że chciałem użyć jeszcze portu.a).

Jak wiadomo procesor Attny2313 posiada 17 nóżek uniwersalnego zastosowania. W związku z tym było mi trochę ciasno na podłączenie wszystkiego do uC. Teraz jak patrzę na to z perspektywy czasu (projekt robiłem miesiąc temu) to trochę przekombinowałem i dało by się to wszystko lepiej podłączyć ,ale już trudno (np. można by było przyciski podłączyć w formie matrycy).
Diody w wyświetlaczu oraz 4 diody 10mm steruje multipleksowo więc zajęło mi to w sumie 10 pinów. Ciekawostką jest tu fakt że do załączania tranzystorów kluczujących nie stosowałem 2 wyjść tylko 1 wyjście (ponieważ zbudowałem bramkę NOT przy jednym z tranzystorów kluczujących). Działa to w ten sposób ,że gdy na wyjściu pojawia się stan wysoki to zapala się lewa cyfra, gdy niski zapala się prawa. Dodatkowo 4 wejścia zostały użyte do podłączenia przycisków graczy, a jedno wyjście do buzera. Zostały mi
więc 2 wejścia a ja musiałem jeszcze podłączyć 3 przyciski do wprowadzania ustawień - w związku z tym zdecydowałem się podłączyć tak naprawdę 2 przyciski ,natomiast 3 przycisk zachowuje się tak że zwiera oba przyciski (za pośrednictwem diod prostowniczych).

Program pisałem w BASCOM-AVR, zajął 99% miejsca z pośród 2kb pamięci. Zawsze piszę programy tak aby zapełniały całą dostępną pamięć w procesorze (bo czemu mam nie korzystać z całej pamięci skoro za nią zapłaciłem). Gdy napisze jakiś program i zajmuje on mniej niż się spodziewałem to staram się dodawać nowe funkcje do urządzenia.Tak też było w tym przypadku. Poznałem też kilka trików pozwalających na zmniejszenie objętości programu w BASCOMie (np. kto by się spodziewał że

lepiej użyć kilku poleceń If...End niż logicznych funktorów).

Elektronika została wykonana na bazie dwóch płytek PCB (zaprojektowane w programie Design Spark PCB), jedna parowała katody wyświetlaczy do multipleksów, na drugiej znajdowała się cała elektronika. Urządzenie zasilam 4 bateriami AA (6V). Jak ktoś byłby zainteresowany to mogę udostępnić wzór PCB, ale mogą być problemy co gdzie trzeba podłączyć ponieważ nie posiadam schematu.


Filtr na wyświetlacz wykonałem z foli do przyciemniania szyb. Producent oraz poradnik na który akurat natrafiłem w internecie podawał aby najpierw oczyścić powierzchnię do której przyklejamy folie, następnie spryskać ją roztworem wodnym mydła/ detergentu, a następnie przykleić folię (z foli trzeba było zdjąć warstwę ochronną pod którą znajdował się klej, było to dość trudne i musiałem wspomóc się nożykiem do tapet).


Cała elektronika znajduje się w obudowie wykonanej z pomalowanej na czarno blaszanej puszcze po kremie. Przyciski dla (graczy również wykonane zostały z pojemników po jakiś kremach) połączone są z główną płytką za pomocą metrowych przewodów.


Jeśli chodzi o obsługę praktyczną to z grubsza widać to na filmie:
  FILM



 
"Jednostka centralna" urządzenia


                                               Urządzenie w całości - razem z przyciskami

Kiedy uruchomimy układ pojawia się kilku sekundowa animacja, następnie układ czeka (wyświetla wtedy 2 poziome kreski) na naciśnięcie przycisku przez któregoś z użytkowników.
W tym momencie mamy także możliwość ustawienia czasu jaki gracz będzie posiadał na dokonanie odpowiedzi (po jego minięciu usłyszymy "piknięcie"(można też ustawić "00" i wtedy czas na odpowiedź będzie nieograniczony). Służą do tego przyciski "góra" i "dół" obok wyświetlacza. Gdy naciśniemy któryś z tych przycisków układ na kilka sekund pokaże aktualną wartość po czym wróci dalej do trybu "czuwania" (pokaże znów poziome kreski). Jeśli jednak szybko zwolnimy przycisk i jeszcze raz go naciśniemy będziemy mogli dokonać zmiany. Na uwagę zasługuje tu system tzw. "inteligentnego przycisku". Rozbudowałem go nieco względem mojego wcześniejszego projektu.Działa on teraz tak że szybkie zmniejszanie/ zwiększanie wartości zmiennej odbywa się dopiero gdy użytkownik przytrzyma przycisk co najmniej sekundę. Zacznie ułatwia to precyzyjne wpisywanie danej wartości.

Kiedy natomiast w trybie "czuwania" naciśniemy środkowy przycisk urządzenie wyświetli animacje oraz wskaże który z uczestników otrzymał największą ilość punktów (może też wskazać remis) - zwycięzca wskazany jest za pomocą diod 10mm natomiast ilość punktów ,które zgromadził pokazuje wyświetlacz LED. W tym momencie przyciski "góra" i "dół" są nieaktywne natomiast przycisk "środkowy" przenosi nas znowu do trybu "czuwania".

Kiedy układ jest w trybie "czuwania" a któryś z graczy naciśnie swój przycisk,urządzenie pokazuje ilość punktów zgromadzoną przez tego gracza (i jednocześnie blokuje przyciski innym graczom dzięki czemu wykrywa różnice w zgłoszeniu się uczestników na poziomie kilku ms), przyciski "góra", "dół" służą do zmiany ilości punktów (tu też działa system "inteligentnego przycisku") a przycisk "środkowy" pozwala na powrót
do trybu "czuwania".

Starałem się wyeliminować wszystkie błędy mogące prowadzić do nieoczekiwanego zachowania układu bądź jego zawieszenia. Np. gdy kod był jeszcze "nie oczyszczony z wszelakich błędów" pojawiały się problemy tego typu że np. wciśnięcie kilku przycisków na raz (w konfiguracji nieprzewidzianej przez program) powodowało problemy w działaniu - teraz tego typu sytuacje są zażegnane.

Errata: Program posiada jedną wadę której nie udało się wykryć podczas testów (i tak już niestety zostanie, poza tym i tak nie wiem czy naprawa tego błędu zmieściła by się w programie). Wada ta związana jest z "piknięciem" sygnalizującym użytkownika o zakończeniu czasu na odpowiedź. Otóż gdy uruchomimy funkcję wskazującą zwycięzce to układ również piknie po żądanym czasie. 


Po opublikowaniu projektu na forum elektroda.pl poproszono mnie o udostępnienie wzoru PCB i programu. Wzór ścieżek w PDF i źródło programu zamieściłem w jednym ze swoich postów w temacie w którym opisuje to urządzenie na forum: LINK  
(proszę spojrzeć na post z 23 września) .

piątek, 13 lipca 2012

Zegar LCD z podświetleniem RGB


Ostatnio zdecydowałem się zrealizować nieco ambitniejszy projekt - "Zegar LCD z podświetleniem RGB".
Ponieważ postanowiłem podciągnąć/ sprawdzić swoje umiejętności programowania / obsługi AVRów zdecydowałem się stworzyć trochę bardziej zaawansowany zegarek ( w oparciu o BASCOMa). Wyposażyłem go w wyświetlacz LCD co czyni go trochę bardziej nieczytelnym , za to dało mi większe pole manewru w tworzeniu funkcji zegarka. Nieczytelność tutaj jednak w niczym
nie przeszkadza ponieważ zegarek stoi na biurku. Very Happy

Zegar ten wyposażony jest w funkcje ustawiane w menu w którym istnieje możliwość:
Arrow ustawienia godziny (z dokładnością do godzin i minut)
Arrow ustawienia dni tygodnia
Arrow ustawiania daty (z uwzględnieniem lat przestępnych co 4 lata - jedyny mankament to to że mój zegarek bezwzględnie trzyma się zasady "co cztery lata rok przestępny" w skutek czego rok "00" uznaje zawsze za rok przestępny mimo iż w rzeczywistości zazwyczaj rok ten jest zwykły (wbrew zasady co 4 lata rok przestępny) np. 2000 był przestępny ale 2100 , 2200, 2300 już nie będzie przestępny.Miałem pomysł wprowadzenia możliwości zmiany przez użytkownika
czy rok "00" ma być przestępny czy zwykły ,ale zabrakło miejsca w programie, więc za niespełna 90 lat ktoś będzie miał problem Wink.
Arrow ustawienia budzika (dla każdego dnia tygodnia budzik ustawiamy niezależnie , ponadto możemy również zdecydować
czy chcemy aby w dany dzień budzik dzwonił czy nie.)
Arrow wybór bajerów wizualnych - diody LED (możemy tu wybrać podświetlenie RGB w jednym z następujących trybów: wyłączony, efekt tęczy [płynnie zmieniające się podświetlenie RGB - sterownie poprzez programowy PWM], efekt skokowy [różne kolory zmieniające się skokowo], kolor czerwony, zielony, niebieski, fioletowy, różowy, żółty, pomarańczowy, biały; istnieje też możliwość włączenia/ wyłączenia podświetlenia wyświetlacza LCD)
Arrow Zmiana czasu ( w tej sekcji menu mamy możliwość zadecydowania czy chcemy aby zegarek automatycznie przestawiał nam godzinę z czasu letniego na zimowy i odwrotnie - "tryb auto" lub "tryb manualny")

Przy ustawianiu godziny, budzika i daty mamy uruchomioną tzw. funkcje "inteligentnego przycisku" czyli trzymamy przycisk cały czas wciśnięty a on z dużą szybkością powiększa daną wartość.

Mamy 4 przyciski:
1) Służy do przechodzenia do kolejnych sekcji w menu. Po przejściu całego menu wracamy na ekran główny na którym wyświetlony jest w lewym górnym
rogu dzień tygodnia, w prawym górnym data i na dole godzina z uwzględnieniem sekund; gdy budzik dzwoni przycisk ten służy do wyłączenia budzika
2) Przycisk do ustawiania godziny, dnia tygodnia (przewiń w górę), dnia miesiąca, godziny budzika, wyboru podświetlenia LED (przewiń w górę),
zmiany czasu z letniego na zimowy (zamienia auto na manualny i odwrotnie).
3) Przycisk do ustawiania minuty, dnia tygodnia (przewiń w dół), miesiąca, minuty budzika, wyboru podświetlenia LED (przewiń w dół),zmiany czasu z letniego na zimowy (zamienia auto na manualny i odwrotnie).
4) Przycisk do ustawiania roku, ustawiania czy włączamy/ wyłączamy budzik na dany dzień, włączanie/ wyłączanie podświetlenia LCD, gdy budzik dzwoni uruchamiamy tym przyciskiem drzemkę

W przypadku uruchomienia się budzika przez pierwszą minutę piszczy dość spokojnie, po minucie wchodzi w tryb "wzmożonego budzenia" Wink - wiadomo o co chodzi, często stosowane w tradycyjnych budzikach.
Mamy możliwość uruchomienia sobie drzemki na 5 minut - za pomocą przycisku lub pilota - nie stosuje tu żadnego kodowania - układ działa w sposób załącz/ rozłącz, dzięki temu drzemkę można uruchomić nie wstając z łóżka (opcja dla leniuchów).

Oczywiście poza tym istniej także możliwość całkowitego wyłączenia budzika (gdy zadzwoni) za pomocą jednego przycisku. Dodatkowo o pełnych godzinach zegarek generuje piknięcie - dzięki czemu człowiek może utrzymać lepsze poczucie czasu nawet nie spoglądając na zegarek.

Niestety obsługa wyświetlacza LCD przez program okazała się na tyle powolna że dioda RGB (kiedy była obsługiwana przez programowy PWM) przygasała, gdy następowała zmiana treści wyświetlacza - w moim wypadku działo się to co sekundę. Zdecydowałem się więc dodać warunek w programie powodujący, że w czasie świecenie diód RGB sekundy są zawsze wyzerowane (chociaż w rzeczywistości inkrementują się w pamięci procesora).

Obudowa została wykonana z pleksi (aby ładnie się mogła podświetlić przez diody RGB). Chociaż dysponuje opalarką i kiedyś wyginałem plekse tym sposobem to postanowiłem jednak nie ryzykować i użyłem gotowej ramki na zdjęcia ,którą odpowiednio dociąłem.
Na przodzie ramki namalowałem pusty w środku prostokąt tak aby zasłonić zieloną płytkę modułu wyświetlacza.
Moduł wyświetlacza skręciłem z własną płytką PCB i z tyłu z pomalowaną na czarno płytką pleksy za pomocą śrub M3 x 30mm (domyślny otwór w module LCD jest minimalnie mniejszy niż 3mm ,więc musiałem go rozpiłować iglakiem). Następnie utworzoną w ten sposób "kanapkę" przykleiłem do ramki  z pleksy za pomocą kleju na bazie cyjanoakrylu - używałem odrobiny, nałożyłem za pomocą pędzla tak aby nie rozlał się na wyświetlacz lub na obudowę. Po bokach użyłem czarnej izolacji.

Cała elektronika sprowadza się w zasadzie do procesora Atmega8A taktowanego kwarcem 16 Mhz (odciągnięty przez 2 kondensatory 15pF do GND). To właśnie na tym układzie spoczywa cała odpowiedzialność dotycząca dokładności zegara ,bowiem nie użyłem zegara czasu rzeczywistego (co to za robienie zegara jak się używa układu, który już sam w sobie jest zegarem Wink ). Tak na prawdę powodem takiego stanu rzeczy była chęć jak największego uproszczenia płytki PCB. Napięcie pobieram z ładowarki od telefonu - jest ono następnie stabilizowane przez popularny stabilizator 5v. Filtracją przy stabilizatorze zajmują się 2 kondensatory 220 uF ;przy scalonym czujniku ir (TFMS 5560 na 56khz - jak sama nazwa wskazuje) zastosowałem 4,7 uF; przy procku 100nF.
W pilocie użyłem natomiast Attiny13A taktowanego częstotliwością 4,8 Mhz (aby marnowało się mniej prądu). Ma on za zadanie generować sygnał ir z częstotliwością 56khz. Do zasilania użyłem pastylkowej baterii 3v. Obudowa składa się z 2 pomalowanych na czarno płytek pleksi oklejonych po bokach izolacją.

Zliczanie sekund odbywa się w przerwaniu (z preskalerem równym 1024).
16 000 000 / 1024 = 15625
65535 to maksymalna wartość timera, ale przerwanie następuje dopiero gdy timer się "przekręci" więc doliczamy jeszcze jeden.
65535 + 1 - 15625 = 49 911 ( wychodzi 49 911 - w praktyce działa dokładniej przy wartości 49 910 i taką też mam aktualnie wgraną do procka).
Przy wartości 49911 uzyskałem dokładność 4s / 12h pomiędzy godziną 24 a 12( a więc średnia temperatura utrzymała się na poziomie przeciętnym - trochę w nocy/ trochę w dzień) - zgonie z http://linker2.w.interia.pl/pliki/zegar.htm
Później ustawiłem 49910 i uzyskałem dokładność niemal idealną (na 12h według zegara online) dzięki czemu mój zegarek już nie ustępuje przeciętnym zegarkom w tej kwestii.
Z obliczeń wynika że wpisanie do timera jeszcze mniejszej wartości spowodowało
by zbyt duży odchył i zegar zaczął by się późnić zamiast spieszyć. Uznając jeszcze, że w zimie kwarc może zacząć działać nieco wolniej zdecydowałem się  użyć wartości 49910.

Zdecydowanie najdłuższą fazą budowy było pisanie programu. Szybko wypełniłem całe 8kb wolnego miejsca i zdecydowanie większość czasu spędziłem nad optymalizacją kodu tak żeby upchnąć w niego jeszcze funkcje RGB, polskie znaki, lata przestępne i kila innych rzeczy. Niestety nie zdołałem zmieścić już możliwości zamiany roku "00" na rok zwykły o czym już wcześniej wspominałem. Gdybym mógł dodał bym też opcje która pozwalała by dobrać użytkowniki wartość wpisywaną do timera z poziomu menu tak żeby każdy mógł sobie go uregulować we własnym zakresie . Miałem też pomysł na funkcje "autokorekty" (np. co tydzień) ,którą by sobie mógł użytkownik sam ustawić ,ale tego też nie zrealizowałem.

Programu nie zamieszczę - może kiedyś to zrobię w ramach kursu, ale nie teraz. Schematu w ogóle nie robiłem (wszystko mam w głowie). Mam za to płytkę PCB robioną w eaglu - zamieszczam jej plik w formacie PDF - mogą być jednak pewne problemy z jej "ogarnięciem" bowiem w większości nie korzystałem z bibliotek tylko rysowałem po prostu pady pod dane elementy (jedyne elementy biblioteczne to LCD i procesor). Na płytce na szczęście nie pojawiły mi się żadne błędy ( mimo iż wbrew temu co piszą inni tworzę PCB od zera bez rysowania schematu). Płytka została wykonana domowym sposobem metodą termo transferu. Wzór ścieżek odbiłem na ksero (na śliski papier kredowy) a następnie oczyściłem (wodą i rozpuszczalnikiem) i zmatowiłem laminat. Wzór przeniosłem za pomocą żelazka - używam jakiegoś starego żelazka bez regulacji temperatury. Przykręcam je "do góry nogami" w imadło. Najpierw je nagrzewam ,potem gdy stygnie sprawdzam temperaturę i gdy jest już odpowiednia(kartka żółknie, ale nie pali się) umieszczam na niej płytkę w papierowej kopercie (od niezadrukowanej strony do żelazka) i przygniatam żelaznym klocem. Następnie w ciepłej wodzie z proszkiem do prania odrywam papier od laminatu. Nic nie musiałem poprawiać - gdyby jednak zaszła taka potrzeba używam pisaka wodoodpornego.Płytkę następnie wytrawiłem w roztworze nadsiarczanu sodu (stęż ok. 1 miary na 5 miar wody)Po trawieniu
toner zmyłem rozpuszczalnikiem .Płytka wyszła mi bardzo dobrze, najlepiej z dotychczasowych prze zemnie tworzonych, zapewne dlatego że w odróżnieniu od poprzednich była jednostronna i użyłem zdecydowanie większej grubości ścieżek i padów. Otwory wywierciłem malutką wiertarką za pomocą wiertła 0.8 mm. Do lutowania używałem cyny z kalafonią i dodatkowej kalafonii ,którą nanosiłem pędzlem. Niestety pod procesor musiałem użyć zwykłej podstawki ,bo taką akurat dostałem w sklepie. Podobnie wykonałem płytkę do pilota.

Poniżej zamieszczam zdjęcia z budowy: 



 


A tutaj już widzimy gotowy pilot i zegar:



 Opinie kolegów z forum "elektroda.pl" zmobilizowały mnie do usunięcia izolacji w zegarku i pilocie. Nową obudowę wykonałem z pomalowanej na czarno blachy. Teraz urządzenie prezentuje się w następujący sposób:






 Projekt został też opisany na forum elektroda.pl. W opisie na tejże stronie (OPIS) istnieje możliwość bezproblemowego pobrania płytki PCB w formacie PDF. Nic tylko pobierać, spoglądnąć na zdjęcie przedstawiające moją zlutowaną płytkę i ćwiczyć / uczyć się programowania. Zapraszam również do obejrzenia filmu prezentującego działanie tego urządzenia. FILM

środa, 6 czerwca 2012

Podstawowe dyrektywy języka BASCOM.



      
     W tym artykule zajmę się opisywaniem podstawowych dyrektyw języka BASCOM bez których program nie mógł by działać. Wszystkie kody źródłowe zamieszczone w tej serii artykułów są kompatybilne z mikrokontrolerem Attiny2313 lub Atmega88 (ewentualny zamiennik to Atmega8A). Pierwsze ćwiczenia zostaną zrealizowane na Attiny 2313, natomiast kolejne (już bardziej zaawansowane) na Atmedze88. Najprawdopodobniej ukażę się także prezentacja płytki testowej stworzonej specjalnie na potrzeby tego cyklu artykułów. Będzie to istotne kiedy przejdziemy do ćwiczeń praktycznych.
 Pierwszą z wcześniej wspomnianych dyrektyw jest polecenie config służące do ustalenia które bity danych portów mają zostać wejściami a które wyjściami. Polecenie Input oznacza wejście ,a Output wyjście. Wejście jak sama nazwa wskazuje stanie się nogą procesora odbierającą informacje (będą tam więc podłączone np. przyciski lub czujniki) , natomiast wyjścia będą wysyłać dane (podłączymy tam np. diody LED lub też tranzystory sterujące - np. silnikami itp.) Przykład takiej konfiguracji to:

Config Pind.0 = Input  
Config Pind.1 = Input
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.5 = Input
Config Pind.6 = Output
Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Input
Config Pinb.3 = Input
Config Pinb.4 = Output
Config Pinb.5 = Output
Config Pinb.6 = Output
Config Pinb.7 = Output

Z wyżej przedstawionego fragmentu programu  wynika ,że nóżki o numerach od 0 do 5 portu d staną się wejściami. Jedynie nóżka 6 portu d zostanie wejściem. W porcie b bity od 0 do 3 są wejściami, natomiast od 4 do 7 wyjściami. Zwróć uwagę, że  mikrokontroler Attiny2313 posiada 7 bitów portu d oraz 8 bitów portu b. Taka konfiguracja zajmuje bardzo dużo miejsca w programie (w pamięci FLASH zajmie tyle samo ile niżej przedstawione rozwiązania ,ale chodziło mi o to ,że zmniejsza czytelność zapisu - lepiej zrobić to krócej) Istnieje więc możliwość skonfigurowania całego portu za jednym razem.

Config Portd = Input
Config Portb = Output


 Takie rozwiązanie wygląda już znacznie bardziej elegancko ,jednak nie daje nam możliwości niezależnego kontrolowania poszczególnych bitów. Możemy jedynie zdecydować ,aby wszystkie nóżki mikrokontrolera należące do danego portu zostały  wyjściami bądź wejściami. W wyżej przedstawionej sytuacji cały port d przeznaczyłem jako wejście a port b jako wyjście.               


Istnieje jednak sposób na niezależne konfigurowanie poszczególnych bitów a przy tym zachowanie krótkiego zapisu, który wykorzystuje system zero-jedynkowy. Cyfra 0 oznacza tu wejście natomiast wyjście to cyfra 1. Polecenie to wygląda w następujący sposób:


Config Portd = &B1000000
Config Portb = &B11110000


  Powyższy zapis oznacza to samo co pierwszy a przy tym jest o wiele krótszy. Bit nr 0 (najmłodszy) to ten ,który został umieszczony jako pierwszy z prawej strony. Kolejne cyfry  oznaczają kolejne piny danego portu. Znaki &B uprzedzają kompilator ,że liczba która za nimi stoi  zapisana jest w systemie binarnym. Istnieje bowiem możliwość jeszcze krótszego zapisu z wykorzystaniem systemu dziesiętnego. Po prostu zamieniamy system zapisu z zero-jedynkowego na dziesiętny i usuwamy znaki &B.

Config Portd = 63
Config Portd = 15


To wszystkie z możliwości konfiguracji wejść i wyjść w języku BASCOM. Z których będziesz korzystać musisz zdecydować sam. Ja używam przedostatniego sposobu ze względu na dość wysoką czytelność przy krótkim zapisie. Sposób ten jest preferowany nie tylko przeze mnie ale i zapewne przez większość ludzi zajmujących się pisaniem takich programów.
Poza konfiguracją portów na początku pisania programu należy zdecydować także jaki stan spoczynkowy będą posiadać nóżki naszego mikroprocesora. Są to stany wysokie(1) lub niskie(0) które przybiorą bity wyjść i wejść  zaraz po uruchomieniu programu. Jeśli dana noga procesora przyjmie stan niski (0) oznacza to ,że posiądzie potencjał masy - a więc jeśli będzie do niej podłączony przewód do plusa to popłynie prąd (w przeciwnym razie nie). I analogicznie w drugim wypadku. Jeśli dana noga procesora przyjmie stan wysoki (1) oznacza to ,że stanie się jakby "plusem" - a więc jeśli będzie do niej podłączony przewód do masy to popłynie prąd (w przeciwnym razie nie).Podczas jego działania mogą one zmieniać swoje wartości (wszystko zależy od programu).Można to zrobić w dwojaki sposób.

Portd.0 = 0
Portd.1 = 0
Portd.2 = 0
Portd.3 = 0
Portd.4 = 0
Portd.5 = 0
Portd.6 = 0
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Portb.5 = 0
Portb.6 = 0
Portb.7 = 0      
                                                                                                                                                                  Albo krótszy zapis, który ja preferuję:                                                                                                                                         
Portd = &B0000000
Portb = &B0001111


Podobnie jak przy konfiguracji możemy to zapisać w jeszcze krótszy sposób z udziałem systemu dziesiętnego. Obowiązują tu takie same zasady tzn. usuwamy znaki  &B.

Portd = 0
Portb = 15


Kolejną bardzo ważna dyrektywą jest polecenie Do…Loop . Jest to nieskończona pętla. Polecenia zawarte pomiędzy członem Do a Loop są wykonywane w kółko. Przyjrzyjmy się poniższej części kodu:

Do
Polecenie 1
Polecenie 2
Polecenie 3
Loop


Taki zapis oznacza że procesor najpierw wykona polecenie pierwsze ,potem drugie , następnie trzecie i wróci na początek pętli by znowu wykonywać polecenie pierwsze itd. Gdybyśmy nie zastosowali pętli Do…Loop wówczas polecenia zostały by wykonane a następnie procesor przestałby pracować. Należało by go zresetować ,aby ponownie wykonał program. W późniejszych artykułach ,kiedy zajmę się praktycznym wykorzystaniem poznanej wiedzy dobrze zrozumiesz sens tej dyrektywy.


Ostatnie z ważnych poleceń jest dyrektywa End. Kończy ona po prostu program. Należy umieścić ją na końcu kodu źródłowego. Chodź nie zawsze. Bowiem jeśli wykorzystujemy przerwania lub podprogramy to one znajdują się na końcu. Lepiej jest więc stwierdzić ,że umieszczamy polecenie End zawsze zaraz za poleceniem Loop.


Przy pisaniu programu niezwykle pomocne, choć nie niezbędne są komentarze. Pozwalają one w „ludzki” sposób opatrzyć dane polecenia programu wyjaśnieniami co miałeś na myśli. Aby napisać komentarz należy użyć znaku „” lub polecenia Rem. W komentarzach możemy napisać co chcemy i nie wpływa to na działanie programu. Po prostu ułatwiają one późniejszą analizę programu.
Na zakończenie chciałbym przedstawić najprostszy (w zasadzie nie jest najprostszy ,ale możemy tak przyjąć ponieważ będzie stanowił dla nas niejako bazę do tworzenia kolejnych programów)  możliwy program. Mikrokontroler zaprogramowany w ten sposób nie będzie jednak  wykonywać żadnych zadań.


Config Portd = &B1000000                              ‘konfiguuruję portd
Portd = &B0000000                                          ‘ustawiam stany spoczynkowe
Config Portb = &B11110000                            ‘konfiguruję portb
Portb = &B0001111                                          ‘ustawiam stany spoczynkowe
Do                                                                      Rem początek pętli
Loop                                                                  ‘koniec pętli
End                                                                   ‘koniec programu


W zasadzie polecenie Do…Loop jest tu niepotrzebne, ale  chciałem wykorzystać wszystkie dyrektywy ,które poznaliśmy w tym artykule. Myślę ,że nie ma sensu wgrywać go do procesora ,ponieważ i tak nie zauważymy różnicy w jego działaniu.

Na koniec warto wspomnieć jeszcze o dwóch poleceniach kompilatora odpowiedzialnych za ustawienie zewnętrznego taktowania i typu procesora. Są to $regfile (określa model mikrokontrolera) i $crystal (określa częstotliwość kwarcu wyrażoną w hz). Polecenia te wpisujemy na początku programu np. :

$regfile = "2313def.dat"   
$crystal = 4000000 
 
Powyższy zapis oznacza ,że pracujemy na uC - attiny2313 z taktowaniem 4Mhz = 4000000hz. Należy również  pamiętać, że do nazwy procesora dodajemy rozszerzenie .dat . Ja jednak nie umieszczam tych informacji w programie. Zamiast wpisywać te polecenia w tekst programu wygodniej dokonać koniecznych zmian w zakładce "Options" (ikona zębatki na górnym pasku menu). Mamy tam możliwość wskazania procesora ,który używamy oraz taktowania współpracującego z nim kwarcu (bądź też oscylatora wewnętrznego czy np. generatora częstotliwości)
                               Options - Compiler - Chip - w oknie Chip wybieramy 2313.dat 
                               Options - Compiler - Communication - w oknie Frequency wybieramy 4000000

Jeśli w programie wpiszemy sprzeczne dane względem tych zawartych w ustawieniach to dane w ustawieniach zostaną zignorowane.Należy jednak zaznaczyć, że polecenie  nie ingeruje w fusebity mikrokontrolera i nie spowoduje przestawienia kwarcu (należy to zrobić za pomocą AVR studio tak jak pokazałem w ostatnim artykule). To polecenie jedynie informuje BASCOMA z jakim kwarcem będzie współpracował. Ma to istotne znacznie zwłaszcza przy obsłudze poleceń takich jak wait, waitms , waitus, lcd itp.Dokładnie przyczynę tego zjawiska omówię w kolejnych częściach artykułu.

piątek, 1 czerwca 2012

Mikrokontrolery od strony technicznej, systemy zapisu liczb i operatory logiczne

    
      Język BASCOM nie wymaga od programisty szczególnej znajomości budowy mikroprocesora. Jednak aby móc skutecznie pisać programy należy zapoznać się przynajmniej z podstawami tego zagadnienia. Mikrokontrolery AVR są to procesory 8 bitowe. Oznacza to ,że w jednym cyklu potrafią przetworzyć 8 bitów danych czyli jeden bajt.  Bit jest to najmniejsza jednostka informacji dla mikrokontrolera. Może ona przyjąć stan wysoki (1) lub niski (0).  Cykle w pracy mikrokontrolera generuje rezonator kwarcowy. Każdy z takich generatorów ma określoną częstotliwość np. 8Mhz.  Liczba Mhz oznacza ilość milionów cykli wykonywanej w jednostce czasu ( w tym wypadku sekundzie). Wcześniej wspomniana częstotliwość 8Mhz oznacza ,że kwarc wytwarza 8000000 cykli na sekundę. Czym szybszym  kwarcem dysponuje mikrokontroler tym dokładniej potrafi działać.  Do bezproblemowego działania kwarcu niezbędne są również kondensatory ceramiczne o pojemności rzędu kilkudziesięciu bądź kilkunastu pF (zazwyczaj uC działa także bez tych kondensatorów ja jednak dla bezpieczeństwa stosuje 2x kondensator 15pF) . Jednak istnieje możliwość rezygnacji  z zewnętrznego rezonatora i korzystania z wewnętrznego taktowania (w wypadku attiny2313 domyślnie jest to 1Mhz , można wykorzystać także większe częstotliwości jednak w porównaniu do zewnętrznego kwarcu dokładność wewnętrznego oscylatora pozostawia wiele do życzenia). Wówczas poza kwarcem nie podłączamy także kondensatorów.

Kolejnym zagadnieniem dotyczącym obsługi mikrokontrolera jest funkcja reset, będąca jedną z nóżek naszego procesora. Reset pozwala na natychmiastowe przerwanie działania programu i uruchomienie go od początku. Aby uruchomić funkcje reset należy połączyć nóżkę reset z potencjałem masy. Aby mikrokontroler poprawnie działał jednocześnie nóżka reset powinna być połączona z plusem zasilania za pomocą rezystora o oporze 10kohm. Dodatkowo dla pewności nóżkę reset można połączyć z masą za pomocą kondensatora ceramicznego 10nF. Poprawne połączenie kwarcu wraz z kondensatorami oraz resetu do mikroprocesora przedstawia poniższy rysunek:




Na powyższym schemacie uwzględniłem kondensator filtrujący napięcie - powinien być ceramiczny o pojemności przynajmniej 10nF (najlepiej więcej - nawet do 100nF). Ulokować należy go jak najbliżej zasilania. Jest to bardzo istotne jednak często pomijane przez początkujących. Bez użycia tego kondensatora mikroprocesor może przejawiać dziwne zachowania - np. czasem układ uruchamia się , innym razem nie. Niekiedy występuje efekt "palucha" :) polegający na samoistnym restarcie uC pod wpływem dotknięcia jego obudowy. Wiele osób przygląda się wówczas ze zdziwieniem jak za sprawą dotknięcia czarodziejskiej różdżki układ się wyłącza. Kierunek podłączenia tego rodzaju kondensatora (ceramicznego) jest dowolny.
Ponad to wyżej zamieściłem także rezonator kwarcowy. Podobnie jak kondensator ceramiczny możemy podłączyć go w dowolnym kierunku. Dodatkowo obie nogi kwarcu odciągamy do masy 2 kondensatorami - czasem działa bez tych kondensatorów ale nie warto ryzykować. Dokładna wartość tych kondensatorów zamieszczona jest w nocie katalogowej konkretnego układu (zależy ona od częstotliwości kwarcu i modelu uC). Ja zazwyczaj stosuje ok. 15 pF - nie można użyć zbyt dużych pojemności bo wówczas sygnał z kwarcu będzie "ścianny" i nie dotrze do procesora. Warto wziąść także pod uwagę ,iż procesor taktowany wyższą częstotliwością wymaga większego napięcia zasilania (np. Atmega8A może być zasilana napięciem 2,7v - 5v jednak jeśli użyjemy kwarcu 16Mhz minimalne napięcie zasilania wynosi 4,5v).
Aby zmusić procesor do współpracy z zewnętrznym kwarcem (domyślnie jest wewnętrzny) należy zmienić ustawienie fusebitów - bitów konfiguracyjnych. Można dokonać tego np. za pomocą wcześniej opisanego programu - AVR studio.  Po połączeniu się z programatorem (co opisałem w poprzednim artykule) należy wybrać zakładkę "Fuses" i z rozwijanej listy "SUT_CKSEL" wybrać opcje odpowiednią dla danego kwarcu.


Poniżej przedstawiam wariant z ustawieniem dla zewnętrznego rezonatora 16 Mhz 
Ext.Crystal/Resonator High Freq- oznacza że mówimy o zewnętrznym kwarcu
Start-up time: 16K CK  - oznacza ,że uruchamiamy kwarc o częstotliwości 16Mhz
+ 64ms - oznacza ,że procesor uruchomi się po czasie 64ms od włączenia zasilania. Można ustawić większą szybkość, ale wówczas procesor będzie działać mniej stabilniej. Następnie klikamy "Program".

Przy ustawianiu fusebitów należy zachować ostrożność ponieważ przypadkowe ustawienie jakiegoś innego fusebita może zablokować procesor. Możemy np. wyłączyć wejście RESET co spowoduje uniemożliwienie programowania uC normalnym programatorem. Co więcej jeśli zaprogramujemy dany kwarc ,ale nie podłączymy go ,albo podłączymy inny kwarc (lub np. generator częstotliwości) procesor także nie będzie działać.


Ostatnia kwestia dotyczy odciągnięcia RESETU. Zawsze, nawet gdy go nie używamy należy odciągnąć go rezystorem 10kohm do VCC. Jeśli chcemy w naszym układzie uwzględnić przycisk reset to dodatkowo odciągamy wejście RESET przez ten przycisk do plusa.


Teraz przejdę do omówienia pamięci. Mikroprocesor  posiada jej 3 rodzaje:

Pamięć FLASH W niej zapisywany jest program ,a więc instrukcja działania mikrokontrolera. Pamięć ta ulega zmianie jedynie wówczas ,gdy zdecydujesz się zaprogramować procesor. Podczas zaniku zasilania pamięć FLASH nadal pozostaje niezmieniona.  Jest to pamięć najmniej wytrzymała na przeprogramowanie (zazwyczaj możemy wykonać ok. 1000 przeprogramowań). Informacje w niej zawarte można porównać do BIOSU komputera.

Pamięć RAM (Inna nazwa SRAM)Jest to pamięć w której zapisywane są informacje wybierane przez mikroprocesor na podstawie programu zapisanego w pamięci FLASH (np. wartości zmiennych). Informacje zawarte w pamięci RAM bardzo często ulegają zmianie podczas działania programu a w wyniku zaniku zasilania wszystkie informacje w niej zawarte ulegają utraceniu. Pamięć RAM jest w stanie dużo więcej razy zmieniać zapisane w sobie informacje niż inne rodzaje pamięci.

Pamięć EEPROMPamięć ta zapisuje informacje wybrane przez mikrokontroler na podstawie danych zebranych przez procesor podczas działania programu. Nie ulega ona utracie podczas zaniku napięcia zasilania. Jest bardziej wytrzymała na przeprogramowywanie niż pamięć FLASH ,jednak mniej odporna pod tym względem od pamięci RAM. 

Istotnymi elementami budowy mikroprocesora są także rejestry danych ,czyli tak jakby komórki pamięci procesora. Najważniejszymi rejestrami dla początkującego programisty BASCOMA są porty (w przypadku attiny2313 to portd i portb). Porty składają się z pojedynczych bitów ,których fizycznymi odpowiednikami są określone nóżki mikrokontrolera. Mogą one być wejściami procesora i służyć do zbierania przez niego informacji lub wyjściami w celu generowania sygnału zwrotnego.W bardziej zaawansowanych językach np. assemblerze programiści pisząc program uruchamiają wszystkie rejestry bezpośrednio co wymaga ogromnej wiedzy na ich temat. Pisząc w BASCOM’ie nie musisz się jednak oto martwić ,bo podczas kompilacji program ten zamienia dyrektywy języka na polecenia odpowiedzialne za uruchamianie bądź wyłączanie poszczególnych rejestrów.

Na co dzień używamy dziesiętnego systemu zapisu liczb. Jednak w informatyce znacznie częściej wykorzystuje się dwójkowy system zapisu liczb (tzw. system binarny). Dwójkowy system zapisu liczb musisz dobrze poznać i zrozumieć dlatego też postaram  Ci się go w prosty sposób wytłumaczyć.Przykładem liczby dwójkowej jest np. „1010”.W systemie tym cyfra będąca pierwszą od lewej symbolizuje wartość  1, cyfra stojąca na drugim miejscu od lewej oznacza wartość dwukrotnie większą czyli 2 , trzecia cyfra od lewej wartość  4 , czwarta cyfra od lewej wartość 8 itd. Aby obliczyć wartość liczby zapisanej w systemie zero-jedynkowym należy zsumować wartości miejsc na których zapisane są cyfry 1. A więc pierwsze miejsce od lewej zajmuje cyfra zero czyli wartość przypisaną do tego miejsca należy pominąć, kolejna liczba to 1 dlatego też należy uwzględnić wartość zajmowanego przez nią miejsca ,a więc jest to 2, kolejna cyfra to 0 czyli możemy ją pominąć , a ostatnia cyfra to 1 ,symbolizująca wartość 8. Wartość szukanej liczby to 10 ,bo 2 + 8 =10.

Poniżej przedstawiam dodatkowe przykłady liczb zapisanych w systemie dwójkowym i ich dziesiętne odpowiedniki:
1011 = 11
1111 = 15
11 = 3
1 = 1
0 = 0
10101 = 21
101 =  5
10000000 = 128
10000001 = 129
10000011 = 131

W informatyce często używa się także systemu szesnastkowego w którym do zapisu liczb wykorzystuje się właśnie 16 znaków. Są to cyfry od 0 do 9 i litery od A do F. Na razie znajomość tego systemu nie jest Ci potrzebna. Przykłady liczb zapisanych w systemie szesnastkowym to : AA , 1A , 3 , BF ,9F ,G, 2C , CD , CCC , 659 .

Przy pisaniu programów często będziesz miał do czynienia z operatorami logicznymi. Określają one, w jaki sposób dane warunki muszą zostać spełnione aby zdanie zostało uznane jako prawdziwe. Istnieją cztery podstawowe operatory logiczne. 

AND – Aby zdanie zostało uznane jako prawda oba warunki muszą zostać spełnione.

OR – Aby zdanie zostało uznane jako prawda przynajmniej jeden warunek musi zostać spełniony

XOR – Aby zdanie zostało uznane jako prawda dokładnie jeden warunek musi zostać spełniony

NOT – Zmienia wartość warunku na przeciwną. Prawdę na fałsz natomiast fałsz na prawdę.

W tej części to już wszystko.

środa, 9 maja 2012

Elektroniczny zapalnik czasowy

 
                                                              
     Ten temat jak i inne artykuły z serii "prezentacji" będą poświęcone pokazaniu i ewentualnemu ogólniejszemu omówieniu danej konstrukcji. Oczywiście w przyszłości omówię sposób wykonania takiego urządzenia w sposób dokładny ,ale wymaga to umiejętności pisania bardziej skomplikowanych programów co zostanie omówione przy okazji kursu BASCOMA .Wtedy też udostępnię schemat i wzór płytki PCB. Mogę także wysłać program jeśli ktoś będzie zainteresowany (proszę pisać w komentarzach) .Od razu mówię ,że terrorystą nie jestem. Poza tym zapalnik ten uruchamia jedynie żarówkę a dopiero po modyfikacji polegającej na usunięciu bańki i zostawieniu samego żarnika będzie można go wykorzystać do odpalenia np. petardy . Urządzenie to może przydać się np. osobą zajmującym się ASG. Obecnie istnieją dwie wersje tego urządzenia. Pierwotną można zobaczy na moim kanale youtube  Posiadała ona jednak drobną wadę - często układ nie uruchamiał się przy podłączeniu zasilania bądź po resecie. Trzeba było "obudzi" go poprzez naciśnięcie dodatkowego przycisku.Obecnie problem ten jest zażegnany. Powstała druga wersja mojego zapalnika ,która uruchamia się bezproblemowo.Działa niemal identycznie dlatego nie zdecydowałem się stworzyć drugiego prawie identycznego filmu a jedynie wstawiam zdjęcie . Rozwiązaniem problemu przy uruchamianiu okazało się umieszczenie kondensatora filtrującego (10nF) przy zasilaniu. dodatkowo aby uniknąć dziwnych problemów w przyszłości bezpiecznie jest także odciągnąć wejście RESET procesora poprzez rezystor 10Kohm na stałe do vcc (do plusa). Ponadto nowa wersja została wykonana na specjalnej do tego projektu stworzonej płytce PCB dzięki czemu nie ma już nieestetycznie wyglądanej plątaniny kabli tak jak to było w starszej wersji stworzonej na bazie płytki uniwersalnej. Nowa wersja zapalnika jest przeznaczona na sprzedaż -  cena 69zł.Zamówienia przyjmuję w wiadomościach prywatnych na youtube.  Za darmo natomiast udostępniam wszelkie pomoce dotyczące budowy zapalnika (praktycznie całą dokumentacje techniczną) - schemat, program, opis działania elektroniki i algorytmu , instrukcję. Dopóki program nie zostanie omówiony w ramach kursu BASCOMA udostępnie go w wersji skompilowanej w formacie HEX (na życzenie). Zachęcam więc do spróbowania wykonania takiego gadżetu samemu.


Oto film prezentujący działanie zapalnika: FILM

*Na filmie pokazany jest prototyp zapalnika.Obecnie w produkcji jest natomiast wersja prezentowana na zdjęciach.

1) Elektronika

Elektronika składa się m.in. z procesora Attiny2313. Myślę że ten procesor ma idealny potencjał aby wykorzystać go w taki właśnie sposób. Według mnie wykorzystywanie tu np. Atmegi88 jest przesadą ,natomiast Attiny2313 ma wystarczającą ilość pamięci FLASH ,aby spokojnie zmieścić cały program. Posiada także kilka przydatnych modułów jak choćby timery ,które zostały wykorzystane w tym projekcie. Poza tym wyświetlacz sterowany jest multipleksowi (w jednej chwili działa tylko jeden z wyświetlaczy- lewy lub prawy - ale efekt ten zmienia się tak szybko że użytkownik odnosi wrażenie iż oba pracują równocześnie). Multipleks pozwolił na ograniczanie ilości potrzebnych wyjść, jednak do jego obsługi konieczne było użycie dwóch tranzystorów kluczujących (odpowiadają za załączenie jednego z dwóch wyświetlaczy). Dodatkowo użyto także kolejnych dwóch tranzystorów - jeden z nich odpowiedzialny jest za efekt dźwiękowy poprzez włączanie głośnika. Głośnik ten ma wbudowany generator dzięki czemu nie musimy się dodatkowo martwic pisząc program aby podawał sygnał o określonej częstotliwości.Podajemy sygnał ciągły a generator załatwi sprawę za nas. Wadą tego rozwiązania jest jednak brak możliwości wyboru różnych wysokości dźwięku - jesteśmy skazani na ten który został wybrany przez producenta. Ostatni z 4 tranzystorów uruchamia natomiast żarówkę po zakończeniu odliczania. Poza tym urządzenie posiada podwójny wyświetlacz ze wspólną anodą  (wspólnym plusem). Odpowiednie segmenty uruchamiamy więc poprze podanie stanów niskich na określonych katodach (czyli minusach diód). Oprócz tego zapalnik posiada także 3 przyciski (w starszej wersji było ich 4 ze względu na dodatkowy przycisk "pobudzający" zapalnik gdy ten nie chciał się włączyć) oraz koszyczek na 4 baterie AAA.

2)Program
Nie ma sensu tłumaczyć w tym miejscu istoty działania programu oraz szczegółów funkcjonowania elektroniki. Zajmę się tym w jednej z części kursu BASCOMA. Będzie on dostępny na mojej stronie w ramach artykułów serii "Kurs programowania w języku BASCOM" . Jeśli natomiast ktoś chciałby odtworzyć takie urządzenie, a woli otrzymać gotowy program proszę się ze mną skontaktować (najlepiej w komentarzu). Wówczas udostępnię go wcześniej specjalnie takiej osobie.

3)Opis działania urządzenia (instrukcja):
a) Uruchamianie/ wyłączanie -> przełącznik
b) Przyciski (od góry)
  •  pierwszy ---> reset (wyłącza i uruchamia zapalnik jeszcze raz)
  •   drugi ---> przewija ustawiany czas do góry (wolne naciskanie = pojedyncze dodawanie sekund)(dłuższe wciśnięcie = automatyczne dodawanie sekund(funkcja inteligentny przycisk))
  •   trzeci ---> przewija ustawiany czas w dół (wolne naciskanie = pojedyncze odejmowanie sekund)(dłuższe wciśnięcie = automatyczne odejmowanie sekund(funkcja inteligentny przycisk))
  • drugi + trzeci (jednocześnie) ---> uruchamia zliczanie od wybranego czasu
  • czwarty ---> przycisk "wspomagający" (zazwyczaj należy go wcisnąć po resecie i po uruchomieniu w celu "obudzenia" zapalnika - jest to wada która istnieje tylko w prototypie (który widzicie na filmie). W egzemplarzach przeznaczonych na sprzedaż błąd ten zostanie usunięty i przycisk ten nie będzie istniał. Napisałem o tym tylko po to aby uniknąć niepotrzebnych pytań ,które mogły by się pojawić.
c) Sekwencja odliczania:
Sekundy na wyświetlaczu (możliwe do ustawienia w zakresie od 0-99 z dokładnością co do jednej sekundy) są odejmowane z częstotliwością 1Hz (co sekundę). Jednocześnie każdemu pomniejszeniu wartości licznika towarzyszy sygnał akustyczny. Kiedy do "detonacji" pozostają 3 sekundy wyświetlacz zaczyna migać z wysoką częstotliwością (przyśpiesza także sygnał dźwiękowy). Po dojściu sekwencji zliczania do zera na wyświetlaczu pojawiają się migające zera a sygnał staje się ciągły. Dodatkowo zapala się żarówka, w miejsce której można podłączyć inny odbiornik energii (np. silnik) jeśli by zaszła taka potrzeba. W przypadku potrzeby zastąpienia żarówki bardziej "prądożernym urządzeniem" zalecam zastosować pośrednictwo przekaźnika.

4) Zalety:
Na polskim youtube istnieje już kilka filmów prezentujących podobne konstrukcje. Jednak moje urządzenie jest pozbawione wszelkich wad rozsianych po produktach innych użytkowników. Przede wszystkim mój zapalnik posiada funkcje inteligentnego przycisku, możliwość ustawiania czasu z dokładnością co do jednej sekundy oraz wyświetlacz nie daje efektu niepożądanego "migotania" podczas pracy .

5)Cena:
Koszt wyprodukowania w domowych warunkach takiego urządzenia jest dość wysoki w porównaniu do produkcji hurtowej. Oprócz pokrycia kosztów części i dostawy tychże elementów konieczne było by  pokrycie także kosztów robocizny . Dlatego też oferuję możliwość sprzedaży tego urządzania za cenę 119zł (zamówienie proszę zamieszczać w prywatnej wiadomości na youtube). Aktualna cena wynika z braku czasu oraz innego ukierunkowania mojej pracy.  Specjalnie na sprzedaż mogę zrobić identyczny egzemplarz lub odpowiednio zmodyfikowany zależnie od potrzeb klienta. Chętnie także odpowiem na wszelkie pytania i udzielę darmowej pomocy osobą ,które spróbują wykonać to samodzielnie do czego gorąco zachęcam.