Sonar
Leestijd: 5 MinutenProcessing view van de HC-SR04
De HC-SR04 uit nieuwsgierigheid een keer besteld op internet. Daarna verdween hij heel lang in de la zonder er wat mee gedaan te hebben. Tot aan vandaag.
Wat is de HC-SR04 ? Het is een Ultrasone sensor module. Het kan volgens de specs objecten “zien” vanaf 2 centimeter tot 400 centimeter. Met een precisie van 3 mm. De module bevat de zender, de ontvaner en het circuit om alles te regelen. Wat over blijft zijn 4 pinnen die je aanstuurt met bijvoorbeeld je Arduino. De module stuurt een ultrasone geluid richting het object die het terugkaatst. Dit geluid wordt vervolgens opgevangen door zijn eigen sensoren. De tijd tussen het versturen en ontvangen wordt terug gegeven.
Wanneer je het standaard voorbeeld “Ping” van de Arduino software een klein beetje aanpast werkt het ook voor de HC-SR04. Je moet een extra pin definiëren waar je minimaal 2 microseconden een pulse naar toe stuurt. Op deze manier geeft de module op de “echo pin” een pulse waaruit je de lengte in centimeters kan berekenen.
De snelheid van geluid is 340 meter per seconden, oftewel 29 microseconden per centimeter. Wanneer je de pulse deelt door 29, heb je de afgelegde afstand in centimeters. Vervolgens deel je dit door 2 aangezien het ultrasone geluid heen en terug gaat.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
/* HC-SR04 Sensor The circuit: * VCC connection of the sensor attached to +5V * GND connection of the sensor attached to ground * TRIG connection of the sensor attached to digital pin 2 * ECHO connection of the sensor attached to digital pin 4 */ const int trigPin = 2; const int echoPin = 4; void setup() { // initialize serial communication: Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { // establish variables for duration of the ping, // and the distance result in inches and centimeters: long duration, cm; // The sensor is triggered by a HIGH pulse of 10 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Read the signal from the sensor: a HIGH pulse whose // duration is the time (in microseconds) from the sending // of the ping to the reception of its echo off of an object. duration = pulseIn(echoPin, HIGH); // convert the time into a distance cm = microsecondsToCentimeters(duration); Serial.print(cm); Serial.print("cm"); Serial.println(); delay(100); } 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; } |
Ik kwam een YouTube filmpje tegen die deze module op een servo had geplaatst en vervolgens de data terugstuurde naar Processing om er volgens een “Radar” beeld van te maken.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
/* HC-SR04 Sensor The circuit: * VCC connection of the sensor attached to +5V * GND connection of the sensor attached to ground * TRIG connection of the sensor attached to digital pin 2 * ECHO connection of the sensor attached to digital pin 4 * Servo connected to pin 9 */ #include <Servo.h> Servo servo; static const int minAngle = 0; static const int maxAngle = 180; int angle=0; int servoAngle; int servoPos; const int servoPin = 9; const int trigPin = 2; const int echoPin = 4; void setup() { // initialize serial communication: Serial.begin(9600); servo.attach(servoPin); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { if (Serial.available()) { angle = Serial.parseInt(); if(angle>-1){ servoPos = constrain(map(angle, 0,180,minAngle,maxAngle),minAngle,maxAngle); servo.write(servoPos); getDistance(); } } } void getDistance(){ // establish variables for duration of the ping, // and the distance result in inches and centimeters: long duration, inches, cm; // The sensor is triggered by a HIGH pulse of 10 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Read the signal from the sensor: a HIGH pulse whose // duration is the time (in microseconds) from the sending // of the ping to the reception of its echo off of an object. duration = pulseIn(echoPin, HIGH); // convert the time into a distance cm = microsecondsToCentimeters(duration); Serial.print(cm); Serial.println(); delay(100); } 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; } |
Het resultaat een grafische weergave van de gegevens in Processing.
En uiteindelijk nog een filmpje van de HC-SR04 in actie.