wtorek, 10 maja 2016

Nowy projekt w Atmel Studio

Jakieś 2 miesiące temu pomyślałem, że obejdzie się bez sięgania do podstaw. Dzisiaj pomyślałem - a co, jeśli ktoś przeczyta moje wpisy, zapała nieograniczoną chęcią stworzenia własnego małego urządzenia i cały Jego zapał pryśnie, gdy w Atmel Studio po utworzeniu projektu dostanie w twarz takim oto okienkiem:


By uniknąć zaprzepaszczonych szans - dziś specjalnie dla Ciebie, początkujący czytelniku kilka słów na temat konfiguracji programatora AVR Dragon w Atmel Studio.

Zatem od początku. Naszym celem jest zaprogramowanie mikrokontrolera Atmega 162 skompilowanym kodem pochodzącym z pliku main.c. Zakładam, że Dragon jest podpięty przewodem USB do komputera i taśmą z wyprowadzeniami JTAG do mikrokontrolera.

Pierwszy krok - tworzymy projekt. Dla pierwszego w solucji:


Dla każdego następnego prawy przycisk myszy na solucji i:


Po wybraniu opcji (New) Project pojawi nam się okno:


(gdzie dla pierwszego projektu będziemy mieli dodatkowo możliwość nazwania naszej nowej solucji).
W otwartym okienku wybieramy typ projektu - Executable project - możemy wybrać język c lub c++, podajemy nazwę i klikamy OK. Następnie zostaniemy zapytani o docelowy mikrokontroler:


Możemy użyć szukajki z prawego górnego rogu i dzięki niej znaleźć interesujący nas model mikrokontrolera. Zaznaczamy i OK. Atmel Studio utworzy plik main.c (jeżeli wybraliśmy język C) i dorzuci tam kawałek boiler plate'a z informacją o autorze, a w funkcji main umieści nieskończoną pętlę. Zestaw w sam raz na dobry początek. Wgrajmy ten skomplikowany kodzik do mikrokontrolera! Na początek - upewnijmy się, że wybrany przez nas projekt jest domyślnym (startowym) w solucji. Prawy klawisz na nazwę projektu i do dzieła:


Domyślny projekt jest zaznaczony pogrubioną czcionką. Następnie klikając w:


Uruchamiamy procedurę budująco-programującą. I tu zonk:


Konfigurując projekt nie wybraliśmy domyślnego programatora. Możemy to zrobić teraz. Continue. Szczęśliwie AS zostawia nas w miejscu, gdzie powinniśmy skonfigurować programator. Z tajemniczego dropdowna wybieramy naszego Dragona z interfacem JTAG:


Naszym oczom ukaże się multum opcji do wyboru. Ustawiamy jeszcze JTAG clock. Częstotliwość nie powinna być większa niż 1/5 częstotliwości taktowania mikrokontrolera. W naszym przypadku 8 MHz, zatem nie przekraczamy 1.6 MHzm czyli 1 MHz jest jak najbardziej poprawną wartością. Zapisujemy zmiany (Ctrl+S albo dyskietka z menu) i próbujemy jeszcze raz.


Nasz skompilowany kodzik trafia wprost do naszej Atmegi, o czym zostaniemy poinformowani w okienku Output dla Build:



Z ciekawych rzeczy - dowiemy się ile pamięci programu i ile pamięci danych zajął nasz kodzik w mikrokontrolerze (zaznaczony fragment). Możemy zrobić pierwszego commita i naduszać dalej z kodzikiem:)

piątek, 6 maja 2016

Fun with Fan part 4

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!


środa, 4 maja 2016

Fun with Fan part 3

Gospodarowanie dostępnymi zasobami

Trzeba dążyć do tego, by wykorzystać jak najwięcej z tego, co mają nam do zaoferowania producenci sprzętu, który wpadnie nam w ręce. Maglowany przeze mnie wiatraczek a.k.a. wentylator oprócz dwóch linii zasilających (czerwonej + i czarnej -) posiada jeszcze linię oznaczoną kolorem żółtym. Szybki rzut oka w Internety wystarcza, by dowiedzieć się, że jest to wyjście tacho. Linia ta jest częścią sprzężenia zwrotnego dla naszego proca - zwiększając napięcie zasilania spodziewa się, że wentylator będzie kręcił się coraz szybciej. W myśl zasady - kontrola najwyższą formą zaufania - za pomocą żółtej linii jest w stanie określić prędkość, z jaką obraca się wirnik wentylatora i w zależności od sytuacji odpalać takie albo inne eventy. Np. gdy wie, że prędkość jest niska, a temperatura wzrosła - może podnieść nieco napięcie zasilania - spodziewając się wzrostu prędkości obrotowej. Gdy ten wzrost nie nastąpi - nasz procesor może zacząć bić na alarm - bo coś złego dzieje się z tak ważnym elementem każdego komputera - chłodzeniem (PC zaczyna piszczeć tym swoim głośniczkiem...).

Pomysł na mikro-projekt

Co jako było nie było programista Atmegi mogę zrobić z tym fantem? Ano podpiąć dodatkową linię do mikrokontrolera i wykorzystać jakoś te informacje. Co mnie interesuje? Interesuje mnie stan tej linii w czasie. Pierwsza myśl - podłączę tacho do dowolnej nóżki mikrokontrolera i będę sobie sprawdzał jej stan. Dobre, ale są lepsze rozwiązania. Przerwanie! Przecież mogę podpiąć ten sygnał pod przerwanie - główna pętla programu już nie będzie musiała sprawdzać stanu nóżki. OK - do tego jeszcze potrzebny nam jest jakiś pomiar czasu. Z żółtej linii odczytamy ilość wykonanych przez wirnik obrotów - do zmierzenia prędkości potrzebny będzie też czas. Zapniemy jakiś zegarek? Stoper? Blisko - wykorzystamy Timer! Lepiej! Wykorzystamy mechanizm przechwytywania sygnału wejściowego (Input Capture Unit).

Zejdźmy na poziom sygnałów

Przechwytywany sygnał musimy podpiąć do jednego z dwóch (w przypadku Atmegi 162) wejść ICP. Dla niepoznaki są to ICP1 na pinie PE0 i ICP3 na pinie PD3. Pin PD3 to także wejście zewnętrznego przerwania INT1 - warto o tym pamiętać wybierając miejsce podłączenia sygnału tacho - chcąc wypróbować podejście z przerwaniem warto skorzystać z pinu PD3 - nie trzeba będzie zmieniać konfiguracji połączenia przy zmianie podejścia programowego - chcąc zaoszczędzić dobrą linię przerwania - warto wybrać port E.
Nie warto ryzykować - wentylator działa z napięciem 12V - Atmega 5V - sięgamy po transoptor!

Input Capture Unit

Jak zwykle w przypadku obcowania z zewnętrznymi sygnałami, musimy określić, na jaki stan nasza potężna jednostka ICU ma reagować. W momencie, gdy na wejściu ICPn pojawi się oczekiwany przez nas stan, nastąpi przechwycenie! W momencie przechwycenia do rejestru ICRn jest wpisywana aktualna wartość rejestru TCNTn wykorzystywanego licznika (krótko mówiąc timestamp). Warto tak skonfigurować mikrokontroler, by w tym momencie wystąpiło przerwanie - przecież musimy na bieżąco reagować! Mało tego - musimy reagować szybko, bo przy następnym oczekiwanym stanie logicznym interesujące nas rejestry zostaną nadpisane, a cenne dane utracone. W tym miejscu warto jeszcze wspomnieć o istnieniu mechanizmu redukowania szumów (Noise Canceler), który może usprawnić nasze pomiary, gdy na linii występują zakłócenia.

I z tą dozą teorii zostawiam Cię Czytelniku, w niedalekiej przyszłości pojawi się adekwatny kodzik!

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.

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 temperatury

Podłą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

czwartek, 21 kwietnia 2016

Wyślij SMS o treści...

Wyrównujemy szanse

Dodajmy kolejną możliwość do naszej komunikacyjnej piaskownicy. Za pośrednictwem modułu jesteśmy w stanie przekazać wiadomość SMS do Atmegi. Wyrównajmy szanse - niech teraz Atmega będzie w stanie wysłać SMSa do nas.

W tym celu musimy skonfigurować połączenie z modułem GSM jak poprzednio. Uruchomić moduł, odczekać 15 sekund potrzebne na zalogowanie się do sieci i wysłać - niespodzianka - sekwencję komend AT, które sprawią, że przez sieć GSM poleci SMS od Atmegi wprost do telefonu o wskazanym przez nas numerze telefonu - najlepiej, żeby był to nasz telefon - przynajmniej będziemy wiedzieć, że działa, a karta SIM włożona do modułu GSM nie posłuży nam do wysyłania niechcianych wiadomości do losowych ludzi...

Procedura wysyłania SMSa

Ustalamy tryb tekstowy
AT+CMGF=1
Po otrzymaniu informacji
OK
Podajemy numer telefonu odbiorcy
AT+CMGS=000000000 lub AT+CMGS=+48000000000

Następnie oczekujemy na znak zachęty:
>
Zachęceni podajemy treść SMSa:
Daj sie poznac!
Koniec treści SMSa komunikujemy kombinacją Ctrl+Z... czyli za pomocą kombinacji:
\x1A
Możemy jeszcze zaczekać na potwierdzenie nadania wiadomości
+CMGS: ...
Po otrzymaniu tak rozpoczynającego się ciągu znaków, możemy uznać, że SMS został wysłany - nasz trud skończony.

W optymistycznym przypadku...

...nie będziemy musieli się martwić o nieprzewidziane sytuacje. Jednak warto być świadomym, że każda nasza komenda może zostać niezrozumiana przez moduł GSM, o czym w najlepszym przypadku poinformuje nas pięknym komunikatem ERROR, który przyjdzie do nas zamiast oczekiwanej wiadomości pozytywnej. Dlatego komunikując się z modułem GSM za pomocą komend AT warto określać stan aplikacji - będzie o wiele łatwiej zarządzać kodzikiem i decydować, co w danym momencie powinniśmy zrobić - będziemy mieć informację na temat stanu, w jakim się aktualnie znajdujemy i wiadomości, jaka aktualnie przyszła - sporo wiedzy - warto ją spożytkować w należyty sposób - nie zawsze mamy aż tyle informacji o stanie systemu...

Kodzik
Aby wysłać SMS o treści podanej w kodzie programu powinniśmy wprowadzić aplikację w stan "GSM_Init". W celu odebrania SMSa od modułu GSM, wprowadzamy aplikację w stan "SMS_ReadInit". Zmiana stanu aplikacji może nastąpić na przykład pod wpływem odczytu określonej temperatury (jeżeli podepniemy do układu termometr) lub pod wpływem przerwania wywołanego przez zwarcie lub rozwarcie zewnętrznego układu - kiedy dokładnie - zostawiam Tobie!