Arduino Forum

International => Français => Topic started by: gunsman76 on Jan 31, 2013, 05:12 pm

Title: Photorésistance plus sensible
Post by: gunsman76 on Jan 31, 2013, 05:12 pm
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
Title: Re: Photorésistance plus sensible
Post by: -Standby on Jan 31, 2013, 05:22 pm
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
Title: Re: Photorésistance plus sensible
Post by: gunsman76 on Jan 31, 2013, 05:29 pm
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);
 
}
Title: Re: Photorésistance plus sensible
Post by: al1fch on Jan 31, 2013, 05:54 pm
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.
Title: Re: Photorésistance plus sensible
Post by: gunsman76 on Jan 31, 2013, 05:55 pm
Il faudrait donc que j'utilise une photodiode ?


Title: Re: Photorésistance plus sensible
Post by: B@tto on Jan 31, 2013, 05:58 pm
Faudrait déjà virer le delay(50) qui plombe le truc !
Title: Re: Photorésistance plus sensible
Post by: gunsman76 on Jan 31, 2013, 07:01 pm
A je vais essayé sans alors !

Title: Re: Photorésistance plus sensible
Post by: gunsman76 on Jan 31, 2013, 07:28 pm
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 ?
Title: Re: Photorésistance plus sensible
Post by: gunsman76 on Jan 31, 2013, 07:48 pm
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);
Title: Re: Photorésistance plus sensible
Post by: schizophrene on Jan 31, 2013, 08:12 pm
Sinon, il y a les balises 'code', pour une meilleure lisibilité: le bouton '#' de l'éditeur de commentaire :)
Title: Re: Photorésistance plus sensible
Post by: B@tto on Feb 01, 2013, 09:44 am
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.
Title: Re: Photorésistance plus sensible
Post by: 68tjs on Feb 01, 2013, 10:54 am
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.




Title: Re: Photorésistance plus sensible
Post by: fdufnews on Feb 01, 2013, 11:13 am
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)
Title: Re: Photorésistance plus sensible
Post by: gunsman76 on Feb 01, 2013, 04:47 pm
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é.
Title: Re: Photorésistance plus sensible
Post by: gunsman76 on Feb 01, 2013, 04:49 pm

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 !
Title: Re: Photorésistance plus sensible
Post by: skywodd on Feb 01, 2013, 06:53 pm
Bonjour,


Quel commande puis-je utiliser ?


Ajoute une boucle d'attente (active) :
Code: [Select]
mesureIR = analogRead(photoIR);
if (mesureIR < seuil)
  Serial.println("Piece detecte");

do {
  mesureIR = analogRead(photoIR);
} while(mesureIR < seuil);
Title: Re: Photorésistance plus sensible
Post by: gunsman76 on Feb 01, 2013, 07:04 pm
Voilà c'est nettement mieux !!!

Le code :

Code: [Select]

#include <LiquidCrystal.h>

// initialisation librairie LCD
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; //potentiomètre 1 "col"
const int RVar1=1; //potentiomètre 2 "fond"
const int RVar2=2; // potentiomètre 3 "Travers"

const int photoIR=3; //cellule mesure de lumière ARCHE

const int Led=8;
const int Ledrouge=9;

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

int seuil=600; //Infrarouge seuil sensiblité passage pièce

float mesure;
float potard;

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

void setup() {
  // set up LCD indication nb colonne et case:
  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("Initialisation...");
  delay(2000);
  lcd.clear();
  delay (10);
 
  pinMode (Led, OUTPUT);
  pinMode (Ledrouge, OUTPUT);
 
  Serial.begin(115200);
 
}

void loop() {

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

 
  mesureBrute=analogRead(RVar2);
  mesure=map(mesureBrute,0,1023,0.0,1000.0);
 
  potard=mesure/10.0;
  lcd.setCursor(13,1);
  lcd.print(potard,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");
  //delay(100);
 
  mesureIR=analogRead(photoIR);
  if (mesureIR<seuil) {//Serial.println("Piece detecte");
  digitalWrite (Led, HIGH);
  }
  else {
    digitalWrite(Led,LOW);
  }
 
  do {
    mesureIR = analogRead(photoIR);
  } while(mesureIR < seuil);
 
 
//  if (mesureIR<seuil) {//Serial.println("Piece detecte");
// digitalWrite (Ledrouge, HIGH);
// }
// else {
//   digitalWrite(Ledrouge,LOW);
// }
// delay(Rvar2);
 
}