Strumenti Utente

Strumenti Sito


braccio_robotico

Braccio Robotico

Robot nell'automazione industriale

I robot sono sempre più utilizzati nel campo dell'automazione per compiere movimentazioni e lavorazioni più complesse di quelle delle normali macchine automatiche.

I robot usati nell'industria sono estremamente costosi, ingombranti e difficili. A scuola useremo un modellino che si ispira al robot pallettizatore di ABB.

Questo modello adotta una serie di soluzioni interessanti tra cui:

  • motori posizionati sulla base, che rendono il braccio più agile
  • un meccanismo tale per cui la pinza resta sempre orizzontale

Obiettivi

  • assemblare il kit di un braccio robotico
  • comandarlo con Arduino
  • progettare e realizzare una scheda per l'alimentazione dei servomotori
  • realizzare una copia del robot usando pannelli di compensato/MDF tagliati con la laser cutter del FabLab
  • comandarlo via BlueTooth con uno smartphone

Roboarm di Futura Elettronica

Su internet ci sono tanti progetti di bracci robotici realizzabili con stampante 3D o laser cutter1) che è possibile replicare a scuola. Noi cercavamo un modello:

  • disponibile anche in kit di montaggio per poterlo testare
  • dal costo contenuto
  • facilmente controllabile (ad esempio con una scheda Arduino)
  • con una buona documentazione (istruzioni, software, ecc.)
  • che fosse replicabile con le attrezzature disponibili a scuola (stampante 3D, laser cutter, ecc.)

La scelta è caduta su un kit di montaggio proposto nel numero di agosto 2018 della rivista Futura Elettronica2), che è stato acquistato e assemblato alla fine dell'anno scolastico 2018-2019.

Hardware

Il kit contiene la sola parte meccanica:

  • tanta ferramenta: almeno 10 tipi di viti diverse (testa a croce, a brugola di due tipi diversi, viti M4 M3 M2 autofilettanti)
  • 5 servo RC: tre TowerPro MG995 per il braccio e due microservo TowerPro SG90-Analog per polso e pinza3)
  • pezzi in acrilico da 5mm (base e spalle) e da 3mm (il resto) tagliati con laser cutter
  • un CDROM con le istruzioni di montaggio

La parte elettronica è venduta separatamente e prevede:

  • una scheda Arduino per comandare il braccio
  • uno shield per schede Arduino per azionare i servo
  • una pompa e un attuatore pneumatico opzionali che sostituiscono la pinza

La parte meccanica non è direttamente replicabile perché né la rivista, né il sito mettono a disposizione i file di progetto ma dalle immagini nelle istruzioni è comunque possibile generare un file per la nostra laser cutter. Lo shield, che contiene un regolatore a 5V per i servo e due uscite a transistor per l'attuatore pneumatico opzionale, non è strettamente indispensabile; per comandare i 5 servo bastano le uscite PWM della scheda Arduino e un'alimentazione separata a 5V4).

Le istruzioni, complete e dettagliate, sono indispensabili per l'assemblaggio. Il procedimento non è dei più semplici; oltre a ciò:

  • è stato necessario limare lo spinotto di alluminio che collega i due servo sulle spalle (troppo lungo)
  • c'è distanziale hub-servo in più
  • la posizione centrale dei due microservo non è facilmente individuabile perché l'albero ruota liberamente (ma si può trovare comandandoli con Arduino)

Il prodotto sembra solido e ben fatto. E' possibile muovere il braccio anche senza alimentazione a patto di farlo con un po' di cautela5).

Software

Nella pagina prodotto del kit è disponibile questo software:

  • firmware: un file zip con uno sketch che usa la libreria Octopus di uno shield per il controllo dei servo
  • un link alle librerie Fishino
  • roboarm: un file zip con uno sketch che usa le librerie del prodotto Braccio di Tinkerkit

Nessuno dei file sembra particolarmente utile ma ci sono degli ottimi esempio nel sito di Mauro Alfieri.

Shield servo RC

Progettiamo uno shield Arduino per alimentare i cinque motori servo RC ispirandoci al modello proposto da Futura Shop in abbinamento al kit del braccio robotico (vedi il documento nella sezione Risorse in fondo alla pagina).

Per prima cosa occorre individuare le specifiche:

  • alimentazione in comune tra scheda Arduino e shield (come avviene per il Motor Shield)
  • non servono le uscite di potenza per pompa ed elettrovalvola (utili solo se si acquista il kit pneumatico)
  • alimentazione dei servo con un convertitore step-down DC-DC basato su LM2576 (vedi risorse in fondo alla pagina)
  • connettori per i 5 servo collegati ai pin della scheda arduino come nello shield venduto da Futura Shop

Per l'alimentazione bisogna considerare:

  • che la tensione massima consentita per la scheda Arduino è 12V
  • le masse dei servo devono essere in comune con quella della scheda Arduino
  • l'uso di un barrel jack, più indicato in un prodotto commerciale, complica le cose perché i piedini sono a linguetta e le dimensioni non sono standard

Si sceglie di alimentazione schede e motori con un alimentatore da banco a 12V e di utilizzare un morsetto a vite. Questa tensione, a valle di un diodo di protezione 1N4001, sarà collegata al piedino Vin per alimentare anche la scheda Arduino.

Per il dimensionamento del regolatore occorre sapere:

  • Vin = 12V
  • Vout = 5V (adatta sia per i 3 servo più grandi che per i due più piccoli)
  • Imax = 2A (i servo più grandi assorbono al massimo 1,2A)

e scegliere:

  • Cin (elettrolitico da 100uF)
  • Cout (elettrolitico da 1000uF)
  • L1 (220uH)
  • D1 = 1N5822

Oltre a questo servono 5 connettori SIL per i servo con segnale (giallo), 5V (rosso) e GND (marrone) in questo ordine. Fare riferimento ai vari datasheet dei servo per non sbagliare l'ordine. Il pin del segnale va collegato come nello shield venduto col kit:

sigla connettore pin Arduino descrizione
S111rotazione base
S210braccio avanti-indietro
S39inclinazione polso
S46rotazione polso
S55pinza

Per progettare lo shield usermo i template scaricabili dal sito della National Instruments, come descritto qui. Dopo aver scaricato i template e aggiunto al database utente (user) footprint e componenti usati nei modelli, si può creare un nuovo progetto in Multisim aprendo il file del template per schede Arduino Uno6).

Cominciamo così:

  • creiamo un nuovo progetto usando il modello per Arduino Uno
  • salviamo il file di Multisim e quello di Ultiboard (che si apre automaticamente) nella stessa cartella usando lo stesso nome
  • rendiamo visibili le Ratsnest7) in Ultiboard (spunta nel layer corrispondente)
  • cancelliamo i fori per le viti (filtro Enable selecting other objects)

In Multisim:

  • aggiungiamo il morsetto a vite (HDR1X2), cambiamo il package (footprint) in MKDSN_2RMM e colleghiamo il pin 2 a massa
  • colleghiamo un diodo 1N4001G al piedino 1 del morsetto a vite e sul catodo mettiamo l'on-page-connector chiamato Vin già presente nello schematico
  • aggiungiamo cinque connettori HDR1X3 con il piedino 1 collegato al pin della scheda Arduino secondo la tabella sopra (per S1 IO11, ecc.), il piedino 3 a massa e il due a un nuovo on-page-connector che chiameremo 5VMOT (o qualcosa di simile) che sarà l'uscita del regolatore
  • realizziamo un partitore di tensione con
    • un resistore da 1k collegato a massa e a un nuovo on-page-connector che chiameremo FB (feedback del regolatore LM2576)
    • un resistore da 2,7k in mezzo
    • un potenziometro da 500 Ohm collegato come reostato, con il morsetto superiore collegato a 5VMOT

A questo punto generiamo la netlist e la importiamo in Ultiboard scegliendo Forward Annotate to Ultiboard dal menu Transfer (se necessario scegliamo il file Ultiboard su ci portare i componenti).

In Ultiboard cominciare

  • disponendo i componenti (morsetto a vite sul bordo a sinistra)
  • cambiamo le piazzole scegliendo
    • piazzole tonde con foro da 0.8mm e diametro 3mm dove possibile
    • piazzole custom ovali per le piazzole troppo vicine tra loro (vedere qui per le piazzole custom)

Calcolo del partitore

Facciamo riferimento al circuito di figura 32 e alle formule da pagina 22 del datasheet dell'LM2576. Sappiamo che la versione Adjustable dell'LM2576 mantiene una Vref costante a 1,23V sul piedino 4 di feedback. La legge del partitore dice che:

`V_{REF}=R_1/(R_1+R_2)V_{OUT}`

Ricavando Vout e poi R2 otteniamo la formula di pagina 22:

`R_2 =R_1 (V_{OUT}/V_{REF}-1)`

quindi scegliendo R1 = 1k si ottiene una R2 di circa 3k, che otterremo con un resistore fisso R2=2,7k e un trimmer da 500 Ohm per regolare la tensione tra 4,5 e 5,3 Volt (si veda la formula di Vout per il calcolo dei due valori limite).

Creazione del componente LM2576

Da Multisim:

  • scegliere Component wizard dal menu tools
  • passo 1: LM2576HV-ADJ, Texas Instruments, Step-Down Voltage Regulator, Layout only
  • passo 2: single section, 5 pin, select a package TO-220-5(NDH)
  • passo 3: edit
    • resize boundary box (da edit) e allargo il rettangolo
    • sposto i piedini in modo da avere 1 e 3 a sinistra e 4 2 e 5 a destra
    • cliccare su salva
  • passo 4: assegno il nome ai piedini come da datasheet: Vin, Output, Ground, Feedback, on-off
  • passo 5: map pins, auto-assing
  • passo 6: scelgo un gruppo e una famiglia (o creo una famiglia) dove salvare il componente e clicco finish

Piazzo l'LM2576 e collego gli altri componenti:

  • C1 elettrolitico da 100uF (package ELKO5R5)
  • C2 elettrolitico da 680uF (package ELKO10R5)
  • D2 1N5822G
  • L1 da 220uH (footprint a caso che tanto devo cambiarlo in Ultiboard)
  • R1 e R2 (package RES1300-700×250)
  • trimmer (package di default che tanto va cambiato)

Lo schematico dovrebbe avere più o meno questo aspetto.

Forward annotate sul file già salvato in Ultiboard, poi aggiustare i footprint di:

  • L1 SPU_PU_C
  • R3 TRIM-3386P
  • R1 e R2 RES10
  • D2 DO-15
  • U1 TO220-T05B (va già bene quello scelto in Multisim, è solo brutto il render nella vista 3D)

Tentare il primo sbroglio seguendo le indicazioni di figura 32 del datasheet (collegamenti in grassetto devono essere corti e grossi). Tracce da 1mm. Piazzole tonde con fori da 0.8 e diametro 2,6 dove possibile altrimenti ovali custom (vedi qui o qui). Io non sono riuscito a fare lo sbroglio solo sul bottom (ma Alifuoco e D'Agostino sì!) e ho dovuto piazzare 2 via e un collegamento sul top.

Se è necessario realizzare dei collegamenti nel lato top bisogna piazzare delle via:

  • dal menu Place scegliere via
  • selezionare il collegamento (da bottom a top per la prima, da top a bottom per la seconda)
  • collegare le due via con una pista sul lato top (pista verde)

Al termine aggiungere il piano di massa:

  • dal menu Place scegliere power plane
  • selezionare la net 0 (massa) e il lato bottom
  • impostare manualmente la clearance a 1mm dalle proprietà del piano di massa

Controllare sempre:

  • che la clearance sia corretta (possibilmente 1mm tra piste e piste e tra piste e piazzole, dove non possibile tentare comunque di non scendere sotto 0.6)
  • dal menu Design scegliere DRC and netlist check e Connectivity check

I piedini dei condensatori elettrolitici possono risultare invertiti. Lo si vede controllando il collegamenti in Ultiboard ma anche in Multisim se nella scheda Display delle proprietà del componente si mette la spunta su show symbol pin names e show package pin names. Per correggere si può procedere in due modi:

  • aggiustando il mapping (l'abbinamento tra piedini del simbolo e piedini del footprint) in Multisim e riportando le modifiche in Ultiboard con Forward Annotate; per farlo selezionare il componente e cliccare Edit package nella scheda Value, quindi abbinare correttamente Symbol pin e Package pin
  • da Ultiboard col il Netlist editor dal menu tools:
    • dalla net 0 (massa) eliminare il pin + di C2 selezionandolo e cliccando su Remove
    • procedere allo stesso modo eliminando il pin - di C2 dall'altra net
    • aggiungere i pin alla net giusta selezionando prima la net e aggiungendo i pin col pulsante con la freccia sotto al pulsante Add

Collaudo

Montata la scheda single layer8) con questi componenti:

  • diodo di protezione 1N4007
  • diodo shottky 1N5819
  • Cin 100uF
  • Cout 1000uF
  • induttore 220uH
  • morsetto a vite
  • resistori da 1k e 2,7k
  • trimmer da 500
  • LM2576-ADJ9) dopo aver piegato tre piedini
  • stripline maschio-maschio lunghe

Per tutti i componenti punta da 0,8mm tranne che per: stripline, morsetto a vite, induttore, regolatore dove serve la punta da 1mm.

La scheda è stata collaudata usando un reostato come carico e 100mA di corrente e la tensione in uscita, regolata con l'aiuto del tester, a 5V. All'oscilloscopio osserviamo il ripple della tensione in uscita e la tensione al piedino Vout10):

{{:regolatore_switching_oscilloscopio.jpeg?400|ripple della tensione in uscita e Vout sull'LM2576

Si osserva un ripple di circa 20mV e il tipico andamento della tensione su Vout prodotta dalla commutazione del regolatore.

Software

Ho usato la libreria servo e l'esempio 4 da qui per inviare i dati da monitor seriale. La scheda switching funziona e il regolatore senza dissipatore non scalda granché. Per calibrare ognuno dei servo si può usare questo sketch.

FIXME aggiustare i valori dopo la riparazione

Range valori per i 5 attuatori:

  • pinza pin 5: 0 aperto, 60 chiuso
  • polso2 pin 6: 0 90° a sinistra, 90 orizzontale, 180 90° a destra
  • polso1 pin 9: 50 a terra, 120 tutto indietro
  • braccio pin 10: stare tra 80 (alto) e 120 (basso) col braccio avanzato
  • base pin 11: 80 sinistra 45°, 40 dritto, 0 45° a destra

Codice adattato da qui:

/*  da https://www.mauroalfieri.it/bricolage/posizionamento-braccio-robot.html#more-12400
 *  aggiunto start-stop da seriale
 *  le posizioni vanno ricalibrate in base al nostro robot
 *  i movimenti sono rallentati usando la funzione goPos()
 */
 
#include <Servo.h>
 
// per il range di valori vedi qui
// https://leonardocanducci.org/wiki/tp4/braccio_robotico#collaudo
Servo base;         // 1 0 - 180
Servo shoulder;     // 2 140 - 37
Servo elbow;        // 3 65 - 140
Servo wrist_rot;    // 4 0 - 180
Servo gripper;      // 5 0 - 75
 
// posizione iniziale
byte pos[5]    = {90,90,90,90,0};
// serve per la funzione goPos()
byte oldpos[5] = {90,90,90,90,0};
 
// sequenza coordinate
//byte seq[][5] = {
//  {90,90,90,90,0},
//  {110,90,130,90,0},
//  {110,63,130,90,50},
//  {110,90,110,90,50},
//  {30,90,110,90,50},
//  {30,63,110,90,0},
//  {30,90,110,90,0},
//  {90,90,130,90,0},
//  {90,63,130,90,40},
//  {90,90,110,90,40},
//  {40,90,110,90,40},
//  {40,63,110,90,0},
//  {40,90,110,90,0},
//  {70,90,130,90,0},
//  {70,63,130,90,40},
//  {70,90,110,90,40},
//  {45,90,110,90,40},
//  {45,63,110,90,0},
//  {45,90,110,90,0},
//  {90,90,90,90,75,}
//};
 
byte seq[][5] = {
  {90,90,90,90,0},
  {140,110,60,90,0},
  {140,110,60,90,0},
  {140,110,60,90,35},
  {140,90,90,90,35},
  {90,90,90,90,60},
  {90,110,60,90,0},
  {90,90,90,90,0}
};
 
// avvio se arriva del testo da seriale
bool run = false;
 
void setup() {
  Serial.begin(115200);
 
  // abbinamento servo-pin
  base.attach(11);
  shoulder.attach(10);
  elbow.attach(9);
  wrist_rot.attach(6);
  gripper.attach(5);
 
  // comando posizione iniziale
  base.write(pos[0]);
  shoulder.write(pos[1]);
  elbow.write(pos[2]);
  wrist_rot.write(pos[3]);
  gripper.write(pos[4]);
 
  Serial.println( "#### invia testo per avviare e per fermare la sequenza ####" );
}
 
void loop() {
 
  startStop();
  while (run) {
 
    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);
      delay(1000);
      startStop();
    }
    delay(2000);
  }
}
 
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];
}
 
void startStop() {
  // se arriva del testo dal monitor seriale
  if (Serial.available()>0){
    // senza questo ritardo non legge tutti i dati del buffer!
    delay(10);
    Serial.println("buffer non vuoto");
    Serial.print("buffer dati: ");
    Serial.println(Serial.available());
    // svuota il buffer
    clearInputBuffer();
    Serial.print("buffer dati: ");
    Serial.println(Serial.available());
    // toggle della variabile che attiva la sequenza
    run = !run;
    Serial.print("run vale: ");
    Serial.println(run);
  }
}
 
void clearInputBuffer() {
  while (Serial.available() > 0) {
    char t = Serial.read();
  }
}

Risorse

Torna all'indice.

2)
tutti i numeri sono disponibili nella biblioteca scolastica
3)
che sembrano servo continui - muovendoli non si avverte il fine corsa - ma non lo sono
4)
le masse devono essere collegate!
5)
NB: con questo prodotto non è possibile “insegnare” un movimento al braccio registrandolo mentre lo si muove “a mano” per poi replicarlo. Per farlo ci vuole un servo con feedback (tipo questo)
6)
i file hanno estensione .mst13 e sono organizzati per tipo di scheda Arduino
7)
linee gialle che indicano cosa collegare con le piste
8)
da progetto degli studenti D'Agostino e Alifuoco
9)
occhio che nel cassettino ci sono anche gli LM2576-5 a 5V fissi e occhio anche al verso!
10)
scendendo sotto i 100mA il comportamento peggiora
Questo sito Web utilizza i cookie. Utilizzando il sito Web, l'utente accetta la memorizzazione dei cookie sul proprio computer. Inoltre riconosci di aver letto e compreso la nostra Informativa sulla privacy. Se non sei d'accordo, lascia il sito.Maggiori informazioni sui cookie
braccio_robotico.txt · Ultima modifica: 2023/03/07 08:23 da admin