Autor:
Dondu
Artykuł jest częścią cyklu:
Robotyka - Teoria oraz kurs budowy robotów.
W poprzednim artykule określiliśmy
ogólne założenia dot. robota
RoDonM8, nadszedł więc czas na wstępne rozplanowanie dostępnych funkcjonalności mikrokontrolera do zadań stawianych przed robotem.
W każdym z poniższych punktów wyjaśniam każdą podejmowaną decyzję oraz wykazuję niezbędne piny i peryferia, które są potrzebne do realizacji danego zadania. Nieliczne przypadki pozostawiam, do rozstrzygnięcia w dalszej części projektowania robota.
Zaczniemy od:
Częstotliwość taktowania mikrokontrolera
Nasz robot będzie miał sporo zadań do realizacji, a większość z nich będzie niezwykle istotne dla poprawności działania i osiągów robota.
Dlatego też powinniśmy na początek przyjąć, że mikrokontroler powinien pracować z możliwie największą częstotliwością zegara taktującego.
Jako, że w założeniach ustaliliśmy, że mikrokontrolerem tym będzie jeden z rodziny
Atmega8, to zerkając do datasheet ustalamy, że graniczną częstotliwością taktowania jest
16MHz:
i jest ona osiągalna, ale tylko i wyłącznie przy zastosowaniu zewnętrznego zewnętrznego jego źródła, którym w naszym przypadku będzie
rezonator kwarcowy. Kwarc do mikrokontrolera
ATmega8 podłącza się do pinów
XTAL1 i
XTAL2:
Niezbędne peryferia:
Wersja mikrokontrolera
W zakresie wersji mikrokontrolera
ATmega8 mamy kilka elementów do rozpatrzenia:
Obudowa
Ze względu na fakt, iż wykorzystamy sporo (a może nawet wszystkie) piny mikrokontrolera
Atmega8, należy przyglądnąć się jego różnym wersjom obudowy. Interesować nas będą tylko te, które łatwo można lutować:
Zauważ, że w przypadku
ATmega8 w obudowie
TQFP mamy więcej pinów niż w obudowie
DIP. Konkretnie
jest ich o cztery więcej i są nimi:
- jeden pin Vcc,
- jeden pin GND,
- dwa piny przetwornika ADC (ADC6 i ADC7).
O ile dodatkowe piny zasilania nie mają dla nas żadnego znaczenia (choć oczywiście je podłączymy zgodnie z
zasadami prawidłowego zasilania mikrokontrolerów), o tyle
dwa dodatkowe kanały przetwornika ADC są dla nas bardzo pożyteczną cechą obudowy TQFP, która znacznie ułatwi nam realizację robota.
Dlatego też, do naszego robota
wykorzystamy wersję w obudowie TQFP. Tych co obawiają się lutowania takiego układu pragnę pocieszyć, że jest to naprawdę prosta czynność, ponieważ
raster (czyli odstępy między środkami sąsiednich nóżek) jest spory i wynosi
0,8mm co oznacza, że przy szerokości nóżki
0,3mm odstępy między krawędziami sąsiednich nóżek wynosi
0,5mm.
To jest bardzo przyjemny w lutowaniu raster, który spokojnie przylutujesz nawet lutownicą transformatorową, używając dużej ilości kalafonii. Także wykonanie płytki pod raster 0,8mm „metodą żelazkową” (powszechną wśród hobbystów) jest możliwe i nie powinno być z tym kłopotów.
Wersja mikrokontrolera
Mikrokontroler
ATmega8 produkowany jest w 3 wersjach:
- Atmega8,
- Atmega8L,
- Atmega8A.
Częstotliwość taktowania
Ponieważ ustaliliśmy, że mikrokontroler będzie pracował z najwyższą możliwą częstotliwością zegara taktującego, to zerkamy do datasheet szukając informacji pod kątem maksymalnych częstotliwości wybranych wersji, gdzie już na pierwszej stronie znajdujemy:
Atmega8 i
Atmega8L:
 |
| Atmega8 i Atmega8L |
Atmega8A:
 |
| Atmega8A |
Jak widać wersja Atmega8L odpada ponieważ może pracować tylko z częstotliwością do 8MHz.
Pozostają nam więc do wyboru wersje
ATmega8 i
ATmega8A.
Napięcie zasilania
Zapewne zauważyłeś powyżej, że
ATmega8 nie może pracować z napięciami niższymi niż
4,5V. Mogłeś także stwierdzić, że
ATmega8A może pracować z częstotliwością od
0 do
16MHz, w pełnym zakresie napięć od
2,7 do
5,5V.
Niestety tak nie jest, a pokazuje to wykres bezpiecznego obszaru pracy:
 |
| Atmega8A |
na którym widać, że
ATmega8A, by pracować z wymaganą przez nas częstotliwością 16MHz także wymaga co najmniej 4,5V.
Prąd w czasie pracy
Ponieważ nasz
RoDonM8 będzie zasilany z
akumulatorów lub baterii, stąd należy w miarę możliwości minimalizować pobór prądu, na wszystkich etapach jego projektowania. Dlatego też zerkamy do datasheet pozostałych na placu boju mikrokontrolerów w poszukiwaniu odpowiednich danych.
Dla
Atmega8 znajdujemy:
 |
| Atmega8 |
i ustalamy, że
Atmega8 podczas pracy z zegarem
16MHz przy zasilaniu
5V zużywać będzie około
20mA.
W przypadku
Atmega8A:
 |
| Atmega8A |
na wykresie ustalamy, że przy tej samej częstotliwości taktowania pobór prądu będzie w okolicach
11mA, czyli prawie o połowę mniejszy niż
Atmega8.
Stąd nasz wybór powinien paść na ATmega8A.
Podsumowanie
Najlepszą dla potrzeb
RoDonM8 jest wersja
Atmega8A w obudowie
TQFP. W ostateczności możemy użyć wersji
Atmega8,
ale nie możemy użyć Atmega8L, gdyż nie pracuje z zegarem 16MHz.
Sterowanie silników
Do sterowania silników użyjemy scalonego sterownika silników lub wykonamy własny na tranzystorach MOSFET. Niezależnie od tego niezbędne będą nam dla każdego silnika:
- kanał PWM do sterowania prędkością obrotów,
- pin sterujący kierunkiem obrotów silnika.
Dobrze byłoby także wiedzieć jaki prąd pobiera każdy silnik, aby w pełni kontrolować jego parametry pracy oraz zabezpieczyć silniki przed uszkodzeniem. Potrzebne więc nam będzie na każdy silnik dodatkowo:
- wejście przetwornika analogowo-cyfrowego.
W rezultacie otrzymamy następujący schemat blokowy:
Niezbędne peryferia:
- timer z dwoma wyjściami PWM (w ATmega8 jest to Timer1),
- dwa piny sygnałów PWM,
- dwa piny sterujące kierunkiem obrotu silników,
- dwa wejścia przetwornika ADC do pomiaru prądów silników.
Pomiary prędkość oraz kierunku obrotu kół
Wiedza o aktualnym kierunku i prędkości obrotu kół jest jednym z najistotniejszych elementów Linefollowera jak i innych robotów poruszających się za pomocą kół, co opisałem w osobnym artykule:
Robotyka: Teoria - Prędkość obrotowa i kierunek obrotu kół
Wyjaśniłem tam, dlaczego musimy określać
dla każdego koła faktyczne:
- prędkość obrotów,
- kierunek obrotów.
Wytłumaczyłem tam także dlaczego potrzebować będziemy, aż
dwa czujniki na jedno koło, czyli w przypadku naszego
RoDonM8 będą to łącznie
cztery czujniki.
Z punktu widzenia programu, by dokładnie mierzyć prędkości obrotowe kół niezbędne jest dokładne wyznaczanie momentu, w którym czujnik wiodący trafia na np. czarne pole tarczy impulsatora. Aby ten moment uchwycić w miarę możliwości bez opóźnień, można wykorzystać
przerwania zewnętrzne. W mikrokontrolerze ATmega8 mamy do dyspozycji piny
INT0 oraz
INT1 i wykorzystamy je podłączając do czujnika wiodącego enkdera.
W związku z tym nasz układ pomiaru prędkości i kierunku obrotu koła wyglądać będzie następująco:
Do pomiaru prędkości będzie nam potrzebny timer, który będzie zliczał czas upływający pomiędzy kolejnymi impulsami.
Reasumując, w ten sposób będziemy mogli zmierzyć aktualną prędkość obrotową oraz kierunek obrotu kół.
Niezbędne peryferia:
- dwa piny przerwań zewnętrznych z możliwością ustawienia wybranego zbocza sygnału dla transoptorów wiodących (INT0 oraz INT1),
- dwa piny dla transoptorów kierunku,
- timer.
Czujniki linii
Jako czujniki linii wykorzystamy
transoptory odbiciowe, które będą w stanie „widzieć” linię na tle pozostałej powierzchni, po której jedzie robot. Wybór konkretnych transoptorów zostawiamy na później, teraz ustalamy jedynie sposób realizacji tej funkcjonalności robota i wymagane piny.
Ponieważ sygnał z transoptorów jest sygnałem analogowym należy wybrać pomiędzy dwoma rozwiązaniami podłączenia ich do mikrokontrolera:
- transoptory podłączone do zewnętrznych komparatorów,
- transoptory podłączone do wejść analogowych przetwornika ADC mikrokontrolera.
co szczegółowo opisałem w artykule:
Linefollower - Podążanie za linią
Ponieważ jednym z
nadrzędnych założeń RoDonM8 jest minimalizacja kosztów oraz wagi, a także samo-kalibracja, stąd ustalamy, że wykorzystamy sposób drugi, czyli przetwornik
ADC.
Zgodnie z założeniami
RoDonM8 wykorzystujemy mikrokontroler
ATmega8A, który ma zaledwie maksymalnie
8 kanałów ADC. Ponieważ powyżej ustaliliśmy, że dwa kanały musimy wykorzystać do pomiaru prądu silników, stąd dla potrzeb czujników pozostanie nam maksymalnie
6 kanałów. To trochę mało o czym pisałem w temacie dot.
listwy czujników.
Dodatkowo na tym etapie nie wiemy jeszcze ile w ogóle pinów nam zostanie.
Dlatego decyzję w zakresie ilości czujników linii podejmiemy później, po ustaleniu niezbędnych pinów dla pozostałych funkcjonalności robota, co determinuje ilość pinów ADC, które pozostaną do naszej dyspozycji.Jeżeli pozostanie nam mało wejść ADC powinniśmy się zastanowić, jak powiększyć ich ilość.
Niezbędne peryferia:
- piny ADC w ilości uzgodnionej w późniejszym czasie,
- pin AREF z kondenstarorem,
- pin AVcc z filtracją dobrą zasilania.
Pilot RC-5
Każdy robot powinien mieć możliwość reagowania na wydawane przez właściciela komendy. Mam tutaj na myśli przygotowanie robota do wykonania zadania poprzez wybór jakiejś opcji algorytmu, czy innych nastaw, które przed wyruszeniem na trasę należy ustawić.
Poza tym przy bardzo szybkim robocie istotnym jest posiadanie możliwości jego zdalnego zatrzymania na końcu trasy lub gdy z niej wypadnie poza planszę.
Dlatego też podejmujemy decyzję, że zastosujemy
pilot podczerwieni w standardzie RC-5. Do odbioru sygnału
RC-5 potrzebować będziemy:
- najprostszy timer 8-bit,
- pin przerwania zewnętrznego.
Timer możemy współdzielić z którąś z innych funkcjonalności robota, ponieważ komendy będą wydawane tylko w czasie jego postoju lub chęci zatrzymania.
W przypadku
pinu przerwania nie mamy już takiego komfortu.
Problem polega na tym, że mikrokontroler
ATmega8 ma tylko dwa piny przerwań zewnętrznych, którymi są
INT0 oraz
INT1, a te już zarezerwowaliśmy dla określania prędkości i kierunku obrotu kół. Rodzina
Atmega8 nie ma także możliwości generowania przerwań ze zmiany stanu innych pinów cyfrowych (ang. pin change interrupt).
Musimy więc poszukać innej możliwości, a jest nią wykorzystanie wbudowanego komparatora analogowego, którego nie będziemy wykorzystywać do innych celów:
W ten sposób będziemy mogli skutecznie wyłapywać zbocza sygnału
RC-5 i odbierać komendy z pilota podczerwieni.
Niezbędne peryferia:
- dwa piny komparatora,
- komparator z przerwaniem,
- timer (może być współdzielony z inną funkcjonalnością).
Zapamiętywanie parametrów jazdy
Jednym z
naszych założeń, jest zapamiętywanie parametrów w czasie pracy robota. Rodzaj danych ustalimy w późniejszym czasie, ale na pewno będą to co najmniej:
- prędkość obrotowa kół,
- kierunek obrotu kół,
- nastawione prędkości kół,
- stan czujników,
- podejmowane decyzje,
- itp.
W tym celu niezbędna jest dodatkowa pamięć ponieważ w
Atmega8, który jest podstawą
RoDonM8, nie mamy wystarczających zasobów pamięci
SRAM, ani
EEPROM. Możemy rozpatrzyć więc dwie możliwości:
- karta pamięci SD,
- zewnętrzna pamięć EEPROM lub SRAM o sporej pojemności.
Karta pamięci SD
Karta pamięci SD (w szczególności
microSD) jest fajnym rozwiązaniem ze względu na:
- olbrzymią pojemność i swobodę ustalenia formatu danych (dane w formie binarnej lub tekstowej),
- poręczność w zakresie wyciągnięcia z robota i odczytu w komputerze, co zaoszczędziło by nam piny do komunikacji z komputerem w celu odczytu danych.
Jednakże w naszym przypadku zastosowanie karty SD znacznie zmniejszy poziom dostępnej pamięci programu i z tego powodu rozwiązanie to jest dla nas niemożliwe do zaakceptowania. Dodatkowo
karta SD pobiera znaczne ilości prądu, a chcemy minimalizować ten parametr, ze względu na źródło zasilania (akumulator, bateria) i jego ciężar.
Pozostaje nam więc zastosowanie zewnętrznej pamięci
EEPROM lub
SRAM.
Który interfejs do komunikacji?
Zanim wybierzemy rodzaj pamięci powinniśmy ustalić, który interfejs dostępny w
ATmega8 wykorzystamy do komunikacji z pamięcią. Mamy do wyboru:
Zaglądamy więc do
datasheet ATmega8 i znajdujemy tabelkę:
Aby wykorzystać interfejs
TWI musielibyśmy poświęcić dwa piny portu C, na których zlokalizowane są także wejścia przetwornika ADC.
Ponieważ podjęliśmy decyzję, że czujniki będziemy odczytywać, za pomocą ADC, nie możemy więc poświęcać jego pinów na inne funkcjonalności. Z tego powodu interfejs TWI odpada.
Nie mamy więc wyboru i musimy zastosować interfejs SPI.
Mamy z tego tytułu dodatkowe zyski:
- wykorzystamy te same piny co złącze programowania (MOSI, MISO i SCK),
- znacznie szybsze przesyłanie danych z częstotliwością linii SCK nawet 8MHz przy kwarcu 16MHz. Dla porównania interfejs TWI pozwalałby na maksymalnie 0,4MHz.
Ale będą tekże straty:
- pamięć z interfejsem SPI wymaga dodatkowego pinu sterującego CS.
Zysk dot. współdzielenia pinów jest oczywisty i bardzo pożądany, o tyle dodatkowy pin sterujący pamięcią może być dla nas problemem, którego ewentualne rozwiązanie zostawimy sobie na później.
Pamięć EEPROM
Pamięci
EEPROM mają tę zaletę, że po odłączeniu zasilania zapisane dane nie są tracone.
Mają jednak istotną dla nas wadę, którą jest długi czas zapisu danych. Popatrzmy na popularną pamięć serii 24Cxx, a konkretnie na
AT24C32 i AT24C64:
Pięć milisekund to sporo czasu. Wprawdzie pamięć ta zorganizowana jest w
32-bajtowe strony, co pozwala zwiększyć szybkość zapisu bloku danych, to nadal zapis takiego bloku trwa
5ms.
Czy taki czas zapisu nie jest dla nas zbyt długi?
Policzmy:
Ilość 200-tu pomiarów po 32 bajty, to sporo informacji i być może wystarczy do naszych celów:
Pamięć SRAM
Jednakże znając nasz apetyt na analizę zebranych danych, wielkość transferu na poziomie
6,25kB/s (kBps) to porcja informacji, która może być zbyt mała, jeżeli będziemy chcieli zapisywać także dane o trasie lub inne parametry.
W takim przypadku warto przyglądnąć się pamięciom
SRAM, które zapisują dane bez dodatkowego zauważalnego czasu zapisu, czyli natychmiast po otrzymaniu danych (ang. Zero Write Time).
Wprawdzie nie są one odporne na zanik zasilania, ale dla nas nie jest to problemem, ponieważ po zatrzymaniu robot przejdzie do stanu czuwania, czyli będzie podtrzymywał stan pamięci, aż do odłączenia akumulatora. Aby zabezpieczyć się przed zapominalskim, czy podekscytowanym twórcą, możemy przypominać o konieczności odczytu danych, na przykład za pomocą świecącej, czy migającej diody.
Wielkość pamięci
Pamięci
SRAM nie są drogie, ale też i nie są tanie. Dlatego poświęcę, chwilkę na ten temat.
Ponieważ na ten moment, nie jak duże będzie zapotrzebowanie na pamięć, to rozważmy wyżej obliczony transfer oraz maksymalny czas jazdy robota, który przyjmiemy na poziomie
15 sekund:
Pamięć jaka potrzebna byłaby do takiego pakietu danych, to pamięć
128kB na przykład
23LCV1024, która kosztuje około
11-12zł (cena 2013r.).
Nie jest to mało zważywszy cenę mikrokontrolera
ATmega8 na poziomie około
5zł.
Jednakże uważam, że posiadanie tak dużej pamięci jest zasadne i da nam możliwość gromadzenia sporej ilości danych do późniejszej analizy, w celu "śrubowania" osiągów robota do granic jego możliwości.
Można oczywiście będzie wstawić inną tańszą pamięć o mniejszej pojemności, ponieważ biblioteki, które utworzymy będą przygotowane do takiej zamiany. Można także w ogóle zrezygnować z tego modułu i zaoszczędzić trochę pieniędzy, kosztem braku danych do analizy.
Napięcie zasilania
Przy wyborze pamięci należy w szczególności zwrócić uwagę, na dopuszczalne napięcia jej pracy.
Tutaj możesz spotkać wiele różnych zakresów. W naszym przypadku ustaliliśmy już, że napięciem zasilającym elektronikę robota, będzie
5V. Dlatego też warto wybrać taką pamięć, która będzie mogła pracować z tym napięciem, by nie trzeba było stosować dodatkowych układów dostosowujących poziomy sygnałów sterujących oraz dodatkowego problemu związanego z zasilaniem takiej pamięci.
Podsumowując
Wykorzystując pamięć
SRAM wraz z interfejsem
SPI, będziemy mieli bardzo wydajny moduł zapisu danych w trakcie pracy robota. Od nas będzie tylko zależało, w jaki sposób wykorzystamy ten moduł.
Niezbędne peryferia:
- współdzielenie pinów MOSI, MISO i SCK,
- dodatkowy pin do obsługi pinu CS pamięci,
- interfejs SPI.
Komunikacja z komputerem
Aby odczytać zgromadzone w pamięci
SRAM dane z jazdy robota, musimy dysponować interfejsem do komunikacji z komputerem. Warto byłoby także mieć możliwość wysłania do mikrokontrolera jakiś danych, np. jakiejś obszerniejszej tablicy danych konfigurujących robota.
Tanią możliwością jest wykorzystanie interfejsu
RS-232,
do którego dostęp powinien mieć każdy, kto zajmuje się mikrokontrolerami (np. za pomocą konwertera RS232-USB). Interfejs ten wykorzystuje piny
RxD oraz
TxD, a komunikację oprzemy oczywiście o przerwania na bazie artykułu:
RS-232: Komunikacja ATmega8 z komputerem
Niezbędne peryferia:
- piny TxD oraz RxD,
- interfejs USART.