środa, 20 sierpnia 2014

Drift trike dla córci czyli nowa zajawka.

Ostatnio trochę mnie wzięła nowa zajawka czyli drift trike. Trike to trzykołowy rowerek z dwoma tylnymi kółeczkami wielkości około 10cali, zwykle o mniejszej przyczepności i przednim kołem troszkę większym. Napędzany zwykle pedałami zamontowanymi na przednim kole. Czasem napędem jest silnik elektryczny umocowany w przednim kole, rzedziej z napędem na tył a już najrzadziej z silnikiem spalinowym.


Tak więc na początek wziąłem się za zrobienie trike'a napędzanego pedałami dla córeczki. Pociąłem jakąś tam ramę z kołami około 22 cale. Jakoś tam pospawalem tylną belkę gdzie będzie umieszczona tylna oś napędowa. Poniżej kilka fotek z początków pracy nad tym cudactwem.

 album



W późniejszym czasie będzie aktualizacja i przedstawianie postępów w budowie tego rowerka.

sobota, 7 czerwca 2014

Obsługa zegara DS1307 w Bascom

Obsługa DS1307 w Bascom


RTC z ang. Real Time Clock czyli zegar czasu rzeczywistego jest elementem służącym do odliczania czasu niezależnie od stanu urządzenia (pracuje, jest w stanie uśpienia czy też wyłączone)
Kostki RTC można także spotkać w wielu systemach mikroprocesorowych projektowanych zarówno przez amatorów jak i profesjonalistów. Mimo iż współczesne procesory posiadają układy czasowe czy też czasowo – licznikowe wbudowane w swoje wnętrze to często stosuje się osobne źródło do odliczania czasu. W tej podpowiedzi chcę przedstawić sposób obsługi jednego z wielu na rynku zegarów RTC, a jest nim kostka DS1307 firmy Dallas.

Układ DS1307 "rozmawia" się z mikrokontrolerem za pomocą magistrali tak zwanej magistrali I2C. Sama magistrala zostanie kiedyś omówiona w osobnym artykule. Kostka posiada wyprowadzenia do których należy podłączyć kwarc o częstotliwości 32.768 kHz, popularnie zwanym zegarowym. Do jednego z pinów podłączyć należy baterię o napięciu 3,2 V, która to bateria ma za zadanie podtrzymać pracę zegara kiedy reszta urządzenia nie jest aktualnie zasilana.


Wewnątrz układ posiada takie bloki funkcyjne jak:
- zegar
- kalendarz
- wewnętrzną pamięć RAM do dowolnego wykorzystania.

Podczas projektowania płytki pod ów zegar warto zachować ogólnie przyjęte warunki odnośnie umieszczania kwarcy w układach odliczających czas. W tym przypadku należało by zajrzeć do noty układu zegara by spojrzeć co proponuje producent.
Połączenie kwarcu z układem DS powinno być jak najbliżej wyprowadzeń samego scalaka. Zegar jest też wrażliwy na zakłócenia przychodzące z szyny zasilania. Dlatego obligatoryjnie należy zastosować kondensator o pojemności 100nF również jak najbliżej wyprowadzeń samego zegara.

Po wstępnym ustaleniu wymagań tego RTC możemy przejść do obsługi zegara od strony programowej. W nocie katalogowej zamieszczona jest tabela z adresami komórek pamięci zegara.

Podczas uruchamiania zegara najpierw należy skonfigurować sprzętowy interfejs I2C w procesorze z którym będzie sprzęgnięty nasz RTC. Wykonujemy to za pomocą następującego polecenia:

Config Sda = PORTx.y 
Config Scl = PORTx.z

Warto w tym miejscu nadmienić, że układy pracujące na szynie I2C posiadają własne adresy do zapisu i odczytu tak więc na jednej magistrali może pracować kilka układów Slave (z angielskiego niewolnik) z jednym układem typu Master (z angielskiego mistrz, władca).

Wszystkie układy mogące pracować na szynie I2C mają po dwa adresy. Jeden z nich służy do zapisu a drugi do odczytu. Nasz dzisiejszy bohater czyli kostka DS1307 ma adres przypisany na stałe, tak więc dla zapisu informacji do układu używamy adresu 208 natomiast do odczytu adresu 209.

Aby móc odczytywać dane z tegoż RTC i do niego dane zapisywać stworzymy sobie dwie stałe o nazwach ds_odczyt oraz ds_zapis

Const ds_odczyt = 209
Const ds_zapis = 208

Stworzymy sobie także zmienne które są wymagane do przechowywania informacji o aktualnym czasie, dacie czy dniu.



Po tym jak zadeklarowaliśmy sobie niezbędne zmienne można zacząć pisać program.
Dwie proste procedury. Jedna do zapisu a druga do odczytu:



'----- Zapis do DS1307 RTC -----
I2cstart
I2cwbyte 208
I2cwbyte 0
I2cwbyte 0
I2cwbyte Minuty
I2cwbyte Godziny
I2cwbyte Dzientygodnia
I2cwbyte Dzien
I2cwbyte Miesiac
I2cwbyte Rok
I2cstop


Nim będziemy mogli cokolwiek zapisać do zegara czy też cokolwiek z niego odczytać najpierw należy zainicjować magistralę I2C, a robi się to w następujący sposób:

I2cstart

Czasem może się zdarzyć że nasz układ będzie wyrzucał różne nieprawidłowości i krzaczki na wyświetlacz. W takim przypadku należy zaraz po konfiguracji procesora dołączyć dwie biblioteki, a są to biblioteki o nazwach $lib "mcsbyte.lbx" oraz $lib "ds1307clock.lib". Po takim zabiegu zegar powinien pracować już prawidłowo.

Sterownik semaforów

Przedstawiony poniżej sterownik semaforów służy do zarządzania priorytetem przejazdu lub wjazdu aut do garażu. Posiada wyjścia na dwa semafory dwukomorowe oraz dwa wejścia na fotokomórki, wejście z odbiornika radiowego oraz wejście z wyłącznika krańcowego otwarcia bramy. Może współpracować z dwiema parami fotokomórek gdzie elementem czynnym jest przekaźnik o stykach COM oraz NO, może też współpracować z pętlą indukcyjną proloop. Wybór ustawiany za pomocą trzech jumperów.

Zasada działania polega na sprawdzaniu obecności przeszkody w świetle bariery foto lub obecności pojazdu nad pętlą w przypadku pętli indukcyjnej. Priorytet wjazdu (zapalenie się światła zielonego) ma pojazd który jako pierwszy przesłoni swoją barierę. W chwili wjechania w barierę foto zapalają się na obydwu semaforach światła czerwone i dopiero wówczas można użyć pilota do otwarcia bramy wjazdowej. Gdyby ktoś chciał otworzyć sobie bramę przed przesłonięciem bariery foto to niestety nie uda się to. Warunkiem jest zasłonięcie bariery. Światło zielone uzyskujemy dopiero po całkowitym otwarciu bramy i jest ono utrzymywane przez czas ustawiony za pomocą potencjometru umieszczonego na płytce elektroniki. Światło zielone na "swoim" semaforze otrzymuje - jak pisałem wyżej - osoba która jako pierwsza przesłoniła ze swojej strony barierę foto optyczną.

Zasilanie samej elektroniki możemy poprowadzić z centrali sterującej (szlabanem czy też innym automatem). Sterownik akceptuje zasilanie w do 18VAC lub 26VDC. Jeśli chodzi o zasilanie samych semaforów to nie ma tu ograniczenia. Do ich zasilania przewidziane jest osobne wejście i na wejście to może być podane napięcie od 24VAC/DC do 230VAC zależnie od zastosowanych żarówek/diod w semaforach.

Sercem układu jest procesor ATTiny13 z odpowiednim oprogramowaniem wewnątrz. Do generowania czasu podtrzymania można było by użyć nieśmiertelnej kostki NE555 ale wówczas nie było by rozpoznawania kierunku z którego podjechało auto i sterownik by się gubił zmieniając światło zielone z jednego semafora na drugi w chwili opuszczenia bariery foto.

W niedługim czasie pojawi się więcej zdjęć a także program do obsługi. W planach jest też sterownik czterech semaforów oparty o 8 linii foto, po dwie linie na jeden semafor.


poniedziałek, 2 czerwca 2014

Amatorska stacja lutownicza
Na wstępie apeluję i bardzo proszę o zachowanie szczególnej ostrożności, gdyż w niektórych miejscach płytki występuje pełne napięcie sieci 230VAC.
Nie zachowanie ostrożności może grozić śmiercią !!!


Lutownica czy też stacja lutownicza to chyba najbardziej potrzebne narzędzie w pracowni zarówno elektronika jak i elektronika-amatora. O ile zwykłą lutownicę można mieć za przysłowiowych kilka złotych o tyle stacja lutownicza to już większy koszt a w dodatku nie zawsze spełnia nasze oczekiwania. Prosta lutownica ma wiele minusów spośród których można wymienić choćby brak kontroli nad osiąganą temperaturą.
Zaprezentowana tutaj stacja lutownicza ma wiele plusów, natomiast minusów w sumie nie dopatrzyłem się. Z pewnością ktoś może wytknąć ich masę, ale przypominam że jest to amatorska stacja lutownicza i do takich zastosowań przeznaczona, więc nie ma co szukać dziury w całym. Poza wszystkimi plusami jakie posiada owa stacja, można dodać jeszcze jeden, chyba najważniejszy - cena. Koszt wykonania tej stacji nie uszczupli zbyt mocno domowego budżetu przeciętnego a nawet mniej zamożnego elektronika-amatora.


Stacja nie jest moim projektem i całkowicie podpisać się pod nią nie mogę bo było by to co najmniej nie fair.
Projekt jest dzieckiem kolegi Kamila Szkutnika (a przynajmniej u niego na stronie pierwszy raz ją znalazłem). Cały projekt pochodzi z tej strony, natomiast ja wniosłem do tegoż projektu kilka poprawek które przyznam szczerze, podpowiedział mi pewien kolega Piotr.
Schemat i opis
Poniżej znajdziecie schemat ideowy stacji i opis który wyjaśni co, po co, dlaczego i do czego?

Zaczniemy od początku czyli sekcja zasilania. Na wejście CON1 nalezy podać napięcie zasilające cały układ. Podpinamy tam wtórne uzwojenie transformatora o napięciu 2x12V i mocy około 60VA. Transformator taki można kupić w wielu sklepach, a nie chcąc robić nikomu reklamy nie będę podawał konkretnej lokalizacji.

Napięcie wyjściowe prostowane jest przez przez mostek prostowniczy B1 i podawane na dwa człony stabilizacyjne. Pierwszy człon zasilania to stabilizator napięcia +5V dla procesora a także jego peryferii. Natomiast drugi człon to symetryczny stabilizator napięcia +/- 9V dla wzmacniacza operacyjnego wykrywającego przejście napięcia sieci przez zero oraz dla wzmacniacza który wzmacnia bardzo niewielkie napięcie termopary do poziomu, który spokojnie odczyta sobie serce naszej stacji czyli procesor atmega8.
Cała sekcja zasilania jest typowa dla scalonych stabilizatorów z serii 78XX i 79XX i nie ma sensu wdawać się tu w głębsze omawianie tego zagadnienia.


Jako że procesor będzie zbierał dane ze swoich wejść ADC to został on wyposażony w potrzebne kondensatory filtrujące napięcie zasilania. Są to kondensatory C15, C16 oraz C17 i towarzyszący im dławik 10uH. Są to elementy niezbędne do prawidłowej pracy procesora w takiej konfiguracji jak w zaprezentowanym tu projekcie. Kostka IC1 czyli wzmacniacz LM311 pracuje tu w roli układu wykrywania przejścia napięcia sieci przez zero, choć ostatecznie samo wykrywanie realizowane jest drogą programową. Kolejnym blokiem wartym omówienia, który jest też koniecznym blokiem aby stacja mogła pełnić swoją rolę jest układ IC6 czyli kostka OP07N. Scalak ten pracuje tu w roli wzmacniacza o wzmocnieniu wyznaczonym stosunkiem rezystancji R9 i R10, a jego wzmocnienie ustawione jest na x100. Układ ten wzmacnia niewielkie napięcie termopary i podaje na jedno z wejść ADC mikrokontrolera. Dioda zenera na wyjściu IC6 zabezpiecza przed sytuacją gdyby przypadkiem pojawiło się tam napięcie wyższe niż napięcie dopuszczalne które można podać na wejście procesora.

Aby móc korzystać z przetwornika ADC najpierw należy go skonfigurować a wygląda to tak:

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Kilka słów muszę wspomnieć o sekcji zasilania 230V z dziwnym układem przycisków SW3, SW6, tranzystorem T1 oraz diodą D5. Moduł ten jest jedną z kilku innowacji jakie wprowadziłem w swojej wersji stacji lutowniczej.
Pozwala on na:
tzw miękkie włączanie stacji
automatyczne usypianie stacji po upływie określonego czasu (15 min.)
automatyczne wyłączanie stacji po upływie określonego czasu (30 min.)
automatyczne wyłączanie podświetlania lcd po określonym czasie (5 min.)
włączenie podświtlania następuje po naciśnięciu któregokolwiek z przycisków
automatyczne przejście w stan normalnej pracy po podniesieniu kolby lutownicy
Do złącz o nazwach SW3 i SW6 należy podłączyć włącznik chwilowy o stykach NO i z dwoma galwanicznie oddzielonymi sekcjami, ponieważ jedna z sekcji załącza zasilanie 230VAC i trzeba z tym bardzo uważać. Krótko omówię zasadę działania tego bloku. Zacznijmy od sytuacji kiedy stacja jest wyłączona i nie pobiera zupełnie żadnego prądu. Tranzystor T1 nie podaje zasilania na przekaźnik Pk1 a ten nie zasila transformatora. Naciskamy włącznik który zwiera nam jednocześnie wyprowadzenia SW3 i SW6 i co dzieje się dalej? Już tłumaczę.
Zwierając SW6 podajemy zasilanie 230V na trafo, niejako zwierając wyprowadzenia przekaźnika, więc dostarczamy zasilanie na transforamtor a co za tym idzie na cały układ. Program napisany wewnątrz mikrokontrolera po kilku chwilach podaje stan wysoki na tranzystor T1, ten zwiera wyprowadzenia przekaźnika i już nie musimy trzymać przycisku wł/wył. W tym samym czasie zwarty SW3 nie daje żadnego efektu i nie ma wpływu na działanie układu poza wstrzymaniem działania programu do czasu jego puszczenia. Procedura odpowiedzialna za to wygląda tak:


Wlacznik Alias Pinc.4
'...
'...
'...
Bitwait Wlacznik , Set

Teraz opiszę sytuację kiedy stacja pracuje a my chcemy ją wyłączyć naciskając przycisk wł/wył. Co się dzieje?
Naciśnięcie wł/wył zwiera SW6, ale że ten obwód jest już zwarty przez przekaźnik Pk1 to tutaj nic się nie stanie, lecz...zauważyć trzeba że jednocześnie z SW6 zwieramy SW3 podając stan niski na PINC.4 mikrokontrolera. W programie zdarzenie takie wywołuje podprogram wyłączania stacji lutowniczej. W tym czasie zapisywana jest do pamięci eeprom aktualnie ustawiona temperatura i podawany jest stan niski na tranzystor T1 wyłączając całe urządzenie. Jeśli ktoś nie chce kombinować z szukaniem włącznika z dwiema oddzielonymi galwanicznie sekcjami, to albo wykona na własną rękę taki włącznik na bazie dwóch oddzielnych, zachowując przy tym dalece idącą ostrożność, albo po prostu założy sobie dwa włączniki i opisze jeden jak wł. a drugi jako wył.

Ja w swojej stacji lutowniczej wykorzystałem taki oto włącznik i dostosowałem go do swoich potrzeb:



Dostosowanie to polegało na usunięciu blaszki i kołeczka które są odpowiedzialne za stany bistabilne przełącznika. Dzięki temu przełącznik stał się monostabilny i przydatny do moich potrzeb.

Wspomnieć tu należy, że zarówno podczas włączania stacji jak i podczas jej wyłączania można przycisk(i) trzymać przez dowolnie długi czas, ponieważ w każdym przypadku program czeka na stan rozwarcia SW3. Jedynymi skutkami ubocznymi będą wydłużone czasy zarówno włączania jak i wyłączania urządzenia.


Obsługa:
--------------------------------------------------------------------------------

Obsługa stacji jest prosta i dość intuicyjna. Przy pierwszym uruchomieniu po zaprogramowaniu procesora należy najpierw wcisnąć przycisk więcej i trzymając go nacisnąć wł./wył. Dzięki takiemu zabiegowi wpisujemy do stacji wartość początkową ustawień czyli 250st. Jest to zabieg jednorazowy i nie wymaga ponownego wykonywania chyba że ktoś jeszcze raz zaprogramuje procesor a ma ustawione czyszczenie pamięci EEPROM wraz z czyszczeniem pamięci FLASH. Samo użytkowanie sprowadza się do kilku czynności:
przycisk WIĘCEJ zwiększa wartość pożądanej temperatury
przycisk MNIEJ zmniejsza wartość pożądanej temperatury
przycisk UŚPIENIE wprowadza stację w stan hibernacji obniżając zarówno temperaturę grota jak i pobór mocy
przyciski TEMP. ZADANA 1, ZADANA 2, ZADANA 3 odpowiadają za ustawienie predefiniowanych wartości temperatur do szybkiego wyboru
przycisku ON/OFF chyba nie trzeba tłumaczyć


Jeśli chcemy skorzystać z przycisków szybkiego wyboru temperatury TEMP. ZADANA 1, 2, 3 to należy przypisać im odpowiednie temperatury. Dokonujemy tego następująco:
1.przyciskami WIĘCEJ lub MNIEJ ustawiamy pożądaną temperaturę
2.wciskamy któryś z przycisków szybkiego wyboru temperatury na dłużej niż 0,5 sekundy
Na wyświetlaczu pojawi się komunikat o zapisie aktualnej temperatury pod dany przycisk a jednocześnie temperatura zapisana zostanie do nieulotnej pamięci mikrokontrolera. Postępujemy tak z wszystkimi trzema przyciskami. Od tej pory pod każdym z guziczków zapisaną mamy temperaturę do szybkiego wyboru. Gdy wciśniemy na chwilę (krócej niż 0,5 sekundy) którykolwiek z przycisków, wybrana zostanie jedna z wcześniej zapisanych temperatur. By opuścić tryb szybkiej temperatury należy wcisnąć ten sam przycisk który nacisnęliśmy wchodząc w dany tryb. Podobnie jest z trybem uśpienia, by z niego wyjść należy ponownie nacisnąć przycisk UŚPIENIE.
W trybach UŚPIENIE, TEMP. ZADANA 1, TEMP. ZADANA 2 oraz TEMP. ZADANA 3 nie działają inne przyciski póki nie wyjdziemy z danego trybu. By z nich skorzystać należy wyjść do trybu normalnej pracy stacji. Przy podniesionej kolbie lutownicy nie działa przycisk UŚPIENIE, a w zasadzie nie tyle nie działa co podniesiona kolba wybudza stację ze stanu hibernacji. Sądzę że chyba nie jest to kłopotem?


Do odliczania czasów automatycznego usypiania, automatycznego wyłączania czy czas automatycznego podświetlania wyświetlacza lcd zaprzęgnięty został timer1 który skonfigurowany został tak, że przerwanie wywoływane jest co 1 sekundę. Poszczególne czasy są ustawione na sztywno i wynoszą:
czas podświetlania lcd = 5 minut bezczynności
czas do automatycznego uśpienia = 15 minut bezczynności
czas do automatycznego wyłączenia = 30 minut bezczynności
Każdorazowe naciśnięcie któregokolwiek z przycisków zeruje czas a dodatkowo każde wejście w tryb zadanej temperatury zeruje czas oraz wyłącza jego zliczanie. Podniesienie kolby lutownicy z podstawki zeruje czas i automatycznie włącza normalną pracę jeśli stacja zbajdowała się w trybie uśpienia.



Gdyby ktoś chciał sobie dostosować czasy do swoich potrzeb to wystarczy zmienić następujące fragmenty kodu:
Czasy podświetlania lcd oraz czas do autouśpienia:

  1. If Kolba_odlozona = 0 Then 'jeśli kolba jest położona
  2. If Zm_dla_odl_kolby = 0 Then 'i zmienna pomocnicza =0
  3. Start Timer1 'to rozpocznij zliczanie
  4. Zm_dla_odl_kolby = 1 'zmień stan zmiennej pomocniczej na 1 żeby timer nie był już startowany
  5. End If
  6.  
  7. If Licz_czas = 900 Then Gosub Usypianie 'jeśli kolba leży 900 sekund (15 minut)
  8. If Licz_czas < 300 Then 'czas podświetlania w sekundach Reset Wlacz_lcd 'jeśli czas od ostatniego naciśnięcia przycisku jest > 5min. to
  9. Else 'wyłącz podświetlanie
  10. Set Wlacz_lcd
  11. End If
  12. Else
  13. Stop Timer1 'zatrzymaj timer
  14. Zm_dla_odl_kolby = 0 'wyzeruj wartość zmiennej pomocniczej odłożenia kolby
  15. Licz_czas = 0 'i zerujemy wartość zliczania czasu
  16. End If


Czas do autowyłączenia:


  1. Usypianie:
  2. '==========================================================
  3. Nastawa_temp = Nastawa 'wpisujemy aktualne ustawienia do zmiennej tymczasowej
  4. Nastawa = 60 'nastawa przyjmuje wartość 60
  5. Locate 2 , 1
  6. Lcd " U" ; Chr(1) ; "PIENIE "
  7. Bitwait Uspienie , Set 'i program czeka na puszczenie przycisku UŚPIEINIE
  8. Do
  9. Gosub Pomiar_temp
  10. Gosub Sterowanie_grzalka
  11.  
  12.  
  13. If Licz_czas = 1800 Then Gosub Procedura_wylaczania 'czas do autowyłączania(30 minut)
  14. '...
  15. '...
  16. Return


Program napisany i wstępnie przetestowany. Gdyby ktoś chciał już testować i znalazłby "niedoróbki" to proszę o kontakt.


Nieprawidłowości jakie zauważyłem:
1. Na obecną chwilę po wszystkich testach zauważyłem że czasem w dolnej linii wyświetlacza zostaje napis LUTOWNICY po tym jak zostanie odłączona rączka lutownicy, minie czas 15 minut czyli włączy się uśpienie i z tego uśpienia wyjdziemy.
2.Jeśli odłączymy rączkę lutownicy to nadal można ustawiać temperaturę przyciskami MNIEJ oraz WIĘCEJ ale tego nie widać. Zmianę widać dopiero po jej podłączeniu.


Coś na temat pozostałych złącz.

- ISP_PROG - jak sama nazwa mówi jest to typowe złącze do programowania ISP
- SW1 - złącze do podłączenia przycisków zwiększania temp. zmniejszania oraz uśpienia
- SW2 - złącze przycisków szybkiego wyboru jednej z trzech predefiniowanych temperatur
- SW5 - czujnik odłożenia kolby lutownicy
- JP1 - złącze przewidziane do zasilania prostych typów programatorów jak STK200
- CON3 - złącze do podłączenia uzwojenia pierowtnego transformatora
- CON5 - wraz z elementami R14 i T3 zostały dodane na przyszłość
- CON6 - wejście napięcia 230VAC
- CON7 - wyjście 230V na dodatkowe podświetlanie
- CON8 - wyjście 230V na wentylator wyciągu
- FUSE - złącze śrubowe do podłączenia gniazda bezpiecznika

Spis elementów:
Rezystory:
R4, R5, R16, R17 - 220R
R18 - 330R
R6, R7 ,R8, R12 - 510R
R3 - 1k
R13, R14, R15 - 4k7
R1, R2, R10, R11 - 10k
R9 - 1M
Kondensatory:
C2,C4,C5,C7,C6,C11,C12,C13,C15,C16,C17,C19,C20,C24,C25 - 100nF
C3,C6,C9,C22,C23, - 10uF
C10 - 100uF
C1 - 470uF

Układy calone:
IC1 - LM311N
IC2 - MEGA8
IC3 - 7805
IC4 - LM7809
IC5 - LM7909
IC6 - OP07CN

Różne:
DZ1 - 4V7
L1 - 10uH
LCD - LCD-16x2
OPT1 - MOC3020M
OPT2 - MOC3042M
PK1 - KM82
TR1 - BT138
TR2 - BT138
LED1,LED2 - kolory według uznania

Wkrótce wideo z działania stacji lutowniczej