Introducció a la robòtica en trenta-una classes/Vuitè dia: mesurar distàncies amb ultrasons

Avui hem emprat un circuït de mesura de distància per ultrasons, que ja inclou emissor i

receptor. En el nostre cas, hem fet servir un HC-SR04.

Aquest circuït, ens dóna un senyal durant el temps que viatja el so. O sigui, que si

mesurem el temps que ens està donant senyal, sabrem quan ha trigat el so en anar fins a

l’objecte i tornar. Funciona molt bé si l’objecte és pla i rígid, i malament si l’objecte no

presenta una cara plana o és de roba, per exemple. Això té tot el sentit, ja que el que

necessita el sensor és que torni la major part del so, i que no sigui esmorteït per

l’objecte. Ja que és ultrasò, uns 40KHz, no el sentirem funcionar.

Sabem que el so viatja a uns 340 metres per segon. L’arduino ens donarà el temps en

microsegons. Per tant, si volem que ens doni la resposta en mm, haurem de multiplicar x

365, i dividir per mil. Això ens dirà quants de mm ha viatjat el so, sumant anada i tornada.

Com que volem saber a quant es troba l’objecte, dividirem el resultat per dos. El resultat

el treurem pel monitor sèrie.

Per a fer el programa ens documentem, i ens diu que li hem de donar un pols de deu

microsegons en el pin de trigger, i que llavors ell ens treurà un 1 pel pin echo durant el

temps que trigui el so en tornar. El programa ens ha quedat:

void setup() {
    pinMode(11,OUTPUT); // preparem pin 11 per a sortida
    Serial.begin(115200); // configurem el port sèrie a 115200
}

void loop() {
    digitalWrite(11,0); // assegurem que estigui el trigger apagat
    delayMicroseconds(2); // esperem un temps per a estabilitzar
    digitalWrite(11,1); // donem sortida de trigger
    delayMicroseconds(10); // esperem el temps que ens diu el fabricant
    digitalWrite(11,0); // aturem la sortida de trigger
    long durada=pulseIn(12,1); // preparem el pin 12 per mesurar el temps
    long distancia=durada*340/1000/2; // calculem distància
    Serial.print(distancia=); // posem un títol
    Serial.println(distancia); // donem el resultat
    delay(1000); // esperem un segon
}