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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.