Vollausschlag für die Fotosensoren
Zur Linienverfolgung steht wegen der roten FrontLED normalerweise nur ein sehr begrenzter Bereich der 10bit-AD-Wandler (0-1023) zur Verfügung, typischerweise von 0(schwarz) bis 80(weiß).
Im Beitrag Asuro tiefergelegt wurde gezeigt, wie man durch einfaches Absenken der Sensoren bis auf 1mm über Untergrund den Bereich auf 0-100 vergrößern kann.
Weiterhin wurde im selben Beitrag gezeigt, wie man den Meßbereich auf 0-320 erweitern kann, wenn man die FrontLED und die beiden Fototransistoren mit einer Abschirmung umgibt, welche innen weiß ist (z.B. Joghurtbecherplastik).
Als ich diesen Aufhellungseffekt einem Kollegen schilderte, sagte der: Lies doch mal die Spec für den Fototransistor!
Dies tat ich, und fand auf der Original-Asuro-CD unter "Doc/datasheets" sowohl die Spec für den Fototransistor SFH300, als auch die für die Infrarotdiode SFH415 (wird für die IR-Datenübertragung verwendet). Die Wellenlänge der roten LED (650nm) ist sehr viel weiter von der maximalen Empfindlichkeit des SFH300 bei 880nm entfernt, als die Wellenlänge einer InfrarotLED (950nm), und die Sensitivität des SFH300 ist für rote LEDs (55%) auch viel geringer als für Infrarote (85%):
Bild hier
Ich kaufte beim Elektronikhändler eine InfrarotLED (noname) und ersetzte die rote FrontLED durch diese -- der Effekt war umwerfend:- 30-320 ohne Abschirmung
- mit (innen weißer) Abschirmung sogar 70-980!!
Seit dieser Zeit habe ich gar keine Probleme mehr mit der Linienerkennung des Asuro -- selbst ein dunkler Holztisch oder dunkler Laminatboden sieht infrarotbeleuchtet aus wie Weiß! Ärgern kann man die Linienverfolgung eigentlich nur mit schwarzem Isolierband auf dunkelblauem Untergrund ...
Diese Nutzung von Infrarotlicht für die Linienerkennung scheint nicht sehr bekannt zu sein -- auf der RobotChallenge am Wochenende in Wien haben beim kleinen Finale um Platz 3 im Slalom enhanced beide Robots die Linie verloren, und auch bei vielen Testläufen anderer Roboter konnte man Probleme mit den Lichtverhältnissen beobachten.
Durch Infrarot&Abschirmung beschränkt sich der Einfluß des Außenlichts auf "< +30", ist also zu vernachlässigen. Ein fester (Summen-)Schwellwert von 1100 für dunkel/hell hat bisher ohne Justierung auf den meisten Untergründen funktioniert.
Infrarotlicht ist zwar für den Menschen nicht sichtbar, aber wie bereits mehrfach in diesem Forum diskutiert, kann man es durch eine Digitalkamera, oder einfacher durch ein Fotohandy, sehen:
Bild hier Bild hier
Links der infrarot beleuchtete Holztisch unter der (angehobenen) Abschirmung, rechts die leuchtende IR-LED in der weißen Abschirmung.
<u>Achtung:</u>
Ich habe einen Platinenkontakt beim (zu heißen) Auslöten der FrontLED eingebüßt -- seitdem ist ein Fuß der Diode D11 freiluftverbunden mit dem Widerstand R9 ...
Viel Spaß beim Umbau der FrontLED und dem Fotosensor-Vollausschlag!
Re: Vollausschlag für die Fotosensoren
Zitat:
Zitat von HermannSW
Diese Nutzung von Infrarotlicht für die Linienerkennung scheint nicht sehr bekannt zu sein -- auf der
RobotChallenge am Wochenende in Wien haben beim kleinen Finale um Platz 3 im
Slalom enhanced beide Robots die Linie verloren, und auch bei vielen Testläufen anderer Roboter konnte man Probleme mit den Lichtverhältnissen beobachten.
Hust. Das verlieren der Linie beim Slalom Enhanced lag nicht an den Lichtverhältnissen. Das lag daran, dass die Linie an einer Stelle 10cm unterbrochen war und man sie sogar beim Ziegelsteinumrunden wiederfinden musste. Schau dir den Parallelslalom an, da sind kaum welche abbogen, wenn ja, dann lags an der Software ohne PID-Regler ;) . Wir sind mit "Tequila" durchs Qualifying gekommen, sind aber im ersten Knockout (wie unser gegner :P ) aus der unterbrechung gekracht, da wir deppen nur 4 CNY-70 mit 7mm Abstand hatten und damit keine "lückenlose" Auflösung hatten -> beten statt proggen.
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo
Schon klar, dass der Helligkeitsunterschied, den die Linie verursacht, das Mass aller Dinge ist. Und hier brachte mir die Umrüstung eine deutliche Verbesserung. Hier mal mein "Testaufbau" für eine gemeinsame Basis:
Bild hier
Der Streifen ist 1,5cm breit und mit 'nem Deskjet 670c ausgedruckt. Mein Testprogramm im Anhang sendet pausenlos die Werte der Liniensensoren zum Hyperterminal, der Taster links außen schaltet die FrontLED ein, der Taster daneben schaltet sie wieder aus. Testablauf: asuro neben der Linie einschalten, nach den ersten gesendeten Werten die FrontLED einschalten und dann das Blatt unter den Liniensensoren durchziehen. So habe ich diese Werteliste erzeugt:
Code:
0 0
0 0
0 0
0 0
402 387
400 385
400 384
399 383
396 381
328 380
86 334
42 219
73 79
241 40
379 129
394 275
396 364
399 375
398 375
Wenn ich etwas an den LEDs rumbiege, kann ich die Max-Werte für beide Seiten auf Unterschied<3 abgleichen.
Vor dem Umbau der LED hatte ich bei diesem Test knapp 30 für Hell und 8 für Dunkel, also ca. 4 zu 1, jetzt sind es knapp 400 zu 40, das ist 10 zu 1!
Gruß
mic
Liste der Anhänge anzeigen (Anzahl: 1)
Hier habe ich die Werte meiner ASURO Liniensensoren mit superheller, roter LED ( die ich damals für die "waste'sche Balance" eingebaut habe ) vermessen und das Summen- und Differenzsignal graphisch dargestellt. Wie man sieht, erreichen die Fotoransistoren ca. 600 LSBs.
Messbedingungen:
LED: superhell, rot, mit Schrumpfschlauch gegen seitliches Übersprechen
Linie: schwarzes Isolierband, 17.5mm
Untergrund: weises Papier
Raum: abgedunkelt
LED-Spot-Durchmesser auf Untergrund: 15mm
Liste der Anhänge anzeigen (Anzahl: 1)
Hier eine bessere Messung. asuro steppt von links nach rechts über die Linie. Startposition ist Drehpunkt der Räder über der Linie mit rechte Platinenkante links neben der Linie. In der Endposition ist der Drehpunkt immer noch unverändert über der Linie (wir zirkeln mit MotorDir(FWD,RWD)) und linke Platinenkante rechts neben Linie. Nur wenn sich nach einem Step einer der Werte verändert hatte, wurden beide Werte gelogt:
Code:
0 ; 0 ; 0
1 ; 343 ; 340
2 ; 343 ; 341
3 ; 343 ; 339
4 ; 342 ; 339
5 ; 341 ; 338
6 ; 342 ; 340
7 ; 339 ; 340
8 ; 340 ; 341
9 ; 337 ; 340
10 ; 337 ; 341
11 ; 336 ; 339
12 ; 337 ; 338
13 ; 338 ; 326
14 ; 338 ; 313
15 ; 337 ; 292
16 ; 336 ; 255
17 ; 334 ; 222
18 ; 331 ; 137
19 ; 314 ; 91
20 ; 295 ; 66
21 ; 266 ; 47
22 ; 232 ; 38
23 ; 197 ; 39
24 ; 121 ; 48
25 ; 71 ; 66
26 ; 56 ; 83
27 ; 41 ; 135
28 ; 37 ; 217
29 ; 40 ; 237
30 ; 53 ; 273
31 ; 86 ; 314
32 ; 103 ; 325
33 ; 126 ; 332
34 ; 210 ; 336
35 ; 252 ; 337
36 ; 298 ; 338
37 ; 318 ; 336
38 ; 329 ; 337
39 ; 333 ; 337
40 ; 336 ; 338
41 ; 336 ; 337
42 ; 336 ; 338
43 ; 336 ; 337
44 ; 336 ; 339
45 ; 336 ; 338
46 ; 338 ; 337
47 ; 338 ; 336
48 ; 339 ; 337
49 ; 338 ; 336
(erste Messung mit FrontLED aus)
Ich vermute den schwachen Akku als Ursache für die immer kleiner werdenden Werte. Es wäre nett, wenn da jemand ein Diagramm draus machen könnte. *liebschaut*
Der Code des Messprogramms (für 80mm-Räder):
Code:
#include "../inc/asuro.h"
#include "../inc/asuro.c"
#define limit 50
#define NewLine SerWrite("\n\r",2)
#define Trenner SerWrite("; ",2)
unsigned int data[2], data_old[2], d_l[limit], d_r[limit], zeiger;
int main( void ){
Init();
zeiger=0;
LineData(data_old);
d_l[zeiger]=data_old[0];
d_r[zeiger]=data_old[1];
zeiger++;
FrontLED(ON);
Msleep(500);
MotorDir(BREAK,BREAK);
MotorSpeed(255,255);
while(zeiger<limit) {
if (zeiger & 1) StatusLED(YELLOW); else StatusLED(RED);
MotorDir(FWD,RWD);
Msleep(10);
MotorDir(FREE,FREE);
Msleep(100);
LineData(data);
if ((data[0]!=data_old[0]) || (data[1]!=data_old[1])) {
d_l[zeiger]=data[0];
d_r[zeiger]=data[1];
data_old[0]=data[0];
data_old[1]=data[1];
zeiger++;
}
}
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
FrontLED(OFF);
Msleep(500);
while(!PollSwitch()) { StatusLED(GREEN); Msleep(200); StatusLED(OFF); Msleep(600);}
NewLine; NewLine;
SerWrite("Gespeicherte Linedatas (10.3.2007)",34);
NewLine; NewLine;
for (zeiger=0; zeiger<limit; zeiger++) {
NewLine;
PrintInt(zeiger);
Trenner;
PrintInt(d_l[zeiger]);
Trenner;
PrintInt(d_r[zeiger]);
}
while(1);
return 0;
}
Gruß
mic
Edit: Diagramm hinzugefügt.
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Mmmh, blöderweise weis ich nicht, was ein "Fangbereich" ist. Aus dem Zusammenhang würde ich mal tippen, es ist der Bereich, in dem der asuro erkennt, dass hier was ist
.
Ja, so stelle ich mir das auch vor. Der Fangbereich ist der Bereich, in dem der ASURO sich zur Linie hin drehen kann. Wenn die Linie ausserhalb seines Sichtfeldes liegt, kann er die Linie nicht mehr "fangen".
Ich vermute, dass das nur bis zu dem Abstand geht, bei dem die Differenz der beiden Sensoren maximal wird. Deshalb habe ich die Daten aus Deinen 1.ten Messungen auch mal graphisch dargestellt, um einen Vergleich zu haben. Was mir dabei auffält, ist das auf der rechten Seite der Bereich Deiner Sensoren weiter ausläuft. Ich habe aber noch keine Idee, wie das zustande kommt und was es bedeutet.