niedziela, 6 listopada 2016

AVR NEC - biblioteka obsługi popularnych pilotów podczerwieni

     Realizując różnorakie projekty w oparciu o mikrokontrolery napotykamy problem obsługi różnych peryferiów doń podłączonych. Aby nasz projekt programistyczny był przejrzysty i uniwersalny, warto jest by obsługę tychże urządzeń oprogramować w osobnych plikach po czym zlinkować je do pliku głównego - właśnie przy pomocy biblioteka.
     Zarówno w celach edukacyjnych jak i praktycznych, napisałem bibliotekę umożliwiającą wykorzystanie w swoim projekcie odbiór danych z pilota podczerwieni pracującego w protokole NEC. Piloty tego typu można dziś spotkać bardzo często do sterowania urządzeniami domowymi, jest też wiele bardzo tanich i nieustępujących ładnym designem pilotów do nabycia na znanych portalach aukcyjnych, czy w sklepach internetowych.
     Ukazana tutaj biblioteka zawiera się w trzech plikach:

  • IR_config.h - służący do wyboru standardu jaki obsługujemy (oprócz standardu NEC, można dodać także innych, a wszystkie linkowane będą tylko jednym plikiem nagłówkowym)
  • NEC.c - gdzie zostały zawarte wszystkie funkcje i procedury realizujące dekodowanie sygnału oraz inicjalizację sprzętu)
  • NEC.h - którego przeznaczeniem jest wybór funkcji z jakich chcemy korzystać w obrębie standardu. Zawiera również kilka istotnych parametrów definiujących standard NEC.
     Oraz posiada następujące cechy:

  • Możliwość obsługi wielu standardów
  • Możliwość dodawania standardów (po ówczesnym napisaniu odpowiednich procedur oczywiście)
  • Możliwość wybiórczej kompilacji wybranych funkcji/opcji
  • Obsługa oparta na zdarzeniach
  • Licznik odebranych ramek
  • Redundancja odebranego adresu i komendy (weryfikacja poprawności ramki)
  • Możliwość rozszerzenia pola danych do rozmiaru 32 bitów w jednej ramce
Biblioteka została napisana na Atmege16 i na niej była testowana, jednak nie powinno być problemu z przeportowaniem jej na dowolny procesor z timerem posiadającym tryb Input Capture.
Wymaga scalonego odbiornika podczerwieni typu TSOP lub podobnego.
Do obliczania ilości odebranych ramek zostało wykorzystane przerwanie od przepełnienia licznika (tego samego, który odpowiedzialny jest za dekodowanie sygnału i jest związany z trybem Input Capture). Wobec tego wymagany jest tylko jeden timer. Być może w przyszłości powstaną aktualizację tej biblioteki, również na inne procesorki nie posiadające takiej konfiguracji. Jest ona dokładnie opisana więc nie powinno być problemu z jej zrozumieniem. Z racji wykorzystania przerwań, konieczne jest uruchomienie przerwań globalnych. Biblioteka dostępna na GitHub'ie:





EclipseCommentator - program do formatowania komentarzy

     Po przejściu z języka i kompilatora BASCOM na rzecz języka C (kompilator AVR-GCC) nieustannie staram się poprawić swoje zdolności w zakresie programowania. Od dłuższego czasu pisałem biblioteki w bezpłatnym środowisku programistycznym Eclipse. Jednak pierwsze rezultaty moich starań, choć działające, nie satysfakcjonowały mnie. Wraz z upływem czasu wyrobiłem sobie nawyki i usystematyzowałem styl i sposób pisanych programów. Chciałem by pisane przez mnie programy były coraz lepsze, przejrzyste i czytelne dla innych. W związku z tym przeorganizowałem stare biblioteki oraz nowe tworzyłem już z pewną, przyjętą koncepcją. Jednym z kluczowych elementów tejże koncepcji są niejednokrotnie zaniedbywane przez programistów - komentarze. Jednak szybko okazało się, że nowy sposób komentowania jest czasochłonny i wymaga drobnych, lecz monotonnych obliczeń długości tekstu oraz znaków. Chcąc uwolnić się od tego problemu napisałem prosty programik, który sam oblicza długość właściwego komentarza i uzupełnia go podanym znakiem.
      Program ten ma na stałe wpisaną wartość jaką ma posiadać komentarz wynikowy - dokładnie jest to 115 znaków. Użytkownik podaje w konsoli swój komentarz, po czym obliczania jest jego długość, następnie różnica między wartością 115 a długością jest dzielona przez dwa. Wynikiem tych działań jest ilość znaków (jednego rodzaju np. "-") jakie zostają wpisane po obydwu stronach właściwego komentarza. Sformatowany tekst jest zwracany do konsoli skąd użytkownik może sobie go skopiować i wkleić do Eclipse'a. Ten prosty program znacząco przyśpieszył moją pracę więc może komuś się przyda :) Jest on dostępny do pobrania na GitHub'ie, pod poniższym linkiem:

poniedziałek, 17 sierpnia 2015

Na ratunek truskawce!...Czyli system nawadniania roślin nieco inaczej. Część 2

     W poprzednim artykule przybliżyłem wam same założenie i ogólny zarys części elektronicznej. Całkowicie jednak pominąłem kwestię części wykonawczej, czyli chyba najciekawszy element, który z pewnością wyróżnia ten projekt z wielu jemu podobnych. Po krótkim słowem wstępu przejdę do rzeczy :

Część wykonawcza
... czyli okradzione Tico i tragiczna śmierć napędów DVD/CD

     Stojąc przed problemem jakim jest konieczność zdefiniowania ilości wody dla każdej z roślin oraz uwzględniając fakt iż każda z tychże roślin znajduje się w różnej odległości od urządzenia odpuściłem sobie proste rozgałęźniki, trójniki, czwórniki i im podobne...
Dobrze sprawdziłyby się tutaj elektrozawory. Każdy byłby przypisany do jednej rośliny i otwierałby się na określony czas, wlewając pewną dawkę wody...Taak, elektrozawory byłyby tutaj naprawdę bardzo dobrym wyborem, jest jednak pewien problem - dość zaporowy czynnik, zwany czynnikiem ekonomicznym. Załóżmy iż chcemy podlać tylko 10 roślin, a jeden elektrozawór kosztuje np. 30 zł (to i tak bardzo optymistyczne założenie!). Z prostej kalkulacji wychodzi nam 300 zł, a tyle chciałem co najwyżej(!) przeznaczyć na budowę całości. Zatem na elektrozawory poszłoby za dużo pieniędzy...odpada :/
Chwila namysłu i rodzi się nowa idea:
A gdyby tak w pojemniku o kształcie zbliżonym do prostopadłościanu, w jednej ze ścian zamontować "matrycę" rurek i odpowiednio przesuwać nad nimi jakiś wylot, przez który płynęłaby woda? O tak! To jest to! Igła przesuwająca się nad grupą rurek w systemie kartezjańskim sterowana poprzez silniki krokowe. Względnie proste i tanie. jeszcze chwila namysłu i już jest pomysł jaki taką mechanikę sklecić po najniższej linii oporu. Wystarczą przecież tylko dwa mechanizmy pozycjonowania lasera z napędu DVD - silnik krokowy jest, prowadnice są, cały układ przełożenia ruchu obrotowego silnika na ruch liniowy tacki jest już gotowy, wystarczy tylko połączyć dwa takie mechanizmy i dodać do tego igłę z rurką, potem jeszcze jakiś zgrabny pojemniczek i matryca rurek :)
I tak oto powstało takie cudeńko:

           

Do tego dochodzi jedynie pompka spryskiwaczy podłączona do widocznej powyżej rurki. Pompa podłączona jest również z pojemnikiem z tworzywa sztucznego do którego zamontowałem czujnik ultradźwiękowy w celu pomiaru ilości pozostałej wody.

Część sterująca

     Jak pisałem w poprzednim artykule, będzie to system mikroprocesorowy, tutaj lepiej niż słowami będzie się posłużyć schematem: 
     Na schemacie nie zostały uwzględnione wszystkie elementy, nie mniej jednak to jest ta podstawa, która jest wystarczająco do samego procesu podlewania :)
     
     I jeszcze mozaika ścieżek na PCB :


     Do tego kilka zdjęć już gotowej płytki :

 







niedziela, 16 sierpnia 2015

Na ratunek truskawce!...czyli system nawadniania roślin nieco inaczej. Część 1

Wielu z nas w okresie letnim ucieka od szarej rzeczywistość by choć przez tydzień móc się cieszyć błogim spokojem, lenistwem i najlepiej słoneczną pogodą! :)


Posiadacze roślin i zwierząt są jednak postawieni podczas tej ucieczki na istotny problem.
O ile zwierzaka możemy zabrać ze sobą bądź oddać pod opiekę rodzinie czy dobremu znajomemu o tyle z roślinami jest nieco gorzej. Oczywiście, możemy poprosić sąsiada czy nie mógłby od czasu do czasu podlać naszych biednych roślinek, jednak nie każdemu uśmiecha się by ktoś chodził mu po domu podczas nieobecności. Tak czy inaczej rozwiązań na pewno każdy znaleźć może wiele, jedne lepsze, jedne gorsze. Ja proponuję od siebie coś zautomatyzowanego :)

Zacznijmy od założeń, są one dość proste:
  • Możliwość podlewania do kilkunastu-kilkudziesięciu roślin. (np. 30)
  • Definiowanie ilości wody dla każdej z roślin indywidualnie. (np. jedna roślinka dostaje 0,5 litra wody, drugą podlewamy dwoma litrami)
  • Możliwość zaprogramowania godziny o której ma się rozpocząć podlewanie. 
  • Zbiornik wody w którym zapas winien wystarczyć na przynajmniej kilka dni.
  • Pomiar ilości pozostałej wody oraz sprawdzanie czy pozostałą ilość jest wystarczająca aby rozpocząć kolejny cykl podlewania.
Tak by wyglądały te podstawowe założenia, bezsprzecznie najsensowniej będzie tu zastosować system mikroprocesorowy, do tego jakiś RTC, i czujnik poziomu wody, dla picu dorzucimy jeszcze jakiś wyświetlacz alfanumeryczny i już mamy nasz mały sterownik :)

Ja dodatkowo poszedłem nieco dalej i dodałem takie funkcje jak:
  • Bezprzewodowy update firmware oraz przesył danych takich jak zewnętrzna temperatura, wilgotność, ilość pozostałej wody i zgłoszenia ewentualnych błędów
  • Skoro przesyłam dane odnośnie wilgotności i temperatury to muszę je jakoś mierzyć, więc również dodany został czujnik tych wielkości.
  • Odbieranie komend RC5 oraz NEC 
  • Klawiatura 4x4 
  • Sygnalizacja buzerem
 Jak widać zebrał się z tego całkiem pokaźny system o sporych możliwościach.
W związku z tymi założeniami wykorzystałem następujące elementy :
  • Mikrokontroler - Atmegę16, głównie ze względu na dużą liczbę portów I/O. 
  • Wyświetlacz - popularny wyświetlacz alfanumeryczny 2x16, niebiesko-biały, oparty o kontrolerze z godnym z HD44780.
  • Czujnik wilgotnośći i temperatury - tani czujnik DHT11.
  • Miernik poziomu wody w zbiorniku - ultradzwiękowy miernik odległości HC-SR04.
  • Klawiatura - klawiatura membranowa 4x4, dostępna jako moduł do arduino.
  • Odbiornik podczerwieni - jakiś TSOP pracujący na 36khz.
  • Transcriver 2,4GHz - nrf24l01 - taniutki moduł pracujący na częstotliwość 2,4GHz, sterowany komendami AT przez interfejs SPI.
  • RTC - zegar czasu rzeczywistego, wykorzystałem moduł do arduino TinyRTC, głównie ze względu na cenę. 
  • Pompa do wody - pompa spryskiwacza do Tico.