Rozmnażanie Arduino czyli jak zjeść ciastko i mieć ciastko
Kłopot z Arduino jest taki, że wszystko fajnie dopóki nie skończymy prac nad nowym projektem. Chcemy go zostawić tak jak jest – nie ma sprawy – wszystko ładnie działa, wystarczy jakaś obudowa i już. Gorzej kiedy do głowy przyjdzie nam nowy pomysł a Arduino jest już użyte i nie pasuje nam rozmontowywać gotowego układu. Na szczęście, można kupić trochę elementów i tanim kosztem zdublować sobie istniejący projekt. Ja jako pierwsze Arduino kupiłem wersję Uno z Atmega328. Dość szybko złożyłem pierwszy zestaw, który wylądował w swoim docelowym miejscu i chodzi tak złożony do dziś dnia. Ponieważ w tak zwanym międzyczasie potrzebowałem złożyć kolejny układ, zdecydowałem się kupić kolejne Arduino (tym razem Duemilanove czyli poprzednika Uno), także na Atmega328. Tym razem poszedłem jednak po rozum do głowy i od razu zakupiłem także same mikrokontrolery Atmega328 w ilości 2 sztuk z zamiarem wykorzystania nowego Duemilanove wyłącznie do prototypowania i zaprogramowania mikrokontrolerów. W ten sposób uzyskałem tytułowe „zjeść ciastko i mieć ciastko” czyli przygotowałem gotowy prototyp najpierw na płytce stykowej z użyciem Arduino a następnie przeniosłem całość na płytkę uniwersalną z użyciem mikrokontrolera zaprogramowanego dokładnie tym samym programem (po prostu nie potrzebujemy całej płytki Arduino, żeby procesor działał poprawnie).
Świeżo kupiony mikrokontroler Atmega328 nie posiada wgranego bootloadera, który pozwala na komunikację z oprogramowaniem Arduino. Owszem istnieją w sprzedaży także wersje z wgranym bootloaderem, ale ich koszt jest według mnie niewspółmierny do pracy i kosztów wgrania bootloadera samemu kiedy posiadamy płytkę Duemilanove lub Uno. Pozwoli nam to później na dowolne zamienianie mikrokontrolerów na płytce Arduino a w efekcie końcowym – zamontowanie gotowego zaprogramowanego mikrokontrolera na docelowej płytce. Sam proces wgrywania jest bardzo prosty i opisany po angielsku na stronie From Arduino to a Microcontroler on a Breadboard (Od Arduino do mikrokontrolera na płytce stykowej). Na stronie tej można znaleźć kilka ciekawych instrukcji – między innymi jak pozbyć się kwarca z układu podczas programowania), ja jednak skupię się na samym wgrywaniu bootloadera. Jak widać na zdjęciu obok – Atmega328 umieściłem na płytce stykowej, podłączyłem kwarc 16MHz z kondensatorami 22pF, opornik 10k utrzymujący reset w stanie wysokim i podłączyłem raptem cztery kable – trzy do programowania i jeden do resetu. Wszystkie te elementy i tak będą mi później potrzebne do budowy gotowego projektu, nie rezygnowałem więc z niczego co istotne. Dalsza praca jest po stronie komputera:
- Nie podłączamy jeszcze zasilania do programowanego mikrokontrolera
- Uruchamiamy środowisko programistyczne Arduino
- Wgrywamy do naszego Arduino gotowy sketch o nazwie ArduinoISP (Arduino In System Programmer)
- Z menu Tools -> Board wybieramy posiadaną wersję Arduino (w moim przypadku Duemilanove lub Uno)
- Z menu Tools -> Programmer wybieramy ArduinoISP (w starszych wersjach oprogramowania nie ma tego menu)
- Podłączamy zasilanie programowanego układu (ja wziąłem po prostu zasilanie z Arduino)
- Z menu Tools wybieramy Burn Bootloader (w starszych wersjach oprogramowania jest Tools -> Burn Bootloader -> w/Arduino as ISP)
Z mojego doświadczenia wynika że czasem potrzeba kilku prób wgrania bootloadera, ponieważ nie zawsze układy Arduino i programowanego mikrokontrolera zsynchronizują się poprawnie. Kiedy nie ma synchronizacji, środowisko programistyczne komunikuje błąd i wtedy czynność trzeba powtórzyć. Poprawne programowanie bootloadera na Duemilanove zajmuje mniej więcej minutę czasu. Ja potrzebowałem około trzech prób przy każdym układzie, zanim złapałem synchronizację. Pomogło poruszanie kwarcem i podpiętymi do niego kondensatorami 22pF.
Świeżo zaprogramowany mikrokontroler pozwala się już normalnie programować ze środowiska Arduino. Ja po prostu zamieniłem układy miejscami i w ramach testu wgrywałem do każdego przykładowy program „Blink”.
Teraz już nic nie stoi na przeszkodzie żeby tak przygotowany układ zaprogramować docelowym programem i umieścić na płytce na której będzie mógł pracować tak długo jak to będzie potrzebne. Należy przy tym pamiętać, że układy Atmega potrzebują prawidłowego podłączenia – minimalnym akceptowalnym przeze mnie rozwiązaniem jest podłączenie widoczne na rysunku obok – kwarc 16MHz z dwoma kondensatorami 22pF (oprogramowanie Arduino zakłada że taka jest konfiguracja mikrokontrolera), podłączone WSZYSTKIE piny dotyczące zasilania a także kondensator filtrujący 100nF na pinie AREF (dla prawidłowej pracy przetwornika analogowo-cyfrowego) oraz na zasilaniu (możliwie jak najbliżej mikrokontrolera) a także rezystor utrzymujący reset w stanie wysokim. Jak widać nie jest to wiele elementów, i jeśli mamy zasilacz podający między 3,3V a 5V to właściwie mamy wszystko co potrzebne. Ja potrzebuję więcej prądu i dotkowo zmontowałem zasilacz na bazie LM7805 do czego użyłem dodatkowo dwóch kondensatorów 470uF, dwóch 100nF i dwie diody. Schemat regulatora napięcia zaczerpnąłem ze strony Zasilanie Mikrokontrolera na Mikrokontrolery.blogspot.com którą gorąco polecam wszystkim zainteresowanym tematem.
Koszt całości przedsięwzięcia? Otóż części wyszły mnie następująco:
- Atmega328 – 28zł za dwie sztuki
- Kwarc – 1zł za dwie sztuki
- Stabilizator LM7805 – 1,20 za dwie sztuki
- Podstawka pod Atmega – 1zł za pięć sztuk
- Kondensatory 22pF – 1zł za pięć sztuk
- Kondensatory 100nF – 1zł za pięć sztuk
- Kondensatory 470uF – 2zł za cztery sztuki
- Radiator do stabilizatora – 1zł za dwie sztuki
- Oporniki – 1zł za dużą ilość :)
- Płytka uniwersalna na której zlutowałem docelowy układ – 5zł
Całość w sumie – w przeliczeniu na jeden kompletny układ to mniej niż 25 złotych a nie licząc płytki uniwersalnej, którą i tak musiałem użyć – mniej niż 19 zł. Jest to zdecydowanie lepiej niż kupować kolejne Arduino. Nawet sam koszt zakupu Atmega z wgranym bootloaderem jest większy :)
Jeszcze jedna uwaga na koniec – używając płytki Duemilanove, wgrywamy bootloader Duemilanove. Używając płytki Uno wgrywami bootloader Uno. Różnica jest taka, że Atmega z bootloaderem Uno nie będzie dawał się programować po włożeniu do płytki z Duemilanove i na odwrót. Dodatkowo – bootloader Duemilanove zajmuje 2kB pamięci podczas gdy Uno raptem 0,5kB. Dla mnie nie miało to znaczenia bo nie potrzebowałem dużo pamięci a po drugie – Uno mam już zajęte i ciężko mi je wyciągać z działającego zespołu.
Ten projekt na obrazku robiony w Virtual Breadboard? Skąd tam wziąłeś mikrokontroler atmega?
Rysunki są robione we Fritzing. Tam są dostępne zarówno ATMega jak i płytki Arduino i kilku innych typów.
Słuchaj a jak programować zmontowany układ ze stabilizatorem napięcia?
Trzeba go jakoś tak zmontować aby można było stabilizator odłączać na czas programowania i zasilanie brać z arduino?
Czy mogę programować przy podpiętym zasilaczu?
Ja robię bardzo prostą rzecz – układ montuję w podstawce. Jak trzeba go zaprogramować, to przekładam go na chwilę do Arduino (bo ma bootloader, więc pracuje jak układ „fabryczny”) a potem wkładam ponownie na płytkę.
Ja wymyśliłem aby zrobić złącze którym będę programował zmontowany układ bo będzie obudowany i dostęp do niego będzie utrudniony.
Wymyśliłem coś takiego
http://imageshack.us/a/img194/3966/arduinoa.jpg
Będzie dobrze? Bo jak na razie programuje się bez problemu na płytce stykowej.
Nie potrafię jednoznacznie odpowiedzieć. Na mój gust, dopóki zasilacz nie będzie podłączony do prądu (zasilanie będzie z programatora) to wszystko powinno być OK. Ale skoro to jest gotowy układ, to inne elementy mogą wpływać na programowanie układu. Mimo wszystko polecał bym wyciąganie ATMega z płytki na czas programowania.
Mi się wydaje że nie będą wpływać. Bazując na Twojej instrukcji dołożyłem tylko stabilizator 5V i stabilizator 3.3V reszta będzie podłączana tak jak do zwykłego arduino. Głównie oparłem się na tym http://arduino.cc/en/Main/Standalone oraz na tym http://www.instructables.com/id/DIY-Arduino-or-The-DIY-Duino/ i tym http://www.jameco.com/Jameco/workshop/JamecoBuilds/arduinocircuit.html
Kilka drobnych uwag:
1. Jeśli uC ATMega ma działać samodzielnie na płytce docelowej, to nie potrzebny mu bootloader. Można wgrać, za pomocą ArduinoISP, sketch na „surowego” chipa. Potrzebna jest tylko mała modyfikacja pliku boards.txt. Można w ten sposób odzyskać 0,5/2kb miejsca na sketch no i wypalać od razu sketch z pominięciem fazy wypalania bootloadera. Dobry opis znajdziecie na: http://www.open-electronics.org/arduino-isp-in-system-programming-and-stand-alone-circuits/
2. Wszystko jest ładnie, pięknie, jeśli programuje się surowe ATmega328P z dołączonym oscylatorem 16MHz – czyli konfigurację w 100% zgodną z Arduino Duemilanove/ UNO. Jeśli chce się zaszaleć z innym chipem lub skorzystać z wewnętrznego, 8MHz, oscylatora ATMegi, to trzeba się trochę bardziej pogimnastykować z plikiem boards.txt i poczytać o fuse-bitach, np. tu: http://www.ladyada.net/learn/avr/fuses.html
3. Jeśli planujecie szaleństwa wspomniane w pkt.2 [inne chipy, wewnętrzny oscylator etc….] to polecam podejście opisane na Adafruit w: http://learn.adafruit.com/arduino-tips-tricks-and-techniques/arduinoisp
Znajdziecie tam nieco inny schemat podłączenie Arduino do surowego chipa na płytce prototypowej [1 drut więcej (PWM) ale za to bez oscylatora!] a także ulepszoną wersję sketcha ArduinoISP oraz inne cenne informacje. Ten ulepszony sketch programujący używam z powodzeniem na Arduino UNO R3 w miejsce oryginalnego ArduinoISP. Z oryginalnym miałem spore problemy – zwykle AVRdude źle wykrywał ID programowanego chipa, to ponoć częsty problem na R3]. Zmodyfikowanym sketchem programowałem, obstalowane na płytkach prototypowych, ATmega8 [koszt ok. 5PLN] i Atmega168 w wersjach mających pracować z zewnętrznym i wewnętrznym oscylatorem. Nie było żadnych problemów i wielokrotnych prób wgrania: odpala zawsze i do tego idzie błyskawicznie [taktowanie podczas programowania podaje pin z PWM]. Oczywiście bootloader też można wgrać – jak się kto uprze – np. żeby mieć „zapasowy” uC do płytki Arduino gdyby coś…
PS. Wielokrotne wkładanie i wyjmowanie chipa z podstawki na Arduino nie służy podstawce na dłuższą metę :-) A są i w sprzedaży wersje z uC SMD – tu się w ogóle go wyjąć nie da :-)
Michale, dzięki za cenne uwagi! Ja zajmuję się Arduino czysto amatorsko i na własne potrzeby, myślę że sporo zainteresowanych osób skorzysta z twoich porad. Dzięki raz jeszcze!
Witam,
Temat poruszany na wielu forach i zastanawiam sie dlaczego Wy wszyscy sie tak gimnastykujecie.
Za 10 kupujecie programator AVR USBasp, w plytke np UNO wkladacie czysty chip, do ICSP na pcb Uno podlaczasie programator i za pomoca srodowiska Arduino wypalacie bootloader. [Narzedzia]->[Wypal Bootloader]
Bez gimnastykowania sie z kabelkami, breadbordem, kwarcem i innymi szalenstwami ktore czekaja na Was po drodze.