Visualizzazione post con etichetta Rocrail. Mostra tutti i post
Visualizzazione post con etichetta Rocrail. Mostra tutti i post

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.





















venerdì 17 ottobre 2014

Arduino e SRCP server - Installazione e configurazione

Nel precedente articolo avevo promesso una guida per la configurazione di un semplice SRCP server mediante Arduino.
Diamo ormai per scontato di avere attivo e configurato sul nostro PC l'ambiente di sviluppo di Arduino (nel caso si possono avere maggiori informazioni QUI.)
Il passo successivo è ottenere una copia del codice sorgente per Arduino, quindi rechiamoci sul repository di microSRCP ospitato nei server di GitHub. Per chi non è pratico di repository e Git, a questo link è possibile avere una copia di tutto il necessario compressa in un file zip.
Estraiamo il file ottenuto in una cartella temporanea. A questo punto dobbiamo copiare il contenuto della cartella


microSRCP-0.92\microSRCP\arduino\libraries

nella cartella libraries dell'IDE di Aduino

A questo punto occore aprire nell'IDE il file 

microSRCP-0.92\microSRCP\arduino\microSRCPServer\microSRCPServer.ino


Di default il server è configurato per restar in ascolto sul canale seriale, per modificarlo in modo da utilizzare una rete Ethernet modificare la riga 34

#define SRCP_PROTOCOL SRCP_SERIAL

editarla in

#define SRCP_PROTOCOL SRCP_ETHERNET

inoltre l'autore ha inserito un ulteriore controllo per no configurare nulla se si sceglie il server ethenet in quanto ogni tipo di shield inserita potrebbe interferire co la Ethernet Shield. Eliminare quindi le righe 127 e 170 per cancellare IF condizionale. 

Il passo successivo è configurare la scheda come una scheda di tipo FB, per fare questo editare la riga 46

#define BOARD  BOARD_STANDARD

editarla in 

#define BOARD BOARD_FB

Configuriamo anche l'indirizzo IPdel server editando questa line di codice inserendo un indirizzo adatto alla nostra rete 


A questo punto occorre configurare gli ingressi di Arduino da utilizzare come ingressi di feedback. 

localizzate il seguente codice all'interno del sorgente:


Notate che vengono create due istanze di Feedback, a prima considera gli ingressi da D2 a D9 ed il primo indirizzo di feedback esposto avrà' indirizzo 1 lato Rocrail, mentre la seconda considera gli ingressi da 10 a 17 e il primo degli 8 ingressi avrà indirizzo 9. Ricordo che per ingresso 14 si intende il primo ingresso analogico avendo la Board UNO solo 13 ingressi digitali.

A questo punto possiamo compilare il sorgente e caricarlo in Arduino, quindi connettiamo la Ethernet Shield alla nostra rete.

Per configurare Rocrail occorre aggiungere nelle proprietà di Rocrail una nuova centrale di tipo SRCP con ID univoco configurata come segue, ovviamente inserite l'indirizzo IP del vostri microSRCP


Configuriamo quindi i sensori ricordandoci di assegnare come interfaccia quella del server SRCP e gli indirizzi che avete inserito nel sorgente.


A questo punto riavviate il server Rocrail, tenete d'occhio la finestra di  output e noterete una serie di informazioni relative all'handshaking e alla connessione al server SRCP, alla fine dei quali avrete il vostro sistema di feedback collegato a Rocrail!

Alla prossima!






Arduino e SRCP Server

Nell'utilizzo di Rocrail mi sono imbattuto spesso in questo acronimo che subito mi ha incuriosito per le sue possibilità. Come detto SRCP è un acronimo di Simple Railroad Command Protocol e in sostanza è un protocollo di comunicazione tra sistemi diversi atto alla gestione ed al comando di un plasico ferroviario.
SRCP è un protocollo, quindi non si occupa della trasmissione fisica del segnale, di fatto è implementabile sia su linea seriale su CAN bus, su RS485 e su Ethernet. Questo ultimo layer fisico è molto interessante in quanto già implementato da Rocrail.
SRCP è un protocollo Client/server, in questo caso Rocrail agisce da Client, il quale si interfaccia ad un server per comunicare azioni od ottenere informazioni. Per maggiori informazioni è disponibile un documento PDF con le specifiche del protocollo 

Navigando in rete mi sono imbattuto in questo progetto : microSRCP
Si tratta sostanzialmente di un server SRCP scritto per Arduino. Al momento la versione disponibile e' la 0.92.

Il server sostanzialmente può assumere diverse funzioni in base a come compiliamo il sorgente.
Attualmente la mia attenzione si e' concentrata sulla compilazione di unA board di tipo FB (feedback) da collegare via TCP/IP a Rocrail.
Naturalmente per realizzare un layer fisico di questo tipo dovremo dotarci oltre ad una board di tipo Arduino UNO R3 anche di una Ethernet Shield



Nel prossimo articolo vediamo come configurare il sistema.