Mini Braccio Robotico ARM con Arduino

ATTENZIONE GUIDA NON DEFINITIVA
Mini Braccio Robotico ARM con Arduino

Questo è il braccio robotico che utilizziamo durante le gare delle Olimpiadi Robotiche.
Di questo braccio su internet se ne trovano varie versioni. Noi siamo partiti da questa per poi apportare varie modifiche e migliorie.
Oltre alle parti da stampare con una stampante 3D
i materiali necessari per relaizzare il braccio robotico sono:
– 5 servomotori EMAX ES08MA II
– 1 servomotore SG90
– 1 viti M2,3×10
– 2 viti M2,3×8
– 4 viti M3x16 a testa bombata
– 4 dadi M3 autobloccanti
– 8 rondelle M3
– 2 viti M3x12 per il legno
– 1 scheda Arduino
– 1 schield controllo motori con Chip PCA9685
– 1 alimentatore 5V – 5A con connettore 2,2 x 5,5 maschio
– 1 cavo con connettore 2,2 x 5,5 femmina per alimentare la schield
– 1 prolunga per servomotori di lunghezza 10 cm
– 1 Breadboard 400 punti
– 1 base di legno o stampata 3D

Iniziamo il montaggio con i seguenti pezzi:

Per fissare la base del robot al piedistallo occorreranno 4 viti M3x16, 8 rondelle e 4 dadi M3, possibilmente autobloccanti così da non dover stringere forte il serraggio dei bulloni.
Per fissare l’Arduino si utilizzerà la sua apposita cornice e 4 viti M3x6.
Infine montiamo il Servo Motore (facendo attenzione al verso) con le due viti date in dotazione e applichiamo sopra l’Arduino UNO la schield PCA9685.
Il risultato sarà il seguente:
Adesso montiamo la base rotante del Braccio Robotico con il supporto tondo per il Servomotore come visibile nella prossima foto:
A questo punto montiamo la base rotante al Servomotore.
Prima di bloccarla definitivamente però si dovranno trovare i parametri min e max da inviare al motore in modo che la base rotante andrà a 0°, 90° e 180°.
Questi parametri andranno trovati per ogni motore che collegheremo alla scheda PCA9685.
Se volete capire il funzionamento della scheda PCA9685 potete leggere la nostra guida al seguente link:
https://www.makerslab.it/pca9685-controllo-i2c-a-16-canali-pwm-per-led-e-servomotori/

Alla fine di questa pagina è presente lo sketch per Arduino che noi abbiamo utilizzato per testare i motori e trovare i vari parametri di configurazione.

Una volta trovati i parametri le posizioni saranno le seguenti:

Ora iniziamo a montare i vari snodi del Braccio.
Ai prossimi motori si dovrà fare una piccola modifica:
Si dovrà rimuovere con un taglierino il piccolo fermo in plastica vicino all’albero motore. Attenzione: dovra essere rimosso solo a quei motori che dovranno essere inseriti nei vari snodi.
Ci sono due pezzi simili, iniziamo da quello più lungo:
Applichiamo Il Servo Motore (questo è uno di quelli da modificare) alla base rotante montata precedentemente e facciamo passare il cavo nell’apposita asola presente nella base rotante:
A questo punto si dovrà montare il primo snodo:

Prima di bloccarlo definitivamente, come indicato precedentemente, si dovranno trovare i parametri min e max da inviare al motore in modo che la parte possa andare a 0°, 90° e 180°:
Ora è il turno del pezzo più corto dei due simili:

Prima di tutto si monta il Servo Motore (anche questo è uno di quelli da modificare) sul pezzo precedentemente montato facendo passare il cavo nell’apposita asola:
A questo punto si dovrà montare il secondo snodo e, anche in questo caso prima di bloccarlo definitivamente, si dovranno trovare i parametri min e max da inviare al motore in modo che la parte possa andare a 0°, 90° e 180°:

Adesso montiamo i seguenti pezzi:

Prima di tutto si monta il Servo Motore (anche questo è uno di quelli da modificare) sul pezzo precedentemente montato facendo passare il cavo nelle apposite asole:
Come al solito a questo punto si dovrà montare il terzo snodo e, anche in questo caso prima di bloccarlo definitivamente, si dovranno trovare i parametri min e max da inviare al motore in modo che la parte possa andare a 0°, 90° e 180°:
Adesso montiamo i seguenti pezzi:
Prima di tutto si monta il Servo Motore (questo non dovrà essere modificato) sul pezzo precedentemente montato, come visibile nella prossima foto, facendo passare il cavo nelle apposite asole:
Prima di montare il supporto a croce per il Servo Motore dovrà essere modificato come visibile nella prossima foto:
Come al solito a questo punto prima di bloccare definitivamente il pezzo al suo Servo Motore, si dovranno trovare i parametri min e max da inviare al motore in modo che la parte possa andare a 0°, 90° e 180°:
E’ ora giunto il momento di montare la pinza tramite i seguenti pezzi:

Si inizia fissando il servomotore e la parte piatta della pinza facendo attenzione all’ordine con il quale inserire i componenti:
Anche il cavo di questo motore dovrà essere fatto passare dalle varie asole e, dato che alla fine risulterà corto e non arriverà alla nostra schield, applicheremo anche una apposita prolunga di 10 cm per Servo Motori.
Per poi passare alle montaggio delle griffe.
Per questo motore si dovranno trovare i parametri min e max da inviare in modo che la pinza sia o chiusa o aperta (ma non troppo in modo da non farla smonatare).
Non ci resta che concludere il montaggio con la Breadboard ed il fermo per il cavo di alimentazione della schield:
Come mostrato nella seguente foto:
Ecco il nostro Mini Braccio Robotico ARM con Arduino completamente montato:

Questo è lo sketch che abbiamo utilizzato per trovare i parametri dei servomotori da utilizzare con la libreria di Adafruit, la Adafruit PWM Servo Driver Library.

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// modificare il seguente rigo in base all'indirizzo i2c della propria scheda
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
// i parametri da inserire nella seguente scheda andranno trovati empiricamente
#define SERVO_FREQ 50

// questi sono i valori degli impulsi minimi e massimi da dare ai servomotori dopo averli rilevati
// Motore 10 - Base Rotante
#define SERVO10MIN  130
#define SERVO10MAX  510
// Motore 11 - Spalla
#define SERVO11MIN  125
#define SERVO11MAX  500
// Motore 12 - Gomito
#define SERVO12MIN  130
#define SERVO12MAX  505
// Motore 13 - Polso
#define SERVO13MIN  105
#define SERVO13MAX  475
// Motore 14 - Rotazione Pinza
#define SERVO14MIN  105
#define SERVO14MAX  475
// Motore 15 - Pinza
#define SERVO15MIN  110
#define SERVO15MAX  320

// variabili utilizzate per calcolare il segnale da inviare al servomotore in base ai parametri rilevati
int lungImpulso10, lungImpulso11, lungImpulso12, lungImpulso13, lungImpulso14, lungImpulso15;

void setup() {
  Serial.begin(9600);
  Serial.println("Test Braccio Robotico");

  pwm.begin();
  pwm.setOscillatorFrequency(27000000);
  pwm.setPWMFreq(SERVO_FREQ);
  delay(10);

  // il seguente rigo serve a calcolare la lunghezza dell'impulso da inviare al servomotore in base ai gradi scelti
  // basterà sostituire il 90 con il valore in gradi della posizione in cui dovrà andare il servomotore
  lungImpulso10 = map(90, 0, 180, SERVO10MIN, SERVO10MAX);
  // il seguente rigo invia l'impulso calcolato al servomotore scelto
  pwm.setPWM(10, 0, lungImpulso10);
  lungImpulso11 = map(90, 0, 180, SERVO11MIN, SERVO11MAX);
  pwm.setPWM(11, 0, lungImpulso11);
  lungImpulso12 = map(90, 0, 180, SERVO12MIN, SERVO12MAX);
  pwm.setPWM(12, 0, lungImpulso12);
  lungImpulso13 = map(90, 0, 180, SERVO13MIN, SERVO13MAX);
  pwm.setPWM(13, 0, lungImpulso13);
  lungImpulso14 = map(90, 0, 180, SERVO14MIN, SERVO14MAX);
  pwm.setPWM(14, 0, lungImpulso14);
  lungImpulso15 = map(90, 0, 180, SERVO15MIN, SERVO15MAX);
  pwm.setPWM(15, 0, lungImpulso15);
  delay(2000);
}
void loop() {
  /* elenco servomotori connessi
  servo su connettore 10 - Base rotante
  servo su connettore 11 - Spalla
  servo su connettore 12 - Gomito
  servo su connettore 13 - Polso
  servo su connettore 14 - Rotazione Pinza
  servo su connettore 15 - Pinza
  */
  // numero del servomotore da testare
  int motore = 14;
  // valore minimo da trovare
  int SERVOMIN = 105;
  // valore massimo da trovare
  int SERVOMAX = 475;

  int posizione;

  // posiziona il servo a 0 gradi
  posizione = map(0, 0, 180, SERVOMIN, SERVOMAX);
  pwm.setPWM(motore, 0, posizione);
  Serial.println("Posizione  0");
  Serial.print("Valore ");
  Serial.println(posizione);
  delay(3000);
  // posiziona il servo a 90 gradi
  posizione = map(90, 0, 180, SERVOMIN, SERVOMAX);
  pwm.setPWM(motore, 0, posizione);
  Serial.println("Posizione 90");
  Serial.print("Valore ");
  Serial.println(posizione);
  delay(6000);
  // posiziona il servo a 180 gradi
  posizione = map(180, 0, 180, SERVOMIN, SERVOMAX);
  pwm.setPWM(motore, 0, posizione);
  Serial.println("Posizione 180");
  Serial.print("Valore ");
  Serial.println(posizione);
  delay(3000);
  // posiziona il servo a 90 gradi
  posizione = map(90, 0, 180, SERVOMIN, SERVOMAX);
  pwm.setPWM(motore, 0, posizione);
  Serial.println("Posizione 90");
  Serial.print("Valore ");
  Serial.println(posizione);
  delay(6000);
}