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); }
—