Absender: Peter Jonas
Datum: Fr, 07.04.2006 00:02:11
Hallo zusammen, bevor ich in den Osterurlaub gehe, möchte ich noch einen Patch zur Verfügung stellen, der mittels einer EEPROM-Tabelle die Kalibrierung der Distanzsensoren durchführen kann. Die Kalibrierung wird über zwei defines in der Datei ctbot.h gesteuert: #define CALIBRATE_DIST_SENSOR: Wenn diese Zeile aktiviert ist, geht der Roboter in den Kalibrierungsmodus #define USE_SENSOR_TABLE: Wenn diese Zeile aktiviert ist, wird im normalen Roboterbetrieb eine im EEPROM abgelegte Tabelle für die Linearisierung der Distanzsensoren benutzt. Im Kalibriermodus sieht man auf dem Display zunächst ein Menü. Man wird aufgefordert, den Roboter auf eine Distanz von 5cm zur Wand zu stellen. Wenn man das gemacht hat, drückt man die Taste "2" auf der Fernbedienung. Es wird nun aus den folgenden 100 Meßwerte pro Sensor ein Mittelwert gebildet. Dieser Wert wird dann in den beiden Tabellen (links und rechts) im EEPROM abgelegt. Danach wird man aufgefordert, die Distanz 10cm einzustellen und der Vorgang beginnt von vorn. Mit der Distanz 80cm ist die Kalibrierung abgeschlossen. Die Sensorwerte für die Distanzen 5, 10, 50 ... 80 cm sind nun im EEPROM. Mit der Taste "0" kommt man in den normalen Roboterbetrieb zurück und kann die Kalibrierung gleich testen (USE_SENSOR_TABLE muss dafür definiert sein). Wenn die Sensoren Distanzen messen, die außerhalb des eingestellten Distanzbereiches liegen, werden die Werte 0 bzw. 999 ausgegeben. Bei den Kalibrierungsschritten kann es noch passieren, dass die Tasten prellen. Die "Entprellung", die bei der Standard-Tastaturabfrage bereits eingebaut ist, funktioniert hier nicht, da ich direkt auf die Funktion ir_read() zugreife. Der Workaround in meiner Routine unterdrückt zwar das Prellen, bewirkt aber auch, dass man manchmal beim Weiterschalten der zu messenden Distanz die Taste "2" erneut drücken muss. Im EEPROM werden für den Distanzbereich 5-80cm 16 Messwerte pro Sensor gespeichert. Da die Sensoren jedoch auch Werte für Distanzen zwischen den gemessenen Distanzen ausgeben, muß man zwischen den Stützwerten interpolieren, um für jeden Sensorwert einen cm-Wert liefern zu können. Dafür gibt es zwei Lösungsansätze: 1. Die Interpolation findet schon vor der Speicherung der EEPROM-Tabellen statt. Nachteil: Die Tabellen werden sehr groß, und man muß evt. auf int16-Werte übergehen, um eine ausreichende Genauigkeit zu erzielen. 2. Man speichert nur die gemessenen 16 Werte pro Sensor ab und interpoliert erst beim normalen Betrieb, wenn ein neuer Distanzwert benötigt wird. Vorteil: Die EEPROM-Tabellen sind sehr kurz. Nachteil: Die Interpolation muß im normalen Roboterbetrieb erfolgen. Für einen aktuellen Sensorwert muß die Tabelle durchsucht werden, festgestellt werden, zwsichen welchen zwei gespeicherten Stützstellen der Messwert liegt, und dann interpoliert werden. Bislang habe ich aber noch keine Probleme durch diese notwendigen Prozessoraufgaben feststellen können. Ich habe die 2. Methode verwendet, weil mir bei 1) die Tabellen zu groß wurden oder aber die Genauigkeit zu gering war. Wenn man die EEPROM-Tabelle geschrieben hat, muss man später beim Flashen mittels PonyProg aufpassen. Ein Write-All bügelt die gemessenen Werte wieder über. Die Messwerte liegen im Adreßbereich ab 0x8000. Gruß Peter Jonas -- Echte DSL-Flatrate dauerhaft für 0,- Euro*! "Feel free" mit GMX DSL! http://www.gmx.net/de/go/dsl