Mit diesem Programm kann man die gesamte Sensorik des Nibo in Ruhe analysieren (Batteriespannung, IR-Abstand, Abgrundsensoren, Liniensensoren)
Damit bewegt er sich so, dass er Hindernissen ausweicht:Code:#include <stdlib.h> #include <avr/interrupt.h> #include "nibo/niboconfig.h" #include "nibo/iodefs.h" #include "nibo/delay.h" #include "nibo/adc.h" #include "nibo/pwm.h" #include "nibo/i2cmaster.h" #include "nibo/display.h" #include "nibo/bot.h" #include "nibo/leds.h" #include "nibo/gfx.h" #include "nibo/irco.h" #include "nibo/motco.h" #include "nibo/floor.h" void Init(void) { sei(); // enable interrupts i2c_init(); pwm_init(); display_init(); bot_init(); leds_init(); floor_init(); gfx_init(); } void float2string(float value, int decimal, char* valuestring) { int neg = 0; char tempstr[20]; int i = 0; int j = 0; int c; long int val1, val2; char* tempstring; tempstring = valuestring; if (value < 0){ neg = 1; value = -value; } for (j=0; j < decimal; j++) {value = value * 10;} val1 = (value * 2); val2 = (val1 / 2) + (val1 % 2); while (val2 !=0){ if ((decimal > 0) && (i == decimal)){ tempstr[i] = (char)(0x2E); i++; } else{ c = (val2 % 10); tempstr[i] = (char) (c + 0x30); val2 = val2 / 10; i++; } } if (neg){ *tempstring = '-'; tempstring++; } i--; for (;i > -1;i--){ *tempstring = tempstr[i]; tempstring++; } *tempstring = '\0'; } float SupplyVoltage(void) { bot_update(); return(0.0166 * bot_supply - 1.19); } void textout(int x, int y, char* str, int ft) { gfx_move(x,y); gfx_print_text(str,ft); } int main() { Init(); leds_set_displaylight(1000); floor_enable_ir(); while(1) { float Ubatt = SupplyVoltage(); char text[6]; float2string(Ubatt,2,text); textout( 0,0,text, 0); textout(35,0,"Volt",0); textout(0,8,"distance:",0); textout(0,24,"floor:",0); textout(0,40,"line:",0); irco_update(); irco_startMeasure(); irco_update(); uint16_t floor_distance[2]; uint16_t line_distance[2]; floor_update(); floor_distance[0] = floor_l; floor_distance[1] = floor_r; line_distance[0] = line_l; line_distance[1] = line_r; //Strings für Display char irco_string[5][5]; char floor_string[2][5]; char line_string[2][5]; int i; /* IR-Abstandssensoren */ for(i=0; i<5; ++i) { textout(i*21,16," ",0); //löschen } for(i=0; i<5; ++i) { itoa(irco_distance[i],irco_string[i],10); textout(i*21,16,irco_string[i],0); } /* IR-Floorsensoren (Abgrunderkennung) */ for(i=0; i<2; ++i) { textout(i*28,32," ",0); //löschen } for(i=0; i<2; ++i) { itoa(floor_distance[i],floor_string[i],10); textout(i*28,32,floor_string[i],0); } /* IR-Liniensensoren */ for(i=0; i<2; ++i) { textout(i*28,48," ",0); //löschen } for(i=0; i<2; ++i) { itoa(line_distance[i],line_string[i],10); textout(i*28,48,line_string[i],0); } delay(100); } while(1); return 0; }
Code:#include <stdlib.h> #include <avr/interrupt.h> #include "nibo/niboconfig.h" #include "nibo/iodefs.h" #include "nibo/delay.h" #include "nibo/adc.h" #include "nibo/pwm.h" #include "nibo/i2cmaster.h" #include "nibo/display.h" #include "nibo/bot.h" #include "nibo/leds.h" #include "nibo/gfx.h" #include "nibo/irco.h" #include "nibo/motco.h" #include "nibo/floor.h" #define LINKS 0 #define VORNE_LINKS 1 #define VORNE 2 #define VORNE_RECHTS 3 #define RECHTS 4 void Init() { sei(); // enable interrupts i2c_init(); pwm_init(); display_init(); bot_init(); leds_init(); floor_init(); gfx_init(); } void float2string(float value, int decimal, char* valuestring); float SupplyVoltage(void) { bot_update(); return(0.0166 * bot_supply - 1.19); } void textout(int x, int y, char* str, int ft) { gfx_move(x,y); gfx_print_text(str,ft); } int main() { Init(); // Kollisionsvermeidung vorbereiten uint16_t Vektor[5][2]; // Einheitsvektoren (*10) [0] ist x- und [1] ist y-Wert Vektor[0][0] = -10; // LINKS x Vektor[0][1] = 0; // LINKS y Vektor[1][0] = -7; // VORNE_LINKS x Vektor[1][1] = 7; // VORNE_LINKS y Vektor[2][0] = 0; // VORNE x Vektor[2][1] = 10; // VORNE y Vektor[3][0] = 7; // VORNE_RECHTS x Vektor[3][1] = 7; // VORNE_RECHTS y Vektor[4][0] = 10; // RECHTS x Vektor[4][1] = 0; // RECHTS y uint16_t VektorMalSensor[5][2]; // Sensorwert * Einheitsvektor (*10) uint16_t VektorMalSensorSumme[2]; // Sensorschwerpunkt (x,y) für Auswertung // Vorbereitungen leds_set_displaylight(1000); leds_set_headlights(512); floor_enable_ir(); motco_setPWM(600,600); motco_setSpeed(25,25); // fixe Display-Anzeigen textout(35,0,"Volt", 0); textout(0, 8,"distance:", 0); textout(0,24,"floor:", 0); textout(0,40,"line:", 0); // Hauptschleife while(1) { // Akkuspannung anzeigen float Ubatt = SupplyVoltage(); char text[6]; float2string(Ubatt,2,text); textout(0,0," ",0); // 5 Zeichen löschen textout(0,0,text, 0); // Abstandsmessung Raumgefühl irco_update(); irco_startMeasure(); irco_update(); // Floor uint16_t floor_distance[2]; uint16_t line_distance[2]; // Abstandsmessung Floor floor_update(); floor_distance[0] = floor_l; floor_distance[1] = floor_r; line_distance[0] = line_l; line_distance[1] = line_r; //Strings für Display char irco_string[5][5]; char floor_string[2][5]; char line_string[2][5]; // Laufvariablen int i,j; /* IR-Abstandssensoren */ for(i=0; i<5; ++i) textout(i*21,16," ",0); //löschen for(i=0; i<5; ++i) { itoa(irco_distance[i],irco_string[i],10); textout(i*21,16,irco_string[i],0); } /* IR-Floorsensoren (Abgrunderkennung) */ for(i=0; i<2; ++i) textout(i*28,32," ",0); //löschen for(i=0; i<2; ++i) { itoa(floor_distance[i],floor_string[i],10); textout(i*28,32,floor_string[i],0); } /* IR-Liniensensoren */ for(i=0; i<2; ++i) textout(i*28,48," ",0); //löschen for(i=0; i<2; ++i) { itoa(line_distance[i],line_string[i],10); textout(i*28,48,line_string[i],0); } /* MOTCO Mathematische Methode "x/y-Schwerpunkt der Sensorvektoren bilden": (Einheitsvektoren * 10) * Sensorwert (0-255), davon Summe bilden VektorMalSensorSumme[...] 0 ist x-Wert und 1 ist y-Wert Blockade: y kann maximal 6120 groß werden (vl, v, vr 255) Richtung: x kann maximal -4335 (Hindernis links) bzw. +4335 (H. rechts) werden (l, vl 255 bzw. r, vr 255) */ VektorMalSensorSumme[0] = 0; // x-Wert VektorMalSensorSumme[1] = 0; // y-Wert for (i=0; i<5; ++i) { for (j=0; j<2; ++j) { VektorMalSensor[i][j] = Vektor[i][j] * irco_distance[i]; VektorMalSensorSumme[j] += VektorMalSensor[i][j]; } } // Reaktion auf VektorMalSensorSumme[...] (x- und y-Wert) if(VektorMalSensorSumme[1] >= 4590) { motco_setSpeed(-25,-25); //rückwärts fahren } else if( (VektorMalSensorSumme[1] < 4900) && (VektorMalSensorSumme[1] >= 3060) ) { if(VektorMalSensorSumme[0] < -2500) // Hindernis links motco_setSpeed(25,-25); else if ( (VektorMalSensorSumme[0] >= -2500) && (VektorMalSensorSumme[0] <= 2500) ) // kein Hindernis motco_setSpeed(25,25); else // Hindernis rechts motco_setSpeed(-25,25); } else { motco_setSpeed(30,30); } motco_update(); } while(1); return 0; } // Hilfsfunktionen void float2string(float value, int decimal, char* valuestring) { int neg = 0; char tempstr[20]; int i = 0; int j = 0; int c; long int val1, val2; char* tempstring; tempstring = valuestring; if (value < 0){ neg = 1; value = -value; } for (j=0; j < decimal; j++) {value = value * 10;} val1 = (value * 2); val2 = (val1 / 2) + (val1 % 2); while (val2 !=0){ if ((decimal > 0) && (i == decimal)){ tempstr[i] = (char)(0x2E); i++; } else{ c = (val2 % 10); tempstr[i] = (char) (c + 0x30); val2 = val2 / 10; i++; } } if (neg){ *tempstring = '-'; tempstring++; } i--; for (;i > -1;i--){ *tempstring = tempstr[i]; tempstring++; } *tempstring = '\0'; }






					
					
					
						
Zitieren

Lesezeichen