Auslesen der Distanz-Sensor-Kalibrierung

Die Programmierung des c't-Bot
Antworten
Gedichtesammler

Auslesen der Distanz-Sensor-Kalibrierung

Beitrag von Gedichtesammler » 01 Mär 2008, 16:08

Hi Leute.

Ich versuche gerade, die Sensoren zu kalibrieren, was aber leider nicht so einfach zu sein scheint.
Ich habe in available_behaviors.h die Kalibrierung eingeschaltet und die rc5-codes entsprechend meiner FB angepasst.
Das Script an sich funktioniert, nur habe ich keine Ahnung, wie ich jetzt an die fertigen Werte kommen kann.
Ich habe als Ausgabe nur das Display, und da stehen die Werte nur in Bruchstücken drin - kann ich das irgendwie ändern oder durchblättern?
Wenn ich die "normale" Blättern-Funktion verwende, lande ich wieder bei "fertig ;-)"


Grus
Christian

eax
Friends of Robby
Friends of Robby
Beiträge: 756
Registriert: 18 Jan 2006, 16:16
Wohnort: Karlsruhe

Beitrag von eax » 01 Mär 2008, 19:48

Hi Christian,

wenn die Kalibrierung abgeschlossen ist, werden die ermittelten Werte automatisch ins EEPROM geschrieben und verbleiben dort, so dass man nichts weiter tun muss.
Zusätzlich können sie per LOG und USB oder WLAN an den Sim gesendet werden, so dass man sie per copy&paste in sensor_correction.h eintragen kann. Das ist praktisch, damit sie auch im EEPROM-Abbild (ct-Bot.eep Datei) stehen. Dieses Abbild muss man nämlich "flashen", wenn man am Programmcode weitere EEPROM-Funktionen ergänzt hat. Durch das Eintragen in sensor_correction.h spart man sich dann eine erneute Kalibrierung.

Eine zusätzliche Display-Ausgabe der Werte ist natürlich auch machbar, falls das jemand haben möchte?

Gruß Timo

Gedichtesammler

Beitrag von Gedichtesammler » 03 Mär 2008, 10:56

hallo Timo,

die Daten werden ja im Display ausgegeben (per LOG-Screen, denke ich), nur leider nicht so, dass man sie abschreiben könnte. ich habe hier 4 Zeilen, in denen jeweils ein Stück der Datensätze zu sehen ist.
Ich würde mir das ganze gern so umbauen, dass ich den Rest auch ablesen kann - eben weil ich es in die sensor_correction.h eintippen will, und leider keine Verbindung zum PC habe außer dem AVRISP MKII - und wie ich damit außer nem Hex-File vom eep-Rom oder dem Flash was auslesen kann habe ich noch nicht durchschaut ;-).
Andererseits müsste man das EEP-Rom ja decompilieren und dann als quasi-Klartext lesen können, oder?


Gruß
Christian

*edit* Hier noch ein Foto von der Ausgabe...
und nein, es sind keine sinnvollen Werte, da ich alle Messwerte auf die Schnelle bei einer Distanz von etwa 30 cm aufgenommen habe.
Dateianhänge
100_2890.JPG

eax
Friends of Robby
Friends of Robby
Beiträge: 756
Registriert: 18 Jan 2006, 16:16
Wohnort: Karlsruhe

Beitrag von eax » 04 Mär 2008, 18:00

Hallo Christian,

ja du kannst das Log auf dem Display ausgeben lassen, aber die Kalibrierfunktion ist (bisher) schlicht und einfach nur für Log-Ausgaben zum PC ausgelegt. Ich kann aber mal eine Display-Ausgabe im Anschluss an die Kalibrierung mit einbauen. Sage dir dann bescheid, wenn es soweit ist.

Nur als Hinweis: Log-Daten per USB-2-Bot-Adapter an einen PC zu übertragen ist eine deutliche Vereinfachung für viele Debugging-Aufgaben. Mir hat das jedenfalls schon sehr oft geholfen, weil sich einfach mehr Daten ausgeben lassen, als auf dem kleinen Display.

Gruß Timo

Gedichtesammler

Beitrag von Gedichtesammler » 05 Mär 2008, 11:04

Huhu!
da ich mir gestern sowieso Teile bei Segor bestellt habe, hab ich auch die USB2Bot Geschichte mit in die Bestellung gepackt - du kannst dir also die Mühe sparen, die Ausgabe um zu modeln ;-)
Aber danke dir trotzdem!

Christian

foobar0815

Beitrag von foobar0815 » 23 Okt 2008, 18:51

Ich hab genau das jetzt fuer mein Projekt benoetigt. Einfache Anpassung, so dass nach der erfolgreichen Kalibrierung mit der Fernbedienung die einzelnen Stuetzpunkte durchgeschalten werden koennen. Ich benutze die aktuelle stable version (rev 1481)

ct-Bot/bot-logic/behavior_calibrate_sharps.c:
[pre]
static uint8_t count = 0; /*!< aktueller Messpunkt */
static int16_t distL = 0; /*!< Rohdaten des linken Sharps */
[/pre]
wird zu
[pre]
static uint8_t count = 0; /*!< aktueller Messpunkt */
static uint8_t displaycnt = 0; /*!< Counter fuer Ausgabe auf Display */
static int16_t distL = 0; /*!< Rohdaten des linken Sharps */
[/pre]
und nun die logik:
[pre]
} else if (count == max_steps) {
display_printf("fertig :-)");
} else {
[/pre]
wird zu
[pre]
} else if (count == max_steps) {
display_clear();
display_cursor(1,1);display_printf("fertig :-)");
display_cursor(2,1);display_printf("Stuetzpunkt: %d",displaycnt+1);
display_cursor(3,1);display_printf("L: {%d/2,%d/5}",(buffer[0][displaycnt].voltage*2),(buffer[0][displaycnt].dist*5));
display_cursor(4,1);display_printf("R: {%d/2,%d/5}",(buffer[1][displaycnt].voltage*2),(buffer[1][displaycnt].dist*5));

if(RC5_Code==RC5_CODE_PWR){
delay(50);
if(displaycnt>=(max_steps-1)) {
displaycnt=0;
}
else{
displaycnt=displaycnt+1;
}
}
} else {
[/pre]

Nun ist es moeglich mit der Powertaste (siehe include/rc5-codes.h) zwischen den Stuetzpunkten durchzuschalten (auf dem Screen der zur Kalibrierung benutzt wurde). Nach dem letzten faengt wer wieder vorne an.

achja, zur entprellung der FB hab ich ein delay(50); drin, dazu wird natuerlich das headerfile benoetigt.
[pre]
#include "rc5-codes.h"
#include "log.h
[/pre]
wird zu
[pre]
#include "rc5-codes.h"
#include "delay.h"
#include "log.h"
[/pre]

Evtl benoetigt das ja jemand. Weiss nicht ob/wie ich das committen sollte bzw. wie man ein patchfile schreibt. so bleibt es jedem selbst ueberlassen.

Benjamin.Benz

Beitrag von Benjamin.Benz » 24 Okt 2008, 10:37

Hi,

ich sehe in Deinem Code ein delay(50); Das kann unter Umständen eher unschöne Nebenwirkungen auf andere Behaviour-Teile haben. Daher würde ich es weglassen.
Weiss nicht ob/wie ich das committen sollte bzw. wie man ein patchfile schreibt.
Siehe hier:
http://www.heise.de/ct/projekte/machmit ... s#erzeugen
http://www.heise.de/ct/projekte/ct-bot/ ... nien.shtml
http://www.heise.de/ct/projekte/ct-bot/ ... shtml#pa02
http://www.heise.de/ct/projekte/ct-bot/ ... shtml#pa03

Committen kannst Du die selber nicht, das machen derzeit die Maintainer. Aber die kümmern sich drum, wenn Du den Patch an die Mailingliste (http://www.heise.de/bin/newsletter/list ... entwickler) postest.[/i]

eax
Friends of Robby
Friends of Robby
Beiträge: 756
Registriert: 18 Jan 2006, 16:16
Wohnort: Karlsruhe

Beitrag von eax » 24 Okt 2008, 15:53

Hi,
foobar0815 hat geschrieben:achja, zur entprellung der FB hab ich ein delay(50);.
Du wertest ja einfach nur die Variable RC5_Code aus, die im RAM liegt. Das Auslesen von Daten aus dem RAM braucht man nicht zu "entprellen". Was du aber vergessen hast, ist RC5_Code nach der Auswertung auf 0 zu setzen. Dies ist unbedingt erforderlich.
Also delay(50); raus und RC5_Code = 0; rein. Durch das delay(50) wird das Nullsetzen der Variablen in manchen(!) Fällen zwar auch bewirkt, das liegt aber nur am Timing der Displayausgaben und funktioniert nicht unbedingt zuverlässig. Außerdem hat es böse Nebenwirkungen, wie schon gesagt wurde.

Vielleicht sollte man auch besser eine andere Taste verwenden, weil Power bereits für Notaus verwendet wird.

Außerdem sollte auch das errechnete Offset ausgegeben werden, sonst sind die angezeigten Daten wertlos.

Grüße,
Timo

Antworten