Pomiar odległości z Arduino czujniki, schematy, przykładowe kody W robotyce, mechatronice czy modelarstwie do rozwiązania jest problem pomiaru odległości do czegoś, na przykład do ściany lub do kogoś idącego w kierunku Arduino. Poniżej prezentujemy 3 przykładowe rozwiązania. Rozwiązanie 1 czujnik PING)))J W tym rozwiązaniu wykorzystujemy popularny ultradźwiękowy czujnik odległości o nazwie PING)))J firmy Parallax do pomiaru odległości obiektu od 2 centymetrów do około 3 metrów. Odległość wyświetlana jest na monitorze szeregowym i miga dioda LED, tym szybciej im obiekty się przybliżają. Na rysunku 1 pokazano widok czujnika PING)))J firmy Parallax, a na rysunku 2 schemat podłączenia tego czujnika do płytki Arduino. Rys. 1. Widok czujnika PING)))J firmy Parallax Przykładowy kod dla Arduino wyświetlający odległość i sygnalizujący miganiem diody LED zbliżanie się do obiektu zamieszczono poniżej /* Czujnik Ping))) * drukuje odległość i zmienia prędkość migania diody * w zależności od odległości od czujnika Ping))) */ const int pingpin = 5; const int ledpin = 13; // pin podłączony do diody LED void setup() Serial.begin(9600); pinmode(ledpin, OUTPUT); void loop() int cm = ping(pingpin) ; Serial.println(cm); digitalwrite(ledpin, HIGH); delay(cm * 10 ); // każdy centymetr dodaje 10 millisekund opóźnienia digitalwrite(ledpin, LOW); delay( cm * 10); // following code based on http://www.arduino.cc/en/tutorial/ping // returns the distance in cm int ping(int pingpin) 1
// establish variables for duration of the ping, // and the distance result in inches and centimeters: long duration, cm; // The PING))) is triggered by a HIGH pulse of 2 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: pinmode(pingpin, OUTPUT); digitalwrite(pingpin, LOW); delaymicroseconds(2); digitalwrite(pingpin, HIGH); delaymicroseconds(5); digitalwrite(pingpin, LOW); pinmode(pingpin, INPUT); duration = pulsein(pingpin, HIGH); // convert the time into a distance cm = microsecondstocentimeters(duration); return cm ; long microsecondstocentimeters(long microseconds) // The speed of sound is 340 m/s or 29 microseconds per centimeter. // The ping travels out and back, so to find the distance of the // object we take half of the distance travelled. return microseconds / 29 / 2; Rys. 2. Schemat podłączenia czujnika Ping)))J do modułu Arduino 2
Mierzenie odległości z Arduino czujniki, schematy, przykładowe kody Czujniki ultradźwiękowe zapewniają pomiar czasu potrzebnego na odbicie dźwięku od obiektu i powrót do czujnika. Impuls dźwiękowy ping jest generowany, gdy poziom na ping Pin przyjmuje stan wysoki (HIGH) na dwie mikrosekundy. Czujnik generuje impuls, który zakończy się, gdy dźwięk powróci. Szerokość impulsu jest proporcjonalna do odległości przebytego dźwięku, a szkic wykorzystuje funkcję pulsein do pomiaru czasu jego trwania. Prędkość dźwięku w powietrzu wynosi 340 metrów na sekundę, czyli 29 mikrosekund na centymetr. Wzór na odległość podróży dźwięku tam i z powrotem jest zatem następujący: odległość tam i z powrotem = ilość mikrosekund/29. Tak więc wzór na odległość w jedną stronę w centymetrach wynosi: (ilość mikrosekund/29)/2 Rozwiązanie 2 czujnik MAXSonar-EZ1 MaxSonar EZ1 to kolejny czujnik ultradźwiękowy, który może służyć do pomiaru odległości. Jest on łatwiejszy do wbudowania niż Ping))), ponieważ nie musi być pingowany (namierzany). Może zapewnić ciągłą informację o odległości, albo jako napięcie analogowe, albo proporcjonalnie do szerokości impulsu. Na rysunku 3 pokazano widok czujnika EZ1, a na rysunku 4 schemat podłączenia tego czujnika do płytki Arduino. Przykładowy kod dla czujnika EZ1 podłączonego do Arduino zamieszczono na następnej stronie. Szkic wykorzystuje wyjście szerokości impulsu EZ1 (PW) do uzyskania wyniku podobnego do tego z poprzedniego szkicu: Czujnik EZ1 jest zasilany przez piny +5V i masę i są one podłączone do odpowiednich pinów Arduino. Należy połączyć pin PW czujni- GND +5V TX AN PW Rys. 3. Widok czujnika MAXSonar-EZ1 wraz z opisem jego wyprowadzeń ka EZ1 z cyfrowym pinem Arduino pinem nr 5. Szkic mierzy szerokość impulsu za pomocą polecenia pulsein. Szerokość impulsu wynosi 58 mikrosekund na centymetr. Rys. 4. Schemat podłączenia czujnika MAXSonar-EZ1 do modułu Arduino 3
/* * Czujnik odległości EZ1 * drukuje odległość i zmienia prędkość migania diody * w zależności od odległości od czujnika Ping))) */ const int sensorpin = 5; const int ledpin = 13; // pin connected to LED long value = 0; int cm = 0; int inches = 0; void setup() Serial.begin(9600); pinmode(ledpin, OUTPUT); void loop() value = pulsein(sensorpin, HIGH) ; cm = value / 58; // szerokość ipulsu to 58 mikrosekund na cm inches = value / 147; // który to 147 mikrosekund na cal Serial.print(cm); Serial.print(, ); Serial.println(inches); digitalwrite(ledpin, HIGH); delay(cm * 10 ); // każdy centymetr dodaje 10 millisekund opóźnienia digitalwrite(ledpin, LOW); delay( cm * 10); delay(20); Uwaga Konieczne może być dodanie kondensatora miedzy linią +5V i Gnd, aby ustabilizować zasilanie czujnika, jeśli używane są długie przewody połączeniowe. Jeśli otrzymywane są błędne odczyty, należy podłączyć kondensator odprzęgający 10μF na czujniku. Można również uzyskać odczyt odległości z czujnika EZ1 poprzez jego wyjście analogowe należy podłączyć pin AN do wejścia analogowego i odczytać wartość za pomocą analogread. Poniższy kod wypisuje wejściowe dane analogowe przekonwertowane na cale: value = analogread(0); inches = value / 2; // każda cyfra odczytu analogowego to około 5mv Serial.println(inches); Wyjście analogowe wynosi około 9.8mV na cal. Wartość z analogread wynosi około 4,8mV na jednostkę, a poprzedni kod zaokrągla je tak, aby każda grupa dwóch jednostek miała jeden cal. Błąd zaokrąglenia jest niewielki w porównaniu do dokładności urządzenia, ale jeśli chcesz bardziej precyzyjnego obliczenia, możesz użyć kodu zmiennoprzecinkowego w następujący sposób: 4
value = analogread(0); float mv = (value /1024.0) * 5000 ; float inches = mv / 9.8; // 9.8mV na cal Serial.println(inches) ; Rozwiązanie 3 czujnik HC-SR04 W tym rozwiązaniu zastosowany został ultradźwiękowy czujnik odległości HC-SR04. Jest to czujnik działający w zakresie od 2 cm do 200 cm. Zasilany napięciem 5V. Wyjściem jest sygnał, którego czas trwania jest proporcjonalny do mierzonej odległości. Na rysunku 5 pokazano widok czujnika HC-SR04, a na rysunku 6 schemat podłączenia tego czujnika do płytki Arduino UNO. Przykładowy kod dla tego czujnika zamieszczono na następnej stronie. Rys. 5. Widok czujnika HC-SR04 HC SR04 VCC Trig Echo GND Rys. 6. Schemat podłączenia czujnika odległości HC-SR04 do modułu Arduino UNO 5
Przykładowy kod dla czujnika odległości HC-SR04 podłączonego do Arduino int echopin = 13; // kontakt Echo na Pinie 13 int trigpin = 12; // kontakt Trig na Pinie 12 void setup() Serial.begin (9600); pinmode(trigpin, OUTPUT); pinmode(echopin, INPUT); void loop() int duration, cm; digitalwrite(trigpin, LOW); delaymicroseconds(2); digitalwrite(trigpin, HIGH); delaymicroseconds(10); digitalwrite(trigpin, LOW); duration = pulsein(echopin, HIGH); cm = duration / 58; Serial.print(cm); Serial.println( cm ); delay(500); 6