Forum: Mikrocontroller und Digitale Elektronik ilx551b und arduino


von löffel (Gast)


Angehängte Dateien:

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.

von Eumel (Gast)


Lesenswert?

Schau mal in Zeile 42, da liegt der Fehler.

von Oliver B. (oliver_b25)


Lesenswert?

Zeile 42? :)

von löffel (Gast)


Angehängte Dateien:

Lesenswert?

hier der quellcode

von void (Gast)


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.

von loeffel (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.