Strumenti Utente

Strumenti Sito


braccio_robotico

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisioneRevisione precedente
Prossima revisione
Revisione precedente
braccio_robotico [2020/03/29 13:52] – [Creazione del componente LM2576] adminbraccio_robotico [2023/03/07 08:23] (versione attuale) – [Collaudo] admin
Linea 1: Linea 1:
 +
 +
 +
 ====== Braccio Robotico ====== ====== Braccio Robotico ======
  
Linea 82: Linea 85:
   * 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   * 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. La tensione a valle di un diodo di protezione 1N4001 sarà collegata al piedino Vin per alimentare anche la scheda Arduino. +Si sceglie di alimentazione schede e motori con un alimentatore da banco a 12V e di utilizzare un morsetto a viteQuesta tensionea valle di un diodo di protezione 1N4001sarà collegata al piedino Vin per alimentare anche la scheda Arduino. 
  
 Per il dimensionamento del regolatore occorre sapere: Per il dimensionamento del regolatore occorre sapere:
Linea 89: Linea 92:
   * Imax = 2A (i servo più grandi assorbono al massimo 1,2A)   * Imax = 2A (i servo più grandi assorbono al massimo 1,2A)
 e scegliere: e scegliere:
-  * Cin (elettrolitico da 100uF?+  * Cin (elettrolitico da 100uF) 
-  * Cout (elettrolitico da 1000uF?+  * Cout (elettrolitico da 1000uF) 
-  * L1 (220uH o più piccolo?)+  * L1 (220uH)
   * D1 = 1N5822   * D1 = 1N5822
  
Linea 173: Linea 176:
   * U1 TO220-T05B (va già bene quello scelto in Multisim, è solo brutto il render nella vista 3D)   * 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 [[https://leonardocanducci.org/wiki/tp3/shield_293d?s[]=custom#come_creare_una_piazzola_custom|qui]] o [[https://leonardocanducci.org/wiki/tp4/simon#creare_una_piazzola_custom|qui]]). Io non sono riuscito a fare lo sbroglio solo sul bottom e ho dovuto piazzare 2 via e un collegamento sul top.+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 [[https://leonardocanducci.org/wiki/tp3/shield_293d?s[]=custom#come_creare_una_piazzola_custom|qui]] o [[https://leonardocanducci.org/wiki/tp4/simon#creare_una_piazzola_custom|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: Se è necessario realizzare dei collegamenti nel lato top bisogna piazzare delle via:
Linea 196: Linea 199:
     * aggiungere i pin alla net giusta selezionando prima la net e aggiungendo i pin col pulsante con la freccia sotto al pulsante //Add//     * 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 layer((da progetto degli studenti D'Agostino e Alifuoco)) 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-ADJ((occhio che nel cassettino ci sono anche gli LM2576-5 a 5V fissi e occhio anche al verso!)) 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 Vout((scendendo sotto i 100mA il comportamento peggiora)):
 +
 +{{:regolatore_switching_oscilloscopio.jpeg?400|{{: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 [[https://forum.arduino.cc/t/serial-input-basics-updated/382007/3|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 {{ ::test_calibrazione_servo_braccio.zip |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 [[https://www.mauroalfieri.it/bricolage/posizionamento-braccio-robot.html#more-12400|qui]]:
 +
 +<code C>
 +/*  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();
 +  }
 +}
 +
 +</code>
 ===== Risorse ===== ===== Risorse =====
  
Linea 202: Linea 390:
   * [[alimentatori_switching#l_integrato_lm2576|pagina sul regolatore LM2576]]   * [[alimentatori_switching#l_integrato_lm2576|pagina sul regolatore LM2576]]
   * {{ ::ultiboard11.pdf |guida Ultiboard del libro di testo di elettronica}}   * {{ ::ultiboard11.pdf |guida Ultiboard del libro di testo di elettronica}}
 +  * {{ :shield_roboarm.zip |file progetto Multisim e Ultiboard}}
 +  * {{ ::sequenza_braccio.zip |sketch Arduino con controllo da seriale o con interruput sul pin D2}}
  
 ===== Navigazione ===== ===== Navigazione =====
braccio_robotico.1585489942.txt.gz · Ultima modifica: 2020/07/03 15:59 (modifica esterna)