[ARDUINO] Oko Cyklopa – ultradźwiękowy „radar” do lokalizacji obiektów
odpowiedź. Następnie przekazujemy wynik pomiaru poprzez port szeregowy (listing 2).
List. 2. Kod obliczający odległość do obiektu i wysyłający dane szeregowo przez RS232
int TX1 = 10; int RX1 = 11; long TIME1; void setup() { pinMode(TX1, OUTPUT); pinMode(RX1, INPUT); Serial.begin(9600); } void loop() { digitalWrite(TX1, HIGH); delayMicroseconds(10); digitalWrite(TX1, LOW); TIME1 = pulseIn(RX1, HIGH); Serial.print(" Czujnik 1: "); Serial.println(TIME1/58); }
W programie z listingu 2 wykorzystano funkcję:
pulseIn(port , oczekiwany_stan)
Funkcja ta zwraca wartość wyrażoną w jednostce czasu informującą o osiągnięciu na danym porcie oczekiwanego stanu logicznego. W powyższym programie po wysłaniu impulsu oczekujemy na pojawienie się na linii 11 wysokiego poziomu napięcia. Otrzymany wynik poprzedzony odpowiednią adnotacją wysyłamy do komputera.
Po zakończeniu testów czujnika przechodzimy do kolejnego etapu, jakim jest jednoczesne uruchomienie trzech czujników oraz określenie, który czujnik znajduje się najbliżej przeszkody. Do wykonania tego zadania warto skorzystać schemat z rysunku 2. Zgodnie z tym schematem czujniki zostały dołączone następująco:
- Czujnik 1: nadajnik – linia 10, odbiornik – linia 11,
- Czujnik 2: nadajnik – linia 12, odbiornik – linia 13,
- Czujnik 3: nadajnik – linia 6, odbiornik – linia 7,
- Zasilanie oraz masa zostały dołączone równolegle.
Rys. 2. Schemat dołączenia 3 czujników ultradźwiękowych do Arduino Leonardo
Po odpowiednim połączeniu elementów urządzenia kolejnym celem będzie oprogramowanie tego układu. Do tego powielimy kod z listingu 2 odpowiednio konfigurując porty. Wynik tej operacji znajduje się na listingu 3.
List. 3. Kod obliczający odległość do obiektu zmierzoną przez trzy czujniki ultradźwiękowe
int TX1 = 10; //port nadajnik Ultrasonic int RX1 = 11; //port odbiornik Ultrasonic int TX2 = 12; //port nadajnik Ultrasonic int RX2 = 13; //port odbiornik Ultrasonic int TX3 = 6; //port nadajnik Ultrasonic int RX3 = 7; //port odbiornik Ultrasonic int CM; //odległość w cm long TIME1,TIME2,TIME3; //długość powrotnego impulsu w uS void setup() { pinMode(TX1, OUTPUT); pinMode(RX1, INPUT); pinMode(TX2, OUTPUT); pinMode(RX2, INPUT); pinMode(TX3, OUTPUT); pinMode(RX3, INPUT); Serial.begin(9600); } void loop() { pomiar_odleglosci(); // szerokość odbitego impulsu w uS podzielone przez // 58 to odleglosc w cm - patrz dokumentacja Serial.print(" Czujnik 1: "); Serial.print(TIME1/58); Serial.print(" Czujnik 2: "); Serial.print(TIME2/58); Serial.print(" Czujnik 3: "); Serial.println(TIME3/58); delay(100); } void pomiar_odleglosci () { // impuls 10 uS inicjalizujacy - patrz dokumentacja digitalWrite(TX1, HIGH); delayMicroseconds(10); digitalWrite(TX1, LOW); TIME1 = pulseIn(RX1, HIGH); digitalWrite(TX2, HIGH); delayMicroseconds(10); digitalWrite(TX2, LOW); TIME2 = pulseIn(RX2, HIGH); digitalWrite(TX3, HIGH); delayMicroseconds(10); digitalWrite(TX3, LOW); TIME3 = pulseIn(RX3, HIGH); }
Aby określić położenie obiektu, będziemy musieli wyznaczyć wartość minimalną wskazania czujników. Do tego celu posłuży algorytm przedstawiony na rysunku 3. Jego implementacja w języku C jest pokazana na listingu 4.
Rys. 3. Algorytm sortowania wartości odczytanych przez czujniki