Help cicli IF e WHILE

Ciao amici, come già detto nella sezione “presentazioni”, mi trovo a realizzare un complessivo da implementare in una confezionatrice.
Vi illustro il lavoro che devo svolgere:
In un tappeto mobile un sistema esistente posizione tre contenitori affiancati che devono essere riempiti con una sostanza.
Talvolta capita che i tre contenitori non siano perfettamente allineati e da qui è nato il mio progetto:
nel movimento, discretamente lento circa 1-1,5 mt/min, una barra metallica viene abbassata da un sensore che rileva la presenza dei contenitori bloccandone lo scorrimento fino a quando i tre non sono perfettamente allineati rilevando ciò mediante un traguardo ottico dietro la fila, di seguito un disegno schematico.

Il problema si presenta quando giungono le piastre successive, la cui distanza dalle precedenti è minore al loro diametro e non può essere aumentata, poichè, mentre con le prime, quando il traguardo “presenza” le rileva l’allineatore può scendere liberamente, quando giunge la seconda, non riuscendo a ritardare la discesa, l’allineatore collide con le precedenti.
Il controllo lo realizzo con dei cicli IF che attivano il meccanismo di discesa quando il traguardo più a dx rileva la prima piastra, per disattivarlo quando il traguardo più a sx, posto alla distanza dal dx esattamente pari al diametro, rileva che esse sono allineate e disattiva il meccanismo.
Banalmente ho usato questo codice:

if ((dx == HIGH) & (sx == HIGH)){
digitalWrite (allineamento, HIGH)
}

if ((dx == HIGH) & (sx == LOW)){
digitalWrite (allineamento, LOW)
}

Però, quando giungono le successive, accade che le prime impegnano ancora il traguardo dx e le seconde quello sinistro, la prima condizione è quindi rispettata e l’allineatore scende sbattendo sulle prime.
Non sono riuscito ad inserire un delay, poichè (forse) basterebbe far scendere la barra anche solo qualche secondo dopo l’impegno del traguardo sx.
Inserendo infatti il comando delay mi scombussola tutto il sistema.
Oppure basterebbe disabilitare la lettura del traguardo dx da quando solleva l’allineatore sempre per qualche secondo.

Spero di essere riuscito ad esporre il mio problema, ogni proposta ed ogni parolaccia sono ben accette :smiley: :smiley: :smiley:

Ho dimenticato, hardware Arduino UNO

LUCA_SIMUL_2.pdf (144 KB)

Non è possibile distanziare maggiormente le file dei barattoli?
Mi sembra normale che se trattieni i barattoli con la pinza mentre il nastro scorre i successivi si avvicinato.

No, purtroppo non è possibile, mi farebbe piacere capire come usare delay, o meglio millis.
Probabilmente così si riesce.
Potrebbe essere utile gestire i fronti di discesa dei sensori.
Grazie amici!!!

luchiluchi:
mi farebbe piacere capire come usare delay, o meglio millis.

Un articolo che può aiutarti

Sembra che hai uno stato che non hai preso in considerazione.
Qual'è la distanza minima fra una fila di contenitori e quella successiva?

Perché, dal disegno allegato, si intende che appena la prima fila viene liberata, il laser sx viene impegnato dalla seconda fila, ma per un breve tempo ti trovi nella condizione che sx == high, e dx == low. Questo stato è quello che ti fa capire che devi abbassare l'allineatore, finché non ti trovi in sx == low e dx == high.

Potresti provare a farlo con

while(sx == low && dx == high){
    digitalWrite (allineamento, XXX);     //Abbassa la barra
}
digitalWrite (allineamento, XXX);         //Alza la barra