Poitiers (France)
Offline
Full Member
Karma: 0
Posts: 136
Ca va j'vais le faire !
|
 |
« on: May 03, 2006, 01:05:35 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 : 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); }
|
|
|
|
« Last Edit: May 04, 2006, 04:08:56 am by Benoit »
|
Logged
|
Cordialement, Benoît ROUSSEAU
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 6
|
 |
« Reply #1 on: September 13, 2006, 11:07:57 am » |
Trop fort, et le resultat est correct ? C'est vraiment utilisable ?
|
|
|
|
|
Logged
|
|
|
|
|
Poitiers (France)
Offline
Full Member
Karma: 0
Posts: 136
Ca va j'vais le faire !
|
 |
« Reply #2 on: September 13, 2006, 11:36:45 am » |
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à
|
|
|
|
« Last Edit: September 13, 2006, 11:37:37 am by Benoit »
|
Logged
|
Cordialement, Benoît ROUSSEAU
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 37
shrz
|
 |
« Reply #3 on: September 27, 2006, 09:46:56 am » |
Salut Benoit, 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
|
|
|
|
|
Logged
|
|
|
|
|
Poitiers (France)
Offline
Full Member
Karma: 0
Posts: 136
Ca va j'vais le faire !
|
 |
« Reply #4 on: September 27, 2006, 09:58:15 am » |
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.
|
|
|
|
|
Logged
|
Cordialement, Benoît ROUSSEAU
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 37
shrz
|
 |
« Reply #5 on: September 28, 2006, 04:22:51 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
|
|
|
|
|
Logged
|
|
|
|
|
Poitiers (France)
Offline
Full Member
Karma: 0
Posts: 136
Ca va j'vais le faire !
|
 |
« Reply #6 on: September 28, 2006, 04:35:29 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.
|
|
|
|
|
Logged
|
Cordialement, Benoît ROUSSEAU
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 37
shrz
|
 |
« Reply #7 on: September 28, 2006, 06:26:36 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Poitiers (France)
Offline
Full Member
Karma: 0
Posts: 136
Ca va j'vais le faire !
|
 |
« Reply #8 on: September 28, 2006, 07:08:07 am » |
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. // 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 // +----+
|
|
|
|
« Last Edit: September 28, 2006, 07:11:24 am by Benoit »
|
Logged
|
Cordialement, Benoît ROUSSEAU
|
|
|
|
Montréal, Qc
Offline
Full Member
Karma: 0
Posts: 185
Practice safe hex!
|
 |
« Reply #9 on: December 06, 2006, 07:08:14 pm » |
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!
|
|
|
|
|
Logged
|
"Pilots believe in a clean living... they never drink wisky from a dirty glass."
|
|
|
|
Poitiers (France)
Offline
Full Member
Karma: 0
Posts: 136
Ca va j'vais le faire !
|
 |
« Reply #10 on: December 07, 2006, 06:10:19 am » |
Bonjour,
L'état des registres n'est pas sauvegardé donc les modifs ne sont pas conservées pour les pulls-up.
|
|
|
|
|
Logged
|
Cordialement, Benoît ROUSSEAU
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 8
|
 |
« Reply #11 on: February 27, 2007, 10:34:19 am » |
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 ?
|
|
|
|
|
Logged
|
|
|
|
|
Poitiers (France)
Offline
Full Member
Karma: 0
Posts: 136
Ca va j'vais le faire !
|
 |
« Reply #12 on: February 27, 2007, 11:43:00 am » |
Bonjour, A priori non ! Quelle carte Arduino avec quelle µP utilisez-vous ?
|
|
|
|
|
Logged
|
Cordialement, Benoît ROUSSEAU
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 8
|
 |
« Reply #13 on: February 27, 2007, 02:50:59 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 ?
|
|
|
|
« Last Edit: February 27, 2007, 03:12:27 pm by gael-l »
|
Logged
|
|
|
|
|
Poitiers (France)
Offline
Full Member
Karma: 0
Posts: 136
Ca va j'vais le faire !
|
 |
« Reply #14 on: February 28, 2007, 03:43:31 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.
|
|
|
|
|
Logged
|
Cordialement, Benoît ROUSSEAU
|
|
|
|
|