Go Down

Topic: détection d'une ligne noire (Read 3773 times) previous topic - next topic

Artouste



Je vais me pencher sur ce que vous me proposez tous les deux, en même temps je suis un peu frustré car le tsl1401 semble plus adapté pour mon utilisation étant juste une ligne de 128 x 1 pixels, j'ai du mal à saisir pourquoi un capteur 16 x 16 du même type serait meilleur ? Peut être à cause de l'optique ? Ou le signal est-il un peu "nettoyé" par un des composants ? Au final c'est quand même la même technologie...

J'ai vu sur internet des types qui montent le tsl1401 sur un moteur servo et qui arrivent à prendre carrément des photos, je me dis que pour ne pas arriver à voir une ligne noire je dois zappeur quelque chose...

Bref je ne suis pas encore démoralisé y'a encore pas mal de trucs à tenter, en tous cas merci pour vos propositions ça m'aide beaucoup !

bonjour
Il ne faut surtout pas se démoraliser , déjà le capteur capte  8), çà rend peut être mal, mais ça rend quelque chose"  :smiley-mr-green:

rapidement parcouru le datasheet :
ce que j'en ressort à ce  stade
- le pic de sensibilité est à ~800 nm , c'est déjà considéré comme de l'IR
- Maximum light exposure at 638 nm  (rouge)  . . . . . . . . . . . . . . 5 mJ/cm2
- 400 Dots-Per-Inch (DPI) Sensor Pitch ~longueur capteur 8 mm
tu illumine comment (diffusion ou reflection ? )avec quoi ?
AMHA avec ce capteur tu ne peux espérer obtenir de l'info fiable que si le support est éclairé homogène par transparence (par derrière) ET que le capteur soit parfaitement appliqué sur "le papier" , si le capteur n'est pas parfaitement appliqué et compte tenu qu'il n'y a apas d'optique de collimation, ce ne serait pas très etonnant que le capteur ne rend qu'une "bouillie générale".

Un pas trop mauvais test serait que tu illumine par devant  un banal (x)décimètre plastique (gradué au 1/2 mm) et que tu promène ton capteur devant les graduations (coté gravure) , je pense que tu devrais obtenir déjà une réponse plus franche des pixels.
http://i4.cdscdn.com/pdt/1/0/9/1/f/MAP146109/rw/triple-decimetre-cristal.jpg

JuliusCo


si ton papier est de type "glacé", peut-être que ça joue. Essaie avec un carton type Canson mat, pour voir.

En fait j'ai essayé pas mal de trucs à ce niveau... sans gros résultats.

Ta fréquence d'horloge (CLK) est de combien ? Parce que normalement, d'après le DS, c'est 5 kHZ mini (donc bien en dessus de ton 0.5 / 0.3 Hz ...

en fait j'ai pour le moment une fonction qui appelle la détection du capteur à quelques Hz, mais la fréquence de l'horloge est plus élevée. J'ai bien essayé de jouer avec, il y a bien des différences dans la sensibilité à la lumière mais à priori rien qui me permette de différencier correctement le blanc du noir.

Regarde "SI" et la page 5 du datasheet. A mon avis, tes signaux sont pas suffisamment clairs, et ton composant perd un peu les pédales.

ça ce n'est pas impossible du tout dans la mesure où la majeure partie du code a été récupérée, cela dit j'ai un peu de mal à bien capter moi aussi ! Je vais tenter la solution de Artouste avec le capteur de souris, ça ne sera pas perdu de toute façon ça peut toujours servir. J'ai récupéré une vieille mighty mouse je vais voir ce que ça donne.

[/quote]

dispose 2 émetteurs récepteurs infrarouge (opto coupleurs, capteurs de position/contact), en encadrement de la tête.
Ces détecteurs émettront en IR, à la verticale du papier, et par réflexion sur le papier blanc, la partie récepteur (photo transistor) fermera un contact.

En fait c'était ma première idée avant de tomber sur ce fameux capteur qui m'a sur le coup semblé plus adapté. Le principal inconvénient est à mon avis que la ligne devra être plus épaisse pour bien faire réagir le capteur, cela dit si c'est bien monté je ne pense pas que l'on perde beaucoup de précision.

Merci pour vos options du coup j'ai pas mal de pistes à exploiter, je vous ferai part des résultats !

Artouste



Merci pour vos options du coup j'ai pas mal de pistes à exploiter, je vous ferai part des résultats !

bonsoir
Juste pour une levée de doute complémentaire :
C'est un TSL1401 ou un TSL1401R  ?
Comment l'output du TSL est câblée sur l'arduino ?

voir ceci





JuliusCo


bonsoir
Juste pour une levée de doute complémentaire :
C'est un TSL1401 ou un TSL1401R  ?
Comment l'output du TSL est câblée sur l'arduino ?


C'est exactement un TSL1401R-LF.
La sortie est branchée directement sur sur l'analog 0 de l'arduino.

Artouste



bonsoir
Juste pour une levée de doute complémentaire :
C'est un TSL1401 ou un TSL1401R  ?
Comment l'output du TSL est câblée sur l'arduino ?


C'est exactement un TSL1401R-LF.
La sortie est branchée directement sur sur l'analog 0 de l'arduino.

ok
Vous avez essayé le test du "décimètre" que j'ai évoqué plus haut ? 
illumination diffusée par transparence et "promenade" du capteur appuyé sur la face graduée ?

JuliusCo


Vous avez essayé le test du "décimètre" que j'ai évoqué plus haut ? 
illumination diffusée par transparence et "promenade" du capteur appuyé sur la face graduée ?


En fait non mais j'ai fait un test assez comparable en baladant une patte de composant entre le capteur et la source lumineuse, ça il le voit plutôt bien.
Je suis en train de tester le hack de la souris, mais pour le moment je n'ai pas les résultats escomptés (je dois m'y pencher encore avant d'appeler à l'aide).

PS : il faut me tutoyer hein, moi j'ai pas 30 ans alors ça me fait flipper !

Artouste



En fait non mais j'ai fait un test assez comparable en baladant une patte de composant entre le capteur et la source lumineuse, ça il le voit plutôt bien.

Je suis en train de tester le hack de la souris, mais pour le moment je n'ai pas les résultats escomptés (je dois m'y pencher encore avant d'appeler à l'aide).

PS : il faut me tutoyer hein, moi j'ai pas 30 ans alors ça me fait flipper !


oui c'est un test équivalent, le principal est de bien voir les transitions.

Pour le hack de souris, l'ideal est de conserver l'ensemble opto montée sur la base (au besoin en jouant de la Dremel  :smiley-mr-green:  ), la distance optimale entre le capteur, la source  et la cible étant alors faite par construction.
si la mouse est basée sur un capteur 16X16, il est peut etre simple de n'utiliser qu'une ligne (16 PX) au moins en phase de test ?

Pour jouer j'avais démonté l'ensemble (capteur,led et optique) et il était très difficile de (main)tenir une bonne distance, remis sur ses "plots" c'est sans problemes.
http://cjoint.com/11dc/ALwuzcHAArv_opteaq.jpg

Ne "flippe" pas pour mes réponses "en vous"  :smiley-mr-green: , j'ai quelquefois mon "ancienne éducation" qui s'entrechoque avec les us et coutumes des moyens de communication  actuels.  8)



JuliusCo

En fait pour la souris je bloque, j'ai fait les branchements à priori correctement (j'ai revivifié moult fois !), il s'agit d'une puce A2051 donc la même que dans l'exemple sur bidouille.org.
Le code permet en principe de reconnaitre dans un premier temps le type de capteur puis transmet les coordonnées ainsi que les valeurs de pixels.
Comme tu le proposes j'avais aussi mis le réglage sur 16 pixels pour ne pas avoir une fenêtre serial trop encombrée.
Les valeurs qui apparaissent ne sont que des "0", pour toutes les valeurs...

J'ai pensé que j'avais grillé la puce en soudant mes fils par dessus mais si je retranche la souris sur l'usb ça fonctionne parfaitement...

Il y a quelqu'un ici qui utilise la même souris : feed://web.me.com/carstenm/INSS/Arduino_Rover/rss.xml
son code est basé sur celui-ci : http://www.martijnthe.nl/2009/07/interfacing-an-optical-mouse-sensor-to-your-arduino/
J'ai dû bidouiller un peu pour que ça compile car c'est un peu ancien. Au mieux j'ai les valeurs x et y qui augmentent en continu sans que je touche à la souris.

Donc avec ces deux sketchs ça ne marche pas, j'ai aussi essayé de changer les ports de l'arduino mais ça ne change rien. Les soudures semblent correctes, en tout cas ça fonctionne bien pour l'alimentation.

Sur certains posts on parle de couper certains circuits sur la carte de la souris pour ne pas que le contrôleur de la souris interfère avec l'arduino, mais là j'ai peur de faire une bêtise... Et je n'ai trouvé cette remarque que très rarement.

Le problème vient manifestement soit de CLK soit de SDIO, je ne sais pas comment je pourrai tester ça... Toi qui a déjà fait la manip as tu une idée ?

Artouste




Le problème vient manifestement soit de CLK soit de SDIO, je ne sais pas comment je pourrai tester ça... Toi qui a déjà fait la manip as tu une idée ?

Je vais laisser là pour ce soir
mias :
je me demande si il n'y a pas un probleme de R pullup ? (me souviens plus, je regarderais demain matin ou apres noel)
essaye ce code (pas retesté en reel, mais ça compile sans erreur en 022 sur uno)

Code: [Select]
/*******************************/
/* OptiMouse, Benoît ROUSSEAU  */
/* - dialoguer avec un ADS2051 */
/* récupérer sur une souris    */
/* optique    */
/*******************************/

#define BROCHE_HORLOGE 2
#define BROCHE_DONNEES 3
#define _BV(bit) (1 << (bit))

byte LectureRegistre (byte adresse)
{
  int i = 7;
  byte retour = 0;

  pinMode (BROCHE_DONNEES, OUTPUT);
  for (; i>=0; i--)
  {

     digitalWrite (BROCHE_HORLOGE, LOW);
     digitalWrite (BROCHE_DONNEES, adresse & (1 << i));
     digitalWrite (BROCHE_HORLOGE, HIGH);
  }

  pinMode (BROCHE_DONNEES, INPUT);
  delayMicroseconds(100);

  for (i=7; i>=0; i--)
  {
    digitalWrite (BROCHE_HORLOGE, LOW);
    digitalWrite (BROCHE_HORLOGE, HIGH);
    retour |= (digitalRead (BROCHE_DONNEES) << i);
  }
  delayMicroseconds(100);

  return retour;
}

void EcritureRegistre (byte adresse, byte donnee)
{
  int i = 7;

  adresse |= 0x80;

  pinMode (BROCHE_DONNEES, OUTPUT);
  for (; i>=0; i--)
  {

     digitalWrite (BROCHE_HORLOGE, LOW);
     digitalWrite (BROCHE_DONNEES, adresse & (1 << i));
     digitalWrite (BROCHE_HORLOGE, HIGH);
  }

  for (i=7; i>=0; i--)
  {
    digitalWrite (BROCHE_HORLOGE, LOW);
     digitalWrite (BROCHE_DONNEES, donnee & (1 << i));
     digitalWrite (BROCHE_HORLOGE, HIGH);
  }

}

void EnvoiImage()
{
  byte val;
  byte adr;
  Serial.print (">IMG:");

  EcritureRegistre (0x0a, 0x09);
  for (int i=0; i<256; i++)
  {
    do {
adr = LectureRegistre (0x0d);
val = LectureRegistre (0x0c);
    } while (val & 0x80);
//    Serial.print (adr, HEX);
//    Serial.print ('>', BYTE);
    Serial.print (val, HEX);
//    Serial.print (13, BYTE);
  }

  Serial.println ();
  EcritureRegistre (0x0a, 0x00);
}

void setup()
{
  pinMode (BROCHE_HORLOGE, OUTPUT);
  pinMode (BROCHE_DONNEES, INPUT);
  Serial.begin(19200);
}

void loop ()
{
  if (LectureRegistre (0x02))
  {
    Serial.print ('>');
    Serial.print (LectureRegistre (0x00), DEC);
    Serial.print ('-');
    Serial.print (LectureRegistre (0x01), DEC);
    Serial.print ('-');
    Serial.print (LectureRegistre (0x03), DEC);
    Serial.print ('-');
    Serial.print (LectureRegistre (0x04), DEC);
    Serial.println ();
  }
  if (Serial.available())
  {
    Serial.read();
    EnvoiImage();
  }
}

JuliusCo

Bon je déterre un peu le topic mais j'ai avancé un peu sur le projet malgré quelques problèmes.
J'ai fini par commander le tsl1401-db soit la version avec optique intégrée. Le problème a été de trouver la petite platine pour l'adapter sur la plaque d'essais mais après avoir attendu un moment j'ai fini par commander directement aux usa.
Résultat : pour le moment plutôt probant, je "distingue" très bien une ligne noire de moins d'1 mm sur un papier blanc en sortant l'optique au maxi et à environ 10 à 12 mm de l'objectif.

Je vous tiens au courant pour la suite !
merci.

epierre

Bonjour,

  as-tu avancé depuis ? quelle platine as-tu commandé ? celle vendue par Parallax ?

Emmanuel

Go Up