QTR-1RC

salve a tutti,
io vorrei utilizzare questi sensori Pololu - QTR-1RC Reflectance Sensor , ne ho 3 ma non so come fare. Ho provato a cercare il datasheet ma non lo ho trovato. Qualcuno di voi li ha già usati? Sa come si collegano e programmano?
Grazie :slight_smile:

Mmm ... carini, leggendo quanto descritto devi :

  1. definire un pin inizialmente come OUTPUT e portalo a HIGH
  2. aspettare almeno 10 µsec
  3. definire lo stesso pin come INPUT, verificare che sia HIGH e iniziare a contare il tempo
  4. arrestare il tempo quando l'input diventa LOW

questo tempo ti indica la "riflettanza" dell'oggetto che gli metti davanti. Un tempo di pochi µsec indica un oggetto con alta riflettanza, un tempo di millisec indica un oggetto a bassa riflettanza :slight_smile:

Guglielmo

Grazie mille, senza di te non l'avrei mai capito :grin:
quindi, "a codice":
nel loop faccio una cosa del genere?

pinMode(2,OUTPUT);
digitalWrite(2,HIGH);
delay(1);
pinMode(2,INPUT);
if(digitalRead(2)== HIGH)
{
long time=millis();
if(digitalRead(2)==LOW)
{
long tempopassato = millis()-time;
}
}

rileggendolo penso sia sbagliato, perchè dopo il primo if se il pin è ancora high, il programma va avanti, giusto? :roll_eyes:
dovrei usare un "while" ?

... bravo ... vedi che stando attento ti accorgi da solo di cose errate :slight_smile:

Due cose fondamentalmente ...

... non puoi usare millis() perché devi misurare tempi che sono di µsec ... quindi ... micros()

... metti il pin in INPUT, leggi i micros() e li salvi, fai il WHILE (il pin è HIGH) e quando esci dal WHILE (ovvero quando il pin diventa LOW) rileggi micros() e fai la differenza con il valore che avevi salvato e sai ... i µsec che sono passati.

Ricorda che 1000 µsec = 1 millisec

Guglielmo

pinMode(2,OUTPUT);
digitalWrite(2,HIGH);
delayMicroseconds(1);
pinMode(2,INPUT);
long time = micros();
while(digitalRead(2)== HIGH)
{}
long tempopassato = time - micros();

quindi una cosa del genere? :slight_smile:

Si, solo che il tempo di carica deve essere almeno 10 µsec ...

pinMode(2,OUTPUT);
digitalWrite(2,HIGH);
delayMicroseconds(15);
pinMode(2,INPUT);
unsigned long time = micros();
while(digitalRead(2)== HIGH) { }
unsigned long tempopassato = time - micros();

... e i il tempo è unsigned :wink:

Guglielmo

okay grazie mille adesso provo... quindi stampando in seriale il valore tempopassato dovrei vedere cambiare il numero quando cambia per esempio, il colore del terreno?

Attento, quello non è un "colorimetro", ma misura la "riflettanza" che ... potrebbe essere la stessa anche per colori diversi ... :roll_eyes:

Inoltre la distanza di misura deve essere costante ...

Guglielmo

mi esce questa serie di numeri spostando il sensore a random...

4292757652
4292546420
4292547168
4292546528
4292564956
4292566624
4292566604
4292566668
4292566708
4292585784
4292549048
4292566644
4292565256
4292566652
4292566252
4292566816
4292548524
4292546732
4292565316
4292586912
4292567556
4292585996

come potrei fare x snellirli?

Non è possibile, c'è qualche cosa che non va ... 4.292.757.652 µsec sono ... 4.292, 7 secondi ... 71 minuti ...

Ah ... c'è un errore ... non deve essere :

unsigned long tempopassato = time - micros();

ma :

unsigned long tempopassato = micros() - time;

ovvero nuovo tempo meno tempo iniziale :wink:

Guglielmo

Edit : con l'errore veniva un numero negativo, ma essendo il campo unsigned ecco che lo vedevi come un enorme numero positivo :grin: :grin: :grin:

ah che stupido :~ :sweat_smile:

allora, ho cambiato lo sketch e lo ho corretto di quell'errore e ora i dati sembrano più comprensibili.
c'è però ancora un problema: tenendo il sensore ad un altezza stabile su un foglio bianco, i dati sono stabili; muovendolo orizzontalmente i dati hanno una piccola oscillazione, ma dopo 1-2 secondi tornano stabili (a cosa è dovuto questa oscillazione dei dati?).
Se disegno una riga nera con un pennarello e la facccio passare sotto al sensore pero i dati che arrivano hanno una piccola oscillazione (come quella di prima) ma poi ritornano esattamente come prima, ovvero il sensore non riconosce la differenza tra binco e nero. Perche? :roll_eyes:

Federico99:
allora, ho cambiato lo sketch e lo ho corretto di quell'errore e ora i dati sembrano più comprensibili.
c'è però ancora un problema: tenendo il sensore ad un altezza stabile su un foglio bianco, i dati sono stabili; muovendolo orizzontalmente i dati hanno una piccola oscillazione, ma dopo 1-2 secondi tornano stabili (a cosa è dovuto questa oscillazione dei dati?).

... non avendoli mai usati posso solo fare delle supposizioni ... che si debba stabilizzare la situazione, tipo distanza dalla superficie e quant'altro.

Federico99:
Se disegno una riga nera con un pennarello e la facccio passare sotto al sensore pero i dati che arrivano hanno una piccola oscillazione (come quella di prima) ma poi ritornano esattamente come prima, ovvero il sensore non riconosce la differenza tra binco e nero. Perche?

Come ti ho già scritto :

gpb01:
Attento, quello non è un "colorimetro", ma misura la "riflettanza" che ... potrebbe essere la stessa anche per colori diversi.

... magari stai usando una superficie o ti trovi ad una distanza per cui ... non riesce a distinguere la differenza di riflettanza.

Provato ad effettuare le misure da una distanza maggiore o minore ???

Guglielmo

si okay che misurava la riflettanza l'avevo capito, ma ero convinto che colori diversi li riconoscesse. Oggi ti dico come sono andate le prove. :grin:

Hai già visto QUESTI ? ... sono abbastanza economici (... es. rispetto a QUESTI) ... :slight_smile:

Guglielmo

no no ma io volevo usare questi per fare un robot line follower... solo che sono cosi impestati!! :frowning:
Dopo l'ennesima prova, con questo sketch, tenendo il sensore fermo mi da dei valori imprecisissimi!! :fearful:

void setup()
{
  Serial.begin(9600);
}
void loop()
{
  pinMode(2,OUTPUT);
  digitalWrite(2,HIGH);
  delayMicroseconds(15);
  pinMode(2,INPUT);
  unsigned long time = micros();
  while(digitalRead(2)== HIGH) { 
  }
  unsigned long tempopassato = micros() - time;
  Serial.println(tempopassato);
  delay(500);
}
1212
1084
1404
14620
1152
1028
1252
14800
1184
1040
1312
14540
1200
1124
1484
14004
1148
1128

quasi quasi provo conla libreria dela pololu, con la quale ho brutte esperienze ma di sicuro è piu facile che così :astonished:

Mah ... i valori, per un illuminazione non costante (ovvero non generata tramite un circuito che genera una illuminazione ben determinata e stabilizzata) sono abbastanza realistici ...
... quelli che non mi spiego sono quei pochi valori molto alti (14000) che appaiono ogni tanto ... sicuro che lo avevi ben fissato e non cambiavano le condizioni ambientali ???

Guglielmo

Federico99:
quasi quasi provo conla libreria dela pololu, con la quale ho brutte esperienze ma di sicuro è piu facile che così :astonished:

Se c'è una libreria apposta ... magari hanno implementato delle correzioni/ottimizzazioni ... :roll_eyes:

Guglielmo