
Ponad 20 lat temu jako amator hobbysta budowałem proste układy elektroniczne. Studia i styczność z informatyką spowodowały, że porzuciłem hobby pod nazwą "składanie elektroniki" na rzecz "składanie programów komputerowych". W bieżącym roku (2011) dzięki uprzejmości kolegi Jacka.M, który okazał się specjalistą od układów mikroprocesorowych mogłem zobaczyć, jakie ogromne możliwości ma dzisiaj amator elektronik/informatyk. Prawdziwego szoku doznałem, kiedy okazało się, że prosty system z mikrokontrolerem mogę zaprogramować za pomocą darmowego kompilatora i na dodatek w języku Basic. (Pamiętam go jeszcze z mikrokomputera Commodore16

Dużą inspiracją był także przeczytany artykuł z EDW 09/2000 Sp Pana Zbigniewa Raabe "Zegar z magistralą I2C".
W związku z faktem, że jest to mój pierwszy projekt po wieloletniej przerwie, proszę o wyrozumiałość w jego ocenie. Ponieważ jednak udało się go zakończyć, postanowiłem podzielić się zdobytym doświadczeniem. Może dla innych początkujących będzie pomocne.
Założenia:
* Chęć samodzielnego wykonania i zaprogramowania urządzenia elektronicznego z mikrokontrolerem.
* Wykonanie urządzenia w pełni funkcjonalnego (z obudową) i jego praktyczne wykorzystanie w domu.
* Czas wykonania - "spokojnie nie pali się" - do końca br. roku (pierwsza myśl o budowie była ma maju).
Najważniejsze powody podjęcia projektu:
* Byłem ciekawy, czy dam radę?
* Zajęcie się czymś konstruktywnym, aby nie myśleć o "przykrościach i komplikacjach życia doczesnego"
* Odrdzewienie mózgu - ten powód jest chyba najważniejszy.
Po krótkim namyśleniu i po przeglądnięciu sieci wybór padł na "urządzenie do pomiaru wielkości pogodowych". Każdy przecież musi zrobić swoją "pogodynkę". Ilość takich projektów opisanych w sieci przekonała mnie, że mam szansę na sukces.
Pierwotne założenia techniczne:
* Odmierzanie czasu (zegar, kalendarz)
* Pomiar temperatury i wilgotności na zewnątrz (mieszkania)
* Pomiar temperatury wewnątrz (mieszkania)
* Pomiar ciśnienia atmosferycznego
* Wykorzystanie tanich czujników cyfrowych I2C
* Wykorzystanie kości ATmega8 i kompilatora Bascom
* Możliwość programowania urządzenia bez wyjmowania kości ATmega8
Wybór mierzonych wielkości uwarunkowany został zdobyciem stosunkowo tanich czujników/przetworników cyfrowych I2C.
1. Szkielet.
Szkielet urządzenia został przetestowany za pomocą płytki testowej ZL2AVR zakupionej okazyjnie na allegro. Na płytce został uruchomiony zegar na układzie PCF8583. Skorzystałem z pomocy zamieszczonej na stronie http://mirley.firlej.org/node/445. Przy okazji wyrazy uznania za poziom całego serwisu.

Z drugiej strony zalecam jednak bardzo dokładne analizowanie wykorzystywanego kodu, gdyż zdarzają się pomyłki. Na taką właśnie natknąłem się w procedurze zapisu danych do układu. Okazuje się, że zawsze warto zaglądnąć do karty katalogowej.
Jako że z zawodu jestem przywiązany do klawiatury PC, postanowiłem, że do ustawiania zegara wykorzystam takową. Z książki Marcina Wiązani (którą także zakupiłem okazyjnie) dowiedziałem się, że jest to proste. W związku z tym podprogram do ustawiania zegara/kalendarza napisałem samodzielnie.
2. Jak mokre jest powietrze?
Pierwotnym założeniem było wykorzystanie czujników cyfrowych z komunikacją I2C. Dlatego, kiedy zobaczyłem po okazyjnej cenie czujnik wilgotności typu SensironSHT11, zalicytowałem bez wahania. Jakież było moje zdziwienie, gdy okazało się, iż mimo, że wykorzystuje on komunikację cyfrową i posiada piny SDA i SCK, to wcale nie jest zgodny z I2C. Wniosek na przyszłość - sprawdź zanim kupisz! Z drugiej strony nie ma tego złego... Okazało się, że procedura obsługi tego przetwornika jest dostępna i to na stronie http://www.mcselec.com/.
Wprowadziłem jedynie drobne poprawki, aby zmniejszyć troszkę rozmiar kodu (wg. mnie kilka instrukcji jest tam nadmiarowych) oraz zamieniłem instrukcję „Bitwait” na inną konstrukcję. Chodzi o to, aby urządzenie pracowało także przy odłączonym czujniku. Dla porządku dodam, że na stronie www.sensiron.com można także odszukać przykładowy kod w C, z którego jasno wynika jak czujnik należy oprogramować.
Osobna sprawa to przygotowanie czujnika do pracy. Jest on miniaturowy, przystosowany do lutowania powierzchniowego. Ponieważ sam nie podjąłbym się tego zadania, poprosiłem o pomoc kolegę Bogdana, doświadczonego radioamatora (raczej zawodowca). Płytkę i elementy współpracujące SMD otrzymałem razem z
zakupionym czujnikiem.

Ponieważ nie mam dostępu do wzorcowego przyrządu mierzącego wilgotność powietrza, "kalibrację" ograniczyłem do zamoczenia czujnika w wodzie i sprawdzenia, czy wskazuje 100%. Wskazał 99,9%.
Z założenia czujnik SHT11 miał mierzyć wilgotność na zewnątrz. Prosty test wykazał, że nie pracuje on dobrze, kiedy jest podłączony kilkumetrowym kablem do urządzenia. Podobnie jak komunikacja po I2C tak samo w tym przypadku odległość musi być raczej mała. W związku z tym dokonałem zmiany założeń do projektu.
SHT11 będzie mierzył wilgotność i temperaturę wewnątrz mieszkania. Temperaturę - ponieważ posiada on zintegrowany termometr cyfrowy wykorzystywany również do kompensacji wpływu temperatury na wskazanie wilgotności.
W trakcie doświadczeń z tym czujnikiem, miałem następujący problem. Stwierdziłem, że pomiar temperatury jest stale zawyżony o ok. 0.5 C. Okazało się, że przyczyna tkwi w sposobie jego "zainstalowania". Otóż, aby go ochronić przed mechanicznym uszkodzeniem, zabudowałem go do aluminiowej tuby (zdjęcie poniżej).

Z jednej strony otwartej, z drugiej strony zostały wyprowadzone przewody. Nie sądziłem, że wpłynie to na jakość pomiaru. Doświadczenie pokazało jednak, że wpływa. Obecnie czujnik jest zainstalowany bez żadnej osłony, wskazania są prawidłowe.
3. Stary dobry DS18B20
W związku z powyższym - do płytki testowej podłączyłem popularny termometr firmy Dallas DS18B20. Mierzy temperaturę na zewnątrz mieszkania. Wykorzystuje protokół 1Wire i pozwala na komunikację na znaczne (kilkumetrowe) odległości.

Ponieważ z założenia projekt miał zostać wykonany solidnie, zabudowałem czujnik do obudowy po zepsutym PT100. Wcześniej posmarowałem go pastą do procesorów, po czym rurkę zakleiłem klejem na gorąco. Wielokrotne porównanie wskazań z termometrem wzorcowym (TES1311A) pokazało poprawność takiego rozwiązania.
4. Jak zaprojektować płytkę drukowaną - przygoda z KiCad
Kiedy prototyp układu na płytce testowej dojrzał, należało podjąć decyzję, w jaki sposób skonstruować układ docelowy. Do łączenia na tzw. pająka czy do płytek uniwersalnych nigdy nie miałem przekonania - oczywiście nie twierdzę, że są to metody nieskuteczne. Zamarzyło mi się wykonać dla urządzenia płytkę drukowaną.
Powstały dwa problemy: jak zaprojektować płytkę oraz jak płytkę wykonać.
Za "dawnych czasów" robiłem to tak:
- projekt układu ścieżek wykonywałem na papierze milimetrowym
- za pomocą punktaka przenosiłem punkty wierceń na płytkę
- lakierem spirytusowym za pomocą rapitografu rysowałem ścieżki na płytce
- suszyłem, a następnie trawiłem w kwasie azotowym
- wierciłem otwory
Postanowiłem, że teraz zrobię to w sposób bardziej "elegancki". Po przeglądnięciu i sprawdzeniu wielu programów mój wybór padł na KiCad. Za pomocą tego darmowego kombajnu mogę narysować schemat, wygenerować listę połączeń i zaprojektować płytkę. Oczywiście pozostało się jeszcze tego trochę nauczyć. Bardzo pomógł mi mini-tutorial zamieszczony na stronie http://kicad.r4b.ru/mediawiki/index.php/PL:Mini_tutorial.

Proszę o niekrytykowanie sposobu narysowania schematu urządzenia, ponieważ:
- jest to mój pierwszy schemat narysowany w KiCad
- schemat miał z założenia odzwierciedlać układ ścieżek na płytce drukowanej
- poprawiałem schemat już po uruchomieniu urządzenia i opisywanych zmianach

5. Do czego służy żelazko?
Ponieważ nie miałem zamiaru ręcznie rysować ścieżek, wybrałem opisywaną w sieci metodę żelazkową. Niestety nie dysponuję doświadczeniem i była to moja pierwsza płytka, nie byłem zadowolony z rezultatu.

Okazało się, że w centralnym miejscu płytki toner nie przykleił się. Musiałem uzupełnić ścieżki pisakiem typu "permament". Poza tym laminat, który miałem (coś al’a ebonitowy) okazał się fatalny, cały się powyginał. Nigdy więcej nie użyję takiego laminatu.

Urządzenie zabudowałem w plastikowej obudowie typu Z-1A. Panel przedni posiada zabudowany wyświetlacz LCD 4 wiersze po 20 znaków oraz przełączniki:
- ON/OFF,
- SetTime - uruchamia wejście do procedury ustawiania czasu,
- Pomiar - ustalenie czasu między kolejnymi pomiarami - 1min lub 5 min.
Podziękowania dla Zbyszka, który wykonał panel przedni.

Na tylnym panelu znajdują się:
- gniazdo klawiatury PS2
- gniazdo do podłączenie programatora SPI(wtyk RS232)
- przycisk Reset
- gniazdo do podłączenia czujnika STH11
- gniazdo do podłączenia czujnika DS18B20
- dławik na kabel zasilający 230V

6. Czujnik ciśnienia i niespodzianki
Urządzenie było prawie gotowe. Pozostał przetwornik ciśnienia. Ale przecież przewidziałem w układzie szynę I2C do jego podłączenia, a nawet fizyczne miejsce na płytkę z czujnikiem. Po analizie dostępnych przetworników na rynku wybór padła na HopeRF HP02S. Przetwornik tani, ale o niezłych parametrach technicznych. Procedury obsługi znalazłem na form http://www.cnc-work.pl/forum/.
I tutaj skończyło się moje samozadowolenie.
Czujnik potrzebuje sygnału 32768Hz (MCLK) oraz sygnału sterowania (XCLR). Wiedziałem o tym przed zakupem czujnika. Zakładałem (wstyd się przyznać), że wykorzystam sygnał z zegara PCF8583. Niestety nie jest to możliwe, tak to nie działa. Próba zrobienia na szybko generatora na drutach także skończyła się niepowodzeniem.
OK, ale przecież Atmega8 ma wewnętrzne timery, za pomocą których można taki generator zrobić. Podpowiada to nawet autor procedury ze strony wskazanej wyżej. Tak, tylko trzeba mieć wolne wyjście OC1A lub OC1B.
Na OC1B mam przełącznik "Set", więc bez problemu mogę go przenieść. Niestety próba wygenerowania jakiegokolwiek stabilnego sygnału na tej nodze kończy się fiaskiem. Na OC1A zrobiłem linię dla szyny I2C. Kicha!
Pozostało wykorzystać dobrą radę Jacka.M. Przeciąłem jedną ścieżkę na płytce drukowanej, tę od OC1A. Szynę I2C przeniosłem na inne wolne wyprowadzenie. Sterowanie XCLR poprowadziłem z innego wolnego wyjścia.
Na szczęście projektując układ, wolne wyjścia mikrokontrolera wyprowadziłem na górną stronę płytki. To mnie uratowało. Dzięki temu mogłem za pomocą kabelków podłączyć poprawnie czujnik HP20S.
' Generator ok. 32kHz dla HP20S
Config PinB.1 = Output
Config Timer1 = Timer, Clear Timer = 1, Compare A = Toggle, Compare B = Disconnect, Prescale = 1
Compare1a = 242
Na zakończenie tego punku dwie sprawy. Po pierwsze - płytkę do czujnika ciśnienia musiałem wykonać sam, poszło o wiele lepiej niż poprzednio. Lutowania czujnika do płytki podjął się Jacek.M


Po drugie czujnik należy skalibrować. Użyłem do tego celu kalibratora Beamex MC5 i wprowadziłem do procedury poprawkę.

7. Czy BASIC żyje ?
Wyznaję zasadę, że nie jest ważne w jakim języku piszesz program ale ważne jest czy Twój program działa poprawnie i czy spełnia wymagania użytkownika. Ponieważ w życiu napisałem trochę programów małych i dużych, to tym bardziej nie zamierzam tłumaczyć się z wybranego narzędzia.
Mój wniosek podstawowy z projektu jest taki:
Dzięki temu, że istnieje takie środowisko jak BASCOM, osoba mało doświadczona w budowie współczesnych układów elektronicznych, a w szczególności w układach mikrokontrolerów może zbudować i zaprogramować w pełni funkcjonalne urządzenie. Budowanie i programowanie takich urządzeń daje ogromną satysfakcję.
Nie wykluczam jednak, iż kolejny projekt oprogramuję w innym języku.
Urządzenie zostało zainstalowane w miejscu docelowym. Funkcjonuje poprawnie i spełnia swoje zadanie. Na bieżąco można przekonać się o panujących warunkach otoczenia. Z użycia wyszedł zaokienny termometr, który wymagał wytężonego spoglądania za okno i którego czytelność była ograniczona.

Poniżej załączam kod programu dla zbudowanego urządzenia. Zaznaczam, że procedury obsługi poszczególnych czujników i zegara pochodzą od innych autorów. Ja pozwoliłem sobie na ich "optymalizację" wg. mojej oceny i połączenie w jeden program. Sobie przypisuję ogólną organizację programu oraz procedurę obsługi ustawiania zegara za pomocą klawiatury PC. Aby ograniczyć wielkość kodu, zrezygnowałem z wykorzystania funkcji "Fusing". W to miejsce sporządziłem podprogram formatujący wyniki pomiarów do standardowej postaci. Również starałem się zamienić mnożenie przez liczby całkowite będące potęgą liczby 2 na przesunięcia bitowe. Istotne także było, aby program funkcjonował także po odłączeniu czujników od urządzenia. Wspomniałem o tym przy okazji opisywania czujnika SHT11. Do tego celu wykorzystałem także zmienną globalną "Err".
Komentarze zawarte w programie będą chyba wystarczającym opisem działania.
Oczywiście mam świadomość, że program mógł zostać napisany "lepiej". Planowałem np. wykorzystać przerwania do odmierzania czasu pomiędzy kolejnymi pomiarami. Ze względu na obszerność obecnego kodu i brak wiedzy, aby go zmniejszyć - zrezygnowałem.
Nie zamierzam w najbliższym czasie poprawiać programu, jednak wdzięczny będę za konstruktywne podpowiedzi.
Prosiłbym jednak o konkretne propozycje z przykładowym i sprawdzonym kodem.
8. Zakończenie
Na zakończenie chciałbym podziękować wszystkim osobom, które przyczyniły się do powstania tego projektu.
9. Wydatki (zł)
SHT11 50
DS18B20 5
HP20S 22
ATmega8 7
PCF8583 3
LCD 4x20 40
Obudowa 8
Pozostałe 30
Razem: ok. 170 zł.
10. Wykorzystane źródła
Elektronika dla Wszystkich 09/2000, artykuł Sp Pana Zbigniewa Raabe "Zegar z magistralą I2C"
Marcin Wiązania, Programowanie mikrokontrolerów AVR w języku Bascom, BTC Warszawa 2004
http://mirley.firlej.org
http://www.mcselec.com/
http://www.sensiron.com
http://kicad.r4b.ru/mediawiki/index.php/PL:Mini_tutorial
http://www.cnc-work.pl/forum/
https://www.elektroda.pl/
Cool? Ranking DIY