dijous, 3 de juliol del 2014

Connectar un sensor de distància d'ultrasons a l'Arduino

Malgrat el nom que té, un detector de distància d'ultrasons es un dels components més clàssics d'Arduino, sobretot si estem interessats en la robòtica. Com el sou propi nom indica, aquest sensor detecta distàncies mitjançant ultrasons i permet, per exemple, detectar la distancia d'un mur o d'una mà. Com veurem, és un sensor força senzill d'usar i fàcil d'aconseguir.

Com és connecta

El sensor té 4 pins:
  • VCC: entrada de voltatge. Va directe a 5V de l'arduino
  • Trig: abreviació de "Trigger" (disparador en català), és el pin que es fa servir per indicar al sensor que emeti ultrasons. En aquest cas el connectarem al 7.
  • Echo: pin per rebre l'eco de l'ultrasò i calcular la distancia. En aquest cas el connectarem al 8.
  • GND: ground. Va directe a l'arduino
Esquema de la connexió (imatge feta amb Fritzing)

Com funciona

La principal dificultat d'aquest sensor es saber com funciona. Per sort hi ha gent mola eixerida que ho ha fet abans i ho documenta millor que aquest bloc (concretament el bloc de Arduino Basics). L'algorisme a grans trets és el següent:
  1. Posem el LOW el pin Trigger per garantis que no estiguéssim emeten
  2. Esperem una estona prudencial per evitar ultrasons residuals (2 microsegons)
  3. Posem el trigger a HIGH per emetre ultrasons
  4. Esperem una estona per permetre el rebot (10 microsegons)
  5. Posem de nou el trigger a LOW per deixar d'emetre
  6. agafem el resultat del pin Echo amb la funció pulseIn
  7. Calculem la distància dividint per la velocitat del so (en serio). Això sona molt difícil però realment es dividir el resultat del pas anterior per 58.2
Codi d'exemple

El següent exemple està directament agafat de la web de Arduino Basics. Concretament, llegeix la distància cada 50 milisegons i escriu el resultat al port serie.


/*
 HC-SR04 Ping distance sensor:
 VCC to arduino 5v 
 GND to arduino GND
 Echo to Arduino pin 7 
 Trig to Arduino pin 8
 
 This sketch originates from Virtualmix: http://goo.gl/kJ8Gl
 Has been modified by Winkle ink here: http://winkleink.blogspot.com.au/2012/05/arduino-hc-sr04-ultrasonic-distance.html
 And modified further by ScottChere: http://arduinobasics.blogspot.com.au/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html
 on 10 Nov 2012.
 */


#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED

int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance

void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
}

void loop() {
/* The following trigPin/echoPin cycle is used to determine the
 distance of the nearest object by bouncing soundwaves off of it. */ 
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 

 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10); 
 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 
 //Calculate the distance (in cm) based on the speed of sound.
 distance = duration/58.2;
 
 if (distance >= maximumRange || distance <= minimumRange){
 /* Send a negative number to computer and Turn LED ON 
 to indicate "out of range" */
 Serial.println("-1");
 digitalWrite(LEDPin, HIGH); 
 }
 else {
 /* Send the distance to the computer using Serial protocol, and
 turn LED OFF to indicate successful reading. */
 Serial.println(distance);
 digitalWrite(LEDPin, LOW); 
 }
 
 //Delay 50ms before next reading.
 delay(50);
}
 
NOTA: el codi font ha sigut formatejat amb hilite.me