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
int czujnik = 9;
int oswietlenie = 0;

void setup(){
    Serial.begin(9600);
}
void loop(){
    oswietlenie = digitalRead(czujnik);
    Serial.println(oswietlenie);
    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 = analogRead(A0);
    if(oświetlenie > 600){
        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);
    pomiar =((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 pomiar = 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);
    pomiar1 = ((67870 / (pomiar1 - 3)) - 40);    
    pomiar2 = ((67870 / (pomiar2 - 3)) - 40);
    zmiana = abs(pomiar2 - pomiar1);
    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 przy pomocy czujnika światła (fotorezystor) będzie potrafił odczytać sygnał SOS. Arduino ma sczytywać sygnał z fotorezystora i ocenić czy sygnał ten składa się z kombinacji "krótki krótki krótki długi długi długi krótki krótki krótki". Jeśli tak, wyprintuj w innym pinie słowo "<swoje imię>, pomocy!"

Przyjmij, że odczyt z fotorezystora powyżej pewnej wartości odpowiada obecności światła, a poniżej tej wartości jego braku (np. 600 jednostek, jak w jednym z przykładów powyżej).

Przyjmij, że krótki sygnał wynosi 500 ms, a długi 1500 ms.

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