détection d'une ligne noire

Tout d'abord bonjour à tous, c'est mon premier post sur ce forum !

Je bidouille l'arduino depuis quelques mois, je teste, je bricole, et pour le moment je m'en sors à peu près car je n'ai jamais fait de projet vraiment complet. A la base je n'ai pas de connaissances en électronique, je connaissais un peu de programmation pour avoir un peu travaillé sous Flash.

J'en appelle à votre aide pour la première étape d'un projet qui me trotte depuis un moment, et pour lequel j'aurai besoin de détecter une ligne noire sur un papier blanc.

Le papier défile à très faible allure, et je n'ai pas besoin de 36 000 détections par seconde, je dirai que 2 ou 3 détections par seconde semblent suffire.
Le but est de déterminer si le papier en question dévie de sa trajectoire, mais vue l'allure ça ne devrait pas bouger très vite, je ne pense donc pas avoir besoin d'un capteur très large.

J'ai acheté un capteur TSL1401R (référence ici : http://www.eureca.de/pdf/optoelectronic/taos/TSL1401R_LF_E4.pdf )
A priori sur le papier ça me semblait parfait mais j'ai quelques soucis avec la gestion des valeurs qu'il me retourne.
J'ai utilisé différents codes trouvés sur le forum en anglais qui sont plus ou moins similaires, les valeurs qui sortent semblent cohérentes (si je masque la moitié du capteur je retrouve une tendance dans les valeurs) mais j'ai constaté cela reste très variable, pas très net et surtout hyper sensible (la moindre ombre qui passe fausse complètement les données).

J'ai essayé de faire un montage du type de ce qu'on voit ici : http://www.laurentkneip.de/line_detection.html
Donc en enfermant le capteur dans une boite avec des leds rouges cela dit je n'ai pas d'améliorations...

D'où ma question pour commencer : pensez-vous que ce capteur est celui qu'il me faut ? Avez-vous une meilleure solutions ?
Si c'est bien le capteur qu'il me faut quelqu'un a-t-il déjà bricolé ce genre de chose ?

J'ai trouvé sur le net plus d'utilisateurs du module TSL1401-DB avec un objectif, mais je ne sais pas si dans mon cas c'est approprié...

Merci d'avance pour n'importe quelle intervention qui peut me permettre d'avancer.

Hello, et bienvenue par ici :slight_smile:

Je ne connais pas ce type de capteur, mais je pense que cela peut satisfaire à ton projet.
Aurais-tu la possibilité de fabriquer une petite boite (selon la taille de la bande papier), hermétique à la lumière? En gros je pensais à installer une led blanche dans cette boite, totalement fermée donc pas de risques d'ombres, et rapprocher au maximum le capteur de la bande, voir même jusqu'à la toucher.

Une voie pour expérimenter, je ne dis pas que ça va marcher.

En fait c'est ce que j'ai fait, comme sur le site indiqué plus haut. J'ai encadré le capteur avec 2 led rouges, j'ai environ 1 mm de vide entre le capteur et le papier.

J'ai essayé de faire varier l'intensité des led pour trouver un "juste milieu".

Pour expliquer chaque pixel renvoie une valeur entre 0 et 255, 0 serait le noir et 255 le blanc.
Afin d'avoir une idée de ce que "voit" le capteur j'ai simplement fait tracer sur le serial un "X" pour les valeurs en dessous de 128 et un " " pour les autres.
Je récupère une sorte d'image noir et blanc (ou "x" et blanc !)qui s'actualise rapidement.

Le problème est que les led étant sur les côtés j'ai une zone à peine plus sombre au milieu (en fait l'ombre portée du capteur lui-même), et que cette zone suffit à me faire apparaître une bande noire au milieu.

Si j'augmente l'intensité de l'éclairage le capteur voit tout de suite "tout blanc", si je baisse un poil c'est tout noir...

J'ai aussi essayé de couper les led et d'éclairer par derrière le papier par transparence mais je ne parviens pas à discerner la ligne.

C'est pourtant un peu le principe du scanner, qui lui utilise un max de lumière, alors je me dis que quelque chose m'échappe peut être...

J'ai trouvé sur le net plus d'utilisateurs du module TSL1401-DB avec un objectif, mais je ne sais pas si dans mon cas c'est approprié.

Cela dépend de la distance entre le papier et le capteur et du mode d'éclairage.
Si tu éclaires par transparence et que le papier est très près du capteur (voir à le toucher) tu n'as pas besoin d'optique. Par contre si le capteur est un peu éloigné l'optique peut vite devenir indispensable. Tout dépend de la précision que tu veux avoir dans le positionnement. Si le capteur est éloigné, sans optique "l'image" du trait va être très flou et donc le contraste faible.

les valeurs qui sortent semblent cohérentes (si je masque la moitié du capteur je retrouve une tendance dans les valeurs) mais j'ai constaté cela reste très variable, pas très net et surtout hyper sensible (la moindre ombre qui passe fausse complètement les données).

C'est ce que je disais au-dessus le flou réduit la dynamique. Il faut peut être aussi jouer avec le temps d'intégration. Le capteur a son maximum de sensibilité dans les 800nm donc le rouge (ou le proche infrarouge) semble approprié. Tu pourrais mettre un filtre pour rejeter le reste du spectre cela améliorera le contraste.

Le capteur sort au maximum 2.4V pour du blanc. C'est la moitié de la dynamique du codeur de l'arduino dans la configuration par défaut. Tu peux facilement avoir un gain de 2 en mettant 2.5V sur Aref et en utilisant AnalogReference(EXTERNAL) analogReference() - Arduino Reference

JuliusCo:
Le problème est que les led étant sur les côtés j'ai une zone à peine plus sombre au milieu (en fait l'ombre portée du capteur lui-même), et que cette zone suffit à me faire apparaître une bande noire au milieu.

Tu pourrais rajouter des leds, de sorte à totalement entourer la boiboite, pour ne plus avoir d'ombre? Dans l'idéal, 4 à 6 leds pour un éclairage 'sans ombre'.

Merci pour ta réponse Fdufnews.

Concernant la précision mon but est simplement d'arriver à positionner la ligne par rapport au capteur pour savoir si elle a tendance à partir à droite ou à gauche. Le capteur est certainement bien trop précis pour moi mais l'avantage est que je pourrai utiliser une ligne relativement fine.

Donc à priori le fait d'éclairer par derrière le papier me permet de plaquer ce dernier sur le capteur, et j'aurai moins le problème des ombres. Je vais tâcher d'avancer dans ce sens.

Par rapport au temps d'intégration j'étais justement en train de me demander s'il ne serait pas possible de commencer par une sorte de "calibration" pour déterminer un temps d'intégration spécifique à chaque pixel ? Cela permettrait d'annuler l'impact des fameuses ombres... (car même en prévoyant d'éclairer par transparence il y aura des variations).
Par exemple en plaçant le capteur contre un papier blanc sans ligne, on prend chaque pixel un par un et on teste plusieurs temps d'intégration jusqu'à recevoir une valeur de 254. Ca risque d'être un peu long je ne me rends pas vraiment compte...
Ensuite on fait les mesures en récupérant les temps d'intégrations qu'on a stockés dans un tableau ?
Peut être que je m'égare ça me parait un poil complexe par rapport au besoin de départ...

Pour finir concernant AnanlogREFERENCE à priori ça n'est possible que sur une platine MEGA ? Ou j'ai mal compris... Pour l'instant je n'ai qu'une Duemilanove. Mais sinon ça me semble une très bonne idée ça me donnerait une plage plus vaste.

@ Schizophrene : à vrai dire dans l'état actuel du truc et ne pouvant pas mettre de led ailleurs qu'autour du composant j'ai peur que ça ne change pas le problème, j'aurai toujours une zone sombre au milieu, tu ne crois pas ?

Je suis d'accord, dans ce cas tu aurais toujours une ombre.

Concernant AnalogREFerence, regarde bien sur ta platine: après la borne digitale 13, tu as 2 bornes, une Ground et une AREF. C'est sur celle là que tu dois appliquer une tension égale ou très légèrement supérieure à celle délivrée par ton capteur. Et je te laisse jeter un coup d'oeil à la référence de l'AnalogReference :slight_smile:

(car même en prévoyant d'éclairer par transparence il y aura des variations)

Il faut placer la source d'éclairage légèrement en retrait du papier et utiliser un diffuseur. Du calque pour les petits budgets ou alors un vrai diffuseur comme ceux que l'on trouve dans les écrans LCD (téléphone, PC,...).

j'étais justement en train de me demander s'il ne serait pas possible de commencer par une sorte de "calibration" pour déterminer un temps d'intégration spécifique à chaque pixel

C'est peut être inutilement compliqué et de toue façon le temps d'intégration est global. Une calibration à la mise en route pourrait être simplement:

  • une acquisition sans éclairage pour mesurer le niveau de noir. S'il y a beaucoup de variation on peut le soustraire point à point avec les acquisitions suivantes (mais cela risque de faire beaucoup de calculs). Plus simplement en déterminer une valeur seuil pour le noir.
  • une série d'acquisition avec éclairage en faisant varier le temps d'intégration pour déterminer un temps d'intégration tel que le niveau de blanc soit supérieur à la moitié de la dynamique mais qu'il ne sature pas le capteur. En quelques itérations tu devrais avoir les paramètres nécessaires pour avoir une image correcte.

Il faut bien protéger le capteur des lumières parasites.

JuliusCo:
J'en appelle à votre aide pour la première étape d'un projet qui me trotte depuis un moment, et pour lequel j'aurai besoin de détecter une ligne noire sur un papier blanc.

Le papier défile à très faible allure, et je n'ai pas besoin de 36 000 détections par seconde, je dirai que 2 ou 3 détections par seconde semblent suffire.
Le but est de déterminer si le papier en question dévie de sa trajectoire, mais vue l'allure ça ne devrait pas bouger très vite, je ne pense donc pas avoir besoin d'un capteur très large.

Bonjour
Cette ligne noire , elle est de quelle largeur et elle peut se déplacer sur quelle distance ?

Merci Fdufnews et Schizophrene pour votre aide, pour la borne Aref je m'en suis rendu compte après coup en lisant mieux la référence. Je vais tenter ça ce soir et je vous donnerai les résultats.
Par curiosité j'ai commandé des petites plaques "EL PANEL", je n'ai pas encore trop testé mais pour le rétro éclairage ça pourrait s'avérer plus régulier, je ne sais pas si un filtre rouge pourrait suffire à modifier la longueur d'onde ?
Merci en tous cas ça me permet de bien avancer.

Artouste, la ligne noire n'a pas encore de dimension précise mais le but est de la garder assez fine si possible dans la mesure où je dois l'imprimer, histoire d'économiser un peu d'encre (je suis auvergnat !). Je pensais quelque chose comme 0,5 mm mais cela reste modifiable si besoin.
Concernant son déplacement il ne devrait pas y avoir beaucoup d'amplitude car le but de la manoeuvre est le suivant :
Le capteur est monté sur un chariot capable de bouger perpendiculairement au défilement du papier (c'est actionné par une simple tige filetée).
Dès que la ligne n'est pas au milieu le capteur doit déclencher un petit moteur qui actionnera la tige filetée et corrigera la trajectoire pour replacer la ligne noire au centre du capteur.
Je ne sais pas encore exactement quelle précision je peux atteindre mais cela dépend grandement des données reçues du capteur, j'essaie donc de résoudre cette partie avant d'aller plus avant.
La vitesse du papier étant très faible (environ 2m/minute) j'ose espérer pouvoir actionner mon chariot avant que la ligne soit sortie du champ de vision du capteur.

JuliusCo:
Artouste, la ligne noire n'a pas encore de dimension précise mais le but est de la garder assez fine si possible dans la mesure où je dois l'imprimer, histoire d'économiser un peu d'encre (je suis auvergnat !). Je pensais quelque chose comme 0,5 mm mais cela reste modifiable si besoin.
Concernant son déplacement il ne devrait pas y avoir beaucoup d'amplitude car le but de la manoeuvre est le suivant :
Le capteur est monté sur un chariot capable de bouger perpendiculairement au défilement du papier (c'est actionné par une simple tige filetée).
Dès que la ligne n'est pas au milieu le capteur doit déclencher un petit moteur qui actionnera la tige filetée et corrigera la trajectoire pour replacer la ligne noire au centre du capteur.
Je ne sais pas encore exactement quelle précision je peux atteindre mais cela dépend grandement des données reçues du capteur, j'essaie donc de résoudre cette partie avant d'aller plus avant.
La vitesse du papier étant très faible (environ 2m/minute) j'ose espérer pouvoir actionner mon chariot avant que la ligne soit sortie du champ de vision du capteur.

Bonsoir
comme capteur voir peut être du coté de ça et voir si c'est adaptable à ton projet en "bricolant" un peu.
http://www.bidouille.org/hack/mousecam (et liens)
j'ai joué avec une vieille logitech "juste pour voir" c'est plutôt intéressant comme résultat et c'est du capteur à pas cher :grin:

Bonjour,

JuliusCo:
Par curiosité j'ai commandé des petites plaques "EL PANEL", je n'ai pas encore trop testé mais pour le rétro éclairage ça pourrait s'avérer plus régulier, je ne sais pas si un filtre rouge pourrait suffire à modifier la longueur d'onde ?

"EL PANEL" ? C'est pas une sorte de feuille lumineuse avec une couleur bleu/blanc une fois en marche (vu un truc dans le genre chez selectronic) ?
Parce que si tu met un filtre rouge sur ce genre de lumière pas vraiment blanche je pense pas que tu te retrouve avec beaucoup de lumière en sortie du filtre (voir pas du tout).

JuliusCo:
Artouste, la ligne noire n'a pas encore de dimension précise mais le but est de la garder assez fine si possible dans la mesure où je dois l'imprimer, histoire d'économiser un peu d'encre (je suis auvergnat !). Je pensais quelque chose comme 0,5 mm mais cela reste modifiable si besoin.

:astonished: Un auvergnat \o/ héhéhé Nous les auvergnats ont est les meilleurs 8)

JuliusCo:
Concernant son déplacement il ne devrait pas y avoir beaucoup d'amplitude car le but de la manoeuvre est le suivant :
Le capteur est monté sur un chariot capable de bouger perpendiculairement au défilement du papier (c'est actionné par une simple tige filetée).
Dès que la ligne n'est pas au milieu le capteur doit déclencher un petit moteur qui actionnera la tige filetée et corrigera la trajectoire pour replacer la ligne noire au centre du capteur.
Je ne sais pas encore exactement quelle précision je peux atteindre mais cela dépend grandement des données reçues du capteur, j'essaie donc de résoudre cette partie avant d'aller plus avant.
La vitesse du papier étant très faible (environ 2m/minute) j'ose espérer pouvoir actionner mon chariot avant que la ligne soit sortie du champ de vision du capteur.

Comme te le propose Artouste tu devrai regarder du coté des hack de souris optique PS/2 ça pourrait coller parfaitement à ton utilisation !
http://www.bidouille.org/hack/mousecam
http://skyduino.wordpress.com/projets/arduino-hack-souris-optique-en-camera/ (bin quoi faut bien que je m'occupe ^^"")
Optical mouse hacking, part 1 | Conor Peterson

Et si tu veut un rendu plus "pro" (et propre) il existe des modules tout pret pour arduino : Breakout for ADNS2620 Optical Mouse Sensor - BOB-10105 - SparkFun Electronics
voir même des modules usb qui ne demande qu'as être branché sur un ordi ^^ : ADNS2620 Mouse Sensor Evaluation Board - WIG-10026 - SparkFun Electronics

La résolution est de 16x16 / noir et blanc, mais pour une ligne de 0.5mm (3-4 pixel en gros) ça doit passer sans trop de problémes.

j'ai joué avec une vieille logitech "juste pour voir" c'est plutôt intéressant comme résultat et c'est du capteur à pas cher

Transformer un souris optique en mini-webcam couleur, c'est la classe 8) (en plus ça tombe bien ça coute pas un centime, le DIY ne connait pas la crise :P)

Merci,
j'ai encore bidouillé toute la soirée sans vraiment avoir de résultat probant...
Je capte assez bien des différences de lumière mais même en posant le capteur sur par exemple un code barre il ne "voit" pas la différence entre du noir et du blanc... à chaque fois que je lui présente une surface les valeurs varient très très peu (même si entre du clair et du sombre je reçois des valeurs entre 0 et 1023, entre du noir et du blanc j'ai tout au plus 5 ou 6 points d'écart). J'ai fait le test à la fois avec un éclairage par derrière le papier et autour du capteur, ça fait à peu près pareil..

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 !

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

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

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.

Bonjour,

Le tracking de ligne noire sur fond blanc est un grand classique.
Il existe de nombreuses solutions, mais la plus didactique et aillant le meilleur ratio complexité/taux de résultats est la suivante :
Sur la tête de ton chariot, qui doit rester centrée sur la bande noire, 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. Ce type d'opto coupleur est très facile à trouver.
En en mettant deux sur la tête du chariot, en encadrement de la bande noire,, le principe de fonctionnement sera le suivant :
Le papier blanc possede un taux de réflexion IR beaucoup plus élevé que le noir.
Lorsque la bande est centrée, les deux optos émettent l'IR sur du blanc, les deux contacts sont donc fermés. Lorsque la bande dévie, un des deux optos ne va plus recevoir l'IR qu'il émet, qui sera absorbé par le noir de la bande. A toi donc de décaler dans le bon sens ta tête de chariot, pas par pas, jusqu'à ce qu'a nouveaux les deux contacts des optos soient fermés !

Voilà, en espérant t'avoir aidé :slight_smile:


Stéphane.

JuliusCo:
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" :grin:

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.

taddot:
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.

taddot:
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.

taddot:
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]

Snootlab:
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 !

JuliusCo:
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

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.

JuliusCo:

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 ?