Servo motori per deviatoi

Utilizza questo forum per richiedere informazioni o condividere le tue esperienze sulla digitalizzazione dei modelli ferroviari.
 
Luca Regoli
Assistente di Stazione
Assistente di Stazione
Messaggi: 1767
Iscritto il: martedì 7 marzo 2006, 7:26

Re: Servo motori per deviatoi

Messaggio da Luca Regoli »

Come promesso, vi pubblico lo schema di massima per fare muovere il servo regolando angolo e velocità.
Provo a fare un pò di premesse doverose:
a) lo schema ha solo fini didattici e manca di tutti gli accessori (eventuali tastiere, interruttori etc) per rendere
operativa una switchboard di controllo di una stazione. Se vi interessa poi complicheremo a piacere l'architettura.
b) la scelta di Arduino mega al posto di Arduino R3 non è legata a nessuna motivazione particolare essendo questo
un esercizio semplicissimo. La disponibilità di un numero maggiore di porte, propria dell'Arduino Mega, verrà utile nel seguito.
c) esistono modi alternativi per moltiplicare le porte e per realizzare qualunque esercizio proposto, quindi questi esempi
non vogliono assolutamente essere dogmi di fede, ma vanno presi appunto come condivisione di passi perchè ognuno
possa capire e valutare se questa architettura può essere adottata sul plastico.
Detto questo, troverete nello schema sottostante il semplice collegamento di un servo motore all'Arduino. Ogni servo è alimentato da
un tensione di + 5Vcc (fili rosso nero, per semplicità prelevati dalla board di Arduino) ed è pilotato da un filo giallo che ordina al motore
come muoversi (sto cercando di spiegare nella maniera più elementare possibile...).

Cosa serve per far muovere il nostro servo? Oltre al servo stesso, serve un Arduino (quello in figura è la versione Mega - con un gran numero
di porte utili per muovere molti servo, oltre che per collegare tastiere, barre led, far scattare relay etc etc - ma può andare bene anche un
Arduino R3), un cavo USB ed un PC-Mac-Linux su cui è caricato il software IDE per la programmazione di Arduino.
Il software è gratuito e si scarica dal sito ufficiale di arduino ( https://www.arduino.cc/ ). Caricato il SW sul PC, si collega Arduino tramite
un cavo USB. Si copia nell'editor il breve sketch che vedete nella figura e si trasferirà lo sketch su Arduino che comincerà a lavorare. Fatto questo, si può mettere
via il PC e Arduino d'ora in poi vivrà di vita propria con il suo bel programma che gli avete caricato.
In figura vi ho messo lo schema di collegamento e il breve e semplice sketch.

servo arduino.png
Luca Regoli
Assistente di Stazione
Assistente di Stazione
Messaggi: 1767
Iscritto il: martedì 7 marzo 2006, 7:26

Re: Servo motori per deviatoi

Messaggio da Luca Regoli »

Dimenticavo: problema polarizzazione del cuore.
La soluzione più semplice è quella del micro switch a fianco del motore. Si può tuttavia far gestire la polarizzazione anche da Arduino, in maniera semplice ed economica, per esempio con un relay.
L'ultima scheda relays che ho acquistato è venuta veramente poco (circa 15€ per 16 relays unipolari e già cablati), ma non sarà questa la via scelta da me per evitare inutili complicazioni
con cablaggi monster. Vorrei evitare di aumentare i fili che corrono sotto il plastico al minimo indispensabile e usando il microswitch, il cablaggio è locale e quindi si riducono i fili a spasso
lasciando solo il pilotaggio del motore e un bus per i +5vcc di alimentazione. Sembrerà una sciocchezza, ma aumentare anche di poco il numero di fili per singola entità comandata, porta
a situazioni che sfociano nell'ingovernabilità della situazione; quindi, a modo modo di vedere, meglio soluzioni semplici e con cablaggi all'osso.
max5726
Manovratore
Manovratore
Messaggi: 408
Iscritto il: lunedì 21 luglio 2008, 17:14

Re: Servo motori per deviatoi

Messaggio da max5726 »

Luca, per la mia esperienza, i servo che ho usato io (che non escludo siano gli stessi che hai usato tu...) al momento dell'accensione fanno un movimento proprio della loro elettronica, prima che il micro o la scheda che li gestisce ne riprenda il controllo: questo si traduce in una corrente significativa che passa dalla scheda al momento dell'accensione, con il rischio di mettere in crisi le piste della scheda stessa se i servo collegati sono un certo numero. Ovviamente se all'accensione i servo non si muovono il fatto non sussiste....

Io ho preferito usare dei relè x polarizzare cuore ed aghi: li polarizzo separatamente, nel senso che sul cuore commuto uno dei 2 poli a seconda della posizione degli aghi: su questi ultimi tolgo la tensione sull'ago non attivo, per evitare corti al passaggio delle ruote: avevo intenzione di usare un Arduino per gestire direttamente servo ed altro, poi ho preferito mettere dei ricevitori DCC locali, proprio per non essere costretto a stendere mazzi di fili....

saluti

Max
Luca Regoli
Assistente di Stazione
Assistente di Stazione
Messaggi: 1767
Iscritto il: martedì 7 marzo 2006, 7:26

Re: Servo motori per deviatoi

Messaggio da Luca Regoli »

Ciao Max, anche i servo che ho io fanno un micro movimento, ma l'assorbimento di corrente è risibile. Cmq intendo per comodità alimentare i servo con un apposito alimentatore senza prelevare corrente dall'Arduino: con un vecchio alimentatore di PC posso alimentare tutto l'insieme a costo zero.
Per quanto riguarda la polarizzazione del cuore, siamo arrivati alla stessa conclusione: meno fili ci sono, meglio è. Io non ho mai gradito il DCC per l'automazione degli itinerari per via del fatto che devi dedicare un PC a servizio del plastico. E siccome ho sempre i minuti contati quando riesco a dedicare un po' di tempo ai treni, non lo voglio certo perdere ad aspettare i comodi del PC: voglio accendere l'interruttore generale e giocare. Quindi viva il DCC per la condotta dei treni, ma itinerari e quant'altro rigorosamente a mano (si fa per dire), agendo sui quadri di controllo :) :) .
Altro fatto è che i soldi non sono infiniti e se posso usare soluzioni a basso-bassissimo costo è meglio (oltre alla soddisfazione di esserci riuscito!).
max5726
Manovratore
Manovratore
Messaggi: 408
Iscritto il: lunedì 21 luglio 2008, 17:14

Re: Servo motori per deviatoi

Messaggio da max5726 »

chiaro Luca..... il tuo ragionamento è più che condivisibile!
d'altra parte adesso abbiamo a disposizione dei circuiti preconfezionati che con un minimo d'impegno ti risolvono un sacco di problemi!
nel mio caso ho solo 7 scambi da controllare, il tracciato è semplice e con una logica ben determinata, ed ho scelto il DCC per poter provare il tutto con una centralina da commercio prima di fare il quadro definitivo (sul quale potrei usare addirittura un altro tipo di comunicazione.... RS485, SPI ecc: probabilmente andrò su quest'ultima, che mi permetterà con pochi fili di metterci anche il segnale di feedback), che temporalmente è nel futuro remoto... :)

Il mio grosso problema è che il 'C' mi sta sulle scatole assai, non riesco a farmelo entrare in testa, quindi x ora... Microchip + assembler!!!! Studierò comunque anche la tua soluzione, mi sembra più che valida!

saluti

Max
Luca Regoli
Assistente di Stazione
Assistente di Stazione
Messaggi: 1767
Iscritto il: martedì 7 marzo 2006, 7:26

Re: Servo motori per deviatoi

Messaggio da Luca Regoli »

Passo avanti:
colleghiamo il nostro arduino ad una tastiera. Aumentiamo sino a 5 il numero dei servo e colleghiamo una tastierina per far scattare gli itinerari.

Schermata 2016-02-11 alle 14.36.48.png

Il sorgente dello script è poco più complicato, ma non sia andrà oltre :

#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <Keypad.h>

//inizializzo i servo
Servo myservoA;
Servo myservoB;
Servo myservoC;
Servo myservoD;
Servo myservoE;
char firsttime=1;
int pos=0;

//inizializzo il display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

//inizializzo tastiera
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
char stato=0;
byte rowPins[ROWS] = {8,7,6,5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4,3,2}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup()
{
lcd.begin(20,4);
lcd.backlight();
myservoA.attach(9);
myservoB.attach(10);
myservoC.attach(11);
myservoD.attach(12);
myservoE.attach(13);

}


void loop()
{

char key = keypad.getKey();
if (key) {
firsttime=1;
stato=key; }
else key=stato;

if(key) {

if (key=='1') {
lcd.setCursor(0,3);
lcd.print("itinerario 1 ");
if(firsttime) {
firsttime=0;
for(pos=45;pos<135;pos+=1) {
myservoA.write(pos);
delay(15);
}
for(pos=135;pos>=45;pos-=1) {
myservoB.write(pos);
delay(15);
}
}
}
if (key=='2') {
lcd.setCursor(0,3);
lcd.print("itinerario 2 ");
if(firsttime) {
firsttime=0;
for(pos=45;pos<135;pos+=1) {
myservoB.write(pos);
delay(15);
}
for(pos=135;pos>=45;pos-=1) {
myservoC.write(pos);
delay(15);
}
}

}
if (key=='3') {
lcd.setCursor(0,3);
lcd.print("premuto tasto 3"); }
if (key==‘4’) {
lcd.setCursor(0,3);
lcd.print("premuto tasto 4”); }
if (key==‘5’) {
lcd.setCursor(0,3);
lcd.print("premuto tasto 5”); }
if (key==‘6’) {
lcd.setCursor(0,3);
lcd.print("premuto tasto 6”); }
if (key==‘7’) {
lcd.setCursor(0,3);
lcd.print("premuto tasto 7”); }
if (key==‘8’) {
lcd.setCursor(0,3);
lcd.print("premuto tasto 8”); }
if (key==‘9’) {
lcd.setCursor(0,3);
lcd.print("premuto tasto 9”); }
if (key==‘0’) {
lcd.setCursor(0,3);
lcd.print("premuto tasto 0”); }
if (key=='*') {
lcd.setCursor(0,3);
lcd.print("premuto tasto *"); }
if (key=='#') {
lcd.setCursor(0,3);
lcd.print("premuto tasto #"); }
} // chiude if(key)

lcd.setCursor(0,0);
lcd.print("Quadro di controllo");
lcd.setCursor(0,1);
lcd.print("Itinerari stazione");
lcd.setCursor(0,2);
lcd.print("by me”);
lcd.setCursor(0,3);
lcd.print("seleziona itinerario ");
}
Luca Regoli
Assistente di Stazione
Assistente di Stazione
Messaggi: 1767
Iscritto il: martedì 7 marzo 2006, 7:26

Servo motori per deviatoi

Messaggio da Luca Regoli »

Come vedete il sorgente è semplicissimo...
Consta di un grosso "case" dove viene riconosciuto il tasto premuto e a seconda del quale
si fa scattare un instradamento riportando la selezione sul video 20X4
Se i deviatoi non sono di più, è sufficiente un arduino uno R3; se servono più porte il mega
è la soluzione. Si potrebbero usare multiplexer per aumentare la capacità in termini di numero
di porte controllate, ma francamente non ne sento il bisogno.....

Ovviamente lo script è solo per dare l'idea della complessità ed è da considerarsi come bozza: non pretende nè di essere perfetto nè di ricomprendere tutte le casistiche possibili.

Non so neppure se sto 'pippone' interessa realmente a qualcuno. Ditelo, nel caso smetto subito :)
antogar
Manovratore
Manovratore
Messaggi: 500
Iscritto il: venerdì 22 settembre 2006, 11:41

Re: Servo motori per deviatoi

Messaggio da antogar »

Luca, se ti interessa sperimentare un annetto fa ho fatto un decoder DCC per servo con Arduino Nano (pilota 5 motori) che ha anche la possibilità di pilotare i motori con interruttori per chi non usa una centrale DCC, insomma un circuito per servo bivalente... DCC e non!
Luca Regoli
Assistente di Stazione
Assistente di Stazione
Messaggi: 1767
Iscritto il: martedì 7 marzo 2006, 7:26

Re: Servo motori per deviatoi

Messaggio da Luca Regoli »

Hai Mp
Luca Regoli
Assistente di Stazione
Assistente di Stazione
Messaggi: 1767
Iscritto il: martedì 7 marzo 2006, 7:26

Servo motori per deviatoi

Messaggio da Luca Regoli »

Interessante, molto interessante! Ho dato un sguardo al sito suggerito da Antogar http://www.rmweb.co.uk e mi è venuta in mente un idea carina:
Una volta realizzato il quadro controllo con tastiera instradamenti come ho spiegato, sfruttando il bus I2C di arduino, si può affiancare un altro arduino che funga da decoder ed inviare i comandi al primo. Devo assolutamente provare a farlo... Così si potrebbe giocare al dirigente movimento oppure decidere di fare il macchinista e lasciare al PC la formazione di itinerari. La lascio come add-on al sistema, ma la voglio assolutamente provare!!!
Rispondi

Torna a “Universo Digitale DCC”