Introducció a la robòtica en trenta-una classes/Vint-i-sisè dia: programa arduino per al control del braç robòtic

Ara, hem de connectar els servos i fer el programa del arduino. Ja vam dir que volíem més ressolució dels 180 graus que ens dona la funció Servo.write. N’hi ha una altra, que no és tan intuitiva, que és Servo.writeMicroseconds, que ens permet dir la durada del pols que s’envia al motor. Quan hem fet els lliscants a la app, hem posat 700 de mínim i 2300 de màxim. Això és perquè fent proves amb aquesta funció, hem vist que hem de donar 700 per a 0 graus, 1500 per a la meitat, i 2300 per a mitja volta, o fins i tot gira un xic més.

Connectarem els quatre motors: rotació, primer braç, segon braç, pinça als pins A0, A1, A2 i A3 respectivament. Recordeu que cada servo té tres fils: el vermell ha d’anar a 5V, el marró a GND, i el taronja de cadacú és el que hem de connectar a cada un dels pins del

arduino.

Com ja havíem dit, hem inclòs un control de velocitat màxima, fent que no pugui canviar més de una unitat cada 5 ms. Això ho hem fet memoritzant on li dèiem que anès cada servo en una variable objA, objB..., que seria l’objectiu, i controlant la posició a la qual

ordenem anar amb les variables posA, posB..., que seria la posició actual. Cada 5ms es mira si estem per sota o per sobre de l’objectiu, i s’incrementa o decrementa la posició amb només una unitat.

El programa ens queda:

#include <Servo.h>
Servo servoA;
Servo servoB;
Servo servoC;
Servo servoD;
int posA, posB, posC, posD;
int objA, objB, objC, objD;

void setup() {
    Serial.begin(9600);
    servoA.attach(A0);
    servoB.attach(A1);
    servoC.attach(A2);
    servoD.attach(A3);
    posA=1500; posB=1500; posC=1500; posD=1500;
    objA=1500; objB=1500; objC=1500; objD=1500;
}

void loop() {
    if (Serial.available()){
        char ordre=Serial.read();
        if (ordre=='A'){
            objA=Serial.parseInt();
        }
        if (ordre=='B'){
            objB=Serial.parseInt();
        }
        if (ordre=='C'){
            objC=Serial.parseInt();
        }
        if (ordre=='D'){
            objD=Serial.parseInt();
        }
    }
    // fi interpretació ordres inici moviments suaus
    if (objA>posA){
        posA++;
        servoA.writeMicroseconds(posA);
    }
    if (objA<posA){
        posA--;
        servoA.writeMicroseconds(posA);
    }
    if (objB>posB){
        posB++;
        servoB.writeMicroseconds(posB);
    }
    if (objB<posB){
        posB--;
        servoB.writeMicroseconds(posB);
    }
    if (objC>posC){
        posC++;
        servoC.writeMicroseconds(posC);
    }
    if (objC<posC){
        posC--;
        servoC.writeMicroseconds(posC);
    }
    if (objD>posD){
        posD++;
        servoD.writeMicroseconds(posD);
    }
    if (objD<posD){
        posD--;
        servoD.writeMicroseconds(posD);
    }
    delay(5); // retard per a suavitzar els moviments
}