Controllo di servomotori con PIC

I servomotori R/C (Radio Controlled), molto usati nella modellistica, hanno trovato un nuovo campo di utilizzo nella realizzazione di piccoli robot, come i robot esploratori.  In questo articolo esamineremo le caratteristiche dei servomotori e vedremo come poterli controllare tramite un microcontrollore. Per dimostrare come sia possibile controllarli tramite un micro avente potenza di calcolo e dotazioni hardware relativamente ridotte, verrà illustrata una applicazione d’esempio in cui un PIC16F876 viene utilizzato per pilotare due servi in configurazione X-Y. Con una applicazione Windows appositamente sviluppata vedremo inoltre come pilotare i due servi tramite PC utilizzando un joystick (al seguente link un approfondimento con Arduino).

I SERVOMOTORI R/C

I servomotori R/C sono costituiti  da un motore DC e da un sistema di controllo  con feedback della posizione; completano l’apparato un insieme di ingranaggi ed un albero di uscita. La qualità del servo dipende fortemente dalla costruzione di tali parti meccaniche, plastiche nei modelli più economici, metalliche in quelli più costosi. Il tutto  è racchiuso in un piccolo  involucro dalle dimensioni standardizzate. Presentano esternamente tre collegamenti: alimentazione, massa e segnale di controllo. Vanno alimentati con una tensione dc compresa tra i 4 ed i 6V: il valore nominale è di 4.8 Vdc.

I servo sono controllati esternamente tramite impulsi di larghezza variabile. La larghezza degli impulsi varia tra un valore minimo ed uno massimo dipendenti dal modello in uso, tuttavia esiste uno standard comunemente accettato secondo cui un impulso della larghezza di 1500 ms pone l’albero del servo nella sua posizione centrale  (o neutra). Gli impulsi vanno inoltre ripetuti ogni 20-30 ms. Partendo dalla posizione centrale, un impulso avente una larghezza inferiore a 1500 ms farà ruotare l’albero in senso antiorario, in maniera proporzionale  alla  variazione della  larghezza dell’impulso. Viceversa, se l’impulso  ha una larghezza  superiore a 1500 ms, l’albero ruoterà in senso orario. Generalmente i servo R/C possono ruotare di circa ±90° rispetto alla posizione centrale: in questo caso la larghezza dell’impulso varierà tra i 600 ms per la posizione a -90°, ed i 2400 ms per la posizione a +90°. Tali valori non sono però standard e vanno verificati per ciascun modello di servo. Il sistema di controllo è costituito essenzialmente da un monostabile, un comparatore, un dispositivo di feedback (un potenziometro) e dal driver del motore. Il principio di funzionamento è il seguente: l’arrivo dell’impulso di controllo fa scattare il monostabile che genererà un impulso di una certa larghezza. La larghezza di questo impulso dipende dalla posizione del cursore del potenziometro: osserviamo che il cursore ruota solidamente con l’albero del motore. Quindi il comparatore riceve in ingresso due segnali: il segnale di controllo e l’impulso prodotto dal monostabile. Se i due segnali presentano larghezze differenti, l’uscita del comparatore scatterà pilotando il driver che a sua volta alimenterà il motore facendolo ruotare finchè i due impulsi non avranno la stessa larghezza. Per esemplificare, supponiamo che il motore sia inizialmente nella sua posizione centrale: facendo riferimento alla figura 1 vediamo cosa succede se gli impulsi di controllo hanno una larghezza inferiore a 1500 ms, ad esempio di 1000 ms.

Figura 1. Segnali di controllo del servo R/C. Per semplicità, si assume che il servo sia in grado di raggiungere la nuova posizione in un solo ciclo di 20 ms.

Figura 1: segnali di controllo del servo R/C. Per semplicità, si assume che il servo sia in grado di raggiungere la nuova posizione in un solo ciclo di 20 ms.

All’arrivo dell’impulso di controllo, il monostabile genererà il suo impulso largo 1500 ms, dopo 1000 ms l’uscita del comparatore scatterà pilotando il driver in modo che su un polo del motore sia presente una tensione di -1V e sull’altro polo una tensione di +1 V. Il motore inizierà allora a ruotare in senso antiorario: si noti che tale tensione continuerà ad alimentare il motore finchè gli impulsi di controllo  e quello del monostabile non avranno la stessa larghezza. Ricordiamo che gli impulsi di controllo si ripetono ogni 20-30 ms. Nel caso contrario, se l’impulso di controllo ha una larghezza superiore ai 1500 ms, ad esempio di 2000 ms, il monostabile genererà il suo impulso largo 1500 ms, dopo 1500 ms l’uscita del comparatore scatterà pilotando il driver in modo che su un polo del motore sia presente una tensione di +1V e sull’altro polo una tensione di -1 V. Il motore inizierà a ruotare questa volta in senso orario, finchè gli impulsi di controllo e quello del monostabile non avranno la stessa larghezza. In realtà il comparatore fornirà in uscita due segnali PWM in opposizione di fase che costituiscono i segnali di errore. Quando la differenza nella larghezza dei due impulsi (e quindi il segnale di errore) risulta inferiore ai 5 ms, il driver viene disattivato per prevenire l’oscillazione del motore. Da quanto detto, risulta che i servi R/C possono ruotare nella posizione voluta (posizionamento assoluto) con una tolleranza di ±0.5°. I servomotori R/C sono dei dispositivi attivi: ciò significa che se, per effetti dovuti al carico, la rotazione dell’albero varia, automaticamente si crea il segnale di errore che fa scattare il driver. Quindi il motore verrà alimentato in modo da generare una rotazione che si oppone al disturbo. La forza massima che il servo può esercitare corrisponde alla coppia nominale: esistono  servo con  coppie  da 1.8 Kg*cm fino a 30 Kg*cm ed oltre. Un altro parametro che caratterizza i servo R/C è lo slew rate: il tempo necessario affinchè il servo cambi la propria posizione. Poiché il controllo riguarda la posizione del servo e non la velocità di rotazione, possiamo solo definire il caso peggiore, che corrisponde alla rotazione da un estremo all’altro. Generalmente una rotazione di 180° richiede tempi di 0.6 s per i servo con coppia di 3 Kg*cm. Più di recente sono stati introdotti sul mercato i servi R/C a controllo digitale: questi, pur essendo perfettamente compatibili con i servi analogici tradizionali, in quanto vengono pilotati nello stesso modo, presentano caratteristiche superiori. Infatti, permettono una precisione superiore nel mantenere la posizione (precisione a regime) ed hanno una coppia maggiore. Anche lo slew rate è migliore. Sono controllati da un microcontrollore e possono essere programmati, permettendo di variare l’escursione massima, la posizione centrale e l’ampiezza della zona centrale, la velocità di rotazione. Permettono inoltre di stabilire una posizione di sicurezza (fail-safe).  Hanno un costo all’incirca doppio rispetto ai servi analogici di coppia corrispondente. Un’altra introduzione recente è quella di servi R/C con rotazione completa a 360°: sono particolarmente utili per applicazioni robotiche in quanto possono essere utilizzati anche per la trazione del robot stesso. In effetti per ottenere ciò sono dotati di driver potenziati in modo da poter alimentare il motore con continuità (normalmente i servi con rotazione <360° devono alimentare il motore solo per brevi periodi). Questi servi permettono inoltre di variare la velocità di rotazione.

Confronto con motori DC dotati di encoder incrementale

Una possibile alternativa all’uso dei servomotori R/C è costituita dai motori DC dotati di encoder incrementale. L’encoder è costituito da un disco solidale con il motore che presenta due serie di tacche lungo la sua circonferenza, sfasate tra loro di 90° (cioè sono in quadratura). Mediante un sistema ottico, si è in grado di rilevare la velocità ed il verso di rotazione   del motore. Quindi, tale tipo di servo risulta più adatto al controllo di velocità piuttosto che di posizione. Infatti, sebbene sia possibile determinare delle variazioni di posizione, diversamente dai servo R/C non è possibile determinare la posizione assoluta dell’albero. Per pilotare un servo di tale tipo è necessario almeno un segnale PWM per ogni motore. L’alimentazione del motore va effettuata tramite un driver esterno, normalmente un H-bridge, ad esempio i noti L293 o L298 di ST Microelectronics. Per quanto riguarda la decodifica del segnale prodotto  dall’encoder,  questa può essere effettuata via firmware, oppure utilizzando un apposito modulo QEI (Quadrature Encoder Interface) nei micro che ne siano provvisti. In questo caso è possibile usare un micro della famiglia PIC18Fxx31 od un più potente dsPIC30F/33F della serie Motor Control. Infine, è necessario implementare nel firmware un controller ad anello chiuso. I controller più usati sono i PID (Proporzionale – Integrale – Derivativo) o delle sottocategorie. Ricordiamo che il controller deve essere progettato per garantire le proprietà di precisione, stabilità e robustezza di un sistema ad anello chiuso, diversamente il sistema può entrare facilmente in oscillazione: perciò è necessario conoscere esattamente le caratteristiche fisiche del motore utilizzato o procedere ad una rilevazione sperimentale delle caratteristiche del sistema di controllo.  Un sistema di controllo  di tale genere può arrivare a richiedere fino al 90% delle capacità di elaborazione di un PIC16F876 per un solo motore, mentre lo stesso micro è in grado di pilotare facilmente una decina di servo R/C.

CONTROLLO DI DUE SERVOMOTORI R/C CON PIC16

Verrà illustrata una applicazione d’esempio in cui un PIC16F876 viene utilizzato per pilotare due servi in configurazione X-Y. Con una applicazione Windows appositamente sviluppata, vedremo inoltre come pilotare i due servi tramite PC utilizzando un joystick. Il PIC sarà comandato dal PC tramite un collegamento seriale RS232. Potremmo utilizzare tale sistema ad esempio per controllare l’orientazione di una telecamera: l’asse X del joystick controllerà il brandeggio e l’asse Y l’elevazione della stessa.

L’hardware del controllo

L’hardware dell’applicazione si basa sull’uso del microcontrollore Microchip PIC16F876 (Al seguente link un approfondimento). Si tratta di un micro RISC ad 8 bit molto diffuso, equipaggiato con una memoria FLASH da 8k x 14bit e 368 Byte di RAM. Possiede inoltre 256 bytes di EEPROM, molto utile per memorizzare dati di calibrazione (ad esempio i valori delle posizioni estreme e centrale dei servi). Tra le periferiche in dotazione annovera 3 timer, 2 moduli CCP (Capture/Compare/PWM), una interfaccia USART (Universal Synchronous/Asynchronous Receiver Transmitter) ed una SPI/I2C (Serial Peripheral Interface/Inter-Integrated Circuit). Nella descrizione dello schema che seguirà faremo riferimento alla figura 2.

Figura 2. Schema elettrico del sistema di controllo dei servomotori

Figura 2: schema elettrico del sistema di controllo dei servomotori

I due servomotori SM1 ed SM2 sono collegati rispettivamente ai pin 12 (RC1) e 13 (RC2) del PIC: da questi pin verranno emessi i segnali di controllo che abbiamo descritto. Come servi potremo usare gli Hitec HS-422HD, accreditati di una coppia di 3.3 Kg*cm @ 4.8 Vdc, con una velocità di 180° di rotazione in 0.63s. Ugualmente bene andranno i Futaba S3003 o altri servi simili. Il clock del sistema viene generato tramite il quarzo da 4MHz collegato tra i pin 9 e 10 (OSC1 e OSC2). Utilizzeremo il modulo USART per collegare il micro ad una interfaccia RS232: al pin 18 avremo il segnale RX ed al pin 17 il segnale TX. L’integrato MAX232 di Maxim Integrated viene utilizzato per convertire i livelli TTL usati dal PIC nei livelli RS232. Ricordiamo infatti che lo standard RS232 (EIA/TIA-232E) prevede due segnali con ampiezza minima di -5V per il livello 1 e di +5V per il livello 0. Il MAX 232 genera le tensioni di ±10V necessarie per il driver RS232 a partire da una sola tensione di alimentazione di 5V, grazie a due generatori di tensione a pompa di carica. I condensatori elettrolitici C1-C4 sono usati da tali generatori. Tramite il connettore DB9 potremo collegare il nostro sistema all’interfaccia RS232 del PC. Qualora sul PC non fosse disponibile una RS232 (come ad esempio sui portatili di costruzione recente) potremo usare un qualsiasi convertitore USB-RS232. Per alimentare il sistema servirà un alimentatore in grado di erogare una tensione di 5Vdc stabilizzati con una corrente max di circa 1A, se utilizzeremo i servi proposti.

Il firmware

Per generare i due segnali di controllo  abbiamo diverse alternative: le principali consistono nell’uso dei moduli PWM o nell’uso diretto dei timer del PIC. Il PIC16F876 possiede due moduli PWM, denominati CCP1 e CCP2: il periodo di ripetizione degli impulsi è determinato dal Timer2, mentre il duty cycle (la parte di larghezza variabile degli impulsi), dai registri CCPR1L:CCP1CON<5:4> e CCPR2L:CCP2CON<5:4>.

Potremmo allora usare i moduli PWM per pilotare i servi in maniera analoga al controllo di un motore DC, senza dover neanche ricorrere a delle routine di interrupt (i registri del modulo PWM si ricaricano da soli alla fine del duty cycle, così come il Timer2). Purtroppo però, alla frequenza di clock  di 4MHz, il Timer2 deve scattare al massimo ogni 4ms circa (ricordiamo che gli impulsi andrebbero ripetuti ogni 20-30 ms): ciò determina un sovraccarico del servo che ne può comportare la distruzione. Potremmo abbassare la frequenza di clock, ma per ottenere una risoluzione sufficiente nel duty cycle, sarebbe necessario usare un clock inferiore al MHz, cosa che ci lascerebbe ben poco tempo per far effettuare al PIC altri task. Opteremo allora per l’uso diretto dei timer del PIC, oltretutto in tal modo saremo in grado di controllare più di 2 servi, se occorre. Nell’utilizzo dei timer siamo di fronte ancora una volta a due alternative: pilotare i servi emettendo i segnali di controllo in contemporanea o in sequenza. La prima scelta però imporrebbe di far scattare la routine di interrupt del timer che genera la parte variabile dell’impulso ogni 10-15ms, limitando anche in questo caso la possibilità di eseguire altri task. Sceglieremo allora di emettere i due segnali in sequenza. All’accensione del PIC viene eseguita la routine RESET nella quale vengono effettuate le inizializzazioni del micro: porte I/O, opzioni del Timer0 del PIC, ed altro. Viene quindi richiamata la routine UARTINIT, che provvede alla inizializzazione dell’UART. L’UART viene settato a 9600 baud, 8 bit dati e 1 bit di stop, senza parità. Quindi viene richiamata la routine RCSERVO: è la routine  principale  che  si occupa  di  impostare  i timer e gestire la ricezione dei dati ricevuti tramite la RS232. Nella descrizione del firmware seguente faremo riferimento al flow chart in figura 3.

Figura 3. Flow chart della routine principale RCSERVO

Figura 3: flow chart della routine principale RCSERVO

In questa routine vengono innanzitutto eseguite le necessarie inizializzazioni ed abilitati gli interrupt. Successivamente viene settato il Timer0 impostando un tempo di 20ms e viene attivato l’interrupt del timer. Il blocco  successivo setta Timer2 impostando un tempo corrispondente alla posizione centrale del Servo 1. Timer2 è un timer ad 8 bit (impostato tramite il registro PR2), con un prescaler ed un postscaler. Il periodo del Timer2 viene calcolato come segue:

[(PR2) + 1] * 4 * Tclock * (Timer2 prescale value)

Impostando il prescaler a 1:16, il timer incrementa a passi di 16 ms, per cui la posizione iniziale del servo, che corrisponde ad un impulso di 1500 ms, darà un valore di PR2 pari a:

PR2=1500/16-1=93.

Viene quindi attivato il servo SM1 ponendo ad 1 il pin RC1, dopodichè si attiva l’interrupt del Timer2. Il ciclo successivo effettua il polling del flag che indica la ricezione di un dato tramite l’UART: se il flag è attivo, viene attivata la ricezione dei dati di posizione relativi ai servi SM1 ed SM2 e vengono aggiornate le variabili S1PULSE ed S2PULSE. Queste variabili saranno usate dalle routine di interrupt dei timer per modificare la larghezza degli impulsi di controllo. Al valore ricevuto via RS232 viene sommato un numero fisso pari a 30, corrispondente  alla larghezza minima dell’impulso di 500 ms.  L’impulso può variare tra 500 e 2500 ms, che corrispondono  ad una rotazione tra -100° e +100°; se l’impulso è più breve del minimo supportato dal servo, questo continua ad alimentare il motore mantenendolo nella posizione estrema. Analogamente se l’impulso è più lungo del massimo supportato. Si può ovviare a ciò modificando opportunamente il codice. Vediamo ora il diagramma di flusso della routine di interrupt del Timer2, TIMER2ISR. Facciamo riferimento al flow chart in figura 4.

Figura 4. Flow chart della routine di interrupt del Timer2

Figura 4: flow chart della routine di interrupt del Timer2

Questa routine viene richiamata la prima volta allo scadere dell’impulso di controllo del servo SM1, cioè dopo 1500 ms. Se è la prima volta che la routine viene richiamata, viene disattivato il servo SM1 ponendo a 0 il pin RC1, quindi viene settato il Timer2 con il valore di  S2PULSE e viene riattivato l’interrupt. Infine viene attivato il servo SM2 ponendo ad 1 il pin RC2. Se invece è la seconda volta che la routine  viene richiamata,  viene disattivato  il  servo SM2 e viene disattivato anche il Timer2. Vediamo infine il diagramma di flusso della routine di interrupt del Timer0, TIMER0ISR. Facciamo riferimento al diagramma di flusso in figura 5.

Figura 5. Fow chart della routine di interrupt del Timer0

Figura 5: flow chart della routine di interrupt del Timer0

Questa routine viene richiamata allo scadere dei 20 ms del ciclo di ripetizione degli impulsi. Il Timer0 viene nuovamente settato  per un’altro ciclo di 20 ms, e viene riattivato l’interrupt  dello stesso. Poiché l’interrupt del Timer0 scatta dopo che il Timer2 ha effettuato due cicli (con cui vengono  controllati  i servi SM1 ed SM2), sarà ora necessario riattivare Timer2. Timer2 viene allora settato  con il valore di S1PULSE, il servo SM1 viene riattivato ponendo ad 1 il pin RC1, ed infine viene attivato nuovamente l’interrupt di Timer2. Alla successiva invocazione di Timer2 questo ricomincerà i due cicli descritti in precedenza. Nel listato 1 è riportata la routine principale del firmware, RCSERVO.

RCSERVO
;*****ABILITA GLI INTERRUPT PER LE PERIFERICHE******
BSF INTCON,PEIE
; ABILITA GLI INTERRUPT (GIE)
BSF INTCON,GIE

; INIZIALIZZAZIONE VARIABILI
CLRF BUFFER
MOVLW D’93’ ; INIZIALIZZA SERVO1 PR2=93=>1500 us
BANKSEL DUMMY_VAR
MOVWF S1PULSE
MOVWF S2PULSE ; INIZIALIZZA SERVO2 PR2=93=>1500 us

;—————————————————————————————
;1) SETTA TIMER0 A 20 ms ED ATTIVA INTERRUPT
;INTERRUPT: ALLO SCADERE RIATTIVA SERVO1 E TIMER2 CON I
;DATI DEL SERVO1
;—————————————————————————————;PERIODO DI RIPETIZIONE DEGLI IMPULSI: 20ms (USA TIMER0)
;setta i registri di timer0, abilita interrupt (T0IE)
;20 ms @ 4MHz: prescaler=/128 (n=6), timer VALUE=256-156
;TMR0=VALUE
MOVLW D’100’
MOVWF TMR0
BANKSEL OPTION_REG
MOVFW OPTION_REG
ANDLW B’11000000’ ; MANTIENE BIT 7:6
IORLW B’00000110’ ; SETTA I BIT 5:0
MOVWF OPTION_REG

; CON INTERRUPT
BANKSEL INTCON
BCF INTCON,T0IF
BSF INTCON,T0IE ; ORA L’INTERRUPT E’ ABILITATO!
;—————————————————————————————
; 2) SETTA TIMER2 a (FISSO+VAR.)*16 us (SERVO1)
; ED ATTIVA INTERRUPT
; ATTIVA SERVO 1

;————————————————————————————— ;[(PR2) + 1] * 4 * Tck * PRESCALE =
;[(FISSO+VAR.) + 1] * 4 * ; 0.25 * 16 us
; FRONTE SALITA IMPULSO MOTORE
BSF PORTC,RCPULSE ; pone RCPULSE=1
MOVLW D’93’ ; posizione iniziale 1500 us

BANKSEL PR2
MOVWF PR2
; TMR2 prescale=16, TMR2 ON
MOVLW B’00000110’
BANKSEL T2CON
MOVWF T2CON
BCF TIMER2OVER,OVER ; ORA OVER VA DISATTIVATO
; ATTIVA INTERRUPT DEL TIMER2
BANKSEL PIR1
BCF PIR1,TMR2IF ; resetta il flag
BANKSEL PIE1
BSF PIE1,TMR2IE ; ORA L’INTERRUPT E’ ABILITATO!

;—————————————————————————————
;3) ABILITA UART, POLLING RICEZIONE ED AGGIORNAMENTO
; PARTE VAR. IMPULSO
;—————————————————————————————
; ATTIVAZIONE UART PER RICEZIONE DATI DI CONTROLLO
; BUFFER->CARATTERI RICEVUTI, NUM. CARATTERI=2->NUARTCHAR
MOVLW D’2’
BANKSEL DUMMY_VAR
MOVWF NUARTCHAR
BANKSEL RCSTA
BSF RCSTA,CREN ; ABILITA LA RICEZIONE

; LOOP DI CONTROLLO RICEZIONE DATI DA UART
RCSERVOLOOP
; CONTROLLA SE L’UART HA RICEVUTO CARATTERI
BTFSS PIR1,RCIF
GOTO RCSERVOLOOP ; rifa’ il ciclo
;(I) BUFFER: VALORE RITORNATO
CALL UARTRXRC1 ; ROUTINE DI LETTURA DATI UART

; AGGIORNAMENTO S1PULSE: PARTE VARIABILE IMPULSO SERVO 1
; LETTURA BUFFER
MOVFW BUFFER
ADDLW D’30’ ; aggiunge il valore fisso => 500 us
BANKSEL DUMMY_VAR
MOVWF S1PULSE ; NUOVO VALORE della posizione
; AGGIORNAMENTO S2PULSE: PARTE VARIABILE IMPULSO SERVO 2
; LETTURA BUFFER
MOVFW BUFFER+1
ADDLW D’30’ ; aggiunge il valore fisso => 500 us
MOVWF S2PULSE ; NUOVO VALORE della posizione
MOVLW D’2’ ; N. DI CARATTERI DA RICEVERE
MOVWF NUARTCHAR
BANKSEL RCSTA
BSF RCSTA,CREN ; ABILITA LA RICEZIONE
GOTO RCSERVOLOOP ; rifa’ il ciclo
RETURN
Listato 1

L’applicazione per PC

Con l’applicazione Windows, è possibile pilotare i due servi tramite PC utilizzando un joystick. Come abbiamo visto, il PIC sarà comandato dal PC tramite un collegamento seriale RS232. Nella  finestra di dialogo dovremo selezionare una porta COM libera da utilizzare, avendo cura di scegliere una porta disponibile sul PC. Se non si è sicuri di quale porta COM è installata sul PC, lo si può verificare aprendo il Pannello di controllo e selezionando: Sistema>Hardware>Gestione periferiche: alla voce Porte (COM e LPT) saranno indicate le porte COM installate. Nella figura 6 è raffigurata l’operazione di selezione della porta. Potremo osservare che muovendo il joystick compariranno le posizioni in gradi dei due servi, come è raffigurato nella figura 7.

Figura 6. Selezione della porta COM nel programma di controllo

Figura 6: selezione della porta COM nel programma di controllo

 

Figura 7. Controllo dei servi tramite joystick

Figura 7: controllo dei servi tramite joystick

Al posto del joystick  si potrà usare una qualunque altro dispositivo di puntamento assoluto, come ad esempio un gamepad. Nel caso in cui la comunicazione si interrompa, il programma terminerà automaticamente dopo una decina di secondi.

 

 

Iscriviti e ricevi GRATIS
Speciale Pi

Fai subito il DOWNLOAD (valore 15€) GRATIS

13 Commenti

  1. Roberta Fiorucci Roberta Fiorucci 30 agosto 2017
    • Maurizio Di Paolo Emilio Maurizio Di Paolo Emilio 30 agosto 2017
  2. Riccardo Ventrella Riccardo Ventrella 30 agosto 2017
  3. Stefano Lovati Stefano Lovati 30 agosto 2017
  4. Luca Giuliodori Luca Giuliodori 30 agosto 2017
    • Emanuele Bonanni Emanuele Bonanni 30 agosto 2017
  5. Fulvio De Santis Fulvio De Santis 30 agosto 2017
  6. Riccardo Ventrella Riccardo Ventrella 30 agosto 2017
    • Luca Giuliodori Luca Giuliodori 30 agosto 2017
      • Riccardo Ventrella Riccardo Ventrella 30 agosto 2017
  7. Gaspare Santaera Gaspare Santaera 31 agosto 2017
  8. Adriano Gandolfo 31 agosto 2017

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Iscriviti e ricevi GRATIS
Speciale Pi

Fai subito il DOWNLOAD (valore 15€) GRATIS