Go Down

Topic: Photorésistance plus sensible (Read 1 time) previous topic - next topic

gunsman76

Bonjour à tous et une fois de plus j'ai besoin de vos lumières...


J'ai réalisé un petit montage, un laser rouge qui pointe vers une photo resistance. Celle ci est relié à l'arduino avec une resistance de 10ko. Lorsque je coupe le faisceau franchement, le top est detecté par l'arduino, mais si la coupure est trop brève, malgré un réglage du programme très sensible, celle-ci ne detecte pas l'objet.


Pensez vous que la photoresistance est assez rapide pour faire la détection de la coupure du faisceau ou vaudrait il mieux que je place une photodiode dans mon montage ?


Merci

-Standby

Avoir le code sous nos yeux peut être utile, mais bon..

Peut être que l'arduino perd du temps avec la conversion ADC ? Possible, mais si tu veut de l'efficacité je te conseil d'utiliser de l'infrarouge avec un photo-transitor comme sa tu aura des valeurs booléenne et comme sa on evite de faire bosser le pauvre arduino
The Mind is like a parachute it works best when opened.

gunsman76

#2
Jan 31, 2013, 05:29 pm Last Edit: Feb 01, 2013, 06:20 pm by gunsman76 Reason: 1
Voilà le code, désolé ce n'est pas du très pro...

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
const int RS=2;
const int E=3;
const int D4=4;
const int D5=5;
const int D6=6;
const int D7=7;
Code: [Select]

const int RVar=0;
const int RVar1=1;
const int RVar2=2;

const int photoIR=3;

int mesureIR=0; //Infrarouge
int mesureBrute=0; // Potard

int seuil=1000; //Infrarouge seuil

float mesure;
float temperature;

LiquidCrystal lcd(RS,E,D4,D5,D6,D7);

void setup() {
 // set up the LCD's number of columns and rows:
 lcd.begin(16, 2);
 lcd.clear();
 delay(10);
 // Print a message to the LCD.
 lcd.print("Piochel 2013");
 delay(1000);
 lcd.clear();
 delay (10);
  lcd.print("test en cours...");
 delay(2000);
 lcd.clear();
 delay (10);
 
 Serial.begin(115200);
 
}

void loop() {

 mesureBrute=analogRead(RVar);
 mesure=map(mesureBrute,0,1023,0.0,5000.0);
 
 //lcd.clear();
 //delay(5);
 
 lcd.home();
 lcd.print("1");
 lcd.setCursor(6,0);
 lcd.print("2");
 lcd.setCursor(13,0);
 lcd.print("3");
 
 temperature=mesure/10.0;
 lcd.setCursor(1,1);
 lcd.print(temperature,0);
 delay(200);
 
 //2e potard
 
 mesureBrute=analogRead(RVar1);
 mesure=map(mesureBrute,0,1023,0.0,5000.0);
 
 temperature=mesure/10.0;
 lcd.setCursor(7,1);
 lcd.print(temperature,0);
 delay(100);
 
 //3e potard

 
 mesureBrute=analogRead(RVar2);
 mesure=map(mesureBrute,0,1023,0.0,5000.0);
 
 temperature=mesure/10.0;
 lcd.setCursor(13,1);
 lcd.print(temperature,0);
 delay(100);
 
 mesureIR=analogRead(photoIR);
 Serial.println(mesureIR);
 if (mesureIR<seuil) Serial.println("Piece detecte");
 delay(50);
 
}

al1fch

Bonsoir
Il faudrait verifier les valeurs de 'temps de réponse' dans la doc de la photo résistance utilisée et comparer avec les durées de coupure de faisceau à détecter mais en général c'est pour une photoresistance de plusieurs dizaines de millisecondes -> pas véritablement adapté pour une détection de coupure 'brève' d'un faisceau.

gunsman76

Il faudrait donc que j'utilise une photodiode ?



B@tto

Faudrait déjà virer le delay(50) qui plombe le truc !

gunsman76


gunsman76

Alors si je supprime tous les delay du programme ça fonctionne parfaitement, trop parfaitement... il me detecte plusieurs passages pour un passage en fonction de la vitesse à laquelle l'objet passe le faisceau !!!


Existe t'il une ligne de code à ajouté pour régler ce soucis ?

gunsman76

#8
Jan 31, 2013, 07:48 pm Last Edit: Feb 01, 2013, 04:48 pm by gunsman76 Reason: 1
Voilà corrigé :

Code: [Select]
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
const int RS=2;
const int E=3;
const int D4=4;
const int D5=5;
const int D6=6;
const int D7=7;

const int RVar=0;
const int RVar1=1;
const int RVar2=2;

const int photoIR=3;

int mesureIR=0; //Infrarouge
int mesureBrute=0; // Potard

int seuil=100; //Infrarouge seuil

float mesure;
float temperature;

LiquidCrystal lcd(RS,E,D4,D5,D6,D7);

void setup() {
 // set up the LCD's number of columns and rows:
 lcd.begin(16, 2);
 lcd.clear();
 delay(10);
 // Print a message to the LCD.
 lcd.print("Piochel 2013");
 delay(1000);
 lcd.clear();
 delay (10);
  lcd.print("test en cours...");
 delay(2000);
 lcd.clear();
 delay (10);
 
 Serial.begin(115200);
 
}

void loop() {

 mesureBrute=analogRead(RVar);
 mesure=map(mesureBrute,0,1023,0.0,5000.0);
 
 //lcd.clear();
 //delay(5);
 
 lcd.home();
 lcd.print("Col");
 lcd.setCursor(6,0);
 lcd.print("Fond");
 lcd.setCursor(13,0);
 lcd.print("Tra");
 
 temperature=mesure/10.0;
 lcd.setCursor(1,1);
 lcd.print(temperature,0);
 //delay(200);
 
 //2e potard
 
 mesureBrute=analogRead(RVar1);
 mesure=map(mesureBrute,0,1023,0.0,5000.0);
 
 temperature=mesure/10.0;
 lcd.setCursor(7,1);
 lcd.print(temperature,0);
 //delay(100);
 
 //3e potard

 
 mesureBrute=analogRead(RVar2);
 mesure=map(mesureBrute,0,1023,0.0,5000.0);
 
 temperature=mesure/10.0;
 lcd.setCursor(13,1);
 lcd.print(temperature,0);
 //delay(100);
 
 mesureIR=analogRead(photoIR);
 //Serial.println(mesureIR);
 if (mesureIR<seuil) Serial.println("Piece detecte");
 //delay(10);

schizophrene

Sinon, il y a les balises 'code', pour une meilleure lisibilité: le bouton '#' de l'éditeur de commentaire :)

B@tto

S'il y a plusieurs detection c'est qu'il y a un effet de rebond. Il y a plusieurs methode : la plus simple, celle que tu utilisais sans faire exprès c'est à dire ajouter un delay() le temps que "la tempête passe". Dans ton cas ça peut suffire, il faut juste trouver la bonne valeur qui donne une réponse tout en limitant l'effet de rebond. Après il y a la méthode hardware : un condensateur tout seul ou un RC.

68tjs

#11
Feb 01, 2013, 10:54 am Last Edit: Feb 01, 2013, 11:05 am by 68tjs Reason: 1
Dilemme :
  Réagir "instantanément"  ou éviter les "rebonds"

Quel que soit le moyen utilisé (la solution matérielle a bien sûr ma préférence  :smiley-mr-green:), il ne sera pas possible de satisfaire à ce dilemme à partir du moment où on ne peut pas supprimer les phénomènes transitoires.

Pour moi la bonne question est : quel est le temps de réponse minimal dont on a besoin : la milliseconde où la seconde.
Après, voir le choix du moyen.





fdufnews

ATTENTION, ce n'est pas des rebonds au sens mécanique de la chose. C'est juste que le passage devant la barrière optique est relativement lent par rapport au temps d'exécution de la boucle principale et que celle-ci est parcourue plusieurs fois avant que le faisceau soit rétabli.

Suivant le besoin de l'application, il faut:
    soit attendre que le faisceau soit rétabli avant de déclencher une nouvelle alarme
    soit mettre en place un comptage pour redéclencher une nouvelle alarme si le faisceau est interrompu trop longtemps (signalement d'une panne potentielle du capteur)

gunsman76

J'aimerais bien la première solution, attendre que le faisceau soit rétabli pour relancer la mesure.


Quel commande puis-je utiliser ?


Sinon en supprimant la fonction delay, le programme est beaucoup plus réactif !

Dès qu'un petit objet passe, c'est détecté.

gunsman76


Sinon, il y a les balises 'code', pour une meilleure lisibilité: le bouton '#' de l'éditeur de commentaire :)



C'est fait merci et c'est beaucoup plus lisible pour tout le monde !

Go Up