Wojny robotów i czujka pola magnetycznego

Mamy nowy pomysł: WOJNY ROBOTÓW ! Będzie trochę zabawy z prostym sterowaniem pojazdami trójkołowymi, połączonymi z elementami rywalizacji. Będzie też zabawa w modelowanie 3D i wydruk gotowych „pojazdów”. Szkice z „burzy mózgów”:

Właśnie z powodu nowego pomyłu przetestowaliśmy działanie czujki pola magnetycznego SS49E – dziecinnie proste 😉 Podłączamy do zasilania (5V z Arduino UNO) a wyjście #3 do portu analogowego.

Odczytywane napięcie z portu analogowego tłumaczymy na wartość pola  magnetycznego zgodnie z poniższym rysunkiem (z noty katalogowej czujnika).

Zaletą tego konretnego czujnika (SS49E) jest możliwość odczytywania pola z obu biegunów magnesu – czyli z biegunu półnonego i południowego. Są bowiem inne czujki, które informują nas jedynie o wartości pola z jednego bieguna, a na pole z przeciwnego bieguna są „głuche”. 

Nas nie interesują wartości w mT, a raczej sama informacja zbliżenia do magnesu. No właśnie – przetesowaliśmy kilka małych (i większych) magnesów, w tym neodymowe – bardzo silne. Będzie się działo!

(c) K.G.

Podstawy: czujka pola magnetycznego SS49E

Analogowa czujka pola magnetycznego SS49E

 

ss49eSS49E to bardzo fajny układ do mierzenia wartości pola magnetycznego w zakresie -1500..0..+1500 Gs. Warto zwrócić uwagę, że czujka ta mierzy zarówno „plusy” jak i „minusy”, czyli jest bibolarna – w odróżnieniu od układów unipolarnych (które reagują jedynie na konkretną polaryzację magnesu, czyli tylko biegun N lub tylko biegun S). Wartość zmierzonego pola tłumaczona jest na napięcie na pinie OUT z zakresu od 0.86V do 4.21V w sposób liniowy. Tę liniowość wykorzystamy za chwilę.

Analogowa czy cyfrowa?

Jest dużo podobnych układów. Inne czujki (szczególnie te unipolarne) są nazywane switczami (ang. switche) i są cyfrowe. Unipolarność wyjaśniłem wyżej, natomiast cyfrowość oznacza tu, że układy te reagują jedynie na jakąś konkretną wartość pola magnetycznego (wartość progową). I tak w przypadku przekroczenia tego progu czujka zwraca napięcie wysokie, a jeśli próg nie został przekroczony – napięcie niskie. Świetnie to się sprawdza w wielu sytuacjach (inteligentne domy – okno zamknięte/otwarte, lub do mierzenia obrotów wszelakiego rodzaju kół). Przykładem takiej czujki jest TLE4905L. Jest też z reguły o połowę tańsza. Ale nie o niej dziś będzie (wspomnianą pobawimy się na innych zajęciach) – my mamy czujkę analogową. Jak więc jej używać?

Pinologia (aka. podłączenie)

Jak zawsze należy pobrań z internetu notę katalogową (szukamy frazy SS49E datasheet lub podobnie) i przeglądamy całość. Nie musimy wszystkiego rozumieć, zwracamy uwagę na opis ogólny układu i sposób podłączenia. Poniżej zamieszczam wycinek z tego dokumentu:

ss49e-pins

i już wiemy, która nóżka tego układu co oznacza. Dalej doczytujemy, że napięcie zasilające (Vdd) musi być z przedziału 4-6V, czyli Arduino UNO jak najbardziej się nada. Przy podłączeniu dbamy o odpowiednie ustawienie układu!

Odczyt wartości pola

Specyfikacja podaje, że SS49E zwraca wartość 0.86V gdy pole wyosi -1500 Gs, oraz 4.21V gdy pole wynosi +1500 Gs. Jak więc obliczać co wskazuje czujka? Musimy podłączyć układ do zasilania (nóżki 1 i 2) a także nóżkę 3 (nazwaną OUT) do woltomierza (miernika uniwersalnego) lub do Arduino i portu analogowego (np. A0). Oczywiście zachęcam do rozpoczęcia zabawy z miernikiem i magnesem, aby sprawdzić jak to działa. Po tej czynności wracamy do Arduino i podłączamy nóżkę OUT do portu analogowego A0 w Arduino. Potrzebujemy przelicznika.

ss49e
(układ SS49E + Arduino UNO + magnes + płytka stykowa).

Czujka liniowa

Oznacza to, że wartości napięcia z pinu OUT odpowiadają wartościom pola w sposób liniowy, czyli jak funkcja y=a*x+b. Traktujemy więc x jako napięcie z pinu OUT, a y jako wskazywane pole. Dlatego zapisujemy układ równań na nieznane jeszcze współczynniki prostej a i b. Są to:

-1500 = a*0.86 + b    (1)
oraz
1500 = a*4.21 + b.     (2)

Te dwa równania należy rozwiązać wyznaczając współczynniki prostej a i b a następnie dla każdego odczytanego napięcia z pinu OUT (oznaczmy to x) obliczać natężenie pola według przepisy

y=a*x+b,

gdzie y to właśnie wartość pola.

float a=....;//policz samodzielnie, rozwiązując (1) i (2)
float b=....;//policz samodzielnie
void setup(){
  Serial.begin(9600);
}

void loop(){
  int odczyt=analogRead(A0);
  float x=odczyt*4.56/1023;
  Serial.print("napięcie OUT [V] = ");
  Serial.print(x);
  Serial.print(" ,pole magnetyczne [Gs] = ");
  Serial.println(a*x+b);
}

Uwaga

Kluczowe jest odpowiednie odczytanie napięcia z nóżki OUT układu SS49E – bardzo przydatny okaże się woltomierz (multimetr w trybie woltomierza). Zwróć uwagę na program powyżej, gdzie moje Arduino jest już lekko uszkodzone i zamiast książkowych 5V otrzymuję jedynie 4.56V z pinu oznaczonego 5V – dlatego moje przeliczenie odczyt <—> x jest w taki, a nie inny sposób.

Rozdzielczość czujnika

Ze specyfikacji czujnika wynika, że na 1 Gs przypada napięcie 0.001116666 V, czyli 1.116 mV (obliczone jako iloraz 4.21-0.86 — caly zakres napięcia — i liczby 3000 — cały zakres pola, od -1500 do 1500). Natomiast rozdzielczość wejścia analogowego to 4.457 mV na 1 jednostkę w funkcji analogRead (obliczone jako iloraz 4.56 i 1023). Oznacza to, że nie jesteśmy w stanie mierzyć Aruinem tak dokładnie, jak by się chciało, ale tylko z dokładnością plus/minus 4 Gs. Dochodzą do tego jeszcze fluktuacje samego przetwornika analogowo-cyfrowego w Arduino – przyznacie, że widzicie czasami skoki odczytów o plus/minus 1? może nawet 2? Dlatego zmierzona w ten sposób wartość pola to raczej plus/minus 8 Gs. 

Ziemskie pole magnetyczne

Na powierzchni Ziemi, bez magnesów i innych zewnętrznych pól powinniśmy otrzymać około 0.5 Gs — z naszą dokładnością każdy wynik <10 Gs jest OK.

Zabawa magnesem

Jak najbardziej! Próbujemy odczyty z obu biegunów magnesu, sprawdzamy zależność od odległości od czujki. W przypadku mocnych magnesów (np. neodymowych) uważamy, aby ich nie zbliżać do mikrokonktrolera Atmega na płytce Arduino — możemy go uszkodzić!

Okazuje się, że w zależności od napięcia zasilania czujka podaj zero pola magnetycznego różnymi wartościami napięcia z pinu OUT — opisane jest to w specyfikacji. Wrócimy do tego zagadnienia później.

 

Podstawy: Programowanie strukturalne cz.2 + czujka pola magnetycznego

Kontynuujemy – wyświetlacz 7-segmentowy

Tym razem dopięliśmy swego i wyświetliliśmy wszystkie cyferki 😉 Przy okazji użyliśmy tablic – ba, nawet tablic dwuwymiarowych! Ostro… Znalezione obrazy dla zapytania wyswietlacz 7 segmentowy

Na dodatek stworzyliśmy funkcję z argumentem – jaką cyferkę chcemy wyświetlić.

void cyfra(int nr){
//kod do wyświetlania...
}

void loop(){
  for (int i=0; i<=9; i++){
    cyfra(i);
    delay(500);
  }
}

Czujka pola – SS49E

Poznaliśmy też czujkę pola, działającą w zakresie -1500..+1500 G. Podłączyliśmy ją do woltomierza a Pan Kamil nawet do Arduino. Za tydzień każdy z nas podłączy sobie ten układ 😉