Oggi è 28/03/2024, 12:50

Tutti gli orari sono UTC + 1 ora




Apri un nuovo argomento Rispondi all’argomento  [ 29 messaggi ]  Vai alla pagina 1, 2  Prossimo
Autore Messaggio
MessaggioInviato: 25/01/2022, 14:55 
Non connesso
Amministratore
Avatar utente

Iscritto il: 18/12/2010, 22:17
Messaggi: 811
Interessi fermodellistici: Scala N, epoche 4 e 5
Città di residenza: Montegrotto Terme
Provincia di residenza: Padova
Skype: marco_zaggia
Per gestire i deviatoi del raccordo industriale per il polo siderurgico Gabrielli ci siamo affidati a dei servomotori comandati da un Arduino MEGA abbinato ad una Servo Shield basata sul chip PCA9865. Abbiamo scelto questa scheda in luogo di un collegamento diretto servo-Arduino perche` consente di facilitare i cablaggi grazie ai 16 connettori a 3 pin offerti. Diversamente avremmo dovuto separare i 3 fili di ogni servo per connetterli alle varie uscite dell'Arduino. L'interfaccia con l'operatore consiste in un pannellino sinottico dotato di micro switch a levetta.
L'Arduino e` programmato secondo questa logica:
  1. All'accensione carica una tabella con i valori (da me determinati in precedenza) corrispondenti agli angoli di rotazione di ciascun servo per la posizione deviata/corretto tracciato dei rispettivi deviatoi;
  2. Ad ogni iterazione del ciclo pincipale controlla lo stato di ciascun micro switch, se questo non corrisponde alla posizione attuale il servomotore viene azionato per portare il deviatoio nella posizione indicata dallo switch;
  3. Quando un servomotore giunge a meta` della sua corsa, il relativo rele` commuta in modo da polarizzare correttamente il cuore del deviatoio.
In breve stiamo cercando di replicare il comportamento di un Esu Switchpilot comandato in analogico. I problemi che stiamo affrontando sono i seguenti:
  • All'accensione dell'impianto, tutti i servo compiono una rotazione di qualche grado in senso antiorario. Questo comportamento indesiderato non si verifica, ad esempio, con i decoder servo DR4024 Digikeijs.
  • Collegando 8 o piu` servo alla shield, questa non risponde piu` correttamente ai comandi: agendo su una levetta, invece che muovere il motore desiderato, tutti i motori si muovono avanti e indietro ripetutamente per 4 o 5 volte, col rischio di danneggiare i deviatoi.
Ho provato a sostituire la shield convinto che fosse difettosa, ma non ho riscontrato miglioramenti. Non sapendo piu` dove sbattere la testa, chiedo aiuto nella speranza che qualcuno piu` navigato di noi in materia di Arduino riesca a darci una mano. Di seguito trovate il codice dello sketch.
Codice:
#include <Adafruit_PWMServoDriver.h>

struct turnout
{
  int closed;
  int thrown;
  int switch_pin;
  int relay_pin;
  int pos;
};

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates

const int totDeviatoi = 16;
turnout deviatoi[totDeviatoi];

void setup()
{
  Serial.begin(9600);
  pwm.begin();
  pwm.setOscillatorFrequency(27000000);
  pwm.setPWMFreq(SERVO_FREQ);  // Analog servos run at ~50 Hz updates
  delay(1000);
  pwm.sleep();
  configura(0, 248, 280, 30, 31);
  configura(1, 225, 311, 32, 33);
  configura(2, 164, 252, 34, 35);
  configura(3, 206, 318, 36, 37);
  configura(4, 283, 339, 38, 39);
  configura(5, 239, 319, 46, 47);
  configura(6, 253, 326, 40, 41);
//  configura(7, 248, 294, 44, 45);
}

void loop()
{
  for(int n = 0; n < totDeviatoi; n++) {
    if(digitalRead(deviatoi[n].switch_pin) == LOW && deviatoi[n].pos < deviatoi[n].thrown){
      pwm.wakeup();
      for (deviatoi[n].pos = deviatoi[n].closed; deviatoi[n].pos <= deviatoi[n].thrown; deviatoi[n].pos += 1) {
        if(deviatoi[n].pos == round((deviatoi[n].thrown + deviatoi[n].closed)/2)){
          digitalWrite(deviatoi[n].relay_pin, LOW);
        }
        pwm.setPWM(n, 0, deviatoi[n].pos);
        Serial.println(deviatoi[n].pos);
        delay(20);
      }
      pwm.sleep();
    }
    if(digitalRead(deviatoi[n].switch_pin) == HIGH && deviatoi[n].pos > deviatoi[n].closed){
      pwm.wakeup();
      for (deviatoi[n].pos = deviatoi[n].thrown; deviatoi[n].pos >= deviatoi[n].closed; deviatoi[n].pos -= 1) {
        if(deviatoi[n].pos == round((deviatoi[n].thrown + deviatoi[n].closed)/2)){
          digitalWrite(deviatoi[n].relay_pin, HIGH);
        }
        pwm.setPWM(n, 0, deviatoi[n].pos);
        Serial.println(deviatoi[n].pos);
        delay(20);
      }
      pwm.sleep();
    }
  }
}

void configura(int addr, int chiuso, int girato, int interruttore, int rele)
{
  deviatoi[addr].closed = chiuso;
  deviatoi[addr].thrown = girato;
  deviatoi[addr].switch_pin = interruttore;
  deviatoi[addr].relay_pin = rele;
  pinMode(deviatoi[addr].switch_pin, INPUT);
  pinMode(deviatoi[addr].relay_pin, OUTPUT);
  if(!digitalRead(deviatoi[addr].switch_pin)){
    deviatoi[addr].pos = deviatoi[addr].thrown;
  } else {
    deviatoi[addr].pos = deviatoi[addr].closed;
    digitalWrite(deviatoi[addr].relay_pin, HIGH);
  }
  Serial.println(deviatoi[addr].pos);
}

_________________
The tinier the train, the more concentrated the fun.


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 25/01/2022, 17:40 
Non connesso
Utente
Avatar utente

Iscritto il: 08/11/2012, 21:51
Messaggi: 1746
Interessi fermodellistici: Esclusivamente autocostruzione in scala Z ed N, di mezzi ed impianti con metodi di stampa 3D
Città di residenza: Oegstgeest (Olanda)
Provincia di residenza: ZH
Non ho esperienza con quel particolare shield ma mi sembra che entrambi i problemi che tu riporti siano ricollegabili a bassa potenza dell'alimentazione.
- movimenti inconsulti all'accensione (tipico problema di inrush)
- incontrollabilità con molti servo (troppa corrente)

Prova con un alimentatore da banco con un bel amperaggio se i problemi vanno via.
Ciao
G.


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 25/01/2022, 18:23 
Non connesso
Amministratore
Avatar utente

Iscritto il: 29/12/2009, 18:16
Messaggi: 5403
Località: Lecce
Interessi fermodellistici: plasticista stile italiano ep. IV-V, + SBB e un po' di DB e SNCF; anche USA, soprattutto PRR, ma ancora senza plastico
Città di residenza: Lecce
Provincia di residenza: LE
Skype: dgmax1
Nemmeno io conosco questo accessorio, ma se dici che fino a 8 servo va bene e poi non più può veramente dipendere da calo di tensione per sovraccarico. Ho letto recentemente che i servo assorbono molta corrente durante il movimento, potresti misurarla e cercare di capire.
Quanto ai movimenti più o meno a caso all'accensione li ho riscontrati anche io con i servo pilotati direttamente da Arduino, probabilmente perchè prima che arrivi il primo comando "buono" passa qualche istante.

_________________
salutoNi
Massimo


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 25/01/2022, 21:27 
Non connesso
Amministratore
Avatar utente

Iscritto il: 18/12/2010, 22:17
Messaggi: 811
Interessi fermodellistici: Scala N, epoche 4 e 5
Città di residenza: Montegrotto Terme
Provincia di residenza: Padova
Skype: marco_zaggia
Grazie per le risposte! Per l'alimentazione si parte da un alimentatore AC/DC con uscita da 12 V e 5 A che alimenta tutti gli accessori elettrici del plastico, a cui segue un convertitore step-down (buck) che butta fuori 5 V e 3 A. Quest'ultimo alimenta in parallelo l'arduino, i banchi relè e la shield. Pensavo fosse sufficiente ma proverò a fare delle misure...

_________________
The tinier the train, the more concentrated the fun.


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 25/01/2022, 22:06 
Non connesso
Maestro Modellista
Avatar utente

Iscritto il: 30/12/2009, 8:58
Messaggi: 12570
Località: Arluno MI
Interessi fermodellistici: Italiano, scala N, un po' tutte le epoche
Città di residenza: Arluno
Provincia di residenza: Milano
Skype: mario.malinverno
Non so se c'entra ma anche con i servo di Pavia oltre gli 8 servo comndati contemporaneamente, all'accensione, 14V erano insufficienti aumentati a 24V tutto è tornato regolare (a parte altri problemi ma non c'entrano col caso in questione)

_________________
Saluti
Mario
..nessuno nasce imparato...


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 25/01/2022, 22:13 
Non connesso
Utente

Iscritto il: 02/02/2017, 14:28
Messaggi: 1396
Interessi fermodellistici:  
Città di residenza: Città
Provincia di residenza: Provincia
Marco Zaggia ha scritto:
[*]All'accensione dell'impianto, tutti i servo compiono una rotazione di qualche grado in senso antiorario. Questo comportamento indesiderato non si verifica, ad esempio, con i decoder servo DR4024 Digikeijs

Usi servo "cinesi"? e non per modo di dire
cercano di mantenere costantemente la posizione e quindi la ricercano inizialmente, con grande assorbimento contemporaneo, e anche successivamente
servo meglio fatti invece (hanno un controlo interno) una volta raggiunta la posizione staccano, e non richiedono più corrente fino ad un nuovo comando
ESU SwitchPilot tramite CV50=2 permette di staccare i servo una volta in posizione: chiedere a Mario per i servo cinesi di Pavia che avevano assorbimento iniziale elevato e continui ronzii ed da ieri invece (con upgrade ESU Switchpilot) funzionano bene

Dovresti forse modificare lo sketch per emulare il comportamento Switchpilot ed inibire completamente passaggio shield-servo una volta in posizione.
Dato che non hai feedback di posizione, taglierei dopo un dato tempo (che inoltre male non fa dal punto di vista sicurezza): diciamo che se il servo non è in posizione in 1" forse c'è qualche altro problema


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 25/01/2022, 22:17 
Non connesso
Utente

Iscritto il: 02/02/2017, 14:28
Messaggi: 1396
Interessi fermodellistici:  
Città di residenza: Città
Provincia di residenza: Provincia
Mario, avete dovuto aumentare tensione per fornire maggiore potenza e mi sembra anche alimentarli a gruppi.
Questo per il problema di ricerca posizione iniziale dei servo cinesi, e mi dicevate dei ronzii iniziali.
Con i servo ESU non si muove foglia e assorbimento 0 (ne ho 99 sotto alimentatore 19V 4A, ma assicuro che non c'è assorbimento iniziale), proprio perché c'è una logica di controllo interna.
Non conosco i Digikejis, ma anche loro non avranno voluto fare figure cinesi.


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 25/01/2022, 22:20 
Non connesso
Maestro Modellista
Avatar utente

Iscritto il: 30/12/2009, 8:58
Messaggi: 12570
Località: Arluno MI
Interessi fermodellistici: Italiano, scala N, un po' tutte le epoche
Città di residenza: Arluno
Provincia di residenza: Milano
Skype: mario.malinverno
Vittorio Vegetti ha scritto:
Mario, avete dovuto aumentare tensione per fornire maggiore potenza e mi sembra anche alimentarli a gruppi.
Questo per il problema di ricerca posizione iniziale dei servo cinesi, e mi dicevate dei ronzii iniziali.
Con i servo ESU non si muove foglia e assorbimento 0 (ne ho 99 sotto alimentatore 19V 4A, ma assicuro che non c'è assorbimento iniziale), proprio perché c'è una logica di controllo interna.
Non conosco i Digikejis, ma anche loro non avranno voluto fare figure cinesi.
Si forse adesso che non devono raggiungere ogni volta la posizione iniziale magari non è più necessaria tanta potenza vedremo quando potremo attaccarli tutti insieme come andrà.

_________________
Saluti
Mario
..nessuno nasce imparato...


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 25/01/2022, 22:27 
Non connesso
Utente

Iscritto il: 02/02/2017, 14:28
Messaggi: 1396
Interessi fermodellistici:  
Città di residenza: Città
Provincia di residenza: Provincia
Mario Malinverno ha scritto:
Si forse adesso che non devono raggiungere ogni volta la posizione iniziale magari non è più necessaria tanta potenza vedremo quando potremo attaccarli tutti insieme come andrà.
Sicuramente con CV50=2 non assorbono più corrente una volta raggiunta la posizione, ma per la posizione iniziale non sono sicuro, bisogna provare.
Spererei che lo Switchpilot, anche inizialmente, non invii comandi (come logico) né alimentazione (boh, ma se la fornisce magari i servo tentano di muoversi), e allora avete risolto tutto.


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 25/01/2022, 22:42 
Non connesso
Utente

Iscritto il: 02/02/2017, 14:28
Messaggi: 1396
Interessi fermodellistici:  
Città di residenza: Città
Provincia di residenza: Provincia
Prevengo un'biezione: ma allora il merito è dello Swicthpilot, non dei servo e un servo ESU vale un cinese.
No, perchè io su Switchpilot ho CV50=0 (cioè il default, come per Pavia prima dell'upgrade).
Quindi i servo ESU stanno fermi se in posizione, indipendentemente dal decoder che li comanda, mentre Switchpilot offre invece un modo per tenere fermi i servo irrequieti.

Per Massimo dG: misurare la corrente assorbita da un servo non è semplicissimo perchè il movimento dura poco, mentre un solenoide senza fine corsa lo puoi tenere alimentato anche a posizione raggiunta.
Però, quando WinDigipet setta un percorso a volte mette in movimento decine di scambi nel giro di un secondo.
Io ho un alimentatore da 4A come quello usato da Sandro Costantino, dove già 4 solenoidi andavano in crisi.
E il tempo di movimento dei solenoidi è molto minore di quello dei servo e quindi anche la sovrapoosizione di assorbimenti è minore.
Perciò, almeno i servo ESU, assorbono molto meno di un solenoide. I servo cinesi invece, ho letto anch'io, assorbono molta corrente (ma siamo sicuri di quel che dice chi?)


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 25/01/2022, 23:03 
Non connesso
Utente

Iscritto il: 02/02/2017, 14:28
Messaggi: 1396
Interessi fermodellistici:  
Città di residenza: Città
Provincia di residenza: Provincia
Marco, ho dato un'occhiata veloce, direi quasi formale, allo sketch, e per l'esperienza che mi sono fatto con il flickering lampioni,
quando si parla di ms (e vedo delay da 20) il Serial.println() conta, e tanto.
Io li ho usati per debugging, ma poi li ho commentati; non ci impieghi molto e ti togli possibili fonti di problemi.


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 26/01/2022, 0:28 
Non connesso
Amministratore
Avatar utente

Iscritto il: 18/12/2010, 22:17
Messaggi: 811
Interessi fermodellistici: Scala N, epoche 4 e 5
Città di residenza: Montegrotto Terme
Provincia di residenza: Padova
Skype: marco_zaggia
Dunque vedo di rispondere in ordine.

I servo sono tutti della Digikeijs tranne due che sono TowerPro. In ogni caso non sembrano molto diversi tra loro, hanno tutti l'involucro in plastica blu trasparente simili a quelli di Pavia. Ne deduco a questo punto che siano tutti cinesi.

I servo inizialmente avevano il problema del ronzio che, come si può vedere nel codice, è stato risolto sfruttando i metodi sleep() e wakeup() i quali rispettivamente interrompono o ripristinano l'alimentazione dei servo al termine e all'inizio delle transizioni. Tuttavia sembra che la scheda quando viene accesa si trovi per default nello stato di wakeup, da cui il primo problema (piccolo spostamento dei servo all'accensione). Ho provato a risolvere spostando la chiamata al metodo sleep() all'inizio del setup ma non è cambiato niente.

Le chiamate a Serial.println() sono lì proprio per debugging. Erano l'unico modo per vedere se la logica del programma fosse corretta, anche se i servo decidevano di disobbedire (o non erano collegati, quando scrissi lo sketch non avevo ancora tutto il materiale). In ogni caso anche commentandole non ho ottenuto miglioramenti.

_________________
The tinier the train, the more concentrated the fun.


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 26/01/2022, 10:11 
Non connesso
Utente

Iscritto il: 02/02/2017, 14:28
Messaggi: 1396
Interessi fermodellistici:  
Città di residenza: Città
Provincia di residenza: Provincia
Marco Zaggia ha scritto:
Tuttavia sembra che la scheda quando viene accesa si trovi per default nello stato di wakeup, da cui il primo problema (piccolo spostamento dei servo all'accensione). Ho provato a risolvere spostando la chiamata al metodo sleep() all'inizio del setup ma non è cambiato niente
Infatti è il mio dubbio anche per lo Switchpilot, che inizialmente invii comandi e i servo quindi ricerchino la posizione.
Lo spostamento avviene anche se alimenti prima Arduino, in modo che vada in stato sleep, e poi la servo shield?
Se così fosse, se colleghi successivamente un servo, che era già in posizione, si muove lo stesso o sta fermo (come spererei, dato che Arduino dovrebbe ritenerlo in posizione ed essere in sleep)?

Per il Serial.println non è detto che dia sempre fastidio; se i ritardi non contano è ininfluente.
Nel flickering lampioni, dove invece accendo/spengo lampioni in ms, e non uso delay ma tempo assoluto, il funzionamento cambiava qualitativamente (nel senso che saltava accensioni o spegnimenti).


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 26/01/2022, 11:53 
Non connesso
Amministratore
Avatar utente

Iscritto il: 29/12/2009, 22:31
Messaggi: 6916
Località: Forlì
Interessi fermodellistici: Scala N Italiana, epoca I,II,III,IV,V e VI, qualche modello Estero e qualche pezzo in H0.
Città di residenza: Forlì
Provincia di residenza: Forlì Cesena (FC)
Skype: cicocri
Forse il rimedio è togliere l'alimentazione quando "fermi" per ora sleep vuol dire che non manda fuori oda quadra, ma il servo ha sempre i 5V di alimentazione... quindi quando accendi questi servo anche con il pin di controllo scollegato si muovono lo stesso... nel mo decoder scambi, parcheggiato per altri progetti... voglio inserire un pin di abilitazione che pilota un mosfet che va ad abilitare l'alimentazione 5V del servo 100-200mS prima di lanciare lo spostamento e lo spegne 100-200mS dopo aver eseguito lo spostamento... ancora non ho provato... ma penso sia l'unico modo di utilizzare questi servo...

_________________
CristiaN CicogNaNi (cicocri)

Qui non vis intelligere, non intelligere........
Chi si loda, si imbroda.......

Amici del TreNo - Forlì

Le singole opinioni espresse sul forum dagli utenti sono sempre opinioni personali, che non rispecchiano necessariamente la posizione della ASN e del suo Consiglio Direttivo. I Gestori del Forum si riservano la facoltà di eliminare parole e frasi offensive nei confronti di altri iscritti o di terzi; questi interventi non sono censura ma tutela per tutti, al solo fine di un corretto utilizzo del forum e di civile convivenza.

ASN diffonde le proprie posizioni ufficiali mediante comunicazioni istituzionali debitamente evidenziate attraverso organi ufficiali (Bollettino, verbali del CD, etc.)


Non trovare difetti.. trova rimedi e provvedi se puoi.

Collezionista modelli in scala N.

1-Prima di utilizzare il forum, è obbligo presentarsi qui.
2-Prima di postare leggere il Regolamento.
3-Per visualizzare le ultime discussioni in cui sono state inserite risposte utilizza la funzione Messaggi Recenti in alto a destra.
4-Per cercare ciò che vi interessa utilizzate la funzione Cerca.
5-Prima di utilizzare il mercatino, leggi il Regolamento.
6-Clicca se vuoi leggere lo Statuto della ASN.
7-Per utilizzare al meglio il forum leggi la guida.
8-Per inserire immagini ed allegati leggi la guida del socio Massimo Benini che ringraziamo.
9-Per l'utilizzo del bbcode leggete questa guida.

Immagine


Top
 Profilo  
Rispondi citando  
MessaggioInviato: 26/01/2022, 11:54 
Non connesso
Amministratore
Avatar utente

Iscritto il: 29/12/2009, 18:16
Messaggi: 5403
Località: Lecce
Interessi fermodellistici: plasticista stile italiano ep. IV-V, + SBB e un po' di DB e SNCF; anche USA, soprattutto PRR, ma ancora senza plastico
Città di residenza: Lecce
Provincia di residenza: LE
Skype: dgmax1
Vittorio Vegetti ha scritto:
... la ricercano inizialmente, con grande assorbimento contemporaneo, e anche successivamente
Io ho servo cinesi, ma anche essi una volta raggiunta la posizione staccano completamente.
A volte (sicuramente a causa del tipo di collegamento che ho fatto tra servo e aghi dello scambio) alcuni ronzano per un qualche istante di troppo, ma poi tutto tace.

_________________
salutoNi
Massimo


Top
 Profilo  
Rispondi citando  
Visualizza ultimi messaggi:  Ordina per  
Apri un nuovo argomento Rispondi all’argomento  [ 29 messaggi ]  Vai alla pagina 1, 2  Prossimo

Tutti gli orari sono UTC + 1 ora


Chi c’è in linea

Visitano il forum: Semrush [Bot], trendiction [bot] e 3 ospiti


Non puoi aprire nuovi argomenti
Non puoi rispondere negli argomenti
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi inviare allegati

Cerca per:
Vai a:  

 

Link ai siti Amici

Powered by phpBB® Forum Software © phpBB Group
Traduzione Italiana phpBBItalia.net basata su phpBB.it 2010