Pages: 1 [2] 3   Go Down
Author Topic: [Avis] "advanced" Ir compound eye  (Read 2853 times)
0 Members and 1 Guest are viewing this topic.
Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?


Logged

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 ?

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

J'effectue mes tests sur une duemilanove.

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

Code:
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.
« Last Edit: July 07, 2012, 09:46:21 am by zoroastre » Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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 ?

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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 ?

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.
« Last Edit: July 09, 2012, 12:47:40 am by zoroastre » Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

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

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.


* comparateur.jpg (6.13 KB, 252x164 - viewed 21 times.)
« Last Edit: July 08, 2012, 05:58:01 am by fdufnews » Logged

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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à...  smiley-confuse

@+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

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

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
« Last Edit: July 08, 2012, 06:11:25 am by fdufnews » Logged

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-lol

Merci pour ces précisions fdufnews smiley-wink

@+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

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

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.
« Last Edit: July 08, 2012, 07:50:12 am by fdufnews » Logged

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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
« Last Edit: July 13, 2012, 12:12:37 pm by zoroastre » Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

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

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

IDF/SO
Offline Offline
Edison Member
*
Karma: 41
Posts: 2312
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Merci messieurs pour vos retours smiley-wink

Je dispose effectivement de filtre infrarouge. Je me suis d'ailleurs concocté une petite boite deux compartiments à l'aide de carton noir et chaterton  smiley-lol
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.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Pages: 1 [2] 3   Go Up
Jump to: