domenica 7 giugno 2020

Decoder DCC e analogico per Servo con Arduino Nano

L'utilizzo dei motori per servo comandi si è molto diffuso anche fra i fermodellisti per comandare scambi e più in generale piccoli automatismi, la diffusione di Arduino  come controllore a basso costo ha dato maggiore impulso a questa tendenza.
Di progetti in rete per comandare servomotori ce ne sono diversi, in questo articolo ve ne presento uno che ha qualche caratteristica particolare: ogni servomotore può essere comandato da una centrale DCC e anche da un interruttore esterno direttamente connesso ad un pin di Arduino, in altre parole il decoder può essere usato anche senza una centrale DCC. Altra caratteristica è quella di regolare l' angolo di deviata del motore facendo muovere questi lentamente e scegliere la posizione ottimale, in questo modo è possibile regolare finemente la posizione che permette allo scambio di raggiungere la posizione desiderata con una buona precisione una volta montato il motore.
Il progetto iniziale è stato pensato per i motori servo e tortoise, nella versione presentata è disponibile solo la funzione servo. Lo sketch è derivato da un'idea presente su un forum inglese da un ottimo modellista d'oltremanica, Dave Renshaw, che ringrazio pubblicamente per aver condiviso il programma che ho poi rivisitato aggiungendo alcune funzioni; nel file .ino ci sono i riferimenti delle fonti.
Lo sketch utilizza la libreria DCC_Decoder.h disponibile a questo link, alla fine dell' articolo è possibile scaricare il file da caricare su Arduino. Esso contiene molti commenti ed è possibile modificarlo a piacimento.Lo schema elettrico è molto semplice, è composto dall' interfaccia DCC che rende disponibile il segnale digitale sul pin D2 di Arduino e da un semplice alimentatore per fornire la tensione ai motori e ad Arduino stesso.


Come accennato, Arduino pilota i servomotori anche in analogico:  per poter muovere i servo occorre un semplice interruttore on-off (non un deviatore), cioè basta mettere il pin relativo (PAD 1-5) a massa (PAD 6) per cambiare la posizione.
Per questo decoder ho disegnato un circuito stampato dalle dimensioni contenute: 52x58mm, alla fine dell' articolo sono disponibili i files gerber per la costruzione del PCB.
All'avvio, collegando il monitor dell' IDE di Arduino alla porta USB di Arduino (velocità 115200), vengono visualizzati i parametri di configurazione, in particolare per ogni motore:
- L' indirizzo
- Il pin cui di Arduino cui è connesso il servo
- Il pin cui collegare lo switch per il comando in analogico
- L' angolo di delle posizioni dritto/deviata
- L'ultima posizione memorizzata

Il decoder all'accensione posiziona i servo secondo l' ultima configurazione salvata, ciò è possibile perchè lo sketch memorizza ogni movimento in EEPROM. Per ripristinare i valori di default basta digitare 'r' dal monitor dell' IDE e premer ENTER. Al riavvio il decoder caricherà la configurazione di default. Tale configurazione è modificabile tramite i valori inseriti nella stringa configData[] seguendo le istruzioni all' interno dello sketch.
Un'altra caratteristica di questo decoder è lo "scollegamento" software del servo una volta che è stato comandato: in pratica, quando si invia un comando al servo, dopo che questo si è correttamente posizionato lo sketch "scollega" il servo dal in di Arduino conil comando:

devices[i].servo.detach();

ciò al fine di evitare i fastidiosi ronzii che possono verificarsi con alcuni modelli di motore. Il "detach time" è impostato a 1,2 secondi con la variabile:

int ServoDetachTime = 1200;

Programmazione indirizzo DCC
L' indirizzo del decoder è l' indirizzo del servo nr.1 (connesso al pin D3), i successivi servomotori avranno indirizzi di valore successivo a questo, ovvero se il servo nr. 1 ha indirizzo 6, gli altri saranno 7, 8, 9, e 10.
Per poter programmare l'indirizzo occorre eseguire i seguenti passi in DCC mode ovvero con il decoder connesso ad una centrale digitale:
1. Accendere il decoder
2. Collegare il segnale DCC della centrale
3. Premere il pulsante reset di Arduino, premere il pulsante S1, il led al pin 13 si accende
4. Inviare dalla Centrale DCC un comando scambi con l' indirizzo desiderato, dritto/deviata non è importante.
5. Premere il pulsante S1
6. Premere reset di Arduino

A questo punto il decoder ha memorizzato l'indirizzo del comando che è stato inviato dalla centrale quale indirizzo del servo nr.1. E' importante notare che il nuovo indirizzo non deve rientrare nel range dell'indirizzo attuale dei 5 motori gestiti dal decoder, in altre parole se i servo hanno indirizzo ad esempio da 11 a 16, il nuovo indirizzo non deve avere come valori da 11 a 16.


Regolare la posizione dei servo
E' possibile regolare l'angolo di movimento del servo in entrambi i sensi, tale funzione è molto utile per una regolazione fine della deviata. La procedura è la medesima sia in DCC che in analogico.

Per regolare la posizione dei servo si agisce in questo modo:
1. Muovere il servo che si desidera regolare inviando un comando dalla centrale (DCC) o agendo sull' interruttore (analogico)
2. Premere il pulsante S1, il servo si metterà nella posizione centrale e il led sul pin 13 lampeggia lentamente ad indicare che si è in fase di regolazione
3. Premere nuovamente il pulsante S1, il led lampeggia più velocemente e il servo inizia a spostarsi lentamente verso un lato. Quando questo avrà raggiunto la posizione desiderata premere il pulsante S1
4. Il servo si posiziona di nuovo al centro e inizierà a spostarsi lentamente nel verso opposto, il led lampeggia ancora più velocemente. Quando questo avrà raggiunto la posizione desiderata premere nuovamente il pulsante S1

La procedura è terminata e le nuove posizioni sono memorizzate nella EEPROM, per verificare il corretto funzionamento provare a dare i comandi dritto/deviata, il servo dovrà muoversi secondo le nuove impostazioni.

 In figura la foto del prototipo montato e delle board ricevute dal produttore cinese (il primo ordine - 5 piastre - è veramente economico 😉 e la qualità è veramente alta!). Accanto al pulsante per la programmazione, si vede il connettore per il comando dei servo in analogico.





Per chi fosse interessato ai files gerber per la realizzazione del PCB ne faccia richiesta tramite il modulo di contatto del blog in Home Page, riceverete un link ai files necessari.