ilx551b und arduino

Gast #3048568
Lesenswert?

Hallo, wir haben ein Projekt in dem wir ein Sensor zur 
lasertriangulation entwerfen und bauen.
Wir verwenden die ilx551b sensorzeile in Verbindung mit arduino. unser 
Problem ist nun, dass bei der Auswertung unser Programm Werte ausspuckt 
die allesamt unlogisch sind. Egal ob man den Sensor abdunkelt oder voll 
belichtet hat pixel1 den Wert 136 und pixel2 hat 134 pixel3 hat wieder 
136 und so geht das weiter bis 2087.. hat jemand ne spontane Idee an was 
es liegen könnte? Vielleicht kommt jemandem dieser Fehler bekannt vor.

vieleN dank schon einmal fürs Kopf zerbrechen.
Angehängte Dateien:
Gast #3053169
Lesenswert?

Oliver B. schrieb:
> Zeile 42? :)

Im Gegenteil. Zeile 42 ist eine Leerzeile und damit ohne Fehler!
Leider kann man das von den anderen Zeilen nicht sagen...

Ein Blick auf die Hardware:
1
/*
2
  3 Buttons on Pins: PD6 - kalibrieren
3
                     PD7 - messen
4
                     PB0 - pfeilart
5
                     PC4 - Uart on/off
6
                     
7
  CCD_CONTROL pins:  PB1 - rog
8
                     PB2 - clock
9
                     
10
                     PC0 - ccd output signal
11
  
12
  LASER pin:         PB5
13
  
14
  LCD pins:          PD2 - D7
15
                     PD3 - D6
16
                     PD4 - D5
17
                     PD5 - D4
18
                     PB3 - E
19
                     PB4 - RS
20
*/
21
/*output from ccd*/
22
#define ccd A0    // = PC0
23
/*pins to control ccd and laser*/
24
#define rog 9     // = PB1
25
#define clock 10   // = PB2
26
#define laser 13   // = PB5
27
/*pins for buttons*/
28
#define kalibrieren_pin 6   // = PD6
29
#define messen_pin 7        // = PD7
30
#define pfeilart_pin 8      // = PB0

Da passt auch nicht ein einziges Define (bzw. Kommentar) zum Schaltplan!
Beispiel: "ROG"-Signal, angeblich Wert "9", Kommentar "PB1" aber 
angeschlossen an "PC0".


Ein Blick auf den Funktionalen Teil der Software:
1
//  --> 1kbyte SRAM --> Using 512 Pixel: 512*2byte = 1024byte
2
#define PIXEL 512
3
#define COMPLETE 2087
4
const uint8_t EXP_HOLZPFEIL = 1000;
5
const uint8_t EXP_CARBONPFEIL = 2000;
6
int ccd_array [PIXEL];
7

8
void ccd_routine (const uint8_t exposure) {
9

10
  //DUMMY RUN
11
  digitalWrite(rog,LOW);    //RESET ROG
12
  delayMicroseconds(200);
13
  digitalWrite(rog,HIGH);    //SET ROG
14
  
15
  for(int i=0;i<PIXEL;i++) {
16
      
17
    digitalWrite(clock,LOW);    //RESET CLOCK
18
    delayMicroseconds(1);
19
    digitalWrite(clock,HIGH);    //SET CLOCK
20
  }

Aha, ein Dummy run über alle 512 Pixel. Was ist mit den anderen ~1500 
Pixel? Der Sensor hat effektiv 2048 Pixel und real noch ein paar mehr.

1
  //EXPOSURE TIME
2
  digitalWrite(laser,HIGH);    //LASER HIGH
3
  digitalWrite(rog,LOW);            //RESET ROG
4
  delay(exposure);
5
  digitalWrite(rog,HIGH);            //SET ROG
6
  digitalWrite(laser,LOW);    //LASER LOW

Zwei Sekunden Belichtungszeit fühlt sich ein bischen lang an.
Oder schaltest du das Licht vorher aus? Laser an hört sich nicht nach 
wenig Licht an...

1
  //MEASURE
2
  for(int i=0;i<COMPLETE;i++) {
3

4
    if (i>29 && i<2081) {  
5
      j++;
6
      digitalWrite(clock,LOW);    //RESET CLOCK
7
      analogRead(A1);      //low phase so lange wie high phase
8
      digitalWrite(clock,HIGH);    //SET CLOCK
9
      if(j == 4) {
10
        ccd_array[x] = analogRead(ccd);
11
        j=0;
12
        x++;
13
      }
14
    }
15
  }
16
}

1. Das Auslesen des ADC damit die high und low Phasen der Clock 
gleichlang sind ist so wie es programmiert wurde wirkungslos, denn so 
sind die Clock Phasen abhängig vom adressierten Pixel.
2. Die Clock wird garnicht erzeugt für Pixel <=29 und >=2081. Damit 
werden nicht die Pixel gelesen welche der Programmierer eigentlich lesen 
wollte, weil bei Pixel 30 erst Pixel 1 aus dem Sensor kommt...
3. Datenblatt Fig.2 sagt, dass VOUT gültig ist wenn die Clock low ist. 
Das heißt der Wert ccd_array[x] wird beim falschen analogRead() 
gespeichert und ist damit immer undefiniert.
Gast #3053764
Lesenswert?

Danke für die Hinweise.

Die aufgebaute Hardware passt  nicht, da der hochgeladene Schaltplan der 
falsche ist. Tatsächlich passen die Pins im Programm aber zur 
aufgebauten Schaltung.

Die Belichtung ist so groß, da der Carbonpfeil, der das Laserlicht 
zurückstreut einen recht hohen Remissionsgrad hat. Beim Holzpfeil könnte 
die Belichtungszeit etwas verringert werden.

Den Rest hab ich jetzt mal umgeschrieben und werde mich melden wenn ich 
es getestet habe.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren