«

»

Ago 04

Stampa Articolo

braccio robot sketch finale – quarta parte

In questo ultimo articolo dedicato al braccio robot leggerai come realizzare la versione finale del progetto di Enrico.

braccio robot sketch

Ho voluto dedicare spazio alla fase progettuale del braccio robot per chiarire che un progetto come questo non lo si realizza in pochi giorni, occorre una accurata fase progettuale e dei test di funzionamento che a volte possono risultare anche molto simili al risultato finale ma che solo attraverso i quali puoi avere un’idea precisa della fattibilità del tuo progetto.

Di tutti i miei progetti pubblico solo il risultato finale senza annoiarti con gli studi e le fasi di test che mi portano a realizzare il progetto stesso.

Tornando al braccio robot di Enrico puoi leggere i precedenti articoli introduttivi:

E sei quindi giunto all’ultimo articolo dedicato al progetto.

Il video del progetto arduino

Solitamente il video lo lascio per ultima chicca in ogni articolo, ma in questo caso preferisco mostrarti il video prima di descrivere lo sketch perché così ti sarà più chiaro il funzionamento dello sketch:

Braccio robot sketch

Questo lo sketch realizzato da Enrico:

#include <Servo.h>

Servo mioservo1;
Servo mioservo2;
Servo mioservo3;
Servo mioservo4;
Servo mioservo;
int angolo =0;

void setup() {
  mioservo.attach(8);
  mioservo1.attach(9); 
  mioservo2.attach(10);
  mioservo3.attach(11);
  mioservo4.attach(12);
}

void loop() {
   //Posizione iniziale//
   mioservo.write(155);
   mioservo1.write(85);
   mioservo2.write(77);
   mioservo3.write(75);
   mioservo4.write(5);
   delay(2000);

   // inizio presentazione movimenti//
   mioservo1.write(85);
   delay(2000);
   mioservo3.write(155);
   delay(2000);
   mioservo3.write(0);
   delay(2000);
   mioservo3.write(75);
   delay(2000);
   mioservo4.write(150);
   delay(1000);
   mioservo4.write(5);
   delay(1000);

   for(angolo = 77; angolo < 150; angolo += 1)  { 
    mioservo2.write(angolo);
    delay(20);
   }
   delay(2000);
   for(angolo = 150; angolo > 77; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(20);
   }
   delay(2000);
   mioservo3.write(30);
   delay(2000);
   mioservo2.write(26);
   delay(2000);
   mioservo4.write(150);
   delay(1000);
   mioservo4.write(5);
   delay(3000);
   
   // dimostrazione di rotazione//
   for(angolo = 150; angolo > 120; angolo -= 1) { 
    mioservo.write(angolo);
    delay(20);
   } 
   delay(500);
 
   for(angolo = 120; angolo > 90; angolo -= 1) { 
    mioservo.write(angolo);
    delay(20);
   } 
   delay(500);
 
   for(angolo = 90; angolo > 60; angolo -= 1) { 
    mioservo.write(angolo);
    delay(20);
   }
   delay(500);
 
   for(angolo = 60; angolo > 30; angolo -= 1) { 
    mioservo.write(angolo);
    delay(20);
   }
   delay(500);
 
   for(angolo = 30; angolo > 1; angolo -= 1) { 
    mioservo.write(angolo);
    delay(20);
   }
   delay(2000);
  
   for(angolo = 155; angolo > 35; angolo -= 1) { 
    mioservo.write(angolo);
    delay(40);
   }
   delay(2000);
   
   for(angolo = 30; angolo < 75; angolo += 1) { 
    mioservo3.write(angolo);
    delay(50);
   }

   for(angolo = 26; angolo < 150; angolo += 1) { 
    mioservo2.write(angolo);
    delay(10);
   }
   delay(1000);

   for(angolo = 85; angolo < 145; angolo += 1) { 
    mioservo1.write(angolo);
    delay(50);
   }

   for(angolo = 35; angolo < 155; angolo += 1) { 
    mioservo.write(angolo);
    delay(30);
   }
   delay(1000);

   mioservo4.write(150);
   delay(1000);
   mioservo4.write(5);
   delay(1000);

   // giro con alzamento braccio//
   for(angolo = 145; angolo > 125; angolo -= 1) { 
    mioservo1.write(angolo);
    delay(40);
  }
  for(angolo = 155; angolo > 125; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 150; angolo > 100; angolo -= 1) { 
    mioservo.write(angolo);
    delay(60);
  }
  for(angolo = 125; angolo > 105; angolo -= 1) { 
    mioservo1.write(angolo);
    delay(40);
  }
    
  for(angolo = 125; angolo > 100; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 100; angolo > 50; angolo -= 1) { 
    mioservo.write(angolo);
    delay(25);
  }
  for(angolo = 105; angolo > 85; angolo -= 1) { 
    mioservo1.write(angolo);
    delay(40);
  }
  for(angolo = 100; angolo > 75; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 50; angolo > 5; angolo -= 1) { 
    mioservo.write(angolo);
    delay(10);
  }
  delay(500);
  
  for(angolo = 5; angolo < 150; angolo += 1) { 
    mioservo.write(angolo);
    delay(30);
  }
  delay(2000);

  // riposizionamento //

  mioservo.write(150);
  mioservo1.write(85);
  mioservo2.write(35);
  mioservo3.write(35);
  mioservo4.write(5);
  
  // recupero pezzo //
  // angolo di presa pezzo //
  
  for(angolo = 150; angolo > 30; angolo -= 1)  { 
    mioservo.write(angolo);
    delay(25);
  }
  delay(500);
  for(angolo = 35; angolo < 75; angolo += 1) { 
    mioservo3.write(angolo);
    delay(25);
  }
  delay(500);
  for(angolo = 35; angolo < 150; angolo += 1) { 
    mioservo2.write(angolo);
    delay(25);
  }
  
  // abassamento braccio //
  for(angolo = 85; angolo < 149; angolo += 1) { // angolo abbassa// 
    mioservo1.write(angolo);
    delay(40);
  }
  delay(500);
  
  mioservo4.write(150);
  delay(1000);
  for(angolo = 75; angolo < 95; angolo += 1) { 
    mioservo3.write(angolo);
    delay(30);
  }
  delay(500);
  mioservo4.write(16);   // gradi presa  //
  delay(500);

  // rialzamento braccio //
  for(angolo = 149; angolo > 105 ; angolo -= 1) { 
    mioservo1.write(angolo);
    delay(30);
  }
  for(angolo = 150; angolo > 120; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(30);
  }
  for(angolo = 95; angolo > 80; angolo -= 1) { 
    mioservo3.write(angolo);
    delay(30);
  }
  for(angolo = 120; angolo > 100; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 80; angolo > 50; angolo -= 1) { 
    mioservo3.write(angolo);
    delay(30);
  }
  for(angolo = 100; angolo > 70; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 50; angolo > 35; angolo -= 1) { 
    mioservo3.write(angolo);
    delay(30);
  }
  
  // rotazione //
  for(angolo = 30; angolo < 128; angolo += 1) { 
    mioservo.write(angolo);
    delay(30);
  }
  // abbassamento pezzo //
  
  delay(1000);
  for(angolo = 70; angolo < 100; angolo += 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 35; angolo < 100; angolo += 1) { 
    mioservo3.write(angolo);
    delay(30);
  }
  for(angolo = 100; angolo < 130; angolo += 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 105; angolo < 130; angolo += 1) { 
    mioservo1.write(angolo);
    delay(40);
  }
  delay(1000);
  mioservo4.write(150);
  delay(1000);

  for(angolo = 100; angolo > 35; angolo -= 1) { 
    mioservo3.write(angolo);
    delay(2);
  }
  for(angolo = 130; angolo > 85; angolo -= 1) { 
    mioservo1.write(angolo);
    delay(25);
  }
  for(angolo = 130; angolo > 33; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(25);
  }
  delay(1000);
  mioservo4.write(5);
  delay(20000);
}

commentiamolo insieme per capire bene come si muove ogni singolo servo:

linea 001: includi la classe Servo.h;

linee 003-007: definisci i 5 oggetti Servo a cui colleghi ciascun movimento del braccio robot, io ti suggerisco di chiamare ciascun oggetto con il nome dell’articolazione ad es.: mano, polso, gomito, ecc.. ti sarà più semplice programmare i movimenti del braccio;

linea 004: definisci una variabile angolo che userai per definire gli angoli da far realizzare al braccio;

linee 011-015: definisci i pin a cui sono collegati i singoli servo;

linee 020-025: imposta la posizione iniziale del braccio dando ad ogni servo la posizione da assumere ed attendi 2 secondi che tutti abbiano raggiunto la posizione indicata;

linee 028-039: impartisci a ciascun servo la posizione da raggiungere aggiungendo dopo ogni movimento un tempo necessario al raggiungimento della posizione desiderata;

linee 041-044: partendo da un angolo di 77 gradi incrementi di un grado alla volta fino ai 155 gradi del servo2, attendendo 20 millisecondi per ciascun grado da raggiungere;

linee 046-049: esegui il medesimo movimento delle linee 041-044 ma al contrario, tornando alla posizione iniziale;

linee 051-058: posiziona i servo 2,3 e 4 alle posizioni indicate;

linee 061-064: partendo dal grado 150 fino al grado 120 posiziona myservo al grado desiderato, attendendo per ciascun grado 20 millisecondi per consentire al servo di raggiungerlo;

linee 067-116: esegui altri spostamenti per gli altri servo con uguale metodo variando solo gradi e servo da spostare;

linee 119-122: posiziona il servo4 prima al grado 150 e dopo un secondo al grado 5;

linee 124-168: usando i metodi che hai appreso sopra, nella parte di dimostrazione del movimento puoi adesso impartire al braccio robot il movimento necessario a ruotare il braccio e contemporaneamente a sollevarlo;

linee 170-177: imposta i gradi dei servo per riposizionare il servo;

linee 178-211: prepara il braccio ed esegui la presa dell’oggetto;

linee 213-241: solleva il braccio con il pezzo preso;

linee 243-247: fai ruotare il braccio da 30 gradi a 128 gradi in modo da posizionare il pezzo nella sede di destinazione;

linee 248-285: posiziona il braccio per lasciare il pezzo raccolto nella posizione ideale e lascia la presa riportando il braccio lontano dall’oggetto appena posizionato.

Compreso il funzionamento del braccio e dello sketch che lo controlla potrai facilmente gestire il software per realizzare tutti i percorsi che ti vengono in mente e per far fare al tuo braccio tutti i movimenti che vuoi o che ti servono nel tuo progetto.

Grazie Enrico per aver condiviso con tutti noi questo progetto !!!

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/braccio-robot-sketch-finale-quarta-parte.html

20 comments

Vai al modulo dei commenti

  1. pietro

    abbiamo costruito il braccio robot ma abbiamo seri problemi a farlo muovere.

    IMPLORIAMO IL VOSTRO AIUTO ( lo stiamo portando come progetto per la maturità)

    1. Mauro Alfieri

      Ciao Pietro,
      se non specifichi che tipo di problemi incontri non posso aiutarvi.
      Considera che non correggo sketch e non è possibile inserirli nei commenti, io posso solo aiutarti chiarendoti i dubbi se li poni in modo chiaro.

  2. Jacopo

    Ciao Mauro,
    Come potrei fare se volessi inserire la cinematica inversa in maniera tale da controllare il movimento del robot?

    1. Mauro Alfieri

      Ciao Jacopo,
      scusami ma non sono molto ferrato in meccanica, cosa intendi per cinematica inversa ?
      Lascio comunque il commento on-line per l’autore del progetto in modo che possa risponderti direttamente.

  3. Jacopo

    Vorrei controllare i motori in modo tale da girare il proprio asse fino a raggiungere un angolo preciso

    1. Mauro Alfieri

      Ciao Jacopo,
      non sono certo di aver compreso fino in fondo.
      Questo robot è costruito con servocomandi per cui dare il comando che desideri da arduino ed ottenere il movimento che ti occorre.

  4. Angelo

    Ciao Mauro,
    vorrei provare anche io a cimentarmi in un progetto del genere.
    Ho un paio di domande, volendo dare al robot un braccio fisso che tiene “in mano” una saldatrice a filo continuo, c’è un modo per far riconoscere ad arduino la distanza (che varia) tra la lamiera e la punta della saldatrice?
    E Volendo, è possibile gestire il tutto utilizzando il meno cavi possibili ed avere un radiocomando per fare il tutto a distanza di sicurezza?
    Per quanto riguarda la distanza che varia, per farti capire meglio.
    Considera la stessa base del robot (Piatta), che deve saldare un pezzetto di ferro su un dosso, anch’esso a base piatta, c’è un modo per far riconoscere ad arduino il dislivello di dove è posizionato il pezzetto di ferrò e dove la punta della saldatrice deve intervenire?
    Un ultima domanda, ho visto che accogli anche le richieste di realizzazione progetti, potrebbero interessarti la realizzazione di due progetti? questo ed un altro simile?

    Grazie per la pazienza
    Ciao
    Angelo

    1. Mauro Alfieri

      Ciao Angelo,
      il progetto riguarda un braccio giocattolo o per sperimentazione didattica.
      Per quello che desideri fare tu dovrai usare almeno un braccio robot tipo KUKA o similia

  5. Davide

    Buongiorno, non sono molto pratico di arduino, perchè quando copio ed incollo lo sketch mi da un errore relativo al comando delay?

    1. Mauro Alfieri

      Ciao Davide,
      verifica che non vi siano caratteri sporchi interno a ciascuna linea, poi indicami l’errore o cercalo nel blog, spesso sono errori noti.

      1. davide

        Grazie mille,ho risolto, adesso mi chiedevo come faccio a comandarlo attraverso due joystick…Sa per caso come vanno modificati i parametri? Grazie in anticipo.

        1. Mauro Alfieri

          Ciao Davide,
          dipende da come intendi usare i 2 joystick e che pipo di controllo desideri impostare.
          Considera ciascun joystick come due potenziometri e trattali come tali.

    2. Andrea

      Dico io… Ma ti costa tanto segnalare il problema e dare un’aiuto a chi invece non ha trovato l’errore, invece che fregartene?

      1. Mauro Alfieri

        Ciao Andrea,
        se mi scrivi il problema ?
        Penso che tutti i lettori del blog, tranne te, sarebbero in disaccordo con la tua affermazione con tutto l’aiuto che do a tutti gratuitamente.

  6. federico

    Ciao Mauro,dopo aver compilato mi esce l’errore expected constructor,distructor or type conversione before'(? token ; all’ultimo delay(20000).Cosa devo fare?.Grazie e complimenti per il tuo sito.

    1. Mauro Alfieri

      Ciao,
      controlla che tutte le parentesi siano aperte e chiuse correttamente.
      Controlla di avere tutte le librerie installate e che non vi siano “;” messi in posti errati.

  7. federico

    Ciao Mauro trovato al rigo 197 :for(angolo = 85; angolo < 149; angolo += 1) // angolo abbassa// { , ////si nota la parenresi graffa posta dopo il commento.Deve essere :for(angolo = 85; angolo < 149; angolo += 1) {, /// angolo abbassa.Ciao

    1. Mauro Alfieri

      Ciao Federico,
      perfetto, grazie per la segnalazione, sarà di certo utile a tanti altri che riprodurranno il progetto.
      Io ho corretto lo sketch 🙂

  8. Luca

    Ho acquistato un braccio a 5 gradi di lberta + pinza potrebbe mica inviarmi lo schema elettrico con il relativo programma.Ringrazio e saluto cordialmente

    1. Mauro Alfieri

      Ciao Luca,
      forse volevi scrivere al venditore, hai scritto sul blog sbagliato.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>