Podstawy: odczytywanie sygnałów (analogowo i cyfrowo)

Podstawy Arduino

Dalej ćwiczymy funckję analogRead() – tym razem z fajnym modułem, mianowicie czujnikiem pola magnetycznego SS49E. Podłączamy zasilanie a sygnał wychodzi z 3-ciej nóżki, jak na rysunku poniżej:

Czujka i opis nóżek (PIN-outy).

Warte podkreślenia jest, że ta czujka odróżnia dwa bieguny magnesów i dlatego jest warta zakupu. Przy tej okazji przekonaliśmy, że Arduino IDE wyposażone jest w automatyczne rysowanie wykresów dzięki Kreślarce – trzeba tylko wysyłać na port szeregowy liczby w postaci napisów (gdy chcemy dwie krzywe na wykresie – liczby muszą być podane w jednej linii, oddzielnone spacjami). Proste, a jakie użyteczne!

Skoro mamy przećwiczone analogRead() to powracamy do mniej widowiskowego digitalRead(): podłączamy moduł przycisku

Moduł przycisku tact-switch.

W kolejnym kroku podłączyliśmy moduł czujnika drgań:

Moduł czujnika drgań.

Ponownie wykorzystaliśmy Kreślarkę by rysować drgania czujnika, razem z wykresem pola magnetycznego – proste, ale cieszy 😉

Maskotka

Prace trwają: BB z PP rozkładają pojazd, programują i… stwierdzają zgon jednego z dwóch Arduino! Przyczyna? no właśnie… dochodzenie trwa…

Precyzyjna Maszyna oraz RPM

Obroty na minutę: RPM (czujka pola magnetycznego SS49E)

Pan Przemek ukończył kod, który zlicza obroty wirującego silniczka – brawo! Należy się pochwała, bo to jego pierwsze zmagania z Arduino.

Układ doświadczalny:

W układzie celowo zamontowano magnesy tak, by czujka SS49E „widziała” raz biegun północny (N) magnesu, a za drugim razem (gdy silniczek obróci sie o 180 stopni) biegun południowy (S). Ustawienie magnesów na końcach patyka nie jest więc przypadkowe 😉 Czujnik SS49E odczytuje zarówno biegun S jak i N (uwaga: nie wszystkie czujki pola magnetycznego, bazującego na efekcie Halla, tak mają – warto to sprawdzić przed zakupejm), dlatego widzimy dwa „piki” podczas obracania silniczka – jeden „do góry” (większe napięcie) oraz „do dołu” (napięcie mniejsze). Z dala od magnesów czujka zwraca napięcie ~2.5V informując, że wartość pola magnetycznego jest (około) zera. Poniżej wykres z Kreślarki

Program zliczający liczbę obrotów na sekundę (zmienna czas – aktualnie 1000ms, ale można zmienić, także przez krotność – zmienna krok). Algorytm polega na znajdowaniu maksimum i minimum napięcia – a zapisywane jest moment ich wystąpienia (do zmiennych t_1oraz t_2, odpowiednio). Różnica tych czasów do pół obrotu.

void setup() {
Serial.begin(9600);
}

int i,max_=518,min_=518,a=0,b=0,czas,n=0,krok=1;
float v;
long int t_1=0,t_2=0,t_k=0,t_3=0,t_p;

void loop(){
 t_p=millis();
 czas=1000;
 i=analogRead(A0);
 if(i>540){
   if(i>max_){
    max_=i;
    t_1=millis();
   }
   else if(i<max_){
    a=1;
   }
 }
 if(i<490){
   if(i<min_){
    min_=i;
    t_2=millis();  
    }
   else if(i>min_){ 
    b=1; 
  }
 }

 if(t_1>t_2){
  t_3=t_2;
 }
 else{
  t_3=t_1;
 }
 
 if(a==1&&b==1){
    t_k=abs(t_2-t_1);
    a=0;
    b=0;
    max_ = 518;
    min_ = 518;
    if(czas>t_3){
      n++;
    }
    else if(czas<t_3){
    Serial.print("Liczba pol-obrotow: ");
    Serial.println(n);
    n=0;
    krok++;
    czas=czas*krok;
    }
 }
 }

Zmienna n (małe n) zlicza wystąpienia „półobrotów”, a co ustalony czas wypisywany jest komunikat z tą liczbą. W ten sposób mamy właśnie pół-RPS (revolutions per second), z którego łatwo można już otrzymać RPM (revolutions per minute).

Precyzyjna Maszyna

Sprężynka nie wytrzymała – chyba była zbyt twarda 🙁

Nowy model powinien być lepszy – bo wydrukowany z Z-Ultratu:

No i mamy coraz lepszą pracę Maszyny:

Więcej o projekcie Maszyny na stronie projektu.

(c) K.G.

Precyzyjna Maszyna (chwytak!) oraz Wiatromierz

Chwytak do ołówka/mazaka zaprojektowany, wydrukowany w 3D i zamontowany! Działa z serwomechanizmem a kod BBcode obsługuje nowe instrukcje (up, down).

No i kolejny (próbny) precyzyjny rysunek:

Opis całego proejktu Maszyny pod tym adresem

Obroty na minutę (rpm) i czujka pola magnetycznego SS49E

Wakacje w trakcie, ale nie tylko Pan Bartek spędza wolny czas z pracą nad projektem. Pan Przemek, który nie miał czasu na zajęcia Fi-BOTa w roku akademickim, poznaje Arduino i „atakuje” temat liczenia obrotów silniczka, wykorzystując czujkę pola magnetycznego SS49E


A po co nam zliczanie tych obrotów? Zastosowań jest wiele, jednym z nich jest mierzenie prędkości wiatru takim prostym urządzeniem:

w środku którego znajdują się: czujka SS49E, dwa magnesy oraz łożysko kulkowe (typ 682ZZ).

O dalszych losach tego projektu niebawem…

(c) K.G.

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 😉