Ich habe ein Programm gebastelt, welches den Nibobee im Kreis fahren lässt. Stösst er auf ein Hindernis oder bleibt er stecken (Motor steht still), so versucht er sich durch Rückwärtsfahren und Drehen zu befreien.
Code:
/* NIBOBee fährt nach Fühleranstoß im Kreis. Stößt er an oder bleibt ein Motor hängen, so setzt er kurz zurück */

#include <nibobee/iodefs.h>
#include <nibobee/sens.h>
#include <nibobee/motpwm.h>
#include <nibobee/led.h>
#include <nibobee/delay.h>
#include <nibobee/odometry.h>

/* Funktionen zur Steuerung der Fahrt
   fahre(1) - im Uhrzeigersinn, 
   fahre(-1) - gegen die Uhr,
   fahre(0) - rückwärts,
   rote Lampe leuchtet auf der Kurven- Innen- Seite */
int fahre(int8_t richtung) {
	switch(richtung) {
		case 1: 
	 		motpwm_setLeft(400);	/* Kreis im Uhrzeigersinn */
			motpwm_setRight(350);
			led_set(LED_L_RD, 0);
			led_set(LED_R_RD, 1);
			break; 
		case -1: 					/* Kreis gegen die Uhr */
	 		motpwm_setLeft(350);
			motpwm_setRight(400);
			led_set(LED_L_RD, 1);
			led_set(LED_R_RD, 0);
			break; 
		case 0: 					/* volle Kraft zurück */
	 		motpwm_setLeft(-1024);
			motpwm_setRight(-1024);
			led_set(LED_L_RD, 1);
			led_set(LED_R_RD, 1);
			delay(800);
	 		motpwm_setLeft(1000); 	/* und ein bischen drehen */
			motpwm_setRight(-1000);
			delay(150);
			break; 
			}
return 0;
}

/* Hauptprogramm */
int main() {
motpwm_init();
sens_init();
enable_interrupts();
odometry_init();

int odo_l = 0;					/* Variablen für die Odometriezählwerte */
int odo_l_merk = 0;
int odo_r = 0;
int odo_r_merk = 0;
int loop = 0;					/* Variable, die bei jedem Programmdurchlauf erhöht wird */

/* warte, bis ein Fühler betätigt wird */
while((sens_getLeft()==0) && (sens_getRight()==0));

/* jetzt gehts los! */
while(1==1) {					/* Endlosschleife */
	switch (sens_getLeft()) {	/* linker Fühler */
		case 1: fahre(1);
				break;
		case -1: fahre(0);		/* bin angestoßen, also zurück */
				delay(500);
				fahre(1);
				break; 
	}
	switch (sens_getRight()) {	/* rechter Fühler */
		case 1: fahre(-1);
				break;
		case -1: fahre(0);		/* bin angestoßen, also zurück */
				delay(500);
				fahre(-1);
				break;
	}
	loop++;						/* Programmdurchläufe zählen, als Ersatz für Zeitgeber */
	odo_l = odometry_getLeft(0);	/* Odometrie einlesen */
	odo_r = odometry_getRight(0);

/* prüfe bei jedem 10000sten Durchlauf ob der Odowert sich auch geändert hat,
   also der Motor noch drehen kann */
	if (loop == 10000) { 			/* diesen Wert habe ich einfach ausprobiert */
		if (odo_l == odo_l_merk) {	/* linker Motor steht */
			fahre(0); 				/* fahre rückwärts */
			fahre(-1); }			/* fahre weiter im Kreis */
		odo_l_merk = odo_l;
		if (odo_r == odo_r_merk) {	/* dito für den rechten Motor */
			fahre(0); 
			fahre(1); }
		odo_r_merk = odo_r;
		loop = 0;
	} ; 
 
	if ((odo_l/10)%2) led_set(LED_L_YE, 1);	/* laß die gelben Lampen blinken, je nach Odometer */
	else led_set(LED_L_YE, 0);
	if ((odo_r/10)%2) led_set(LED_R_YE, 1);
	else led_set(LED_R_YE, 0); 
}
return 0;
}