Teoria już za nami - czas na kodzik!
Na dobry początek rozważmy rozwiązanie wykorzystujące mechanizm przerwań i timer. Sygnał tacho podepniemy pod zewnętrzne przerwanie INT2 (PD3 w mojej Atmedze), a timer skonfigurujemy tak, by generował przerwanie co 1 sekundę. W obsłudze przerwania INT2 będziemy zliczać impulsy, a co sekundę, dzięki timerowi policzymy, ile obrotów wykonał nasz wentylator. Wiemy, że na pełen obrót składają się 2 impulsy, dlatego sumę impulsów podzielimy przez 2.
Żeby mieć jako takie pojęcie o tym, co się dzieje na pokładzie mikrokontrolera, wyślemy ilość obrotów na minutę USARTem przez bluetooth'a wprost do aplikacji terminala odpalonej na telefonie z Androidem. Informację o prędkości będziemy wysyłać również co sekundę. Skąd będziemy wiedzieć kiedy dokładnie? Ustawimy flagę send w obsłudze przerwania!
Do dzieła!
Pokazywanie postów oznaczonych etykietą 1-wire. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą 1-wire. Pokaż wszystkie posty
piątek, 6 maja 2016
piątek, 29 kwietnia 2016
Fun with Fan part 2
Hardware poskładany, czas przysporzyć trochę problemów software'owcom.
Nasz program powinien przyspieszyć obroty wiatraczka w momencie, gdy temperatura wzrośnie ponad zdefiniowane maksimum i wrócić do jałowych obrotów w momencie, gdy spadnie poniżej założonego minimum. Proste. Zatem do dzieła.
Zdefiniujmy nasze wartości graniczne:
Oraz zdefiniujmy graniczne obroty wentylatora. Operujemy na 8-bitowym timerze w ramach naszego PWM, zatem maksymalną prędkość określimy na 255, minimalną na 80 - wartość dobrana eksperymentalnie - możnaby się też pokusić o wyliczenia... 80 jest spoko.
Teraz konfiguracja PWM i termometru (podłączamy go jak ostatnio). Włączamy przerwania.
W nieskończonej pętli będziemy odczytywać temperaturę, modyfikować prędkość wentylatora, a następnie odpowiadającą jej wartość wpisywać do rejestru OCR0. Skomplikowane działanie odejmowania wymuszone jest konfiguracją PWM (clear on match). Odwracając logikę konfiguracji możemy pozbyć się odejmowania. Zostawiam tak, jako przykład akademicki ;)
I tyle - teraz tylko testować, dobierać parametry i na produkcję!
PS kodzik jak zwykle na githubie.
Nasz program powinien przyspieszyć obroty wiatraczka w momencie, gdy temperatura wzrośnie ponad zdefiniowane maksimum i wrócić do jałowych obrotów w momencie, gdy spadnie poniżej założonego minimum. Proste. Zatem do dzieła.
Zdefiniujmy nasze wartości graniczne:
Oraz zdefiniujmy graniczne obroty wentylatora. Operujemy na 8-bitowym timerze w ramach naszego PWM, zatem maksymalną prędkość określimy na 255, minimalną na 80 - wartość dobrana eksperymentalnie - możnaby się też pokusić o wyliczenia... 80 jest spoko.
Teraz konfiguracja PWM i termometru (podłączamy go jak ostatnio). Włączamy przerwania.
W nieskończonej pętli będziemy odczytywać temperaturę, modyfikować prędkość wentylatora, a następnie odpowiadającą jej wartość wpisywać do rejestru OCR0. Skomplikowane działanie odejmowania wymuszone jest konfiguracją PWM (clear on match). Odwracając logikę konfiguracji możemy pozbyć się odejmowania. Zostawiam tak, jako przykład akademicki ;)
I tyle - teraz tylko testować, dobierać parametry i na produkcję!
PS kodzik jak zwykle na githubie.
czwartek, 28 kwietnia 2016
Fun with Fan
Kodzik jest jak klocki LEGO
PWM - temat tak wdzięczny, że postanowiłem poświęcić mu jeszcze kilka postów. Wprowadzając pojęcie PWM do moich rzeczybezinternetu wspomniałem, jak można go wykorzystać do niecnych celów. Teraz, gdy już mamy wiedzę na temat podpinania termometru do naszej Atmegi, możemy zacząć składać klocki w większe... budowle.Masz problem?!
Zatem znajdźmy sobie problem. Potrzebne będą: temperatura, sterowanie napięciem zasilania, urządzenie mogące być sterowane zasilaniem. Przykładowy problem - przegrzewający się mikrokontroler. Możemy mierzyć jego temperaturę, a w momencie, gdy ta przekroczy założoną granicę - możemy ochłodzić nieco atmosferę. Zatem do dzieła!Analiza
Do chłodzenia całego układu posłuży nam wiatraczek wymontowany ze starego komputera - zasilany stałym napięciem 12V - można go nabyć w każdym sklepie z wiatraczkami (czy wentylatorami) - w tym przypadki wiatraczek jest odpowiednim słowem. I tu pojawia się pierwszy problem - jak wysterować urządzenie zasilane 12V z naszej Atmegi, gdzie możemu liczyć na 5V max, przy ograniczonym prądzie. Rozwiązań jest wiele. Zaprezentuję 2. Oba będą zawierać pewien rodzaj izolacji galwanicznej - o tej też już na pewno wiesz!Część wspólna
Zacznijmy od skonfigurowania PWM. Posłużmy się posiadaną wiedzą:Termometr
Potrzebny nam będzie element sterujący PWM. Nie będziemy przecież stać z termometrem nad mikrokontrolerem i zmieniać prędkości wentylatora. Podepnijmy nasz pasożytniczy DS1820PAR i wykorzystajmy wcześniejszy kodzik do odczytu temperaturyPodłączenie LED do wyjścia PB0 (OC0) i zmiana wartości wpisywanej do rejestru OCR0 powodowała jej przygaszanie lub rozjaśnianie. Możemy wnioskować, że w czasie zmieniało się napięcie. Zamieńmy teraz diodę na wentylatorek. Brakuje nam dobrych 7V, żeby kręcić nim na pełnych obrotach, a 12V nasza Atmega nie wytrzyma - czas na izolację
Transoptor
Zadziała? Zadziała. Ale bez szaleństw. Transoptor stanie się częścią obwodu. Napięcie, które powinno odłożyć się na wentylatorze (wpływając na jego prędkość), odłoży nam się również na tranzystorze transoptora, a prąd płynący przez układ sprawi, że wspomniany tranzystor zacznie się grzać. Nie rozwiążemy pierwszego problemu, a na domiar złego stworzymy sobie nowy.
Tranzystor MOSFET
I to nie byle jaki - a tranzystor Mocy! 4 maja już niebawem, a wszyscy wiemy, że Mocy nie należy lekceważyć... W odróżnieniu od opisywanych wcześniej tranzystorów bipolarnych - nóżki tego tranzystora posiadają inne nazwy: gate, drain i source. Wiedza potrzebna na teraz: do bramy możemy doprowadzić wyjście PWM, source połączmy z masą, a między drain i napięcie zasilania wepnijmy wentylatorek.Dlaczego możemy połączyć Atmegę w ten sposób? Ze względu na budowę tranzystora. I dane zamieszczone w nocie katalogowej. Z niej dowiemy się również, że nasze 5V może nie wystarczyć, by rozkręcić wentylatorek na maxa - aczkolwiek prędkość, jaką osiągnie powinna w zupełności wystarczyć.
Pozostaje tylko dodać trochę logiki biznesowej...
piątek, 22 kwietnia 2016
Daj się poznać lvl fotografia
Nie działa i nie wiadomo dlaczego
Projekty elektroniczne mają to do siebie, że nie wszystko działa tak, jakbyśmy tego oczekiwali... A na koniec okazuje się, że cały czas krążyliśmy wokół rozwiązania. Na takie krążenie natknąłem się i ja... Obecnie walczę z uruchomieniem silnika krokowego. Jako że rezultaty nie są najciekawsze pod względem ekhm działania, dziś mniej techniczny post!
Daj się poznać lvl fotografia
Czymże jest wspominane tyle razy moje środowisko deweloperskie - ano mniej więcej czymś takim.
Na zdjęciu od góry:
- część dolna ściągi z datasheetu (wyprowadzenia Atmegi)
- płytka stykowa
- moduł zasilający (mam dostępne 3.3V i 5V DC dzięki niemu!)
- złącze programatora (JTAG ofc!)
- żółta i czerwona LED
- Atmega162,
- Przycisk (wpięty do przerwania)
- Po lewej moduł bluetooth na płytce z mojego projektu inżynierskiego
- Moduł Fibocom G510
- Termometr (między modułami GSM i Bluetooth)
- Programator AVR Dragon
środa, 6 kwietnia 2016
Ważna linia cd.(DS1822-PAR)
Po co mi ta wiedza?
Swego czasu stałem się szczęśliwym posiadaczem czujnika temperatury DS1822-PAR. Czujnik ten jest o tyle ciekawy, że wg noty katalogowej posiada tylko 2 nóżki, do których możemy cokolwiek podpiąć: nóżkę danych (1-Wire) i nóżkę masy (GND). A zasilanie?! No właśnie - i tu jest moc, siła i potęga tego czujnika. Końcówka PAR pochodzi od angielskiego parasite (pasożyt) i nie jest to wcale przesadzone - czujnik czerpie zasilanie z linii danych - wiedzie na niej pasożytnicze życie - jak jemioła na drzewach na przykład...Co to oznacza dla konstruktora-programisty?
Nie mniej - nie więcej tyle, że trzeba to zasilanie czujnikowi dostarczyć - w przeciwnym wypadku, niczego ciekawego się od niego nie dowiemy - a zwłaszcza, jaka temperatura panuje w naszym otoczeniu. To od czego zacząć? Jak zwykle - od czytania dokumentacji.![]() |
| Sposób podpięcia czujnika do mikrokontrolera (źródło: datasheet) |
Najlepszą dokumentacją jest kodzik!
Podłączyliśmy termometr do linii danych, czas te dane z niego wyciągnąć! Bit po bicie... Nasz mikrokontroler będzie działał jako master w tym tandemie, w związku z tym potrzebna mu będzie wiedza, jak wysłać sygnał reset na magistralę:
Kolejnym krokiem - odebranie pojedynczego bitu z magistrali:
Zatem chcąc odebrać bajt:
Jak już potrafimy odczytać, nauczmy się wysyłać: I znowu - bajt:
Na wykresie zaznaczone są pomiary temperatury odnotowane podczas "złapania" czujnika DS1822-PAR w 2 palce (między kciuk a wskazujący). Czujnik złapałem w 21 sekundzie eksperymentu, puściłem w 49. Z wykresu wynika, że czujnik szybciej reaguje na wzrost temperatury niż na jej spadek - posiada pewną bezwładność.
Całość dostępna oczywiście na githubie.
Zatem chcąc odebrać bajt:
Jak już potrafimy odczytać, nauczmy się wysyłać: I znowu - bajt:
To jaka jest temperatura otoczenia?
Teraz wystarczy tylko poprosić termometr o podanie temperatury. W tym celu będziemy musieli wysłać mu kilka komend - 0xCC (skip ROM), 0x44 (convert T) oraz 0xBE (read Scratchpad). Szczegółowy opis znajdziecie w dokumentacji. Tam też znajdziecie tabelki z tajemną wiedzą na temat kolejności wysyłania poszczególnych komend. A jak to będzie wyglądać w naszym przypadku? Dane pochodzące z termometru pochodzą z 'brudnopisu' (scratchpad) czujnika. Temperatura zapisana jest na 2 bajtach. W celu wyliczenia prawidłowej wartości, musimy dokonać małej arytmetyki na tych wartościach - ponownie posługując się wiedzą z dokumentacji.![]() |
| Sposób przechowywania temperatury przez czujnik. Źródło: datasheet. |
Zatem co musimy zrobić? Wziąć MS Byte, przesunąć go bitowo o 8 miejsc w prawo, zapisać do 16 bitowej zmiennej, do tego dopisać LS Byte i podzielić całość przez 16 (ujemne potęgi 2 na najmłodszych bitach LS Byte -> 2^4 = 16).
I po co to wszystko?
A z otrzymaną wartością temperatury możemy zrobić, co tylko chcemy - na przykład wysłać ją za pośrednictwem USART do innego urządzenia, a uzyskane dane przedstawić na wykresie:sobota, 2 kwietnia 2016
Ważna Linia
USART to potężne narzędzie i daje nam naprawdę duże możliwości komunikacji. Jak łatwo się domyślić, nie wszystkie urządzenia implementują ten standard - głównie dlatego, że wymaga zbyt wiele miejsca na elektronikę, która byłaby odpowiedzialna za komunikację. Na szczęście istnieją prostsze i mniej wymagające sposoby 'dogadania się' z elementami z zewnątrz mikrokontrolera.
wyjściem w stanie wysokim
wyjściem w stanie niskim
wejściem
i jeszcze ten 'dany moment' - czyli urządzenia połączone ze sobą mają pojęcie o czasie! To już coś.
Jak rozmawiamy? Wiadomo - zera i jedynki układające się w bajty, a bajt to już liczba albo znak - a to już potrafimy wysłać przez USART do innego urządzenia... Ale po kolei.
Cała komunikacja polega na nasłuchiwaniu, w jakim stanie znajduje się magistrala lub naduszaniu na nią 'swojej woli'. I tak chcąc wysłać bit, urządzenie powinno wystawić stan niski na linii, następnie po czasie 10 us wystawić stan wysoki, jeśli chce wysłać 1, a następnie - w obu przypadkach - odczekać 100us, następnie znów wystawić stan wysoki na linii.
Chcąc odczytać bit, urządzenie powinno na 2us zmienić kierunek swojego portu komunikacyjnego, następnie po 15us sprawdzić stan linii.
Tniemy koszty
USART do prawidłowego działania wymagał co najmniej 3 linii - 2 sygnałowych i jednej linii odniesienia. Jak uprościć ten schemat? Wyrzućmy jedną linię! Proste. Zostawmy linię odniesienia - nadal musi istnieć wspólne 'źródło prawdy' (kiedy jest 0), a 2 linie sygnałowe zastąpmy 1. Czyli zamiast używania uszu i ust do komunikacji, używamy aparatu, który będzie jednym i drugim... na zmianę. Pamiętacie z dzieciństwa zabawę z kubkami i sznurkiem? Nawet nie wiedzieliście, że korzystacie z rozwiązania 1-Wire - opisanego np. w nocie katalogowej jednego z najbardziej popularnych termometrów wśród miłośników domowej automatyzacji.Jakoś się dogadamy...
Podobnie jak w przypadku USART, potrzebny jest protokół. Mamy do dyspozycji 1 linię, która w danym momencie może być:wyjściem w stanie wysokim
wyjściem w stanie niskim
wejściem
i jeszcze ten 'dany moment' - czyli urządzenia połączone ze sobą mają pojęcie o czasie! To już coś.
Jak rozmawiamy? Wiadomo - zera i jedynki układające się w bajty, a bajt to już liczba albo znak - a to już potrafimy wysłać przez USART do innego urządzenia... Ale po kolei.
Cała komunikacja polega na nasłuchiwaniu, w jakim stanie znajduje się magistrala lub naduszaniu na nią 'swojej woli'. I tak chcąc wysłać bit, urządzenie powinno wystawić stan niski na linii, następnie po czasie 10 us wystawić stan wysoki, jeśli chce wysłać 1, a następnie - w obu przypadkach - odczekać 100us, następnie znów wystawić stan wysoki na linii.
Chcąc odczytać bit, urządzenie powinno na 2us zmienić kierunek swojego portu komunikacyjnego, następnie po 15us sprawdzić stan linii.
8 bitów to bajt!
Skoro wiemy jak odczytać i nadać bit - odczytajmy i nadajmy bajt! - ośmiokrotnie wywołując funkcje dotyczące bitów, dbając o to, żeby dostarczać kolejne bity w przypadku nadawania i zapisywać w przypadku odbierania.1 mówi, reszta słucha
Wiemy jak korzystać z linii, ale skąd możemy mieć pewność, że nikt inny akurat z tej linii nie korzysta? Standard przewiduje także procedurę resetu. Polega ona na wprowadzeniu magistrali w stan niski na 480us, następnie 480us w stanie wysokim. Magistrali? Tak magistrali! 1-Wire to magistrala! Możemy do niej wpiąć wiele urządzeń - każde z nich będzie miało swój własny adres i możliwa będzie komunikacja - przeważnie typu master-slave. Np. mikrokontroler jako master odpytywać będzie czujniki temperatury DS1822 działające w trybie slave - w ten sposób zbierze dane z całego domu, przetworzy je i wyśle do centralnego serwera, który w niecny sposób wykorzysta tę tajemną wiedzę (i na przykład podkręci ogrzewanie...).A gdzie kodzik!?
Czeka na porządne przetestowanie na moim dev-środowisku na biurku :)
Subskrybuj:
Posty (Atom)





