Archiwum kategorii: Arduino, Atmega, embedded

Atmega8 i najnowsze Arduino IDE (1.6.6)

Kiedy zachciałem wgrywać programy z Arduino IDE na Atmegę8 pojawił się problem – większość opisów jak dodać obsługę tego AVRa dotyczyła starego IDE albo i tak nie działało z najświeższymi wersjami. Najpierw sam coś posklejałem, później znalazłem na githubie optiboot, niestety z Atmega8 nie działał „out-of-box” ponieważ ArduinoIDE chciało korzystać z extended_fuses, a i sam bootloader w wersji skompilowanej nie był w paczce. Z tym też sobie poradziłem, wynik jest do pobrania jako załącznik do poprzedniego postu po angielsku. W końcu jednak trafiłem na fajne repozytorium, które daje bardzo dobre wsparcie dla mniej popularnych Atmeg i dodatkowo wystarczy tylko w Preferencjach IDE podać lokalizację pliku json. Wszystko tutaj: https://github.com/sleemanj/optiboot

Opublikowano Arduino, Atmega, embedded | Skomentuj

ARDUINO 1.6.6 with Optiboot and Atmega8

Recent versions of Arduino support custom boards by adding URL of json with package and in this way you can put address https://github.com/Optiboot/optiboot/releases/download/v6.2/package_optiboot_optiboot-additional_index.json and get the optiboot bootloaders BUT if want to use Atmega8 (at moment of writing this post) you will receive error because of avrdude command line has declared extended_fuses which do not exist  in Atmega8. This is the first problem. Second problem is that you need to compile optiboot for Atmega8 for your own because it is not in the package.

I solved both problems and made a rar file which you need only to extract to Arduino’s sketch folder. hardware.rar

It is tested with Arduino 1.6.6
UPDATE: I found fork of optiboot repository with good support for Atmega8 and working fine with latest Arduino IDE. See this page: https://github.com/sleemanj/optiboot

Opublikowano Arduino, Atmega, embedded | Skomentuj

Atmega internal oscillator

Znów wyszło, że powinienem czytać noty katalogowe, oszczędziłoby to czasu. Buduję nakładkę na RaspberryPi, tzw. shielda, która to będzie sterownikiem dwóch serwomechanizmów i jednej lampy. Serwami można oczywiście sterować bezpośrednio z Maliny, ale z racji, iż nie jest to system czasu rzeczywistego, to przy bardzo dużym obciążeniu pozycja serwa była bardziej losowa niż zadana. Cały projekt kiedyś opiszę, a teraz wracając do sedna – komunikacja Atmegi8 którą wykorzystałem z RPi odbywać się miała przez UART i gdy testowałem to poza układem wszystko działało (a trzeba dodać, że postanowiłem korzystać z wewnętrznego oscylatora, bez zewnętrznych kwarców). Problem wyszedł na jaw po włożeniu Atmegi w układ gdzie zasilana była nie 5V, a 3.3V. Okazało się, że taktowanie na tyle się rozjechało, że transmisja 9600 nie była możliwa. Tu pojawiają się dwie opcje – kalibracja wewnętrznego oscylatora albo dołożenie kwarcu. Estetyczniej byłoby pobawić się w kalibrację bo na płytce nie przewidziałem miejsca żeby coś dołożyć koło nóżek XTAL, ale nigdy tego nie robiłem i wolałem by estetyka ucierpiała i 70gr które wydałem na kwarc. Podsumowując, jeśli chce się korzystać z wewnętrznego oscylatora należy pamiętać, że przykładowo Atmega8 jest kalibrowana dla 5V przy 25*C, przy taktowaniu 8MHz całkiem w porządku jest ustawić UART na 9600bps. Polecam stronę z tabelami ułatwiającymi dobór prędkości transmisji do taktowania: WormFood’s AVR Baud Rate Calculato

Opublikowano Arduino, Atmega, embedded | Skomentuj

Arduino jako zabezpieczenie przed zbyt głębokim rozładowaniem akumulatora

Ostatnio zaistniała u mnie potrzeba zbudowania urządzenia które zapobiegnie zbyt głębokiemu rozładowaniu akumulatora. Założenia są dość proste – cykliczny monitoring napięcia i odcięcie odbiorników w momencie, gdy napięcie spadnie poniżej zadanego progu. Ponadto sygnalizacja dźwiękowa o zbyt niskim napięciu i bardzo ważne: optymalizacja zużycia prądu przez samo urządzenie. Na allegro można znaleźć wiele takich urządzeń, począwszy od bardzo prymitywnych jak przekaźnik z rezystorem, po „pudełeczka” z niewiadomą zawartością. Szkoda, że mało który produkt ma podane zużycie prądu. Z racji, że na elektronice nie znam się na tyle by zbudować takie urządzenie z wykorzystaniem podstawowych elementów jak np. tranzystory itp., postanowiłem oprzeć swoje rozwiązanie na Arduino Pro Mini, a dokładniej na klonie z eBaya. Budowę własnego zabezpieczenia zacząłem od wyszukania informacji jak zmierzyć napięcie przy użyciu Arduino – wyjście jest bardzo proste, wystarczy dzielnik napięć z rezystorów i podpięcie tego pod pin ADC – skorzystałem z przykładu na stronie https://www.udemy.com/blog/arduino-voltmeter/. Wybrałem największe rezystancje jakie miałem w zapasie żeby maksymalnie zmniejszyć prąd. Następnym krokiem było wyszukanie przekaźnika o maksymalnie małym poborze prądu przez cewkę – przekaźnik który dostałem po podłączeniu przez rezystor pobiera około 30mA (bez rezystora przeszło 60mA) (pobór prądu z poszczególnych elementów sumarycznie okazał się mniejszy, pewnie jest na to jakieś wyjaśnienie…). Ostatni krok to optymalizacja samego Arduino – poszczególne elementy można usypiać, ale jest z tym trochę zabawy, skorzystałem z bardzo prostej w użyciu biblioteki którą używa się prawie jak zwykłego „delay()” z tą różnicą, że w trakcie czekania duża część układu śpi. Mój układ w trakcie spania, z wyłączonym przekaźnikiem, zużywał 5.7mA. Muszę dodać, iż w celu oszczędności również dioda Power z Arduino została usunięta. Wspomniana biblioteka jest dostępna tutaj https://code.google.com/p/narcoleptic/. Problemy jakie napotkałem: zużycie prądu przez przekaźnik i błąd pomiaru napięcia*. Pomysły mam takie by przekaźnik zastąpić tranzystorem MOSFET, ale chcę najpierw dokładniej poznać maksymalne obciążenia jakiemu będzie poddawany akumulator. Błąd pomiaru napięcia wynika z wahań napięcia zasilania Arduino, zastosowany stabilizator (12V -> 5V) ma duży zapas mocy, jednak włączenie przekaźnika i wyłączenie można zauważyć w wartościach mierzonego napięcia. Pomysł jest taki by zrobić osobne źródło które będzie napięciem referencyjnym – myślałem o zwykłym stabilizatorze na 3.3V, bez żadnych innych obciążeń, który będzie na kolejnym pinie dawał wzorcowe napięcie. Na tę chwilę próbuję skorzystać z referencyjnego 1.1V ze sposobu opisanego tutaj: http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/ Przechodząc do rzeczy, całość działa następująco: po uruchomieniu sygnał dźwiękowy – wiadomo, że działa; następnie pomiar napięcia i jeśli powyżej 10.70V to odpalamy przekaźnik i śpimy przez następne 5 minut, po 5 minutach kolejna kontrola; gdy napięcie będzie zbyt niskie „pikamy” kilka razy, odłączamy odbiorniki i śpimy przez 5 minut; następnie znów pikamy albo uruchamiamy przekaźnik jeśli sytuacja się poprawiła. Kod źródłowy i fotki (w finalnej wersji jest inny rezystor przed przekaźnikiem i Arduino nie ma jednej diody):
Aktualizacja: *) problem z pomiarem wyglądał tak, że po włączeniu przekaźnika wartość mierzonego napięcia by zaniżona. Po wielu próbach diagnozy odkryłem, że winowajcą był źle dobrany bezpiecznik. Początkowe zabezpiecznie 100mA okazało się za małe, stąd spadek napięcia. Większy bezpiecznik i zastosowanie wewnętrznego napięcia referencyjnego 1.1V daje świetne rezultaty – pomiar z Arduino zgadza się prawie idealnie z pomiarem z multimetru.

Fotografie ukończonego układu:
Zabezpieczenie akumulatora góra

Zabezpieczenie akumulatora dół

 

AKTUALIZACJA: popełniłem tu błąd karygodny, a mianowicie przekaźnik zasilam z pinu mikrokontrolera – NIE WOLNO TAK! Jeszcze wszystko działa i ma się dobrze, może ten rezystor mnie uratował, ale należy to poprawić i tak nie robić!

Opublikowano Arduino, Atmega, embedded | 2 komentarze