E' partito tutto come una piccola sfida: riuscire a gestire tutti o quasi gli oggetti che sono sottoplancia ad un plastico con un unico dispositivo elettronico. La motivazione della mia ricerca era dovuta al fatto che ho autocostruito un PL e volevo per esso un movimento quanto più possibile realistico: alzamento e abbassamento della sbarra in 8-9 secondi.
Poichè in commercio non esiste alcun motore in grado di offrire tale prestazione a meno che non sia controllato elettronicamente, la prima risposta è stata quella di collegare un servo motore ad un microcontrollore: il PIC. Tuttavia, l'utilizzo di un PIC richiedeva lo studio di un circuito ad hoc con determinati componenti, la stampa del PCB, la foratura del PCB, la saldatura del componenti...e, sperando che tutto funzioni, poi bisognava programmare il PIC in visual basic, che ormai è un linguaggio morto da anni...oltre al fatto che il PIC necessita di un programmatore apposito. Morale della favola, ho lasciato perdere.
Ho allora analizzato lui:
Arduino, che finora ne avevo solo sentito parlare.
Per chi non lo conosce Arduino è un oggetto hardware già realizzato e commercializzato (è open source, open hardware) che è dotato di un microcontrollore abbstanza potente. Si parte da una versione economica (15€) a 14 ingressi/uscite (di cui 7 PWM) ad una versione piu avanzata (39€) a 54 ingressi/uscite (di cui 14 PWM). Questo vuol dire che nel secondo caso si riesce a controllare
contemporaneamente fino a 54 dispositivi tra servomotori (per scambi, PL,...), led (semafori, lampioni,...) senza pulsanteria oppure fino a 27 dispositivi considerando un pulsante ciascuno. Ovviamente è possibile fare anche tante altre cose, di cui però non posso parlare perché non ho tanto una visione d'insieme per ciò che riguarda un plastico. L'unica difficoltà è che arduino va programmato (collegandolo con un cavo USB ad un PC) utilizzando il suo IDE (gratuito, essendo open source). Ma va fatto una volta e basta...e in rete ci sono tantissimi esempi per pilotare un servo. Uno su tutti, il blog di Mauro:
http://www.mauroalfieri.it/elettronica/tutoria-arduno-servo.html, che mi ha aiutato a capire come programmarlo.
Qui potete vedere un video del mio primo test:
http://www.youtube.com/watch?v=nLWFUFez ... r_embeddedI collegamenti sono banali:
alimentatore da 9V <-> arduino <-> servo motori (alimentati a parte)
Ho fatto fare al servo una rotazione di 90° in 0,9 secondi; ma sono riuscito a fargli fare anche una rotazione di 90° in 9 secondi. Più realistico di così...
Se questi vantaggi non bastano, veniamo a quello lampante: il confronto con il
DCC. (Ok, ora picchiatemi pure!!!

)
Per gestire in DCC gli oggetti sottoplancia occorrono dei decoder DCC tipo gli switchpilot. Ognuno di questo sapete che gestisce fino a 4 dispositivi contemporaneamente. fatevi un rapido calcolo di quanti decoder occorrono per gestire 27 dispositivi...ne occorrono 7. Ognuno costa almeno 25€ (gli switchpilot costano fino a 35€)...per cui la cifra da spendere va 175€ a 245€...
Penso che non ci sia altro da aggiungere...per il momento. Attendo vostre considerazioni...
Ciao!
Gianfranco
EDIT: Arduino con passaggio a livello
http://www.youtube.com/watch?v=F1vZrBFK70QSchema dell'utilizzo di Arduino con servo motori:
questo è il codice da inserire in Arduino (copia e incolla nel suo ambiente di sviluppo) per il movimento di un singolo servo motore, che a sua volta può muovere uno scambio o un passaggio a livello. Il codice è testato e funzionante.Il suo ambiente di sviluppo (IDE) è l'ambiente di sviluppo di Arduino e si scarica gratuitamente qui:
http://arduino.cc/en/Main/SoftwareCodice:
#include <Servo.h>
#define servoPin 5
#define swClose 2
#define swOpen 3
#define posMin 0
#define posMax 20
boolean statoPL=false;
int currentGrad=posMax;
Servo myservo;
void setup()
{
pinMode( swClose,INPUT );
pinMode( swOpen,INPUT );
myservo.attach(servoPin);
myservo.write(currentGrad);
}
void loop()
{
if ( digitalRead(swClose) == HIGH ) { statoPL = true; }
if ( digitalRead(swOpen) == HIGH ) { statoPL = false; }
if ( statoPL == true && currentGrad > posMin) {
while (currentGrad > posMin) {
currentGrad--;
myservo.write(currentGrad);
delay(200);
}
}
if ( statoPL == false && currentGrad < posMax) {
while (currentGrad < posMax) {
currentGrad++;
myservo.write(currentGrad);
delay(200);
}
}
}