Introducció a la robòtica en trenta-una classes/Vint-i-unè dia: controlar montura FPV des del mòbil

Afegim un objecte canvas a l’aplicació del mòbil per tal de controlar la rotació de la montura FPV.

Partint de l’aplicació que ja tenim del control de bluetooth per al cotxe, afegirem un objecte canvas. Canvas ho podriem traduïr com a tela, un espai on dibuixar. En informàtica, defineix un espai on podrem col.locar imatges, moure-les, escalar-les… durant l’execució de l’aplicació.

A més, el canvas també té propietats especials com és que ens pot indicar en quines coordenades d’aquest espai hem premut, deixat de prémer, arrossegat,… i això ens anirà molt bé per a aquesta tasca.

A les eines de l’esquerra, despleguem Drawing and animation, i arrosseguem canvas. Com que el servo té una cursa de 0 a 180 graus, si el canvas té exactament 180 píxels d’amplada, cada píxel correspondrà a un grau de moviment del servo. Per tant, a les propietats del canvas, li donem una amplada(width) de 180 píxels, i l’alçada(height) que ens calgui.

Ara, arrosseguem ImageSprite a dins del canvas. Això és un contenidor per a la imatge que volguem que representi la montura. En el nostre cas, hi posem una fletxa. Com que els graus comencen a la dreta en el canvas, 90 son a dalt, i 180 a l’esquerra, la dibuixem mirant cap a la dreta. Els píxels, en canvi, van al revés, el 0 és el píxel més a l’esquerra del canvas.

Ara, anem a Blocks, cliquem a l’eina canvas1,  del desplegable, arrosseguem when Canvas1.dragged cap a l’espai de programa. Cliquem imageSprite1, i del desplegable arrosseguem set ImageSprite1.heading cap a dins del when Canvas1.dragged. De math, arrosseguem la resta, cap al costat de l’anterior. De math arrosseguem el número 0 cap al primer calaix de la resta, i el canviem per 180. Del objecte when Canvas1.dragged, ens acostem al currentX, i del que es desplega, arrosseguem get currentX al segon calaix de la resta.

Amb l’anterior, el que fem és dir-li: quan s’arrossegui el dit per dins del canvas, mirem per quina posició horitzontal(X) passa el dit, ho restem de 180, per a dir quants graus ha de girar la imatge. Restem de 180, perquè ja hem dit que els graus tenen el 0 a la dreta, i les X a l’esquerra.

Com que a més, volem que això es transmeti pel bluetooh cap a l’arduino, fem enviar una ‘g’ i després els graus on volem que vagi el servo. Finalment, aquest tros de programa ens queda:

Ara, ens toca dir-li a l’arduino que interpreti aquesta g seguida de números com a una ordre per al nou servo. Agafarem el programa del cotxe del divuitè dia de classe i hi afegirem que manegui aquest nou servo. A sota de la declaració de servo1, hi afegim servo2:

Servo servo1; 
Servo servo2;

En el void loop, definim el pin per al servo 2, que serà A4, després del de servo1 que ja hi ha:

servo1.attach(A3);
servo2.attach(A4);

Finalment, a sota de la darrera instrucció, la de quan es rebi 5, i afegim la interpretació a la ‘g’:

    if (tecla=='5'){    // exemple d'accionament. Ajustar per a cada cas.
      servo1.write(150);// graus als quals cal girar per activar el nostre dispositiu
      delay(500);       // esperem mig segon
      servo1.write(180);// tornem a la posició de repòs
    }
    if (tecla=='g'){  // quan es rebi una g
      servo2.write(Serial.parseInt());
    }

Veiem que si es rep una g, llavors s’executa que el servo vagi a Serial.parseInt(). Aquesta nova funció del Serial, el parseInt, li diu a l’arduino que llegeixi el número enter que ve al darrera de la ‘g’.