Go Down

Topic: [Avis] "advanced" Ir compound eye (Read 3057 times) previous topic - next topic

barbudor

PB2 (D10) c'est la commande de l'emission IR je suppose
PB1 (D9) c'est la réception ?

j'ai rebouclé D9 sur D10 et ca marche

Bon, j'ai du ré-écrire PBn en PORTBn parce qu'il ne connait pas PBn chez moi, et pause() en delay() ....
Tu compiles pour quelle carte ?


Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

zoroastre

#16
Jul 07, 2012, 04:43 pm Last Edit: Jul 07, 2012, 04:46 pm by zoroastre Reason: 1
Yep!

J'effectue mes tests sur une duemilanove.

Ce que j'ai du mal à comprendre est pourquoi lorsque j'écris :

Code: [Select]
ir1 = (PINB & 0x2);

J'obtiens la valeur binaire de l'ensemble et pas uniquement du port correspondant PB1

Normalement :

 Ob00000000
&0b00000010
= 0x0

ou

 Ob00000010
&0b00000010
= 0x2

Sauf que moi j'aimerais testé uniquement le bit 1 si il est à 1 ou 0, ce que je pensais faire en fait...

@+

Zoroastre.
Gné! ;)

barbudor

Je suis pas sur de te suivre.

PINB te retourne les 8 pins du port B

PINB & 0x02 fait le masque avec le bit correspondant à la broche PB1
Donc la valeur attendue de (PINB & 0x02) est bien soit 0 soit 2
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

zoroastre

Yep!

C'est bien ce que je constate, je pensais en faisant le masque que je me retrouverais avec les 2 états logiques de base 0 ou 1. Ce qui somme toute est tout à fait normal !!!

En fait, j'aurais voulu retrouver la simplicité d'un digitalRead et je m'aperçois que j'ai mal traduis/compris les expliquations/tuto trouvés ici ou là...

Merci.

@+

Zoroastre.
Gné! ;)

barbudor

Oui mais tu le fais bien dans ton autre ligne de code :

ir1 =  (PINB & 0x2) ? 1 : 0;

Tu peux aussi faire

ir1 = ((PINB & 0x2) != 0); // retourne un boolean.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

zoroastre

#20
Jul 07, 2012, 05:33 pm Last Edit: Jul 09, 2012, 07:47 am by zoroastre Reason: 1
Yep!

Oui ceci fonctionne impec.

Je vais éditer ce post avec mon shema et code complet car je suis en train de mesurer les tensions et en fait, j'ai l'impression de mal saturer mon transistor de signal.

...

EDIT



Code: [Select]
#include <avr/io.h>
#include <util/delay.h>

#define Wait(T) _delay_ms(T)

void pause(int y) {
 unsigned int i;
 for (i = 0; i < y; i++) { ; }
}

unsigned char ir;
byte ir1, ir2;

void setup()
{
 Serial.begin(19200);
 Wait(2000);
 
 DDRB = DDRB | B00100100;   // PB2, PB5 = output
 __asm__("nop\n\t");
 
 PORTB |= B00000010;   // PB1 = pull up enable
 __asm__("nop\n\t");
 
 PORTB |= (1 << PB5);
 Wait(1000);
 PORTB &= ~(1 << PB5);
 Wait(500);
 
}

void loop()
{
 PORTB |= (1 << PB2);
 pause(40);
 ir1 = (PINB & 0x2) ? 1 : 0;
 PORTB &= ~(1 << PB2);
 pause(48);
 ir2 = (PINB & 0x2) ? 1 : 0;

 if ((ir1 == 1) & (ir2 == 0))
 {
   Serial.println("detect an objet");
   //PORTB |= (1 << PB5);
 }
 if ((ir1 == 1) & (ir2 == 1))
 {
   Serial.println("saturated");
 }
 
 else
 {
   Serial.println("nothing detected");
   //PORTB &= ~(1 << PB5);
 }
 
 Wait(500);
 
}


@+

Zoroastre.
Gné! ;)

fdufnews

#21
Jul 08, 2012, 12:52 pm Last Edit: Jul 08, 2012, 12:58 pm by fdufnews Reason: 1
Sur ton schéma, l'ampli opérationnel est en boucle ouverte. Ce n'est pas une bonne idée ce montage est très instable. j'imagine que tu veux faire un comparateur. Pour éviter les commutations parasites sur le bruit il vaut mieux monter le comparateur avec une hystérésis. Sur le schéma joint R1/R2 permettent d'ajuster l'hystérésis.

Dans ton programme, dans loop, je ne suis pas loin de penser qu'il y a une erreur. Tu fais tes tests sur ir1 et ir2 mais dans la boucle tu ne mets jamais de valeur dans ir2.

zoroastre

Yep!

Merci, j'envisageais egalement de passer sur un montage à hysteresis. Le problème est qu'en mesurant mes tensions de sortie de AOP, j'atteins 3,57 volts, ce qui au vue des lectures que j'ai faite n'est pas normal.
En comparateur simple, je devrais basculer de 0 à 5 volts.

Il y a un truc que je ne pige pas là...  :~

@+

Zoroastre.
Gné! ;)

fdufnews

#23
Jul 08, 2012, 01:08 pm Last Edit: Jul 08, 2012, 01:11 pm by fdufnews Reason: 1
Quote
En comparateur simple, je devrais basculer de 0 à 5 volts.

L'ampli n'est pas spécifié rail to rail.

Dans la datasheet il est indiqué:
Large Output Voltage Swing: 0V DC to Vcc -1.5V DC
Voir là:
http://www.fairchildsemi.com/ds/LM/LM358A.pdf

zoroastre

Yep!

Ok, je comprends mieux. C'est aussi la raison pour laquelle j'étais partis sur un report de signal via un transistor.

je dois avoir quelques LM324 sous la main qui, me semble t'il, sont rail2rail.

Je vais essayer 2/3 configs différentes afin d'accroitre mes connaissances dans le domaine des AOP, domaines que je réchignais clairement à envisager  XD

Merci pour ces précisions fdufnews ;)

@+

Zoroastre.
Gné! ;)

fdufnews

#25
Jul 08, 2012, 01:40 pm Last Edit: Jul 08, 2012, 02:50 pm by fdufnews Reason: 1
Quote
je dois avoir quelques LM324 sous la main qui, me semble t'il, sont rail2rail.

Pas plus que le 358 mais en fait cela n'a aucune importance puisque le transistor est là. Il faudrait juste mettre une résistance relativement basse dans le collecteur et baisser la 10K pour mieux saturer le transistor. Cela garantirait des fronts plus francs. D'ailleurs au passage il y a une erreur sur ton schéma, l'émetteur du transistor est à la masse et le collecteur au +5V sans aucune résistance.

zoroastre

#26
Jul 13, 2012, 07:10 pm Last Edit: Jul 13, 2012, 07:12 pm by zoroastre Reason: 1
Yep!

Je relance un peu le sujet car j'ai de serieux doute quant à ma capacité à trouver une solution peu honéreuse et surtout viable en l'occurence.

J'ai donc testé différents matos, diode Ir, photodiode 940 nm, phototransistor Ir, etc.
Et mon montage à base d'AOP semble être extremement sensible aux variations d'intensité lumineuse. Je peux aussi bien obtenir une détection quasi parfaite à 60 cm en journée et obtenir en contre-partie, une détection horrible à moins de 5 cm, la nuit sous une lumière artificielle.

Dans l'optique, et pour rappel, je valide la détection d'un objet en envoyant tout d'abord un signal infra-rouge, je consigne le relevé, je désactive ensuite le signal envoyé, je consigne à nouveau et en déduit ainsi si il s'agit d'une véritable détection infrarouge ou d'une saturation lumineuse.

Je balance prés de 250 mA dans la diode émettrice sous un pwm à 25%. L'ajout d'une diode en série n'influe que trés légerement sur la capacité à détecter l'onde Ir.

J'ai de plus en plus l'impression que la sélection matérielle que j'ai faite n'est pas appropriée ou alors que je me fourvoie dans la possibilité d'obtenir les résultats escomptés dûs à des limitations mécaniques (angle d'attaque, concavité du transparent diode, etc)

Je suis en fait un peu à court d'idée et demande une petite aide afin d'orienter mes experimentations soit dans une meilleur optimisation, soit dans une tout autre direction.

Naturellement, des composants courants, de faible coût demeure ma priorité. Je précise également, que je suis dans l'experimentation totale, mes connaissances dans le domaine des transmissions infrarouge se faisant au fur et à mesure des montages et conclusions que j'en retirent.

My code for the moment :

Code: [Select]

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

void _init_()
{
 cli();
 
 TCCR1A = 0;
 TCCR1B = 0;
 
 DDRD |= B00000010; // PD5 = Ir input
 DDRB |= B00000011; // PB0 = red led, PB1 = IrLed
 PORTD |= B00100000; // enable pullup
 __asm__("nop\n\t");
 
 TCCR1A = (1 << WGM11) | (1 << COM1A1); // Fast PWM, non invert
 TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); // prescaler = 1
 ICR1 = 420; // ((16000000 / 38000) /1)-1 = 420

 OCR1A = 165; // 420 / 4 to get a 25% duty cycle
 
 PCICR |= (1 << PCIE2); // INT2
 PCMSK2 |= (1 << PCINT21); // PCINT21 = PD5

 sei();
}

void setup()
{
 _init_();
}

void loop()
{
 
}

ISR(PCINT2_vect)
{
 PORTB ^= (1 << 0);
}


Le montage précedant (voir post plus haut) restant valide pour la géneralité.

@+

Zoroastre.

EDIT1 : J'ai, en fouinant, trouvé une alternative interessante : http://letsmakerobots.com/node/26134
Gné! ;)

fdufnews

Quote
Et mon montage à base d'AOP semble être extremement sensible aux variations d'intensité lumineuse

Le montage avec l'ampli op possède un gain très important il n'est donc pas étonnant que le montage soit très sensible.
D'ailleurs as-tu placé un filtre infrarouge devant le photo-transistor? Cela limite les perturbations dues à la lumière ambiante.

68tjs

Plutôt que de prendre un composant rail to rail qui ne le fait jamais parfaitement et qui coûte plus cher je prendrais un composant classique alimenté en +/- 5Volts.
Pour faire le -5 Volts, comme un ampli op consomme que dalle, j'utiliserais une pompe de charge (dip8 + 2 fois 10µF).
Au moins comme cela pas de problème du coté du 0 Volt et vu les fréquences maintenant atteintes par ces bêtes là le filtrage est facile).
(C'est au conditionnel car je ne l'ai jamais réalisé ayant toujours eu à ma disposition du +/- 5V)

zoroastre

Yep!

Merci messieurs pour vos retours ;)

Je dispose effectivement de filtre infrarouge. Je me suis d'ailleurs concocté une petite boite deux compartiments à l'aide de carton noir et chaterton  XD
Mais j'ai effectué la plupart de mes essais sans !!! à mon tort peut être...

J'ai une autre constatation qui vient plus ou moins confimer d'autres suppositions : J'envoie donc une MLI de 40 Khz avec un duty cycle de 25% afin d'envoyer un max de courant dans la led émettrice, lorsque je fais varié mon cycle à 50%, la detection est carrément meilleur (çà chauffe pas mal et je n'y reste pas longtemps)
J'ai lu quelque part que pour que la sonde infrarouge réagisse correctement, elle doit recevoir au moins trois train d'onde franc.

Je vais donc revoir certain calcul afin de confirmer mes essais sur un cycle à 50%.

Tiens une question comme çà : çà se vend des filtres infrarouges et si oui, sous quelle forme ???

@+

Zoroastre.
Gné! ;)

Go Up