Trasformiamo un braccio robot con funzionalità davvero ridotte, in un braccio robot controllabile via software mediante l'utilizzo di Arduino
Vediamo come trasformare un braccio robot con funzionalità davvero ridotte, in un braccio robot controllabile via software mediante l'utilizzo di Arduino.
Il braccio robot in questione è quello del kit “Edge robotic arm”, esso è dotato di ben 5 motori in grado di muovere le diverse articolazioni del braccio; facendo un'analogia con un braccio umano possiamo dire che la parte meccanica si compone di: una mano, un polso, un gomito, una spalla ed una base per la rotazione dell'intero sistema. La base può ruotare di 270 gradi, mentre polso, gomito e spalla possono ruotare rispettivamente di 120, 300 e 180 gradi; alla mano (pinza) sono consentiti i soli movimenti di apertura e chiusura. Così come viene fornito il kit base (acquistabile per circa 40 euro), è dotato di 5 motori semplici DC, dove per “semplici” intendo dire che non si tratta di motori servo o stepper; i comandi ai motori vengono dati tramite manualmente agendo sugli switch presenti sul modulo di comando direttamente collegato al braccio meccanico.
Tornando a quanto vogliamo realizzare diciamo subito che dovendo utilizzare un sistema di comando che fa uso di microcontrollore, possiamo scollegare gli switch per il comando manuale cercando di recuperare comunque i fili che vanno ai motori in maniera tale da agevolare poi le connessioni tra motori e sistema di controllo. Il sistema più adatto per pilotare motori del genere, è quello di utilizzare un ponte H, ciò consentirebbe di controllare più accuratamente la rotazione in senso orario ed antiorario di ciascun motore. Possiamo costruire da noi dei ponti H, oppure (semplificando il tutto) possiamo ricorrere a degli integrati che effettuano tale funzione; tra questi ci sono gli L293 e gli SN754410.
Mediante un ponte H possiamo sostanzialmente controllare il verso della corrente circolante nei rotori dei motorini e quindi stabilire il verso di rotazione, tenere il motore a folle o frenarlo. Per questo progetto la scelta è caduto sull'integrato SN754410, tale IC semplifica notevolmente le cose in quanto ci consente di pilotare 2 motori; ogni integrato ha 4 input (2 per ogni motore, più due ENABLE) agendo sui quali si ha il controllo completo dei movimenti di ciascun motore; essendo il braccio robot dotato di 5 motori ovviamente utilizzeremo 3 integrati.
Quello che faremo è quindi collegare gli input di questi tre chip agli output di Arduino in maniera tale da poter gestire i motori via software, in particolare vediamo come effettuare i collegamenti al SN754410 dopo aver montato il circuito su bread board:
Shoulder motor
chip 1, pin 1 to Arduino pin 14 (Analog pin o)
chip 1, pin 2 to Arduino pin 15 (Analog pin 1)
chip 1, pin 7 to Arduino pin 16 (Analog pin 2)
Base motor
chip 1, pin 9 to Arduino pin 2
chip 1, pin 10 to Arduino pin 3
chip 1, pin 15 to Arduino pin 4
Elbow motor
chip 2, pin 1 to Arduino pin 8
chip 2, pin 2 to Arduino pin 9
chip 2, pin 7 to Arduino pin 10
Wrist motor
chip 2, pin 9 to Arduino pin 5
chip 2, pin 10 to Arduino pin 6
chip 2, pin 15 to Arduino pin 7
Hand motor
chip 3, pin 9 to Arduino pin 11
chip 3, pin 10 to Arduino pin 17 (Analog pin 3)
chip 4, pin 15 to Arduino pin 18 (Analog pin 4)
Rispettare lo schema di collegamento esposto sopra non è l'unica possibilità, però se rispettiamo tale schema possiamo utilizzare direttamente lo sketch Arduino riportato di seguito (presente anche a questo link) senza effettuare ulteriori modifiche. Ad ogni modo nulla di complicato, anzi il tutto potrebbe essere ancora semplificato (ad esempio con l'utilizzo di registri a scorrimento si potrebbe ridurre il numero di SN754410 variando opportunamente lo sketch).
int baseMotorEnablePin = 2;
int baseMotorPin1 = 3;
int baseMotorPin2 = 4;
int shoulderMotorEnablePin = 14;
int shoulderMotorPin1 = 15;
int shoulderMotorPin2 = 16;
int elbowMotorEnablePin = 8;
int elbowMotorPin1 = 9;
int elbowMotorPin2 = 10;
int wristMotorEnablePin = 5;
int wristMotorPin1 = 6;
int wristMotorPin2 = 7;
int handMotorEnablePin = 11
int handMotorPin1 = 17;
int handMotorPin2 = 18;
void setup() {
// set the motor pins as outputs:
// set all chips to enabled state
pinMode(baseMotorPin1, OUTPUT);
pinMode(baseMotorPin2, OUTPUT);
pinMode(baseMotorEnablePin, OUTPUT);
digitalWrite(baseMotorEnablePin, HIGH);
pinMode(shoulderMotorPin1, OUTPUT);
pinMode(shoulderMotorPin2, OUTPUT);
pinMode(shoulderMotorEnablePin, OUTPUT);
digitalWrite(shoulderMotorEnablePin, HIGH);
pinMode(elbowMotorPin1, OUTPUT);
pinMode(elbowMotorPin2, OUTPUT);
pinMode(elbowMotorEnablePin, OUTPUT);
digitalWrite(elbowMotorEnablePin, HIGH);
pinMode(wristMotorPin1, OUTPUT);
pinMode(wristMotorPin2, OUTPUT);
pinMode(wristMotorEnablePin, OUTPUT);
digitalWrite(wristMotorEnablePin, HIGH);
}
void loop() {
/*
// SET either one to HIGH to turn the motor on.
// e.g.
digitalWrite(baseMotorPin1, LOW);
digitalWrite(baseMotorPin2, HIGH);
*/
digitalWrite(baseMotorPin1, LOW);
digitalWrite(baseMotorPin2, LOW);
/*
// more motors here added.
digitalWrite(shoulderMotorPin1, LOW);
digitalWrite(shoulderMotorPin2, LOW);
digitalWrite(elbowMotorPin1, LOW);
digitalWrite(elbowMotorPin2, LOW);
digitalWrite(wristMotorPin1, LOW);
digitalWrite(wristMotorPin2, LOW);
*/
}
Possiamo alimentare il tutto con le batterie in dotazione nel kit (4 batterie serie 'D') facendo attenzioni a collegare gli integrati SN754410 e Arduino alla stessa GND. Terminati i collegamenti il nostro braccio robot sarà pronto per essere programmato per specifici taks; ricordiamoci che il peso massimo sollevabile resta quello nominale di 100 grammi. Se volessimo pilotare il tutto da PC in tempo reale dobbiamo solo modificare lo sketch predisponendolo alla lettura dei valori da USB.
Sarebbe interessante, ad esempio,dar vita ad un sistema completo in cui vi sia l'interazione di più bracci robot coordinati da un'unita centrale (PC) per lo svolgimento di tasks complessi. Si tratta solo di un esempio, in realtà avendo a disposizione un robot pilotato da un microcontrollore, sarà compito della nostra fantasia trovare le applicazioni più interessanti.
Arduino è disponibile da Farnell
io inoltre ci metterei anche un occhio … digitale non umano 🙂 .. oppure ci proverei a far girare il braccio quando riconosce un oggetto utilizzando ad esempio il kinect…
credete sia possibile interfacciare arduino con qualcosa del genere..?
e soprattutto… è possibile secondo voi che degli algoritmi scritti con delle librerie in C++ possano girare sull’atmel di arduino?
Se qualcuno mi illumina glie ne sarei davvero grato..!
mi son dato una risposta da solo.. non l’avevo visto questo prima :
http://it.emcelettronica.com/robot-comandato-da-kinect-e-arduino
grandioso..anche se in realtà credo che li si traduca tutto in C e non si usano librerie di più alto livello..ossia vengono interpretati direttamente i segnali forniti dal kinect e passati in ingresso al codice C se non sbaglio..
In realtà in questo modo ci priviamo di tutte le belle cose che troviamo in OpenCV la libreria di cui ho parlato nel mio articolo di giorni fa..
Per questo la mia domanda è (un pò con linguaggio forzato): è possibile cross-compilare un le librerie di OpencCV (scritte in C++) su Arduino?
ed ecco a voi la risposta…
http://www.creativeapplications.net/tutorials/arduino-servo-opencv-tutorial-openframeworks/
ok basta la smetto di fare gigi marzullo.. però spero si capisca il ragionamento che c e dietro 😉
Dovresti dare un’occhiata al codice sorgente scritto in C++ e che struttura soprattutto,
così si porrà ma è scritto prevalentemente con un’ottica ad oggetti come il C++ è previsto non puoi fare cross-compilare, ma ad esempio conosco tanta gente che scrive con C++ che lo usa come se fosse C,
Senza sfruttare le potenzialità programmazione ad oggetto quindi in poche parole risulta come se fosse in Programmazione strutturata o Programmazione procedurale.
Ma comunque sei un po’ di tempo da perdere esiste sempre la possibilità dell’ingegneria inversa,
e disse libero di usare qualsiasi linguaggio che si faccia il piacere.
Ma di solito C a migliori risultati nel mondo cmicrocontrollori che il C++ che necessita tante risorse supplementare inutili in questi piccoli progetti
E’ tutto spiegato dettagliatamente nel link presente nell’articolo.
http://luckylarry.co.uk/arduino-projects/arduino-modifying-a-robot-arm/
Penso di si, intervenendo sui vari registri, magari tramite interrupt modificarli dalla porta seriale RS232