ARDUINO Esplora
Gestione servo con Micro Maestro
Ultimo aggiornamento 1 febbraio 2015


  Collegare dei servomotori ad una scheda Arduino UNO è una cosa piuttosto semplice, basta collegare l’alimentazione, il cavo del segnale del servo ad una delle tante porte digitali presenti. La gestione è facilitata dall’opportuna libreria già presente nelle librerie standard. Ma cosa succede se come nel caso della scheda Arduino Esplora le porte digitali disponibili sono solamente due e i servo da comandare sono molti di più.
La soluzione più semplice è quella di utilizzare un modulo specifico come il Micro Maestro prodotto dalla Pololu, questo, permette tramite una linea seriale per la ricezione dei comandi di comandare sino a 6 servomotori.

Specifiche Tecniche
 

Dimensioni stampato

 ~ 21mm×30mm

Numero di porte per servo

 6

Range larghezza impulso

 64 e 3280 μs

Risoluzione

 0,25 µs (~0.025 °)

Tensione di alimentazione

 5-16V

Tensione I/O

 0 e 5 V

Velocità seriale

 300 - 115200 bps

Consumo

 30 mA (valore medio)

homotix

Sulla scheda troviamo un processore PIC18F14K50-I/SS a 8 bit, 48MHz, memoria 16 kB, memoria dati da 256 bytes., con implementare di un’interfaccia USB V2.0, risuonatore per il clock, un regolatore di tensione, tre led di stato e vari connettori con funzione di alimentazione di interfaccia e per il collegamento dei servomotori
Supporta tre metodi di controllo: USB per una connessione diretta con il computer, seriale TTL per l'utilizzo con sistemi embedded, e internal scripting per applicazioni integrate, senza bisogno di un controllore esterno. I canali possono essere configurati come uscite servo per utilizzarli con i normali servo RC da modellismo o con gli ESC (Electronic Speed Control), come uscite digitali, oppure ancora come ingressi analogici.
Con il modulo è possibile il controllo integrato di velocità ed accelerazione su ciascun canale rendendo possibile ottenere movimentazioni morbide e senza scatti.
Ogni scheda può essere collegata in cascata con altri controllers Pololu su una singola linea seriale. Il firmware della scheda è aggiornabile.
Il modulo Micro Maestro ha tre led indicatori di tre colori diversi: il LED verde indica lo stato del dispositivo USB, il led rosso error/user di solito indica un errore, il LED giallo indica lo stato di controllo.

Comandi Micro Maestro - Modo Pololu

I comandi per la gestione di servomotori disponibili per il Micro Maestro in modo Pololu sono:

Set Target – Impostazione della posizione del servo
Set Speed - Imposta la velocità con cui il servo raggiunge la posizione assegnata
Set Acceleration - Questo comando imposta l'accelerazione del servomotore
Get Position - Questo comando consente di ricevere il valore di posizione di un servomotore.
Get Moving State - Questo comando è utilizzato per determinare se le uscite servo hanno raggiunto la loro posizione finale o stanno ancora cambiando.
Get Errors - Utilizzato per esaminare gli errori che il Maestro ha rilevato.
Go Home - Questo comando porta tutti i servi alle loro posizioni iniziali

Esaminiamo in dettaglio alcuni comandi:

Set Target

Protocollo : 0xAA, numero del dispositivo, 0x04, numero servo, target low bit, target high bit.

Si utilizza questo comando per ruotare il servo di un determinato angolo.
Nel nostro caso il target rappresenta la larghezza dell'impulso da trasmettere in unità di quarti di microsecondi.
Un valore di 0 indica alla scheda di interrompere l'invio di impulsi al servo.
Ad esempio: se si vuole inviare sul canale 2 un impulso di 1500 ms (1500 × 4 = 6000 = 01011101110000 in binario), è possibile inviare la seguente sequenza di byte:
• in binario: 10000100, 00000010, 01110000, 00101110
• in esadecimale: 0x84, 0x02, 0x70, 0x2E
• in decimali: 132, 2, 112, 46

Set Speed

Protocollo: 0xAA, numero del dispositivo, 0x07, numero servo, accelerazione bit bassi, accelerazione bit alti.

Questo comando limita la velocità con cui cambia il valore di uscita di un canale servo. Il limite di velocità è espresso in unità di (0,25 ms) / (10 ms).
Una velocità di 0 (valore di default) rende la velocità illimitata, in modo che l'impostazione della destinazione influenzerà immediatamente la posizione. Si noti che la velocità reale alla quale si muove il servo è limitata dalle caratteristiche del servo stesso, la tensione di alimentazione e carichi meccanici.

Set Acceleration

Protocollo: 0xAA, numero de dispositivo, 0x09, numero servo, accelerazione bit bassi, accelerazione bit alti.

Questo comando imposta l'accelerazione del servomotore
Il limite di accelerazione è un valore compreso tra 0 a 255 in unità di (0,25 ms) / (10 ms) / (80 ms).
Il valore 0 corrisponde a nessun limite di accelerazione. Il limite di accelerazione determina la velocità che impiega il servo ad arrivare alla velocità massima, poi il tempo impiegato in decelerazione, questo provoca un movimento relativamente fluido da un punto ad un altro.
Con l'impostazione di minima accelerazione 1, l'uscita del servo impiega circa 3 secondi per passare agevolmente da un valore di 1 ms ad un valore di 2 ms.

Get Position

Protocollo: 0xAA, numero di dispositivo, 0x10, numero del canale.

Questo comando consente al dispositivo di comunicare con la scheda di controllo per ottenere il valore di posizione di un servo. La posizione è inviata come risposta a due byte immediatamente dopo che il comando viene ricevuto. Il valore rappresenta la larghezza d’ impulso che la scheda sta trasmettendo al servo.

Get Moving State

Protocollo: 0xAA, numero di dispositivo, 0x13
Risposta: 0x00 se i servo non si muovono, 0x01 se i servo si stanno muovendo.

Questo comando è utilizzato per determinare se le uscite dei servo hanno raggiunto la loro posizione o stanno ancora ruotando. Il valore sarà 1 purché vi sia almeno un servo che sia ancora in movimento. L'utilizzo di questo comando è necessario per avviare diversi movimenti servo e attendere che tutti i movimenti per finire prima di passare alla fase successiva del programma.

Get Errors

Protocollo: 0xAA, numero di dispositivo, 0x21
Risposta: bit di errore 0-7, errore di bit 8-15

Si può utilizzare questo comando per esaminare gli errori che la scheda controllo ha rilevato. Sul manuale, alla Sezione 4.b sono elencati gli errori specifici che possono essere rilevati dal Maestro. Il registro di errore viene inviato come risposta a due byte immediatamente dopo che il comando è stato ricevuto, allora tutti i bit di errore vengono cancellati.

Go Home

Protocollo: 0xAA, numero di dispositivo, 0x22

Questo comando invia a tutti i servi la loro posizioni iniziale, proprio come se si fosse verificato un errore. Per i servi e le uscite impostate su "Ignora", la posizione sarà invariata.

Uso della libreria

Come abbiamo visto, i comandi per la gestione dei servo sono molti, realizzare un programma di gestione da utilizzare con la scheda Arduino potrebbe essere complesso. Per questo motivo è molto più comodo utilizzare un’apposita libreria che si occupi di inviare i giusti comandi. Ricercando in rete si è trovata una libreria già pronta, questa denominata PMCtrl realizzata da Graham Sortino. Per utilizzare la libreria sarà sufficiente accedere alla pagina e scaricare l’ultima versione della libreria, questa dovrà essere salvata all’interno della cartella Library dell’IDE di Arduino.

Funzioni di assegnazione e inizializzazione

Per utilizzarla, occorre prima di tutto includerla nel programma con il comando.

#include <PMCtrl.h>

Quindi occorre definire il nome con cui si chiamerà il modulo, a quali pin sarà connesso per il dialogo seriale e a quale velocità si utilizzerà per la comunicazione, il comando da utilizzare è

PMCtrl servoCtrl (11, 3, 9600); //RX, TX, Baud

Comandi disponibili nella libreria.

A questo punto si potranno utilizzare i vari comandi disponibili nella libreria, questi sono:

servoCtrl.setServoSpeed (servoSpeed, channel, 12)
Il comando imposta la velocità servoSpeed con cui il servo si muove, channel è il servo che di cui vogliamo variare la velocità e deviceID per il Micro Maestro è il numero 12.

servoCtrl.setTarget (pos, channel, 12);
Il comando imposta la posizione pos che vogliamo far assumere al servo, channel è il servo che di cui vogliamo variare la posizione e deviceID è sempre il numero 12.

servoCtrl.goHome(12)
Il comando sposta tutti i servi collegati alla loro posizione di riposo.

servoCtrl.getPosition(canne,12)
Il comando restituisce la posizione attuale di un servo.

getErrors (channel, 12)
Il comando restituisce le informazioni riguardanti lo stato di errore del servo connesso a canne, per i codici vedere la relativa pagina.
 

Circuito di prova

Il circuito di prova è molto semplice e prevede i seguenti elementi.

• Scheda Arduino Esplora
• Scheda Micro Maestro;
• Due servomotori per esempio connessi ad un semplice dispositivo pan & Tilt
• Cavo di collegamento seriale tra scheda Arduino Esplora e Micro Maestro
• Fonte di alimentazione per i servomotori, per esempio porta batterie e 3 batterie tipo AA 1,5V

Realizzazione cavi di collegamento tra scheda Arduino Esplora e Micro Maestro

Per realizzare il cavo di collegamento tra scheda Arduino Esplora e Micro Maestro sono necessari:
- n° 2 connettori a tre pin femmina passo 2,54 mm tipo Molex 22-1-3037 (codice RS 679-5375P).
- N° 1 connettore pin strip femmina 1X4 passo 2.5 mm
- n° 4 spezzoni di cavi lunghezza a piacere
Nella figura è riportato come devono essere collegati i 4 cavi che sono Positivo e Negativo, alimentazione, TX e RX.

Dispositivo Pan & tilt

Per il test si è utilizzato un piccolo dispositivo Pan & Tilt, questo è venduto dalla SparkFun codice ROB-10335. Nel kit sono presenti i componenti meccanici cioè due staffe e tutto l'hardware necessario per il fissaggio, i servomotori devono essere presi a parte, quelli consigliati sono dei servo compatibili con il modello Hitec HS-55 codice ROB-09065.

Per le istruzioni di montaggio si può fare riferimento alla seguente pagina.

Programma di test

Il programma di test che è presente nell’allegato è molto semplice, è utilizzato il Joystick presente sulla scheda Arduino esplora per comandare un dispositivo pan & Tilt dotato di due servomotori. Il programma utilizza le seguenti librerie:

Arduino_esplora_servo.ino

Libreria PMCtrl

 

Gestione Arduino Esplora tramite:
#include <Esplora.h>: https://arduino.cc/en/Reference/EsploraLibrary

Gestione della Micro Maestro tramite libreria realizzata da gNSortino@yahoo.com

# include <PMCtrl.h> https://github.com/gNSortin

che a sua volta utilizza la libreria gestione seriale
#include <SoftwareSerial.h> https://arduino.cc/en/Reference/SoftwareSerial

Il programma è sufficientemente commentato e non dovrebbe presentare problemi di comprensione.
Per quanto riguarda il comando map, questo è utilizzato per adattare i valori letti dal Joystick ai valori e nei limiti necessari alla gestione dei servomotori, si potrà far riferimento alla guida presente sul sito Arduino (https://arduino.cc/en/reference/map)

/*####################################################################
 FILE: Arduino_esplora_servo.ino
 VERSION: 1.0
 Descrizione: Programma di esempio per la gestione di servomotori
 tramite la scheda Arduino Esplora e la scheda Micro Mestro prodotta
 dalla Pololu
 
 Scheda Arduino Esplora: https://arduino.cc/en/Main/arduinoBoardEsplora
 Micro Maesto Pololu: http://www.pololu.com/product/1350
 
 Gestione Arduino Esplora
 #include <Esplora.h>: https://arduino.cc/en/Reference/EsploraLibrary
 
 Gestione della Micro Maestro tramite libreria realizzata da gNSortino@yahoo.com
 # include <PMCtrl.h>  https://github.com/gNSortin
 #include <SoftwareSerial.h>  https://arduino.cc/en/Reference/SoftwareSerial
 
 
 Ultima modifica il 26/12/2014
 Applicazione realizzata da Adriano Gandolfo
 Sito https://www.adrirobot.it 
 Blog http://it.emcelettronica.com/author/adrirobot/
 
 This example code is in the public domain.
 #################################################################### */

//Gestione Arduino Esplora 
#include <Esplora.h>: 
//Gestione Micro Mestro
#include <PMCtrl.h>
#include <SoftwareSerial.h>
//Definizione pin gestione Micro Maestro
#define rxPin 11
#define txPin 3
//Impostazione Parametri di collegamento con Micro Mestro
PMCtrl servoCtrl (rxPin, txPin, 9600); //RX, TX, Baud

//Definizione delle varibili utilizzate
//Assegnazione canali servomotori
const int servo0 = 0;
const int servo1 = 1;
//Definizione delle posizioni minime e massime
// per i due assi
const int MAX_W = 2224;
const int MIN_W = 598;
const int MAX_H = 1808;
const int MIN_H = 495;
//Definizione delle variabili della posizione
//assunta dal Joystick
int xPos = 0; 
int yPos = 0;

void setup ()
{
  //Imposta la velocità dei due servomotori
  servoCtrl.setServoSpeed (100, servo0, 12);
  servoCtrl.setServoSpeed (100, servo1, 12);
  //Sposta i servomotori nella posizione di riposo
  servoCtrl.goHome(12);  
}

void loop ()
{
  //Assegna a XValue e YValue i valori letti dal Joystick
  int xValue = Esplora.readJoystickX();
  int yValue = Esplora.readJoystickY();
  //Utilizzo del comando map https://arduino.cc/en/reference/map
  //per adattare i valori letti nel range dei servomotori
  xPos = map( xValue, 512, -512, MIN_W,MAX_W);
  yPos = map( yValue, 512, -512, MIN_H,MAX_H);
  //Invia alla scheda MicroMestro le posizioni dei due servomotori
  servoCtrl.setTarget (xPos, servo0, 12);
  servoCtrl.setTarget (yPos, servo1, 12);
  delay (50); //Pausa tra gli aggiornamenti dei valori letti
}

Elenco revisioni

01/02/2015

Emissione preliminare
Private Policy Cookie Policy