Sensory Ultradźwiękowy czujnik odległości (Silabs UNI_DC) Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
Sensory Ultradźwiękowy czujnik odległości HC-SR04 Zasilanie: 5V Pobór prądu: < 2mA Efektywny kąt: < 15º 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości HC-SR04 Efekt piezoelektryczny Efekt piezoelektryczny występujący podczas ściskania i rozciągania płytki o cięciu X a) Płytka rozciągana wzdłuż osi X b) Płytka rozciągana wzdłuż osi Y 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości HC-SR04 Przykłady zastosowań 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości HC-SR04 Parkiet generujący energię elektryczną pod wpływem ruchu tańczących, zużywaną następnie do napędzania klimatyzacji ma londyński nocny klub Surya. Nazwa klubu mieszczącego się w Londynie na Pentoville Road pochodzi od imienia hinduskiego boga słońca. 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości HC-SR04 Silniki piezoelektryczne 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości HC-SR04 Materiały piezoelektryczne Kwarc α - ditlenek krzemu, kryształ górski Sól Seignette'a - winian sodowo-potasowy, sól La Rochelle Turmaliny - borokrzemiany kilku metali Diwodorofosforany amonu i potasu - KH2PO4 i NH4H2PO4, oznaczane są zwykle skrótami KDP i ADP Tytanian baru i jego związki izomorficzne Winian dwuaminoetylenowy, winian dwupotasowy - w skrócie są nazywane EDT i KDT 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości HC-SR04 Zasada pomiaru Odległość = (Szerokość impulsu ● Prędkość dźwięku) / 2 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości HC-SR04 Zależność prędkości fali dźwiękowej (w m/s) od temperatury i wilgotności względnej powietrza C 20%RH 50%RH 80%RH 331,52 331,62 331,70 5 334,57 334,70 334,84 10 337,60 337,79 337,98 15 340,61 340,88 341,15 20 343,62 343,99 344,37 25 346,62 347,13 347,65 30 349,67 350,32 351,01 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości HC-SR04 Charakterystyka sensora: D[cm] = T[µs] / 58 Producent podaje zakres: 2cm - 500 cm (3 cm – 300 cm) Rozdzielczość: 0,3 cm Częstotliwość: 40 kHz (fala 8 x 25 µs = 200 µs) 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – HC-SR04 W temperaturze 21ºC prędkość dźwięku wynosi ok. 345m/s Oznacza to 0,0345 cm/µs Czyli przebycie odległości 1cm wymaga 28,9855 µs W zaokrągleniu przyjmujemy 29, a ponieważ dźwięk przebywa podwójną odległość i w związku z tym zmierzony czas odpowiedzi należy podzielić przez 58 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości HC-SR04 Charakterystyka sensora D[cm] = T[µs] / 58 Producent podaje zakres 2cm - 500 cm 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – HC-SR04 Charakterystyka sensora dookólna 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – HC-SR04 Transmisja asynchroniczna Brak 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – HC-SR04 Przykładowe biblioteki dla Arduino http://www.inmotion.pt/store/ultrasound-sensor-hc-sr04 https://github.com/JRodrigoTech/Ultrasonic-HC-SR04 http://playground.arduino.cc/Code/NewPing https://code.google.com/p/arduino-new-ping/ https://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example https://code.google.com/p/arduino-new-ping/wiki/NewPing_Single_Pin_Sketch https://code.google.com/p/arduino-new-ping/wiki/Ping_Event_Timer_Sketch https://code.google.com/p/arduino-new-ping/wiki/Simple_NewPing_Example https://code.google.com/p/arduino-new-ping/wiki/Using_NewPing_Syntax http://www.instructables.com/id/Ultrasonic-Range-detector-using-Arduino-and-the-SR/ https://apcexpert.wordpress.com/category/sensor-ultrasonico- hc-sr04/ http://www.instructables.com/id/Simple-Arduino-and-HC-SR04- Example/ 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – HC-SR04 Przykładowe realizacja // Pomiar odległości w cm z czujnikiem HC-SR04 //Konfiguracja sprzętowa int trigPin = 9; int echoPin = 10; int gndPin = 11; int vccPin = 8; 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – HC-SR04 Przykładowe realizacja //Konfiguracja mikrokontrolera void setup() { Serial.begin(57600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW); // Zasilanie masa pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH); // Zasilanie +Vcc Serial.println(„ Pomiar odleglosci (w cm) z HC-SR04”); } 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – HC-SR04 Przykładowe realizacja //Pętla główna void loop() { Serial.print(sonarPomiar_cm()); Serial.println(„ cm”); delay(1000); //Pomiar odległości w cm } 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – HC-SR04 Przykładowe realizacja // Funkcja realizującą pomiar w cm int sonarPomiar_cm() { digitalWrite(trigPin, LOW); delayMicroseconds(5); digitalWrite(trigPin, HIGH); delayMicroseconds(12); // Impuls >10 µs int czas = pulseIn(echoPin, HIGH); int odleglosc = czas / 58; // obliczanie odległości if ((odleglosc > 500)|| (odleglosc < 0)) return 999; // przekroczony zakres pomiaru else return odleglosc; // poprawny pomiar w cm } 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – HC-SR04 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – HC-SR04 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Sensor z magistralą I2C 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Protokół I2C wzorowany na układach EEPROM serii 24xx Domyślny adres SFR10: 0xE0 Może być on zmieniony przez użytkownika na jeden z adresów: E0, E2, E4, E6, E8, EA, EC, EE, F0, F2, F4, F6, F8, FA, FC lub FE Rejestry SRF10 Zakres pomiaru określany jest w µs, tzn. wartość max równa 65535 (0xFFFF) odpowiada odległości 1129 cm lub 442 cale Rejestr #2 umożliwia zmianę wzmocnienia analogowego 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Polecenia Polecenia #80 do #82 ustalają format wyniku Polecenia #160, #165, #170 przeznaczone są do zmiany adresu I2C 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Wzmocnienie analogowe 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Wzmocnienie analogowe 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Zmiana adresów I2C 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Czytnik zakresu SFR10 // I2C SRF10 or SRF08 Devantech Ultrasonic Ranger Finder // by Nicholas Zambetti <http://www.zambetti.com> // and James Tichenor <http://www.jamestichenor.net> // Demonstrates use of the Wire library reading data from the // Devantech Utrasonic Rangers SFR08 and SFR10 // Created 29 April 2006 // This example code is in the public domain. #include <Wire.h> 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Czytnik zakresu SFR10 void setup() { Wire.begin(); // join i2c bus (address optional for master) Serial.begin(9600); // start serial communication at 9600bps } int reading = 0; void loop() // step 1: instruct sensor to read echoes Wire.beginTransmission(112); // transmit to device #112 (0x70) // the address specified in the datasheet is 224 (0xE0) // but i2c adressing uses the high 7 bits so it's 112 Wire.write(byte(0x00)); // sets register pointer to the command register (0x00) Wire.write(byte(0x50)); // command sensor to measure in "inches" (0x50) // use 0x51 for centimeters // use 0x52 for ping microseconds Wire.endTransmission(); // stop transmitting 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Czytnik zakresu SFR10 // step 2: wait for readings to happen delay(70); // datasheet suggests at least 65 milliseconds // step 3: instruct sensor to return a particular echo reading Wire.beginTransmission(112); // transmit to device #112 Wire.write(byte(0x02)); // sets register pointer to echo #1 register (0x02) Wire.endTransmission(); // stop transmitting // step 4: request reading from sensor Wire.requestFrom(112, 2); // request 2 bytes from slave device #112 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Czytnik zakresu SFR10 // step 5: receive reading from sensor if (2 <= Wire.available()) // if two bytes were received { reading = Wire.read(); // receive high byte (overwrites previous reading) reading = reading << 8; // shift high byte to be high 8 bits reading |= Wire.read(); // receive low byte as lower 8 bits Serial.println(reading); // print the reading } delay(250); // wait a bit since people have to read the output :) 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Czytnik zakresu SFR10 Fragment zakomentowany /* // The following code changes the address of a Devantech Ultrasonic Range Finder (SRF10 or SRF08) // usage: changeAddress(0x70, 0xE6); void changeAddress(byte oldAddress, byte newAddress) { Wire.beginTransmission(oldAddress); Wire.write(byte(0x00)); Wire.write(byte(0xA0)); Wire.endTransmission(); 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Czytnik zakresu SFR10 Fragment zakomentowany Wire.beginTransmission(oldAddress); Wire.write(byte(0x00)); Wire.write(byte(0xAA)); Wire.endTransmission(); Wire.write(byte(0xA5)); Wire.write(newAddress); } */ 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Symulator czujnika SFR10 byte address = 112; // adres czujnika unsigned int manipVar = 0; // zmienna do zmiany danych byte bytessent = 2 ; // liczba bajtów do wysłania byte bytestosend[2] ; // przygotowanie danych do wysłania byte command = 0 ; // przechowywanie poleceń void setup() { TWAR = (address << 1) | 0b00000001; // ustawienie adresu i ogólnej odpowiedzi na wywołania TWCR = 0b01000101; // ustawienie TWEA, TWEN i TWIE na 1 SREG |= 0b10000000; // globalne włączenie przerwań pinMode(13 , OUTPUT); } // koniec void setup() 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Symulator czujnika SFR10 void loop() { if (command == 0x50) // włączenie diody dla polecenia 0x50 digitalWrite (13 , HIGH); if (command == 0x02) // wyłączenie diody dla polecenia 0x02 digitalWrite (13 , LOW); manipVar++; // główna zmienna do manipulowania dwoma bajtami wyjściowymi bytestosend [0] = manipVar; // przygotowanie starszego i młodszego bajtu zmiennej manipVar bytestosend [1] = manipVar >> 8 ; // starszy bajt manipVar delay (250); // coś innego do zrobienia podczas oczekiwania } // koniec void loop() 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Symulator czujnika SFR10 ISR (TWI_vect) { // procedura obsługi przerwania przypisana do wektora if (TWCR & (1 << TWINT)) { // powtórne sprawdzenie, czy przerwanie jest właściwe if ((TWSR & 0b11111000) == 0x80) { // dane przychodzące command = TWDR; // skopiowanie danych polecenia do wykorzystania później TWCR = 0b11000100; // reset oryginalnej konfiguracji } 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Symulator czujnika SFR10 if ((TWSR & 0b11111000) == 0xA8 ) // żądanie danych wychodzących { while (bytessent > 0 ) // wysłanie bajtów do mastera bytessent--; TWDR = bytestosend [bytessent]; // wysłanie danych od najstarszego do najmłodszego bajta TWCR = 0b11000101; // reset po każdym wysłaniu delay (5); // chwilowa pauza po wysłaniu } if (bytessent == 0 ) // reset liczby bajtów i jeżeli bufor jest pusty bytessent = 2; } // koniec if ((TWSR & 0b11111000) == 0xA8 ) 11-2014 Zygmunt Kubiak
Sensory Ultradźwiękowy czujnik odległości – SRF10 Symulator czujnika SFR10 TWCR = 0b11000101; // jeszcze jeden reset na wszelki wypadek SREG |= 0b10000000; // włączenie z powrotem przerwań } // koniec if (TWCR & (1 << TWINT)) } // koniec ISR (TWI_vect) 11-2014 Zygmunt Kubiak
Dziękuję Zygmunt Kubiak 09-2006