Rilevatore di etichette con sensore KY-033

Ciao a tutti
ho provato a realizzare un progetto per rilevare dei bollini bianchi [con superficie lucida] del diametro di mm. 30
Tali bollini sono applicati ad una distanza programmata su un tubo nero [abbastanza lucido] di polietilene che "viaggia" a 20 mt./min. circa
Il progetto è stato realizzato con

  • n° 1 ARDUINO UNO REV 3 [A000066]
  • n° 1 Elegoo 4 Channel DC 5V Modulo Relay
  • n° 1 Quimat Display LCD, IIC / I2C / TWI Modulo Display LCD 2004/20 x 4
  • n° 1 ALIMENTATORE STABILIZZATO 220Vac 12Vdc 5A
  • n° 1 Safe Alarm 120dB sirena d' interni per allarme 12Vdc
  • n° 3 MODULO TASTO PULSANTE, KEY SWITCH MODULE, SENSORE ARDUINO KY-004
  • n° 1 Intelligent Car Tracing Line Hunt Sensor KY-033

Come funziona
Il sensore KY-033 quando legge [si lavora sul fronte del segnale] "nero/tubo" fa partire un timer T1 [visualizzato runtime sul display]
Il sensore KY-033 quando legge [si lavora sul fronte del segnale] "bianco/bollino" ferma il timer e, prima di resettarlo, memorizza il valore del timer T1 e lo mette in un registro T2 [visualizzato sul display]
Sul diplay abbiamo quindi 2 valori, uno runtime corrispondente al tempo che passa ed uno statico che contiene l'ultimo valore registrato
Se la distanza fra i bollini è 1 metro ed il tubo scorre a 20 mt./min. sul display in corrispondenza del valore T2 avremo circa 3 secondi [s. 2,90 - 3,05]
Pulsante 1 START
Pulsante 2 STOP
Pulsante 3 Incrementa tempo controllo

Il sistema parte nello stato di STOP
Con il pulsante 3 si incrementa il tempo di controllo TC ad un valore maggiore del timer T2 [TC per esempio 5 secondi]
Si preme il pulsante 1 ed il sistema va in START
Se la cadenza dei bollini è regolare, il valore T2 non supera mai il valore di 3 secondi circa, ma se l'etichettatrice "perde" 1 bollino e non lo applica al tubo,
T2 diventa maggiore di TC e quindi viene attivata la sirena di allarme [attraverso Elegoo 4 Channel DC 5V Modulo Relay]
L'operatore spegne la sirena premendo il pulsante STOP, controlla il regolare funzionamento dell'etichettartice, dopodicè rimette il sistema in START

Fino a qui tutto bene, la difficoltà risiede nel fatto che il sensore KY-033 [collegato sul pin 2, in caso fosse necessario usare attachInterrupt] è molto [ma molto] difficile da regolare, legge bene il "nero" ma sfarfalla sul bianco, il trimmer è già quasi regolato al minimo [senso anti-orario], basta cambiare la distanza dal tubo anche solo di 1 mm. che comincia a sfarfallare rilevando il bianco del bollino anche quando sotto c'è semplicemente il tubo nero, forse "ingannato" dalla superficie lucida del tubo.
Il sensore KY-033 ha un led rosso che si accende quando rileva "bianco" e vedo che anche regolato al minimo il led rimane parzialmente/"leggermente" acceso quando sotto di lui scorre il tubo nero, segno che sta pensando di "leggere" qualcosa.

Volevo quindi chiedere il vostro aiuto/consiglio se esiste qualche sensore più affidabile per rilevare il cambio di colore.

Adesso sto testando Modulo TCRT5000 Sensore IR ma quello che mi hanno spedito deve essere guasto poichè non rileva il cambio di colore, anche agendo sul trimmer, questo sensore sarebbe più comodo perchè ha il trimmer dalla parte opposta alle ottiche ed è più facile da regolare durante i test.

Grazie a tutti

Segue la parte di codice preposta a rilevare i fronti del cambio-colore

void loop()
{

 // conserviamo nella variabile var lo stato del sensore
 int valSensore = digitalRead(pinSensore);

 // verifichiamo se viene letto "NERO"
 // se vero accendiamo il led
 if (valSensore == HIGH && valSensoreOld == LOW)
 {

 delay(500); // attendo x00 millisecondi
 valSensoreOld = valSensore;

 // Pulisce l'LCD e pone il cursore all'inizio
 //lcd.clear();
 lcd.setCursor(0, 0);          // 1° colonna - 1° riga
 // scrivo 'HIGH' 
 lcd.print("NERO        ");
 statoLettura = 1;
 currentMillis = previousMillis = millis();
 measuredMillis = measuringMillis;
 lcd.setCursor(11, 1); // 11° colonna - 2° riga
 lcd.print("T:"); lcd.print((measuredMillis) / 1000.0, 2);  lcd.print("  ");

 }
 // altrimenti spegniamo il led
 if (valSensore == LOW && valSensoreOld == HIGH)
 {
 valSensoreOld = valSensore;


 // Pulisce l'LCD e pone il cursore all'inizio
 //lcd.clear();
 lcd.setCursor(0, 0);          // 1° colonna - 1° riga
 // scrivo 'LOW' 
 lcd.print("BIANCO         ");
 statoLettura = 0;


 }

Buongiorno,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink: