Robotyka - Czujniki

Komunikacja z Arduino

int kolejnaLiczba = 0;

void setup() {
      Serial.begin(9600);
     Serial.println("Witaj w programie odliczającym. A teraz kolejno odlicz!");
}

void loop() {
      Serial.println(kolejnaLiczba);
      kolejnaLiczba = kolejnaLiczba + 1;
      delay(1000);
}

Aby zobaczyć efekt wybierz „Narzędzia”, a następnie „Monitor portu szeregowego” lub wciśnij na klawiaturze kombinację „Ctrl+Shift+M”.
Zmienna „kolejnaLiczba” to zmienna, w której zapisujemy liczbę wykonanych do tej pory iteracji. W funkcji „setup()” polecenie „Serial.begin(9600)” służy do otwarcia portu szeregowego i ustanawia prędkość przesyłu danych. Kolejna funkcja „Serial.println()” to funkcja umożliwiająca wyświetlenie informacji na ekranie komputera. W naszym przypadku jest nią „Witaj w programie odliczającym. A teraz kolejno odlicz!".
W funkcji „loop()” wyświetlamy daną liczbę iteracji <Serial.println(kolejnaLiczba)> i zwiększamy wartość zmiennej „kolejnaLiczba” o 1 <kolejnaLiczba = kolejnaLiczba + 1>. Na końcu czekamy jedną sekundę.

W drugim przykładzie pokażemy jak wyświetlić na ekranie liczby wpisane przez nas przy użyciu klawiatury i w jaki sposób port szeregowy wykorzystać do sterowania częstością migania diody.

int predkosc = 10;
int dioda = 13;

void setup() 
{
    Serial.begin(9600);
    pinMode(dioda, OUTPUT);
}

void loop() {
    if (Serial.available()){
        predkosc = Serial.parseInt();
    }
    Serial.println(predkosc);
    digitalWrite(dioda, HIGH);
    delay(predkosc);
    digitalWrite(dioda, LOW);
    delay(predkosc);
}

Program zaczynamy od ustawienia początkowego czasu włączenia lub wyłączenia diody oraz złącza, które będziemy wykorzystywać. W funkcji „setup()”, podobnie jak poprzednio, otwieramy port szeregowy i ustawiamy złącze diody na „OUTPUT”. Polecenie „if (Serial.available())” w tym przykładzie sprawdza, czy dane zostały już wprowadzone (wpisane). Jeśli tak to obierane dane zamienia na liczbę całkowitą „Serial.parseInt()” i zapisuje jako nowy czas w zmiennej „predkosc”. Dzięki linii „Serial.println(predkosc)” na ekranie wyświetlany jest aktualny czas jednego włączenia diody. Dioda miga w zależności od wartości zmiennej „predkosc”.

Czujnik koloru

czujniklinii1_bb.png
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  Serial.println(digitalRead(2)); // print the data from the sensor
  delay(500);
}

Na białej kartce narysuj czarnym pisakiem/flamastrem/markerem czarną linię o grubości kilku milimetrów. Uruchom monitor portu szeregowego. Kartkę umieść równolegle nad czujnikiem, tak aby oświetlana była jej biała cześć. Odczytaj wartości z ekranu komputera. Teraz umieść kartę nad czujnikiem tak, aby oświetlana była jej ciemna cześć. Odczytaj wartości. Pomiędzy pomiarami powinna być znacząca różnica.
Z czego wynika ta różnica? Czarny kolor jest kolorem pochłaniającym światło, natomiast kolor biały odbija światło. Dioda w układzie generuje podczerwone światło, które w większości pochłaniane jest przez czarną powierzchnę, jego resztka trafia do odbiornika w czujniku. Wtedy w monitorze portu szeregowego wyświetlają się większe wartości (więcej pochłoniętego światła). Natomiast gdy światło odbija się od powierzchni białej, światło nie jest pochłaniane i w większości trafia do odbiornika a w monitorze portu szeregowego wyświetlają się wartości mniejsze (mniej światła zostało pochłonięte).

int oswietlenie = 0;
void setup(){
    Serial.begin(9600);
}

void loop(){
    oswietlenie = digitalRead(2);
    if(oswietlenie == 1){
        Serial.println("kolor czarny");
    }
    else{
        Serial.println("kolor bialy");
    }
    delay(500);  
}

Czujnik odległości

czujnikodl_bb.png
void setup (){
Serial.begin (9600);
        pinMode (A0, INPUT);
}

void loop (){
        Serial.println (analogRead (A0));
        delay (1000);
}

Uruchom monitor portu szeregowego. Czy wyniki są prawidłowe? W jakich jednostkach zwracana jest wartość odczytana przez czujnik?
Aby wynik pomiaru zwracany był w znanych (prawidłowych) jednostkach, musimy go przeliczyć wg wzoru:(1)
\begin{align} pomiarMilimetrach=\frac{67870}{pomiar-3}-40 \end{align}

Gdzie „pomiar” to wartość odczytana, a „pomiarMilimetrach” to odległość wyrażona w milimetrach.
Sprawdź teraz w jakim zakresie wyniki podawane przez mikrokontroler są prawdziwe. Zacznij od 200 mm. Jeśli wyniki się pokrywają, sprawdź wartości o 10 mm mniejsze, i tak dalej, aż do momentu kiedy wyniki będą się między sobą różnić. W ten sposób znajdziesz najmniejszą wartość, jaką jest w stanie pomierzyć czujnik. Powtórz te same operacje, aby znaleźć największą wartość, jaką jest w stanie zmierzyć poprawnie czujnik.

int pomiar = 0;
int odleglosc = 0;

void setup(){
Serial.begin(9600);
        pinMode(A0, INPUT);
}

void loop(){
    pomiar = analogRead (A0);
    odleglosc = ((67870 / (pomiar - 3)) - 40);
    if (odleglosc > 800){
        Serial.println("Obiekt zbyt daleko czujnika!");  
    }
    else{
        Serial.print (odleglosc);
        Serial.println(" mm");
    }
    delay (1000);
}

Czujnik ruchu z czujnika odległości

int pomiar1 = 0;
int pomiar2 = 0;
int odleglosc1 = 0;
int odleglosc2 = 0;
int zmiana = 0;

void setup(){
Serial.begin (9600);
    pinMode (A0, INPUT);
}

void loop(){
    pomiar1 = analogRead(A0);
    delay(500);
    pomiar2 = analogRead(A0);
    odleglosc1 = ((67870 / (pomiar1 - 3)) - 40);    
    odleglosc2 = ((67870 / (pomiar2 - 3)) - 40);
    zmiana = abs(odleglosc2 - odleglosc1);
    if (zmiana > 100){
        Serial.println("RUCH!");  
    }
}

Mikrokontroler mierzy odległość dwukrotnie <pomiar= analogRead(A0)> w odstępie 0,5 s <delay(500)>. Następnie obliczana jest wartość bezwzględna zmierzonych różnic <zmiana=abs(odleglosc2-odleglosc1)>. Czemu wartość bezwzględna? Jeśli obiekt się oddalił to różnica zmierzonych odległości jest dodatnia, jeśli jednak się przybliżał, to różnica odległości jest ujemna. Wyznaczenie wartości bezwzględnej pozwala zawsze uzyskać wartość dodatnią, którą wykorzystujemy w instrukcji warunkowej decydującej o tym czy ruch został wykryty czy nie <if (zmiana>100)>. Jeśli ruch został wykryty w monitorze portu szeregowego pojawi się informacja "RUCH!".
Sprawdź czy pomiar wykonywany co 0,5 s oraz różnica zmierzonych odległości wynosząca 100 mm to optymalne wartości dla prawidłowego działania czujnika.

Zadanie 8

Napisz kod na Arduino, który wykorzystuje dane z dwóch dowolnych czujników dostępnych na symulatorze. Poziom skomplikowania kodu powinien być minimalnie taki jak w przykładach pokazywanych na zajęciach.

W mailu proszę zamieścić kod oraz printscreen zbudowanego systemu.

Oceniana będzie poprawność i kreatywność kodu.

Strona na licencji Creative Commons Attribution-ShareAlike 3.0. Autorzy: A. Czoska, M. Komosiński, B. Kowalczyk, A. Kupś, M. Lubawy