Ripetizioni Braccio robot

Ripetizioni Braccio robot è un post in cui diamo ripetizioni ai robot che sono andati male nelle ultime interrogazioni scolastiche.

Robot Arm serial servo controlled gripper

No, non è affatto quanto descritto sopra, piuttosto le ripetizioni braccio robot sono un argomento alquanto interessante della robotica che cercherò di semplificare in questo articolo.

Come faccio spesso in questo blog, anche in questa occasione, cercherò di semplificare concetti di per se complessi al solo scopo di introdurli e invogliarti ad approfondirli.

Per farlo mi servirò del braccio robot che da qualche settimana sto utilizzando per i miei esperimenti.

Cosa sono le ripetizioni braccio robot

Un robot esegue dei movimenti con precisione dettata dalla meccanica costruttiva, dall’elettronica e dall’algoritmo di controllo.

La combinazione delle tre componenti determina sia la capacità di eseguire un’azione sia la successiva possibilità che il medesimo robot esegua con medesima precisione la stessa operazione un numero “n” di volte.

In questo articolo leggerai uno sketch che partendo da una sequenza di movimenti definiti essi saranno eseguiti ciclicamente dal robot.

Misurerai quindi la precisione del tuo braccio robot verificando cosa accade al susseguirsi delle ripetizioni.

Come funziona l’esperimento

Per questo esperimento di ripetizioni braccio robot userai uno sketch modificato in modo che sia possibile impostare la sequenza di movimenti che il braccio robot deve eseguire.

In u precedente articolo hai letto come il braccio robot risponde all’invio di una stringa seriale contenente il formato:

[servo1] [servo2] [servo3] [servo4] [servo5]

in cui ciascun valore tra “[servo1]”, “[servo2]”, ecc.. è sostituito dal valore angolare a cui far giungere il servo.

Il risultato è nel video:

Hai notato che ciascun invio di una stringa con 5 valori è stata interpretata dallo sketch come il movimento di tutti i 5 servo, naturalmente le posizioni già assunte sono ignorate.

Se hai segnato tutte le stringhe inviate al braccio robot avrai ottenuto una sequenza simile alla seguente:

90 90 90 90 0
90 60 90 90 0
90 40 90 90 37
90 40 70 90 37
90 100 70 90 37

90 55 70 90 37
90 51 70 90 37
90 49 70 90 37
90 45 70 90 0
90 45 90 90 0
90 90 90 90 75

hai letto “simile” in quanto ho compattato alcune linee per rendere la sequenza più rapida.

Lo sketch

La matrice di numeri che abbiamo individuato nel paragrafo precedente ti servirà come traccia che passerai allo sketch e fargli eseguire i passi descritti, prendendo e ri-posizionando l’oggetto.

Per ottenere questo effetto dobbiamo che modificare leggermente lo sketch rispetto a quello che hai utilizzato nei procedenti esperimenti:

#include <Servo.h>

Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo gripper;

byte pos[5]    = {90,90,90,90,75};
byte oldpos[5] = {90,90,90,90,75};

byte seq[][5] = {
  {90,90,90,90,0},
  {90,60,90,90,0},
  {90,40,90,90,37},
  {90,40,70,90,37},
  {90,100,70,90,37},
  {90,55,70,90,37},
  {90,51,70,90,37},
  {90,49,70,90,37},
  {90,45,70,90,0},
  {90,45,90,90,0},
  {90,90,90,90,75}
};
  
void setup() {
  Serial.begin(115200);
  
  base.attach(11);
  shoulder.attach(10);
  elbow.attach(9);
  wrist_rot.attach(6);
  gripper.attach(5);

  base.write(pos[0]);
  shoulder.write(pos[1]);
  elbow.write(pos[2]);
  wrist_rot.write(pos[3]);
  gripper.write(pos[4]);

  Serial.println( "#### START ####" );
  delay( 5000 );
}

void loop() {

  Serial.print( "Seq Len: " );
  Serial.println( sizeof(seq) );
  
  for ( byte line=0; line < (sizeof(seq)/5); line++ ) {
    Serial.print("Seq[");
    Serial.print(line);
    Serial.print("]:"); 
    for( byte i=0; i<5; i++ ) {
      Serial.print(" "); Serial.print(seq[line][i]); 
      pos[i] = seq[line][i];
    }
    Serial.print("\n");
     
    goPos(0,base,15);
    goPos(1,shoulder,15);
    goPos(2,elbow,15);
    goPos(3,wrist_rot,15);
    goPos(4,gripper,15);

  }
}

void goPos(byte servo, Servo instance, byte pause) {
   if (oldpos[servo] >= pos[servo]) {
      for ( byte i = oldpos[servo]; i > pos[servo]; i--) {
        instance.write(i);
        delay(pause);
      }
   }
   
   if (oldpos[servo] <= pos[servo]) {
      for ( byte i = oldpos[servo]; i < pos[servo]; i++) {
        instance.write(i);
        delay(pause);
      }
   }
   oldpos[servo] = pos[servo];
}

nota che è più semplice in quanto non deve interpretare delle stringhe provenienti dalla comunicazione seriale.

Ogni sequenza comandi arriva dall’array seq[][5] anche noto come array multidimensionale in cui la dimensione delle colonne è nota [5] in quanto sai che i servo sono sempre 5; mentre la dimensione delle righe può variare in funzione del numero di ripetizioni braccio robot che vuoi siano compiute.

Descrizione dello sketch

Leggendo il listato dello sketch dalla linea 01: includi la libreria servo per il controllo dei servomotori;

linee 03-10: definisci le cinque istanze servo e le due matrici di valori per le posizioni di default “pos” e la memorizzazione delle precedenti posizioni “oldpos”;

linee 12-24: definisci la matrice, o array multidimensionale, in cui per ciascuna linea hai la sequenza di 5 valori da inviare ai servo e l’insieme delle linee determina tutti gli spostamenti della sequenza;

linea 27: attiva la comunicazione con il monitor seriale;

linee 29-33: usando il metodo “attach” della libreria Servo.h associ a ciascuna istanza “servo” il pin a cui è connesso fisicamente il servo;

linee 35-39: imposta per ogni servo il valore angolare di default;

linea 41: invia al monitor seriale la linea “#### START ####”;

linea 42: attendi un tempo di 5 secondi prima di avviare lo sketch, tale tempo puoi ridurlo a tuo piacimento, io l’ho utilizzato per posizionare correttamente l’oggetto difronte al braccio;

linee 47-48: scrivi sul monitor seriale la stringa “Seq Len: ” seguita dalla lunghezza dell’array seq;

linea 50: crea un ciclo for per scorrere ciascuna linea, siccome sai che sizeof restituisce 11×5, dividine il valore per 5 ed otterrai un indice di linea;

linee 51-53: per ciascuna linea dell’array scrivi sul monitor seriale il valore di line, l’indice di linea;

linea 54: crea un ciclo for da 0 a 5, i valori degli angoli dei servo per ciascuna linea;

linea 56: assegna all’array pos in posizione “i” il valore corrispondente alla posizione “i” della linea che stai leggendo;

  • linee 60-64: per ciascun ciclo di loop richiama la funzione goPos() passandole i parametri:
  • servo: il numero del servo, sarebbe meglio dire che indica l’indice nell’array pos[] in cui si trova il valore da applicare all’instanza del servo che gli passerai;
  • instance: instanza del servo a cui applicare il movimento in gradi;
  • pause: tempo di attesa, delay, tra un grado ed il successivo in modo che i movimenti non risultino a scatti;

linee 69-84: definisci ed utilizza la funzione goPos() già vista nel precedente articolo dedicato al braccio robot.

Come funziona lo sketch

Puoi adesso partire con le ripetizioni braccio robot come mostrato nel video:

in cui le ripetizioni braccio robot ti mostrano il risultato dello sketch e la produzione di una serie di movimenti ripetitivi.

Nota inoltre che l’oggetto viene preso e riposizionato dal robot con adeguata precisione a consentire allo stesso di riprendere l’oggetto nuovamente alla successiva ripetizione.

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/robotica-domotica/ripetizioni-braccio-robot.html

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.