Pages: [1] 2   Go Down
Author Topic: Photorésistance plus sensible  (Read 1074 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Paris
Offline Offline
Full Member
***
Karma: 1
Posts: 180
Beyond the possible...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

The Mind is like a parachute it works best when opened.

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);
  
}
« Last Edit: February 01, 2013, 12:20:57 pm by gunsman76 » Logged

France
Offline Offline
God Member
*****
Karma: 4
Posts: 971
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il faudrait donc que j'utilise une photodiode ?


Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3599
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A je vais essayé sans alors !

Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Voilà corrigé :

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;

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);
« Last Edit: February 01, 2013, 10:48:44 am by gunsman76 » Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3599
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


France S-O
Offline Offline
Edison Member
*
Karma: 41
Posts: 2186
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.




« Last Edit: February 01, 2013, 05:05:03 am by 68tjs » Logged

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3443
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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é.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


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

Pages: [1] 2   Go Up
Jump to: