Go Down

Topic: Utilisation des TSL1401 - TSL1402 avec Arduino pour la lecture compteurs Gaz/Eau (Read 290 times) previous topic - next topic

Simone72

Bonsoir tout le monde,

Ce sont des jours que je essaie de comprendre la limite des capteurs CCD linéaires comme le TSL1401 ou TSL1402 qui est présenté dans cette Playground

Mon but serait de lire les mètres cubes qui passent dans les vieux compteurs de gaz ou d'eau, dépourvues des contacts qui génèrent une impulsion ou lumières DEL qui clignotent.
Celui qui développe avec des application robots a certainement utilisé ces capteurs et pourrais me dire jusqu'à quel point je pourrais récupérer des informations utiles.
Sûrement les problèmes fondamentaux demeurent l'éclairage et l'orientation ... :smiley-confuse:
J'ai acheté chez Mouser aux US, les deux capteurs nu sans lentilles et je devrais commencer à faire les essais dès que Fedex me les ramener à la maison.

Voici deux photos que je ai prises sur les compteurs que j'ai ici à la maison, le premier est le gaz et le second c'est l'eau:





Mon but n'est pas de lire exactement les caractères du cadre rouge via un post-traitement du type Tesseract OCR mais plutôt vérifier le simple passage des taquets blancs horizontales ou peut-être la rotation de l'aiguille que j'ai souligné en bleu.
Ce que je voudrais, c'est de lire le poids le moins significatif pour détecter également le flux «instantané».

La lecture actuelle sera écrite dans le programme au moment de l'installation, puis, incrémenté par l'Arduino à chaque tour complet.

2 X Arduino MEGA 2560

Simone72

Voici les deux capteurs ... la taille n'est pas tout à fait le même ...  :smiley-eek-blue:



Je l'ai essayé sur ma peau et je peux dire que les composants CMS sont vraiment emmerdants... le TSL1401CL a rendu l'âme ... J'ai pensé pouvoir ajouter le condensateur directement derrière le dos, mais dès que je plié les pattes de celui-ci  j'ai déchiré celles du CMS  >:(

Puis j'ai recommencé sur le 14PID classique du TSL1402R qui est beaucoup plus robuste, je l'ai aussi placé sur un socle   ;D

Voici quelques photos du montage:





Depuis le Playground, j'ai vu qu'ils ont utilisé une configuration de la lecture des 256 diodes en parallèle, mais pour l'affichage sur le code de visualisation fait en Processing fallait une transmission série ...
J'ai préféré alors le câbler pour une lecture en série comme indiqué sur la fiche technique.

Dans l'Arduino Mega j'ai mis ce code avec le nombre de pixels égale à 256

Code: [Select]
/* TSL1401test --- Taos TSL1401 image sensor chip 2010-07-24 John Honniball
coredump at gifford.co.uk */

#define AOpin 0  // Analog pin 0
#define CLKpin 5
#define SIpin 3

#define NPIXELS 256

byte Pixel[NPIXELS];

void setup (void)
{
   pinMode (SIpin, OUTPUT);
   pinMode (CLKpin, OUTPUT);
   //pinMode (AOpin, INPUT);

   digitalWrite (SIpin, LOW);
   digitalWrite (CLKpin, HIGH);

   Serial.begin (115200);
}


void loop (void)
{
   int i;

   digitalWrite (CLKpin, LOW);
   delayMicroseconds (1);
   digitalWrite (SIpin, HIGH);
   digitalWrite (CLKpin, HIGH);
   digitalWrite (SIpin, LOW);

   for (i = 0; i < NPIXELS; i++) {
     Pixel[i] = analogRead (AOpin) / 4;
     digitalWrite (CLKpin, LOW);
     delayMicroseconds (1);
     digitalWrite (CLKpin, HIGH);
   }

   delayMicroseconds (1);

   Serial.write ((byte)0);
   for (i = 0; i < NPIXELS; i++) {
     if (Pixel[i] == 0)
       Serial.write ((byte)1);
     else
       Serial.write ((byte)Pixel[i]);
   }
}


et pour afficher le résultat sur PC j'utilise ce code avec Processing

Code: [Select]
/* LineViewer --- display for Arduino image sensor 2010-08-01 John Honniball
coredump at gifford.co.uk */

import processing.serial.*;

final int LINELEN = 256;
final int SCROLLHT = 256;
PImage img;
Serial duino ;
boolean Synced = false;

void setup ()
{
   println ("<START>");
   println (Serial.list());
   println ("<END>");
   String[] coms = Serial.list();

   // Open serial port to Arduino at 115200 baud
   duino = new Serial (this, coms[1], 115200);

   // Window is same width as sensor, but long enough to scroll
   size (LINELEN, SCROLLHT);

   // Image is same size as window
   img = createImage (LINELEN, SCROLLHT, RGB);

   // Initialise image to a shade of blue
   img.loadPixels ();

   for (int i = 0; i < img.pixels.length; i++) {
     img.pixels[i] = color (10, 90, 102);
   }

   img.updatePixels ();

   // Choose image update rate
   frameRate (10);
}

void draw ()
{
   int i;
   int ch;
   int nbufs;
   int b;
   int maxi;
   int maxpx;
   byte[] inbuf = new byte[LINELEN + 1];

   // Synchronise
   if (Synced) {
     nbufs = duino.available () / (LINELEN + 1);
   }
   else {
     do {
       while (duino.available () == 0)
         ;

       ch = duino.read ();

     } while (ch != 0);
     nbufs = 0;
     Synced = true;
   }

   // Load the image pixels in preparation for next row(s)
   img.loadPixels ();

   for (b = 0; b < nbufs; b++) {
     // Scroll the old image data down the window
     for (i = img.pixels.length - LINELEN - 1; i >= 0; i--) {
       img.pixels[i + LINELEN] = img.pixels[i];
     }

     // Read 128 pixels from image sensor, via Arduino
     duino.readBytes (inbuf);

     // Check we're still in sync
     if (inbuf[256] != 0) {
       print ("UNSYNC ");
       Synced = false;
     }

     maxi = 0;
     maxpx = 0;

     // Transfer incoming pixels to image
     for (i = 0; i < LINELEN; i++) {
       ch = inbuf[i];
       if (ch < 0)
         ch += 256;

       if (ch > maxpx) {   // Look for brightest pixel
         maxi = i;
         maxpx = ch;
       }

       img.pixels[i] = color (ch, ch, ch);
     }

     img.pixels[maxi] = color (0, 255, 255); // Mark brightest in green
   }

   // We're done updating the image, so re-display it
   img.updatePixels ();
   image (img, 0, 0);
   //saveFrame();  //"line-######.png"
}


Pour l'instant j'ai réussi à faire de cette vidéo, mais je pense que j'ai de gros problèmes de mise au point.

Ce que vous voyez c'est quand je passe le capteur sur une feuille où ils sont imprimés des nombres et du texte .... mais on y vois strictement rien... :smiley-sad-blue:
Quel objectifs utiliser? Comment pouvoir faire une lentille plate qui sera ensuite mise directement sur le cadran transparent du compteur  ... :smiley-eek-blue:

Dans l'attente d'un conseil...  :smiley-sleep:
2 X Arduino MEGA 2560

B@tto

Salut,

Bonne idée en plus ça pourrait peut-être me servir pour un projet. Bon boulot pour le moment en tout cas.

Je m'étonne de pas voir de lentille sur ton ccd, il en faut une normalement.

Après l'OCR oublie jpense : suivant la vitesse de défilement ton image sera plus ou moins étirée et tu ne pourras pas savoir dans quelle mesure.

Donc l'idée des tirets et bien, celle de l'aiguille aussi, après tu peux toujours envisager de monter ton ccd sur un servo et faire une capture "controllée".

Autre point à prendre en compte : imagine il y a une fenêtre sur laquelle le soleil donne et éclaire ton compteur, ça risque de créer des ombres et perturber la lecture.

Maintenant autre approche : une petite webcam de rien du tout ça coute rien. Tu la cale devant ton compteur, envoi une image au PC, défini un rognage que tu renvoi à la carte et elle n'envoi plus que la partie "utile" de l'image. Un OCR et hop ... Bon plus simple à dire qu'à faire cette dernière étape xD
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Artouste

Salut,

Bonne idée en plus ça pourrait peut-être me servir pour un projet. Bon boulot pour le moment en tout cas.

bonjour
dans ce genre de "captation" une solution est peut etre de se servir d'un capteur niveaux de gris de souris optique en matrice 16X16.
J'avais joué avec un capteur de souris et un uno en partant de ça , le resultat etait plutôt interessant



Simone72

Salut Batto,
merci pour les compliments,
mon objectif est d'intégrer le comptage et les mesures analogique des compteur gaz/eau et des transmettre ensuite l'information à une base de données comme EmonCms.

Pour la partie électrique est toujours plus facile, vous ajoutez les capteurs dans tableau électrique ou en face du compteur EDF et la chose est faite.
Pour l'eau et le gaz, les choses se compliquent, le PC est tres loin, tirez un fil pour l'alimentation, faire une connexion sans fil?...
J'exclue a priori la webcam.... ::)
Ensuite, je veux rester dans le DIY plus extrême, où chacun peut accéder par l'intermédiaire d'Arduino.

Merci énormément Artouste,
quand tu a joué avec le capteur de la souris comme ont été les résultats?
A tu des vidéo, des fichier?

Merci d'avance,

Simon
2 X Arduino MEGA 2560

Artouste

quand tu a joué avec le capteur de la souris comme ont été les résultats?
A tu des vidéo, des fichier?

Merci d'avance,

Simon

Attention
pour que les choses soit claires , je n'ai pas experimenté en comptage de... compteur :smiley-mr-green:
J'expose simplement que c'est (peut etre) une voie à explorer.

mais je pense que pour un "bon Diyeur" c'est à tenter
-positionner le capteur (peut etre adaptation optique)
et regarder les logs matrices pour voir si les graduations qui passent sont perceptibles.
apres ...

Simone72

Je regarde ce tutoriel et je dois dire que c'est bien fait!

J'ai juste demonté une souris et j'ai découvert d'avoir le même capteur yuppie! :smiley-yell:
Mon problème, ce est l'objectif, la distance maximale pour la mise au point de la surface est de 2,5 mm!
Les chiffres des conteurs sont beaucoup plus loin!
Comment bricoler une nouvelle lentille?
2 X Arduino MEGA 2560

B83s

salut

tu dis que tu n'y vois rien sur ta vidéo ... moi j'y vois des zones sombres qui alternent avec des zones claires .. il semblerait donc qu'on puisse au moins compter des caractères ... ce serait une bonne piste qui pourrait répondre à tes besoins

tu peux essayer de faire une vidéo en capturant les chiffres du compteur de gaz qui défilent ?

B@tto

Pour la partie électrique est toujours plus facile, vous ajoutez les capteurs dans tableau électrique ou en face du compteur EDF et la chose est faite.
Pour l'eau et le gaz, les choses se compliquent, le PC est tres loin, tirez un fil pour l'alimentation, faire une connexion sans fil?...
J'exclue a priori la webcam.... ::)
Quand je dis webcam, j'entendais juste le composant. Après une transmission radio et on est ok (en tout cas du point de vue théorique c'est tout à fait envisageable avec une Arduino, surtout s'il y a rognage de l'image, au final ça ne fait plus tant de données que ça à acquérir et à transmettre)
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Simone72

tu dis que tu n'y vois rien sur ta vidéo ... moi j'y vois des zones sombres qui alternent avec des zones claires .. il semblerait donc qu'on puisse au moins compter des caractères ... ce serait une bonne piste qui pourrait répondre à tes besoins
Salut B83s,

malheureusement la vidéo montre le passage très prés (3 - 3.5mm) d'un texte, si je m'éloigne tout est surexposé et ça devient blanc... plus prés tout noir... logique. :'(

Ils me faut une lentille d'une focale très courte mais je ne vois pas ou la récupérer...

Quelqu'un a une idée?
2 X Arduino MEGA 2560

B@tto

Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org


B@tto

J'ai beau être photographe à mes heures, je me rappelle plus des notions d'optiques de bases, mais il me semble que si tu décales la lentille du capteur, tu déplaces le plan focal aussi, donc tu augmentes la distance de mise au point
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Simone72

Salut a tous,
je revient sur mon capteur...
j'ai pense de récupérer un rond en plexyglass D5mm et le couper en deux dans le sens de la longueur.

Pourra t'il fonctionner comme lentille d'agrandissement?  :o  :smiley-roll-blue:
Avez vous d'autres idées?
2 X Arduino MEGA 2560

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy