Aide pour la programmation d'un capteur CCD
Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

Aide pour la programmation d'un capteur CCD



  1. #1
    invitea014229f

    Aide pour la programmation d'un capteur CCD


    ------

    Bonjour,

    Je suis actuellement en terminale SSI et ai pour projet un réfractomètre numérique, je travaille sur la programmation d'un capteur CCD (ILX551A http://home.fnal.gov/~maeshima/align...ip/ILX551A.pdf). En gros, je dois comparer la tension de sortie entre les différents pixels, et trouver le pic lumineux qui correspond au pic de tension en y associant la position du pixel. Le capteur est linéaire, il associe 33 premiers pixels inutiles, 2048 utilisables et 6 à la fin inutiles. Voici mon programme, pourriez vous s'il vous plaît me dire ce qui cloche ? Merci d'avance pour votre aide.
    Je l'ai fait sur Arduino.
    Rog et Clock sont les deux signaux à générer.
    Code:
    #include <Wire.h> //inclusion de la libraire Wire (protocole I2C / TWI)
    #include <LiquidCrystal_I2C.h> //inclusion librairie écran LCD
    ?LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //definir adresse LCD ) 0x27 pour un affichage de 
    #define Vout A0 // Vout sur broche A0
    boolean rog = 3; //Rog sur broche 3
    boolean clock =2; //Clock sur broche 2
    float n, D, B; //n,D,B en float
    int i, Ntemp; //déclarer i et Ntemp
    int posmin = 1; //position minimum du pixel à 1 ?
    int lum; //lum est la tension sur Vout (sortie)
    int pic_lum =2047; //position du pixel le plus lumineux
    int poslum //position du pixel
    int poslum1 //position du pixel
    int lum1 //lum1 est la tension sur Vout
    
    void setup(){
      lcd.begin(20,4);  // init lcd 20 caractères 4 lignes
      lcd.backlight(); //  retro éclairage on  
      Serial.begin(9600); //Conexon série 9600 bauds
    }
    
    void loop(){  
      mesure();
      lcd.setCursor(1,0); //postion curseur
      ?lcd.print(i); //écrire i 
      calcul_taux();
    }
    
    
    
    // *****************************mesure*****************************
     void mesure(){
       depart_mesure();
      i = 1; //on se place au pixel 1
      while(i<34){      // 33 premiers clock inutiles (voir doc ilx551a)
           digitalWrite(clock,LOW); //Niveau logique bas sur clock
           delayMicroseconds (0,001); 
           digitalWrite(clock,HIGH); //niveau logique haut
           delayMicroseconds (0,001);
           i=i+1; //incrémentation (on change de pixel)
           
        
      }
      i = 34; //on se place au pixel 34 (33 inutiles)
     while(i<2049){     // mesure des 2048 pixels utiles
           digitalWrite(clock,LOW); //niveau logique bas sur clock
           delayMicroseconds (0,001); 
           digitalWrite(clock,HIGH);
           delayMicroseconds (0,001); //REVOIR HERTZ
           lum = analogRead(Vout); //acquérir tension de Vout
           delayMicroseconds (100);
           poslum= i //position du pixel duquel on prélève la tension
           i=i+1 //on avance d'un pixel
           lum1 = analogRead(Vout); //on releve la tension de ce pixel
           poslum1 = i //on garde la position du pixel
           if (lum > lum1){ //Comparer les deux tensions
             pic-lum = i; //prendre position avec plus haute tension
            else pic-lum= poslum //sinon l'autre
            pic-lum= i-1
             ;

    -----

  2. #2
    invite1c6b0acc

    Re : Aide pour la programmation d'un capteur CCD

    Bonjour,

    comme d'habitude, si tu pouvais dire ce qui se passe quand tu lances ton programme, ça aiderait ...

    Edit : déjà, à mon avis, la ligne "?lcd.print(i);" ne peux pas donner autre chose qu'une erreur de compilation.

  3. #3
    invite1c6b0acc

    Re : Aide pour la programmation d'un capteur CCD

    La ligne "pic-lum = i;" n'a pas de sens non plus : tu t'es trompé de tiret et le compilateur lit ça comme une soustraction.

    Donc commence par corriger les erreurs de syntaxe. S'il y en a qui te dépassent, donne-nous le message, au lieu de nous laisser deviner.

  4. #4
    invitea014229f

    Re : Aide pour la programmation d'un capteur CCD

    Bonjour,
    Veuillez d'abord m'excuser pour l'imprécision de mon post et mes erreurs de syntaxe, je fais mes débuts en programmation.
    Mon programme va :
    -générer un signal ROG qui est le début de la mesure
    -générer un signal clock qui permet la mesure de chaque pixel ( un pic = un pixel)
    -quand il reçoit le faisceau lumineux, un pixel va recevoir la plus haute intensité et donc sur la sortie Vout on a la plus haute tension.
    - le capteur est linéaire avec 33 pixels inutiles, 2048 utiles et Ã* la fin 6 inutiles
    -le programme est chargé de comparer l'un après l'autre les pixels en mémorisant la position du pixel avec la plus haute tension
    C'est cette partie intitulée mesure qui me pose problème et dont je suis très incertaine
    En vous remerciant de votre aide et j'espère avoir été plus précise.

  5. A voir en vidéo sur Futura
  6. #5
    invite1c6b0acc

    Re : Aide pour la programmation d'un capteur CCD

    Et donc, ça donne quoi, comme messages d'erreur, quand tu essaie de le compiler ?

  7. #6
    invitea014229f

    Re : Aide pour la programmation d'un capteur CCD

    J'ai fait les modifications, voici le message :
    Arduino : 1.6.8 (Mac OS X), Carte : "Arduino/Genuino Uno"

    /Users/marilenafalieu/Documents/Arduino/programe_marilena/programe_marilena.ino:2:64: fatal error: LiquidCrystal_I2C.h: No such file or directory
    #include <LiquidCrystal_I2C.h> //inclusion librairie écran LCD
    ^
    compilation terminated.
    exit status 1
    Error compiling for board Arduino/Genuino Uno.

    Ce rapport pourrait être plus détaillé avec
    l'option "Afficher les résultats détaillés de la compilation"
    activée dans Fichier -> Préférences.

  8. #7
    invitea014229f

    Re : Aide pour la programmation d'un capteur CCD

    J'ai fait une verif et je n'ai aucune erreur, maintenant est-ce que l'algorithme fonctionnera pour l'utilisation selon toi?
    Code:
    #include <Wire.h> //inclusion de la libraire Wire (protocole I2C / TWI)
    #include <LiquidCrystal_I2C.h> //inclusion librairie écran LCD
    LiquidCrystal_I2C lcd(0x27,20,4); //definir adresse LCD ) 0x27 pour un affichage de 
    #define Vout A0 // Vout sur broche A0
    boolean rog = 3; //Rog sur broche 3
    boolean clock =2; //Clock sur broche 2
    float n, D, B; //n,D,B en float
    int i, Ntemp; //déclarer i et Ntemp
    int posmin = 1; //position minimum du pixel à 1 ?
    int lum; //lum est la tension sur Vout (sortie)
    int pic_lum =2047; //position du pixel le plus lumineux
    int poslum; //position du pixel
    int poslum1; //position du pixel
    int lum1; //lum1 est la tension sur Vout
    
    void setup(){
      lcd.begin(20,4);  // init lcd 20 caractères 4 lignes
      lcd.backlight(); //  retro éclairage on  
      Serial.begin(9600); //Conexon série 9600 bauds
    }
    
    void loop(){  
      mesure();
      lcd.setCursor(1,0); //position curseur
      lcd.print(i); //écrire i 
    }
    
    // *****************************mesure*****************************
     void mesure(){
      i = 1; //on se place au pixel 1
      while(i<34){      // 33 premiers clock inutiles (voir doc ilx551a)
           digitalWrite(clock,LOW); //Niveau logique bas sur clock
           delay(10); 
           digitalWrite(clock,HIGH); //niveau logique haut
           delay(10);
           i=i+1; //incrémentation (on change de pixel)
        
      }
      i = 34; //on se place au pixel 34 (33 inutiles)
     while(i<2049){     // mesure des 2048 pixels utiles
           digitalWrite(clock,LOW); //niveau logique bas sur clock
           delay(10); 
           digitalWrite(clock,HIGH);
           delay(10); //REVOIR HERTZ
           lum = analogRead(Vout); //acquérir tension de Vout
           delay(10);
           poslum= i; //position du pixel duquel on prélève la tension
           i=i+1; //on avance d'un pixel
           lum1 = analogRead(Vout); //on releve la tension de ce pixel
           poslum1 = i; //on garde la position du pixel
           if (lum > lum1) //Comparer les deux tensions
           pic_lum = i; //prendre position avec plus haute tension
           else pic_lum = poslum; //si infèrieur prendre l'autre pixel
           pic_lum = i-1; //position du pixel précédent (si plus tension plus élevée)
    }
    }
    
    //*************depart mesure**********************
     
    void depart_mesure(){ 
      pic_lum =2047;
      posmin = 0;
       digitalWrite(rog,HIGH);
       digitalWrite(clock,HIGH);
       delay (10);
       digitalWrite(rog,LOW);
       delay (10);
       digitalWrite(rog,HIGH);
       delay (10);
    }
    
    //************************************************
    
    void calcul_taux(){ 
        n= i*4265990;
        n= n/1000000;
        D= 6852*n-9153;
        lcd.setCursor(2,2);
        lcd.print(D);
        lcd.setCursor(7,2);
        lcd.print("g/L   ");
        B = 13345*D;
        B = B/10000;
        lcd.setCursor(3,3);
        lcd.print(B);
        lcd.setCursor(8,3);
        lcd.print("degre B   ");
      }

  9. #8
    Jack
    Modérateur

    Re : Aide pour la programmation d'un capteur CCD

    Moi ce qui m'inquiète, c'est la durée de la conversion analogique numérique. Vu la fréquence de l'horloge, j'ai des doutes sur le temps de conversion. Je ne connais pas bien le hard des µC des arduino, mais 1µs de temps de conversion, ça me semble utopique.
    Tu as vérifié cet aspect?

  10. #9
    Jack
    Modérateur

    Re : Aide pour la programmation d'un capteur CCD

    Je ne vois pas non plus où est géré le temps d'intégration permettant la charge des cellules.

  11. #10
    invitea014229f

    Re : Aide pour la programmation d'un capteur CCD

    Comment et où puis-je vérifier ces aspects ?
    Parce que sur la doc technique du capteur, il y a bien 1M de fréquence d'horloge, la carte utilisée comprend le convertisseur et c'est une Arduino UNO.
    J'ai par ailleurs grandement modifié le programme :
    Code:
    #include <Wire.h> //inclusion de la libraire Wire (protocole I2C / TWI)
    #include <LiquidCrystal_I2C.h> //inclusion librairie écran LCD
    LiquidCrystal_I2C lcd(0x27,20,4); //definir adresse LCD ) 0x27 pour un affichage de 
    #define Vout A0 // Vout sur broche A0
    boolean rog = 3; //Rog sur broche 3
    boolean clock =2; //Clock sur broche 2
    float n, D, B; //n,D,B en float
    int i, Ntemp; //déclarer i et Ntemp
    int lum; //lum est la tension sur Vout (sortie)
    int poslum; //position du pixel le plus luminneux
    int lummax; //lummax est la plus grande tension en sortie
    
    void setup(){
      lcd.begin(20,4);  // init lcd 20 caractères 4 lignes
      lcd.backlight(); //  retro éclairage on  
      Serial.begin(9600); //Conexon série 9600 bauds
    }
    
    void loop(){  
      lcd.setCursor(1,0); //position curseur
    }
    //****************depart mesure**********************************
    void depart_mesure(){ 
       digitalWrite(rog,HIGH);
       digitalWrite(clock,HIGH);
       delayMicroseconds (10);
       digitalWrite(rog,LOW);
       delayMicroseconds (10);
       digitalWrite(rog,HIGH);
       delayMicroseconds (10);
    
    }
    // *****************************mesure*****************************
    void mesure() {
      i = 1; //on se place au pixel 1
      while (i < 34) {  // 33 premiers clock inutiles (voir doc ilx551a)
        digitalWrite(clock, LOW); //Niveau logique bas sur clock
        delayMicroseconds(1);
        digitalWrite(clock, HIGH); //niveau logique haut
        delayMicroseconds(1);
        i = i + 1; //incrémentation (on change de pixel)
    
      }
      i = 34; //on se place au pixel 34 (33 inutiles)
    
      int lumMax=0;
      for (;i < 2049; i++) { // mesure des 2048 pixels utiles
        digitalWrite(clock, LOW); //niveau logique bas sur clock
        delayMicroseconds(1);
        digitalWrite(clock, HIGH);
        delayMicroseconds(1); //REVOIR HERTZ
        lum = analogRead(Vout); //acquérir tension de Vout
        if (lum>lumMax)
        {
          // on a trouvé un pixel plus lumineux que le dernier qu'on avait trouvé
          poslum=i;
          lumMax=lum;
          lcd.print(i);
          delay(1000);
        }
      }
    }
    
    //************************************************calcul du taux**************************************************************************
    
    void calcul_taux(){ 
        
        n= i*4265990;
        n= n/1000000;
        D= 6852*n-9153;
        lcd.setCursor(2,2);
        lcd.print(D);
        lcd.setCursor(7,2);
        lcd.print("g/L   ");
        B = 13345*D;
        B = B/10000;
        lcd.setCursor(3,3);
        lcd.print(B);
        lcd.setCursor(8,3);
        lcd.print("degre B   ");
      }
    Le temps d'intégration n'est pas géré par ROG par hasard ?

  12. #11
    invitea014229f

    Re : Aide pour la programmation d'un capteur CCD

    Je vies de regarder et le temps de conversion d'un CAN 8bit est de 1 ms http://www.chimix.com/an13/bac13/bac7.html

  13. #12
    Jack
    Modérateur

    Re : Aide pour la programmation d'un capteur CCD

    Le temps d'intégration n'est pas géré par ROG par hasard ?
    C'est possible, la doc est un peu trop succincte à mon gout.

    Comment et où puis-je vérifier ces aspects ?
    La durée de la conversion A/N? On doit trouver ça dans la doc de l'arduino, tout au moins celle de la fonction analogRead à mon avis. Tu peux aussi avoir une idée de ce temps avec la doc du µC de l'arduino (voir doc ATMEL)

  14. #13
    Jack
    Modérateur

    Re : Aide pour la programmation d'un capteur CCD

    Citation Envoyé par MarilenaF66 Voir le message
    Je vies de regarder et le temps de conversion d'un CAN 8bit est de 1 ms http://www.chimix.com/an13/bac13/bac7.html
    On doit pouvoir modifier l'horloge du convertisseur, mais je doute que tu puisses descendre à un temps de conversion d'une µs

  15. #14
    invitea014229f

    Re : Aide pour la programmation d'un capteur CCD

    J'ai la doc du micro contrôleur de l'arduino ici : http://www.atmel.com/images/Atmel-82...t_Complete.pdf à la page 42 je trouve ces données:
    24. Analog-to-Digital Converter
    24.1 Features
    • 10-bit Resolution
    • 0.5 LSB Integral Non-linearity
    • ± 2 LSB Absolute Accuracy
    • 13 - 260μs Conversion Time
    • Up to 76.9kSPS (Up to 15kSPS at Maximum Resolution) • 6 Multiplexed Single Ended Input Channels
    • 2 Additional Multiplexed Single Ended Input Channels (TQFP and QFN/MLF Package only) • Temperature Sensor Input Channel
    • Optional Left Adjustment for ADC Result Readout
    • 0 - VCC ADC Input Voltage Range
    • Selectable 1.1V ADC Reference Voltage
    • Free Running or Single Conversion Mode • Interrupt on ADC Conversion Complete
    • Sleep Mode Noise Canceler

  16. #15
    invitea014229f

    Re : Aide pour la programmation d'un capteur CCD

    Si je met précisément 13us dans le programme ça ira ? (en signal Clock)

  17. #16
    invitea014229f

    Re : Aide pour la programmation d'un capteur CCD

    ça aussi c'est intéressant, en faisant des recherches je trouve :
    Le signal observé sur la voie B est le signal ROG (Read Out Gate) et constitue le signal de synchronisation de l’oscilloscope. Au moment de l’impulsion observée sur l’écran, l’ensemble du contenu des 2048 pixels du CCD est transféré dans un registre à décalage de 2048 éléments. Les pixels sont alors vides de charges, ils accumulent les charges électriques jusqu’à l’impulsion suivante du signal ROG (6,5 ms environ). La lecture du registre est effectuée séquentiellement et ne comporte plus aucune information au bout de 3,25 ms environ. L’ensemble des 2048 pixels a été lu.

  18. #17
    Jack
    Modérateur

    Re : Aide pour la programmation d'un capteur CCD

    Ca veut dire que ça va mettre 13 fois plus de temps que prévu pour lire tous les éléments. Est-ce que ceux-ci vont conserver leur charge pendant tout ce temps, je ne le sais pas.

  19. #18
    invitea014229f

    Re : Aide pour la programmation d'un capteur CCD

    Ils conservent selon le signal ROG 3,25 ms selon ce que j'ai lu.

  20. #19
    Jack
    Modérateur

    Re : Aide pour la programmation d'un capteur CCD

    De toutes manières tu n'as pas le choix, il faut essayer.

  21. #20
    invitea014229f

    Re : Aide pour la programmation d'un capteur CCD

    Je le testerai prochainement, merci beaucoup pour ton aide en tout cas.

Discussions similaires

  1. aide pour programmation
    Par invite54a6b4fe dans le forum Électronique
    Réponses: 13
    Dernier message: 01/12/2011, 12h32
  2. aide pour programmation armoire de commande came pour portail a vantaux.
    Par invite5d1cf378 dans le forum Bricolage et décoration
    Réponses: 0
    Dernier message: 06/09/2011, 20h01
  3. Aide pour programmation d'un pic 18f
    Par invite7ca63226 dans le forum Électronique
    Réponses: 27
    Dernier message: 06/06/2011, 22h43
  4. Aide pour un capteur svp ( PPE )
    Par invite596bbc36 dans le forum TPE / TIPE et autres travaux
    Réponses: 0
    Dernier message: 08/03/2008, 08h37
  5. Aide pour programmation VBA
    Par invite588da7a7 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 08/07/2004, 23h55