c't Projekte - c't-Bot und c't-Sim -
Mailinglisten
[Voriger (Datum)]
[Nächster (Datum)]
[Voriger (Thread)]
[Nächster (Thread)]
[Nach Datum][Nach Thread]
Absender: SErpenbeck
Datum: So, 26.03.2006 19:56:37
Hallo Zusammen,
will auch mal mein "nur lese" dasein beenden :-).
Mit meinem Bot hatte (habe) ich 2 Probleme:
- Zum einen sind die Richtungsänderungen und Anfahrten der Motoren doch sehr
heftig. Mein Bot neigt sich dabei immer wieder nach vorne und gerät ins
kippeln (Display-->Schwerpunkt ein wenig zu hoch?!). Ich habe daher mal
versucht den aufruf bot_motor aus der Funktion motor_set in motor.c zu
nehmen und durch 2 Wunschvariablen (Regelvorgaben) zu ersetzen. Auf der
Suche nach einer Möglicherweise passenden Stelle kam mir die timer.c ins
Blickfeld. Dort passe ich nun jede ungerade ms ( time_ms & 1) den Wert der
Motoren linear an. In der vorliegenden version braucht der Bot nun ~ eine
viertel Sekunde von Null auf Vollspeed (2_ms *
(255_Steps/2_Steps_pro_Zyklus)). Das Ergebnis ist ein viel weicheres fahren
des Bot, das sollte die Motoren und Mechanik auf jeden Fall schonen. Einen
Wehrmutstropfen gibt es dennoch. Dieses Regelverhalten ist noch nicht ganz
mit den Verhalten aus bot_logik abgestimmt, wodurch es vorkommt, das der Bot
an einem Türrahmen die Kurve nicht schnell genug kriegt.
- Weiterhin habe ich mal in der sensor_low.c ein clipping für Werte der
Distanzsensoren eingebaut, die meiner Erfahrung nach Mist sind.
Gerade zu dem ersten Patch könnte der Eine oder andere ja mal einen
Kommentar abgeben.
Gruss Simon.
--
"Feel free" mit GMX FreeMail!
Monat für Monat 10 FreeSMS inklusive! http://www.gmx.net
Index: motor.c
===================================================================
RCS file: /ctbot/ct-Bot/motor.c,v
retrieving revision 1.9
diff -u -r1.9 motor.c
--- motor.c 24 Mar 2006 18:16:55 -0000 1.9
+++ motor.c 26 Mar 2006 18:48:52 -0000
@@ -31,6 +31,9 @@
volatile int16 speed_l=0; /*!< Geschwindigkeit linker Motor */
volatile int16 speed_r=0; /*!< Geschwindigkeit rechter Motor */
+volatile int16 speedwish_l=0; /*!< Geschwindigkeit Wunsch linker Motor */
+volatile int16 speedwish_r=0; /*!< Geschwindigkeit Wunsch rechter Motor */
+
direction_t direction; /*!< Drehrichtung der Motoren */
/*!
@@ -48,40 +51,40 @@
left=BOT_SPEED_STOP;
if (abs(left) > BOT_SPEED_MAX) // Nicht schneller fahren als moeglich
- speed_l = BOT_SPEED_MAX;
+ speedwish_l = BOT_SPEED_MAX;
else if (left == 0) // Stop wird nicht veraendert
- speed_l = BOT_SPEED_STOP;
+ speedwish_l = BOT_SPEED_STOP;
else if (abs(left) < BOT_SPEED_SLOW) // Nicht langsamer als die
- speed_l = BOT_SPEED_SLOW; // Motoren koennen
+ speedwish_l = BOT_SPEED_SLOW; // Motoren koennen
else // Sonst den Wunsch uebernehmen
- speed_l = abs(left);
+ speedwish_l = abs(left);
if (right == BOT_SPEED_IGNORE)
right=BOT_SPEED_STOP;
if (abs(right) > BOT_SPEED_MAX)// Nicht schneller fahren als moeglich
- speed_r = BOT_SPEED_MAX;
+ speedwish_r = BOT_SPEED_MAX;
else if (abs(right) == 0) // Stop wird nicht veraendert
- speed_r = BOT_SPEED_STOP;
+ speedwish_r = BOT_SPEED_STOP;
else if (abs(right) < BOT_SPEED_SLOW) // Nicht langsamer als die
- speed_r = BOT_SPEED_SLOW; // Motoren koennen
+ speedwish_r = BOT_SPEED_SLOW; // Motoren koennen
else // Sonst den Wunsch uebernehmen
- speed_r = abs(right);
+ speedwish_r = abs(right);
if (left < 0 ){
- speed_l=-speed_l;
+ speedwish_l=-speedwish_l;
direction.left= DIRECTION_BACKWARD;
} else if (left > 0 )
direction.left= DIRECTION_FORWARD;
if (right < 0 ) {
- speed_r=-speed_r;
+ speedwish_r=-speedwish_r;
direction.right= DIRECTION_BACKWARD;
} else if (right > 0 )
direction.right= DIRECTION_FORWARD;
-
- bot_motor(speed_l,speed_r);
+/* hier auskommentiert Speed wir durch den Timer verwaltet */
+// bot_motor(speed_l,speed_r);
}
/*!
@@ -107,3 +110,9 @@
speed_r=0;
motor_low_init();
}
+/*!
+ * Notaus Funktion
+ */
+void bot_stop(void){
+ bot_motor(BOT_SPEED_STOP,BOT_SPEED_STOP);
+}
\ No newline at end of file
Index: timer.c
===================================================================
RCS file: /ctbot/ct-Bot/timer.c,v
retrieving revision 1.3
diff -u -r1.3 timer.c
--- timer.c 22 Mar 2006 18:19:06 -0000 1.3
+++ timer.c 26 Mar 2006 18:48:52 -0000
@@ -25,6 +25,8 @@
#include "ct-Bot.h"
#include "timer.h"
+#include "motor-low.h"
+#include "motor.h"
#ifdef PC
#include <pthread.h>
@@ -97,6 +99,21 @@
if (time_micro_s >= 1000){ /* Eine Mikrosekunde verstrichen? */
time_ms += (time_micro_s/1000);
time_micro_s %= 1000; /* alle vollen Millisekunden vom Mikrosekundenzaehler in den Millisekudnenzaehler verschieben */
+
+ if (time_ms & 1) { /* alle 2ms den Motorwert anpassen */
+ if (speedwish_l<speed_l) {
+ speed_l-=2;
+ } else if (speedwish_l>speed_l){
+ speed_l+=2;
+ }
+ if (speedwish_r<speed_r) {
+ speed_r-=2;
+ } else if (speedwish_r>speed_r){
+ speed_r+=2;
+ }
+ bot_motor(speed_l,speed_r);
+ }
+
if (time_ms == 1000){ /* Eine Sekunde verstrichen? */
time_ms=0;
time_s++;
Index: include/motor.h
===================================================================
RCS file: /ctbot/ct-Bot/include/motor.h,v
retrieving revision 1.7
diff -u -r1.7 motor.h
--- include/motor.h 24 Mar 2006 18:16:55 -0000 1.7
+++ include/motor.h 26 Mar 2006 18:48:52 -0000
@@ -41,6 +41,9 @@
extern int16 volatile speed_l; /*!< Geschwindigkeit des linken Motors */
extern int16 volatile speed_r; /*!< Geschwindigkeit des rechten Motors */
+extern int16 volatile speedwish_l; /*!< Geschwindigkeit Wunsch linker Motor */
+extern int16 volatile speedwish_r; /*!< Geschwindigkeit Wunsch rechter Motor */
+
/*! In diesem Typ steht die Drehrichtung, auch wenn die Speed-Variablen bereits wieder auf Null sind */
typedef struct {
uint8 left:1;
@@ -77,5 +80,5 @@
* @param servo Zielwert
*/
void servo_set(uint8 servo, uint8 pos);
-
+void bot_stop(void);
#endif
Index: include/sensor_correction.h
===================================================================
RCS file: /ctbot/ct-Bot/include/sensor_correction.h,v
retrieving revision 1.1
diff -u -r1.1 sensor_correction.h
--- include/sensor_correction.h 4 Mar 2006 14:54:23 -0000 1.1
+++ include/sensor_correction.h 26 Mar 2006 18:48:52 -0000
@@ -25,8 +25,8 @@
#ifndef SENSOR_CORRECTION_H_
#define SENSOR_CORRECTION_H_
-#define SENSDISTSLOPE 65330 /*!< Steigung der Sensorkennlinie */
-#define SENSDISTOFFSET -3 /*!< Offset der Sensorkennlinie */
+#define SENSDISTSLOPE 5800 /*!< Steigung der Sensorkennlinie */
+#define SENSDISTOFFSET 150 /*!< Offset der Sensorkennlinie */
#endif /*SENSOR_CORRECTION_H_*/
Index: mcu/sensor-low.c
===================================================================
RCS file: /ctbot/ct-Bot/mcu/sensor-low.c,v
retrieving revision 1.5
diff -u -r1.5 sensor-low.c
--- mcu/sensor-low.c 19 Mar 2006 20:42:51 -0000 1.5
+++ mcu/sensor-low.c 26 Mar 2006 18:48:53 -0000
@@ -73,11 +73,18 @@
#define ENC_ENTPRELL 4 /*!< Nur wenn der Encoder ein paar mal den gleichen wert gibt uebernehmen */
-volatile char enc_l=0; /*!< Puffer fuer die letzten Encoder-Staende */
-volatile char enc_r=0; /*!< Puffer fuer die letzten Encoder-Staende */
+#define ABSTAND_MAX 980 /* Werte die darüber liegen sind Wahrscheinlich falsch */
+#define ABSTAND_MIN 150 /* Werte die darunter liegen sind Wahrscheinlich falsch */
+
+
+volatile uint8 enc_l=0; /*!< Puffer fuer die letzten Encoder-Staende */
+volatile uint8 enc_r=0; /*!< Puffer fuer die letzten Encoder-Staende */
+
+volatile uint8 enc_l_cnt=0; /*!< Entprell-Counter fuer L-Encoder */
+volatile uint8 enc_r_cnt=0; /*!< Entprell-Counter fuer R-Encoder */
+
+
-volatile char enc_l_cnt=0; /*!< Entprell-Counter fuer L-Encoder */
-volatile char enc_r_cnt=0; /*!< Entprell-Counter fuer R-Encoder */
/*!
* Initialisiere alle Sensoren
@@ -115,8 +122,18 @@
*/
int16 sensor_abstand(int16 sensor_data){
// TODO reale Kennlinie beachten!!!!
- return SENSDISTSLOPE / (sensor_data - SENSDISTOFFSET);
-
+ // 2006 03 21 erledigt + werte abgeschnitten die bei meinem bot nicht zu
+ // vernünftigen Ergebnissen führen.
+ if (sensor_data < ABSTAND_MIN) {
+ // fehler wahrscheinlich
+ sensor_data = ABSTAND_MIN;
+ }
+ else if (sensor_data > ABSTAND_MAX) {
+ // fehler wahrscheinlich
+ sensor_data = ABSTAND_MAX;
+ }
+ // Werte nach Kennlinie berechnen
+ return SENSDISTSLOPE / (sensor_data - SENSDISTOFFSET);
// return 1023-sensor_data;
}