## c't-Projekte - Mailinglisten

[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

### [ct-bot] Soft Anlauf für Motoren + Sensor anpassungen

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;
     }

- Voriger (Datum): Re: [ct-bot] rc5-codes für Fernbedienung VIVANCO UR89, Benjamin Benz
- Nächster (Datum): [ct-bot] 2006-03-15 Benjamin Benz (bbe@xxxxxxxx) Servos fuer PC-Bot eingefuehrt, Carsten Giesen
- Voriger (Thread): Re: [ct-bot] signed vs. unsigned char, Peter König
- Nächster (Thread): [ct-bot] 2006-03-15 Benjamin Benz (bbe@xxxxxxxx) Servos fuer PC-Bot eingefuehrt, Carsten Giesen
- Indizes:
  - Datum
  - Thread