ASN
https://www.amiciscalan.com:443/forum/

Problemi deviatoi con Arduino e Servo shield
https://www.amiciscalan.com:443/forum/viewtopic.php?f=49&t=11548
Pagina 1 di 2

Autore:  Marco Zaggia [ 25/01/2022, 15:55 ]
Oggetto del messaggio:  Problemi deviatoi con Arduino e Servo shield

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);
}

Autore:  Gianfranco Visentin [ 25/01/2022, 18:40 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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.

Autore:  massimo di giulio [ 25/01/2022, 19:23 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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.

Autore:  Marco Zaggia [ 25/01/2022, 22:27 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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...

Autore:  Mario Malinverno [ 25/01/2022, 23:06 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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)

Autore:  Vittorio Vegetti [ 25/01/2022, 23:13 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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

Autore:  Vittorio Vegetti [ 25/01/2022, 23:17 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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.

Autore:  Mario Malinverno [ 25/01/2022, 23:20 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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à.

Autore:  Vittorio Vegetti [ 25/01/2022, 23:27 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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.

Autore:  Vittorio Vegetti [ 25/01/2022, 23:42 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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?)

Autore:  Vittorio Vegetti [ 26/01/2022, 0:03 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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.

Autore:  Marco Zaggia [ 26/01/2022, 1:28 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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.

Autore:  Vittorio Vegetti [ 26/01/2022, 11:11 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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).

Autore:  cristian cicognani [ 26/01/2022, 12:53 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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...

Autore:  massimo di giulio [ 26/01/2022, 12:54 ]
Oggetto del messaggio:  Re: Problemi deviatoi con Arduino e Servo shield

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.

Pagina 1 di 2 Tutti gli orari sono UTC + 1 ora [ ora legale ]
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/