Arduino Forum

Forum 2005-2010 (read only) => International => Français => Topic started by: benoit on May 03, 2006, 08:05 pm

Title: Une LED qui mesure l'éclairement et qui éclaire !
Post by: benoit on May 03, 2006, 08:05 pm
Bonjour à tous,

Peut être avez-vous déjà visité ces liens :
http://mrl.nyu.edu/~jhan/ledtouch/ledtouch.mpg (vidéo)
http://www.merl.com/publications/TR2003-035/
http://projects.dimension-x.net/technology-and-projects/ledsensors/

Impressionnant !

J'ai voulu en faire autant avec la carte arduino. En particulier ce qui se trouve ici http://www.merl.com/publications/TR2003-035/, c'est-à-dire la version la plus minimaliste, sans convertisseurs analogique/numérique, juste avec deux entrées/sorties numériques, une résistance et une led ordinaire.

Facile ? Oui et non.

Le problème avec la carte arduino pour réaliser l'application, c'est que les résistance "pull-up" des sorties sont actives par défaut, donc, une entrée avec "pull-up" active ne permet pas de décharger la capacité de la LED par éclairement.

Solution, mettre ceci dans la fonction setup() pour désactiver les "pull-up" : _SFR_IO8(0x30) |= 4;

Pour expérimenter, voici mon code qui envoie les valeurs d'éclairement sur la sortie série tout en allumant la LED. Oh bien sur, la LED "clignote" un peu et ne semble pas allumée de manière permanente. C'est un code "pour voir" mais qui fonctionne. Pour essayer, il vous faudra connecter une LED en série avec une résistance d'environ 560Ohms sur les sorties numériques 2 et 3 de la carte arduino. l'anode (+, patte la plus longue) sur la sortie 2, l'autre la cathode sur la sortie 3.



Le code d'expérimentation est celui-ci :
Code: [Select]

int pinA = 2; // + Anode de la LED
int pinB = 3; // - Cathode de la LED
int val = 0;  // valeur de l'éclairement

void setup()
{
 // désactivation des résistances pull-up
 _SFR_IO8(0x30) |= 4;
 
 // Les deux broches connectées à la LED en sorties
 pinMode(pinA, OUTPUT);
 pinMode(pinB, OUTPUT);

 // On allume la LED
 digitalWrite(pinA, HIGH);
 digitalWrite(pinB, LOW);
 
 beginSerial(9600);        // connect to the serial port
}

void loop()
{
// RAZ valeur d'éclairement
  val = 0;

// phase a - led allumée durant 80 ms
 digitalWrite(pinA, HIGH);
 digitalWrite(pinB, LOW);
 delay (80);

// phase b - mise a niveau
 digitalWrite(pinA, LOW);
 digitalWrite(pinB, HIGH);

// phase c - décharge & mesure
 pinMode(pinB, INPUT);
 while (digitalRead (pinB) != 0)
   val++;
 pinMode(pinB, OUTPUT); // on repasse la sortie B en sortie

// on réallume la LED le temps de la transmisssion plus bouclage, mais rien d'obligatoire
 digitalWrite(pinA, HIGH);
 digitalWrite(pinB, LOW);

// transmission valeur
 printInteger (val);
 printByte (13);
}



Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: auguste on Sep 13, 2006, 06:07 pm
Trop fort, et le resultat est correct ? C'est vraiment utilisable ?
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: benoit on Sep 13, 2006, 06:36 pm
Bonjour Auguste,

 Oui, cela fonctionne bien. Reste que ce qui est réellement mesuré c'est la décharge de la capacité de la LED et qu'en approchant la main la capa se décharge même sans éclairement. C'est donc à la fois un détecteur d'éclairement et de proximité.

Voilà
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: woo_oow on Sep 27, 2006, 04:46 pm

Salut Benoit,

Quote
Solution, mettre ceci dans la fonction setup() pour désactiver les "pull-up" : _SFR_IO8(0x30) |= 4;


tu peux expliquer les details de ce morceau de code?
ca desactive tout les pull-ups ou seulement les deux tu as utilisé?
j'ai cherché dans la documentaion du Atmeg8 mais, j'ai rien trouvé.


woo
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: benoit on Sep 27, 2006, 04:58 pm
bonjour,

Dans la datasheet de l'Atmega8 page 58 :

? Bit 2 - PUD: Pull-up Disable
When this bit is written to one, the pull-ups in the I/O ports are disabled even if the DDxn
and PORTxn Registers are configured to enable the pull-ups ({DDxn, PORTxn} = 0b01).
See "Configuring the Pin" on page 52 for more details about this feature.


Ce bit désactive toutes les pull-up.
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: woo_oow on Sep 28, 2006, 11:22 am
Salut Benoit,

merci bien!
je l'ai trouvé dans le datasheet.
mais quand-meme j'ai la grande question, comment tu arrives d'ecrire le code comme ca?
c'est du C/C++? je sais travailler avec la language arduino, mais malheuresment pas plus.
c'est très compliqué?
(pardonnes mon mauvais francais)  

woo
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: benoit on Sep 28, 2006, 11:35 am
Salut Woo,

 La grande réponse : c'est mon métier  ;)

 Après avoir trouvé la solution dans la datasheet, pour trouver la bonn syntaxe, j'ai regardé les sources de la librairie utilisée par Arduino. Tous les fichiers sont dispos en clair dans les sous-répertoires, donc pas de soucis.
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: woo_oow on Sep 28, 2006, 01:26 pm

d'accord, j'ai lu encore dans la datasheet et dans les "sourcecodes" de arduino.
et maintenant je comprends un peut plus. comment ils font les definitions pour les "pins"
c'etait un bon conseille!

woo
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: benoit on Sep 28, 2006, 02:08 pm
Re,


La corespondance des broches Arduino/uP est définie dans le fichier [ \lib\targets\arduino\pins_arduino.c ] avec un dessin en prime dans le code.

Code: [Select]
// On the Arduino board, digital pins are also used
// for the analog output (software PWM).  Analog input
// pins are a separate set.

// ATMEL ATMEGA8 / ARDUINO
//
//             +-\/-+
//       PC6  1|    |28  PC5 (AI 0)
// (D 0) PD0  2|    |27  PC4 (AI 1)
// (D 1) PD1  3|    |26  PC3 (AI 2)
// (D 2) PD2  4|    |25  PC2 (AI 3)
// (D 3) PD3  5|    |24  PC1 (AI 4)
// (D 4) PD4  6|    |23  PC0 (AI 5)
//       VCC  7|    |22  GND
//       GND  8|    |21  AREF
//       PB6  9|    |20  AVCC
//       PB7 10|    |19  PB5 (D 13)
// (D 5) PD5 11|    |18  PB4 (D 12)
// (D 6) PD6 12|    |17  PB3 (D 11) PWM
// (D 7) PD7 13|    |16  PB2 (D 10) PWM
// (D 8) PB0 14|    |15  PB1 (D 9) PWM
//             +----+

Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: xSmurf on Dec 07, 2006, 01:08 am
J'aimerais bien essayer, ça a tellement fait les manchette du DIY! Mais est-ce que ce changement du pull-up est permanant ou sera-t-il remit a zero au prochain téléversement? Si il l'est, comment le remettre a zero?

Merci!
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: benoit on Dec 07, 2006, 12:10 pm
Bonjour,

  L'état des registres n'est pas sauvegardé donc les modifs ne sont pas conservées pour les pulls-up.
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: gael-l on Feb 27, 2007, 04:34 pm
Pff, alors moi je suis nul, mais je viens d'essayer, et... rien ne se passe :(
Même pas le moindre clignotement.

Est-ce qu'une mauvaise résistance peut faire foirer tout ça ?
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: benoit on Feb 27, 2007, 05:43 pm
Bonjour,
  A priori non !
  Quelle carte Arduino avec quelle µP utilisez-vous ?
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: gael-l on Feb 27, 2007, 08:50 pm
Oups, voilà, ça commence à marcher.
Quel benêt je fais, j'étais pas sur les bonnes sorties...

Par contre, la LED clignote, mais j'avoue que je ne comprends pas les valeurs que ça renvoie :(
Ca mesure effectivement l'éclairement, ça de ce côté ça fonctionne.

Mais comment tirer une info de distance, comme sur la première vidéo ?
Est-ce que ça demande un montage plus complexe ?
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: benoit on Feb 28, 2007, 09:43 am
Bonjour,

  dans l'exemple de la première vidéo, une autre LED "L" allumée pendant la mesure, à côté de la LED qui mesure "M". La lumière émise par la LED L est réfléchie sur le doigt et atteint la LED M. remarquez que toutes les vidéos sont sombres... De plus quand le doigt s'approche, il modifie la décharge de la capacité crée dans la LED M. C'est aussi un détecteur d'aproche capacitif. On mesure l'approche en mesurant le temps de décharge pour connaitre la distance. Ce temps est directement lié à la distance, plus il est court, plus le doigt est proche. Je ne pense pas que le rapport entre temps et distance soit linéaire, mais c'est à vérifier.
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: gael-l on Feb 28, 2007, 12:31 pm
Bon, alors, résultat de mes premières expérimentations :
Dans ce qui circule dans la console Arduino, la valeur semble effectivement varier quand j'approche mon doigt.
Par contre, dans le patch PureData, impossible de la récupérer, il m'affiche une valeur presque constante, aux alentours de 50, quoi que je fasse:(

Cela dit, une remarque sur le programme que tu as posté : chez moi, la LED n'est pas allumée constamment : elle clignote.
Et bizarrement, la fréquence du clignotement augmente avec la luminosité - elle diminue quand j'approche mon doigt, et à l'inverse la diode s'allume en continu si je l'éclaire...
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: benoit on Feb 28, 2007, 06:42 pm
Bonsoir,

Dans ce qui circule dans la console Arduino, la valeur semble effectivement varier quand j'approche mon doigt.
Au pasage, si tu es sous Windows, utilise la console HyperTerminal.

Par contre, dans le patch PureData, impossible de la récupérer, il m'affiche une valeur presque constante, aux alentours de 50, quoi que je fasse
Je ne sais que te dire, jamais utilisé PureData avec l'Arduino. Qu'attends le patch PureData comme format de transmission. Quel protocole utilise t'il ?

Cela dit, une remarque sur le programme que tu as posté : chez moi, la LED n'est pas allumée constamment : elle clignote.

Oui, c'est bien là le but :). Ce n'est qu'un démonstrateur. Dans les faits, en simplifiant : quand on allume la LED, on charge sa capacité qui existe du fait de sa construction. Comme toutes les diodes, les lED sont sensibles à la lumière et il se trouve que l'éclairement décharge la capacité précédement chargée. Plus la LED est éclairée, plus sa capa se décharge vite. Le programme mesure le temps de décharge de la capa en attendant que la tension aux bornes de la LED soit celle du seuil de basculement l'entrée de l'Arduino. Une fois la LED déchargée, on la recherge un temps constant.
Dans ce cas, si l'éclairement est faible, la LED clignote très lentement car la capa se décharge lentement car elle mets lontemps à arriver au seuil de basculment.

Et bizarrement, la fréquence du clignotement augmente avec la luminosité
rien de bizarre voir explication ci-dessus.

- elle diminue quand j'approche mon doigt,
oui, jusqu'a un certain point, car tu crées une ombre. Si vraiment tu approche ton doigt, au contraire elle clignotera plus vite.

et à l'inverse la diode s'allume en continu si je l'éclaire...
Oui, et d'ailleurs elle n'est pas allumée en continu, mais elle clignote trop vite pour que nos yeux humains percoive le cligotement. C'est la persistence rétinienne qui fait que tu la allumée fixement.
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: haks on Mar 10, 2007, 04:06 pm
Hi,
I just tried to run the code on an Atmega168.
The problem is that i dont get the pull-up resistors deactivated. :'(
according to the a168 manual the code for switching off the resistors is the same as in the atmega8
does anyone know how to deactivate the resistors in the a168?

thank you.
max.
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: benoit on Mar 12, 2007, 12:47 am
Hello,

I don't have a solution ! :( I will try it since the end of the week.

Bonjour,

Je n'ai pas de solution ! :( J'essaierai d'ici la fin de semaine...
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: haks on Mar 12, 2007, 09:27 am
i already tried to use the 5V power supply and control it by a relais connected to the digital pins, so there wasnt any resistor i had to turn off - but the relais was just too slow. :-/
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: haks on Mar 16, 2007, 05:20 pm
did you try:
MCUCR=(PUD<<1)
at the moment iam not able to try it myself cause i dont have my arduino with me.

max
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: haks on Mar 22, 2007, 09:59 am
;D
It works.

 _SFR_IO8(0x35) |= 4;
 _SFR_IO8(0x35) |= (1<<4);

instead of _SFR_IO8(0x30) |= 4; according to the atmega168 documentation the MCUCR is located at 0x35.
i didnt check wich of both rules is the matching one, but at least one of both is working, cause my led is flashing in short terms an is i have a look into my serial console i receive the data of illumination.
if i take it into my hand and close is (100% dark) i get "0".
if there is minimal light i get "1". and so on. :o

max
Title: Re: Une LED qui mesure l'éclairement et qui éclair
Post by: benoit on Apr 17, 2007, 12:14 am
Sorry for my too late response,

It's normal that when take your LED in your hand you have 0. The LEd is used like a capacitive sensor wich could be discharge by light or a proximitive (is that word exist ?) of a human body part.

(pff c'est dur l'anglais :))

Désolé pour ma réponse tradive

Il est normal que ta LED se comporte dans ta main comme en pleine lumière. La LED est utilisé en capteur capacitif qui peut être déchargé par la lumière où par la proximité d'une partie de corp humain.
Title: Re: Une LED qui mesure l'éclairement et qui éclaire !
Post by: Bidouille on Mar 14, 2010, 10:51 am
Bonjour à toutes et à tous,

Je déterre ce vieux post : quelqu'un a t-il essayé ce truc sur une Duemillanove ?

En dehors des "évolutions" de langage concernant le serial monitor, pas d'anomalie lors de la compilation et en execution, ça semble rester bettement bloqué en cours de route !!!
J'ai l'impression que la Led ne se "décharge" pas mais sans certitude ...

Merci d'avance pour vos avis et idées.
Title: Re: Une LED qui mesure l'éclairement et qui éclaire !
Post by: jfs on Mar 14, 2010, 11:45 am
La led reste allumée, ou est-ce quelle ne s'allume pas du tout ?
Title: Re: Une LED qui mesure l'éclairement et qui éclaire !
Post by: Bidouille on Mar 14, 2010, 02:31 pm
Alors, elle s'allume, un certain temps ... qui dure, ... qui dure, ... qui dure puis elle s'éteint et se rallume pendant un certain temps ... qui dure, ... qui dure, ... qui dure .

J'ai mis une ligne pour envoyer sur le terminal une info en début de boucle setup et loop mais je ne vois rien? J'ai comme l'impression que ça bloque de proc.
La manip n'est peut être pas directement compatible avec un 328?


Pour la led, j'ai mis une resistance de 100 ohms comme c'est indiqué sur le playground.

Je n'ai gardé que les lignes pour simplement allumer et éteindre la led et ça fait pareil ( sensation de blocage ou de ralentissement du proc ).

Merci pour ton aide
Title: Re: Une LED qui mesure l'éclairement et qui éclaire !
Post by: jfs on Mar 14, 2010, 04:44 pm

Tu as utilisé le code de Benoit Rousseau tel quel ?

Comment as tu branché ta led ?

Entre quelles pins ?

Ensuite fait un serialPrint entre chaque ligne ou fonction, avec "ok1", "ok2","ok... etc, comme cela si ça viens de la prog tu peux déjà situer ou ça bloque ou ralenti.
Title: Re: Une LED qui mesure l'éclairement et qui éclaire !
Post by: Bidouille on Mar 14, 2010, 05:51 pm
Bon, j'ai trouvé où ça bloque : c'est au "while (digitalRead (pinB) != 0)" qui reste à 1.

Pour le branchement de la led, elle est en série avec une resistance de 100 ohms et l'anode est sur Digital 2 et la cathode sur Digital 3.

Voici le programme :

int pinA = 2; // + Anode de la LED
int pinB = 3; // - Cathode de la LED
int val = 0;  // valeur de l'éclairement

void setup()
{
 Serial.begin(9600); // connect to the serial port
 // désactivation des résistances pull-up
 //_SFR_IO8(0x30) |= 4;
 // Les deux broches connectées à la LED en sorties
 pinMode(pinA, OUTPUT);
 pinMode(pinB, OUTPUT);
 // On allume la LED
 digitalWrite(pinA, HIGH);
 digitalWrite(pinB, LOW);
}

void loop()
{
 // RAZ valeur d'éclairement
  val = 0;
 // phase a - led allumée durant 80 ms
 digitalWrite(pinA, HIGH);
 digitalWrite(pinB, LOW);
 delay (80);
 // phase b - mise a niveau
 digitalWrite(pinA, LOW);
 digitalWrite(pinB, HIGH);

 // phase c - décharge & mesure
 pinMode(pinB, INPUT);
 while (digitalRead (pinB) != 0)
 {
   Serial.print("valeur de PinB en entrée =");
   Serial.println(digitalRead (pinB),DEC);
 }
 val++;
 pinMode(pinB, OUTPUT); // on repasse la sortie B en sortie

 // on réallume la LED le temps de la transmisssion plus bouclage, mais rien d'obligatoire
 Serial.println("réallumage");
 digitalWrite(pinA, HIGH);
 digitalWrite(pinB, LOW);

 // transmission valeur
 Serial.print("Valeur lue = ");
 Serial.println(val,DEC);
}

Merci pour ton aide
Title: Re: Une LED qui mesure l'éclairement et qui éclaire !
Post by: jfs on Mar 14, 2010, 06:52 pm
Essaye de mettre la phase "b" en commentaire.
Title: Re: Une LED qui mesure l'éclairement et qui éclaire !
Post by: Bidouille on Mar 14, 2010, 07:39 pm
C'est pas mieux, ça bloque toujours au même endroit ...
Je laisse tomber pour ce soir. Je ferais un autre éssai demain avec d'autre diodes ... Je dois avoir des diodes infrarouges au boulot, ce sera peut être mieux ?

Merci pour ton aide et bonne soirée
Title: Re: Une LED qui mesure l'éclairement et qui éclaire !
Post by: jfs on Mar 14, 2010, 07:46 pm
Grace à ce sujet j'avais fait des opto-coupleurs avec deux diodes montées face à faces dans un tube, une émettait et l'autre (branchée à l'envers) captait.
Ce petit bricolage m'avait bien dépanner le temps de recevoir mes vrais opto-coupleurs.

Par contre j'avais remarqué qu'avec certaines diodes (les rouges par exemples) je n'arrivais pas à capter la lumière de l'émetteur.
Title: Re: Une LED qui mesure l'éclairement et qui éclaire !
Post by: Bidouille on Mar 15, 2010, 08:07 pm
Bonsoir,

Vous savez qui c'est le Neuneu de service ? Et ben, c'est moi !!! :-?

Je n'avais pas tout lu le post.
Dans la partie "in english", y a une modif à faire à propos de l'adresse du registre concerné par la commande SFR .... qui n'est pas la même selon la version du Atmega ...

Avec les bonnes instructions, ben, ça marche beaucoup plus mieux ...

Merci encore et A+
Title: Re: Une LED qui mesure l'éclairement et qui éclaire !
Post by: fdufnews on Aug 17, 2010, 10:02 pm
Quote
Par contre j'avais remarqué qu'avec certaines diodes (les rouges par exemples) je n'arrivais pas à capter la lumière de l'émetteur.

Pour info, j'ai lu (mais je ne retrouve pas sur quel site américain qui expliquait le principe) qu'il y a un léger décalage entre la longueur d'onde de l'émission de la LED et le pic de sensibilité en réception. Cela explique que les performances ne sont pas toujours au rendez-vous.