h
Dependencies: Motordriver TextLCD mbed
main.cpp
- Committer:
- Formatd
- Date:
- 2014-01-11
- Revision:
- 0:be945302062c
File content as of revision 0:be945302062c:
// ######################### KeplerBRAIN V3 - 08.11.2013 ######################### // # // # Funktionen und deren Nutzung der KeplerBRAIN Library // # // # // # MOTORAUSGÄNGE // # // # Zum Ansteuern der Motoren dienen die beiden angeführten Funktionen. // # Die erste steuert die Geschwindigkeit zwischen 0% und 90 %, die // # Drehrichtung wird durch das Vorzeichen des übergebenen Dezimalwerts // # festgelegt. Die zweite Funktion dient zum apprupten Anhalten eines // # Motors ohne dass dieser nachläuft. // # // # Funktion: void WRITE_MOTOR_SPEED(int number, float speed) // # Parameter number: int 1, 2, 3, 4 // # Parameter speed: float -0.9 bis 0.9 (Vorzeichen: Drehrichtung) // # // # Funktion: void WRITE_MOTOR_STOP(int number) // # Parameter number: ganze Zahl 1, 2, 3, 4 // # // # // # DIGITALE SENSOREN AN DEN IO-BUCHSEN // # // # Werden an einen der 12 IO-Buchsen digitale Sensoren, also Sensoren // # die beim Auslösen eine Verbindung zwischen dem IO-Pin des Mikrokontrollers // # und GND herstellen (Taster, Schalter, ...) angeschlossen, so muss der // # entsprechende # IO-Pin als digitaler Eingang konfiguriert werden. Dies // # geschieht am Anfang der Bibliothek im Block "Declatation of IO-Ports". // # // # Festlegen eines IO-Ports 1 als digitaler Eingang: DigitalIn io1(PTB0); // # // # Das Einlesen des Sensor-Status erfolgt über die folgende Funktion, der // # Status des IO-Eingangs wird in einer Variable gespeichert. // # // # Funktion: void READ_IO_DIGITAL_IN(char number) // # Parameter number: int 1, 2, 3, ..., 12 // # Variable: bool BOOL_IO1_DIGITAL_VALUE true oder false // # // # // # ANALOGE SENSOREN AN DEN IO-BUCHSEN // # // # Werden an einen der ersten 5 IO-Buchsen Sensoren, die Spannungswerte // # zwischen 0 V und 3.3 V liefern, angeschlossen, so muss der entsprechende // # IO-Pin als analoger Eingang konfiguriert werden. Dies geschieht am Anfang // # der Bibliothek im Block "Declatation of IO-Ports". // # // # Festlegen eines IO-Ports 1 als digitaler Eingang: AnalogIn io1(PTB0); // # // # Das Einlesen des Sensor-Status erfolgt über die folgende Funktion, der // # entsprechende Spannungswert wird in einer Variable abgelegt. // # // # Funktion: void READ_IO_ANALOG_IN(char number) // # Parameter number: int 1, 2, 3, 4, 5 // # Variable: float FLOAT_IO1_ANALOG_VALUE 0.0 ... 1.0 // # // # // # LEUCHTDIODEN // # // # Zum Aus- und Einschalten der Leuchtdioden werden die folgenden // # drei Funtkionen verwendet: // # // # Funktion: void WRITE_LED_ROT(bool wert) // # Funktion: void WRITE_LED_GELB(bool wert) // # Funktion: void WRITE_LED_GRUEN(bool wert) // # Parameter number: bool true oder false // # // # // # TASTER // # // # Zum Auswerten der beiden Taster muss zuerst eine Funktion aufgerufen // # werden. Im Anschluss daran kann auf das Drücken eines Tasters durch // # Auslesen des Werts der beiden Tastervariablen reagiert werden. // # // # Funktion: void READ_TASTER() // # // # Variablen: BOOL_TASTER_LINKS_PRESSED, BOOL_TASTER_RECHTS_PRESSED // # Werte: bool true oder false // # // # // # DISPLAY // # // # Die Ausgabe von Text auf dem Display erfolgt über die folgende Funktion, // # der die Position der Ausgabe und ein String übergeben werden. Der // # String muss in einem eigens dafür definierten char-Array vorliegen. // # // # Funktion: void WRITE_DISPLAY(char zeile, char zeichen, const char *text) // # Parameter zeile: char 1, 2 // # Parameter zeichen: char 1, 2, ..., 16 // # Parameter *text: char[] // # // # Beispiel: // # // # char MeinText[16]; // # MeinText = "Text Anzeige 123"; // # WRITE_DISPLAY(1,1,MeinText); // # // # // # I2C PYROSENSOR MLX90614 // # // # Dieser Sensor wird an den I2C Bus angeschlossen und kann die // # Objekttemperatur aufgrund dessen Infrarotstrahlung und die Umgebungs- // # temperatur messen. Den beiden Funktionen muss die Adresse übergeben // # werden und liefern die Temperatur in Grad Celsius. Diese werden in // # zwei Variablen abgelegt. // # // # Funktion: char READ_I2C_MLX90614_OBJ(char address) // # Parameter zeile: char 0xB4, 0xB6, 0xB8, 0xBA // # Variable: int INT_I2C_MLX90614_0xB4_OBJ_VALUE // # // # Funktion: char READ_I2C_MLX90614_ENV(char address) // # Parameter zeile: char 0xB4, 0xB6, 0xB8, 0xBA // # Variable: int INT_I2C_MLX90614_0xB4_ENV_VALUE // # // # // # I2C KOMPASSSENSOR HMC6352 // # // # Dieser Sensor wird an den I2C Bus angeschlossen und liefert durch // # den Aufruf der folgenden Funktion die Richtung bezogen auf den // # magnetischen Nordpol in Grad. // # // # Funktion: void READ_I2C_HMC6352() // # Variable: int INT_I2C_HMC6352_VALUE 0, ..., 359 // #################### Beginn Import externe Librarys #################### #include "mbed.h" #include "TextLCD.h" #include "motordriver.h" // #################### End Import externe Librarys #################### // #################### Beginn Declaration of IO-Ports #################### DigitalIn io1(PTB0); // IO 1 DigitalIn, DigitalOut, AnalogIn AnalogIn io2(PTB1); // IO 2 DigitalIn, DigitalOut, AnalogIn DigitalIn io3(PTB2); // IO 3 DigitalIn, DigitalOut, AnalogIn DigitalIn io4(PTB3); // IO 4 DigitalIn, DigitalOut, AnalogIn DigitalIn io5(PTC2); // IO 5 DigitalIn, DigitalOut, AnalogIn DigitalIn io6(PTC10); // IO 6 DigitalIn, DigitalOut DigitalIn io7(PTE5); // IO 7 DigitalIn, DigitalOut DigitalIn io8(PTE20); // IO 8 DigitalIn, DigitalOut DigitalIn io9(PTE21); // IO 9 DigitalIn, DigitalOut DigitalIn io10(PTE30); // IO 10 DigitalIn, DigitalOut, AnalogOut // if AnalogOut REMOVE // in WRITE_IO_ANALOG_OUT DigitalIn io11(PTA5); // IO 11 DigitalIn, DigitalOut, PwmOut // if AnalogOut REMOVE // in WRITE_IO_PWM DigitalIn io12(PTA4); // IO 12 DigitalIn, DigitalOut, PwmOut // if AnalogOut REMOVE // in WRITE_IO_PWM // #################### End Declaration of IO-Ports #################### // #################### Begin of KeplerBRAIN V3 Library #################### // ********** KL25Z PIN-Belegungen ********** // PTA20/RST Taster Reset S1 // GND0 GND // VIN_5_9V 5V // PTB8 Taster S4 links // PTB9 Taster S3 rechts // PTE22 Led2 rot // PTE23 Led3 gelb // PTE29 Led1 grün // PTD7 Display RS // PTD6 Display E // PTE31 Display D4 // PTA17 Display D5 // PTA16 Display D6 // PTC17 Display D7 // PTD5 Motor1 IN1 // PTA13 Motor1 IN2 // PTC9 Motor1 EN // PTC6 Motor2 IN1 // PTC5 Motor2 IN2 // PTC8 Motor2 EN // PTC4 Motor3 IN1 // PTC3 Motor3 IN2 // PTA12 Motor3 EN // PTC7 Motor4 IN1 // PTC0 Motor4 IN2 // PTD4 Motor4 EN // PTB0 IO1/AIN // PTB1 IO2/AIN // PTB2 IO3/AIN // PTB3 IO4/AIN // PTC2 IO5/AIN // PTC10 IO6 // PTE5 IO7 // PTE20 IO8 // PTE21 IO9 // PTE30 IO10/AOUT // PTA5 IO11/PWM // PTA4 IO12/PWM // PTE0 I2C SCL // PTE1 I2C SDA // PTD1 SPI SCK // PTD3 SPI MISO // PTD2 SPI MOSI // PTD0 SPI SEL // PTA2 SERIAL TX // PTA1 SERIAL RX // ********** Deklaration Objekte Variablen intern ********** I2C i2c(PTE0, PTE1); // I2C Objekt TextLCD display(PTD7, PTD6, PTE31, PTA17, PTA16, PTC17, TextLCD::LCD16x2); // Display RS, EN, D4, D5, D6, D7, Type Motor motor1(PTC9, PTD5, PTA13, 1); // Motor 1 pwm, fwd, rev, can brake Motor motor2(PTC8, PTC6, PTC5, 1); // Motor 2 pwm, fwd, rev, can brake Motor motor3(PTA12, PTC4, PTC3, 1); // Motor 3 pwm, fwd, rev, can brake Motor motor4(PTD4, PTC7, PTC0, 1); // Motor 4 pwm, fwd, rev, can brake bool bool_motor1_coast, bool_motor2_coast, bool_motor3_coast, bool_motor4_coast; // Motor wartet nach stop auf coast Timeout wait_motor1_coast; // Timeout zwischen Motor stop und Motor coast Timeout wait_motor2_coast; // Timeout zwischen Motor stop und Motor coast Timeout wait_motor3_coast; // Timeout zwischen Motor stop und Motor coast Timeout wait_motor4_coast; // Timeout zwischen Motor stop und Motor coast DigitalOut led_rot(PTE22); // Led rot DigitalOut led_gelb(PTE23); // Led gelb DigitalOut led_gruen(PTE29); // Led grün DigitalIn taster_links(PTB8); // Taster links DigitalIn taster_rechts(PTB9); // Taster links bool bool_taster_links_down; bool bool_taster_rechts_down; // ********** Deklaration Funktionen intern ********** void motor1_coast() { if (bool_motor1_coast) motor1.coast(); } void motor2_coast() { if (bool_motor2_coast) motor2.coast(); } void motor3_coast() { if (bool_motor3_coast) motor3.coast(); } void motor4_coast() { if (bool_motor4_coast) motor4.coast(); } // ********** Deklaration Variablen Library ********** bool BOOL_TASTER_LINKS_PRESSED, BOOL_TASTER_RECHTS_PRESSED; bool BOOL_IO1_DIGITAL_VALUE, BOOL_IO2_DIGITAL_VALUE, BOOL_IO3_DIGITAL_VALUE, BOOL_IO4_DIGITAL_VALUE, BOOL_IO5_DIGITAL_VALUE, BOOL_IO6_DIGITAL_VALUE, BOOL_IO7_DIGITAL_VALUE, BOOL_IO8_DIGITAL_VALUE, BOOL_IO9_DIGITAL_VALUE, BOOL_IO10_DIGITAL_VALUE, BOOL_IO11_DIGITAL_VALUE, BOOL_IO12_DIGITAL_VALUE; float BOOL_IO1_ANALOG_VALUE, BOOL_IO2_ANALOG_VALUE, BOOL_IO3_ANALOG_VALUE, BOOL_IO4_ANALOG_VALUE, BOOL_IO5_ANALOG_VALUE; int INT_I2C_MLX90614_0xB4_OBJ_VALUE, INT_I2C_MLX90614_0xB4_ENV_VALUE; int INT_I2C_MLX90614_0xB6_OBJ_VALUE, INT_I2C_MLX90614_0xB6_ENV_VALUE; int INT_I2C_HMC6352_VALUE; char CHAR_I2C_LINE_S1_VALUE,CHAR_I2C_LINE_S2_VALUE,CHAR_I2C_LINE_S3_VALUE,CHAR_I2C_LINE_S4_VALUE, CHAR_I2C_LINE_S5_VALUE,CHAR_I2C_LINE_S6_VALUE,CHAR_I2C_LINE_S7_VALUE,CHAR_I2C_LINE_S8_VALUE; char CHAR_IRSEEKER2_DIRECTION, CHAR_IRSEEKER2_S1_VALUE, CHAR_IRSEEKER2_S2_VALUE, CHAR_IRSEEKER2_S3_VALUE, CHAR_IRSEEKER2_S4_VALUE, CHAR_IRSEEKER2_S5_VALUE; // ********** Deklaration Funktionen Library ********** void KEPLERBRAIN_INIT() { bool_taster_links_down = false; bool_taster_rechts_down = false; BOOL_TASTER_LINKS_PRESSED = false; BOOL_TASTER_RECHTS_PRESSED = false; BOOL_IO1_DIGITAL_VALUE = false; BOOL_IO2_DIGITAL_VALUE = false; BOOL_IO3_DIGITAL_VALUE = false; BOOL_IO4_DIGITAL_VALUE = false; BOOL_IO5_DIGITAL_VALUE = false; BOOL_IO6_DIGITAL_VALUE = false; BOOL_IO7_DIGITAL_VALUE = false; BOOL_IO8_DIGITAL_VALUE = false; BOOL_IO9_DIGITAL_VALUE = false; BOOL_IO10_DIGITAL_VALUE = false; BOOL_IO11_DIGITAL_VALUE = false; BOOL_IO12_DIGITAL_VALUE = false; BOOL_IO1_ANALOG_VALUE = 0.0; BOOL_IO2_ANALOG_VALUE = 0.0; BOOL_IO3_ANALOG_VALUE = 0.0; BOOL_IO4_ANALOG_VALUE = 0.0; BOOL_IO5_ANALOG_VALUE = 0.0; CHAR_IRSEEKER2_DIRECTION = 0; CHAR_IRSEEKER2_S1_VALUE = 0; CHAR_IRSEEKER2_S2_VALUE = 0; CHAR_IRSEEKER2_S3_VALUE = 0; CHAR_IRSEEKER2_S4_VALUE = 0; CHAR_IRSEEKER2_S5_VALUE = 0; INT_I2C_MLX90614_0xB4_OBJ_VALUE = 0; INT_I2C_MLX90614_0xB4_ENV_VALUE = 0; INT_I2C_MLX90614_0xB6_OBJ_VALUE = 0; INT_I2C_MLX90614_0xB6_ENV_VALUE = 0; INT_I2C_HMC6352_VALUE = 0; // Initialisierung Motoren bool_motor1_coast = false; bool_motor2_coast = false; bool_motor3_coast = false; bool_motor4_coast = false; } void READ_TASTER() { BOOL_TASTER_LINKS_PRESSED = false; if (!taster_links) { if (bool_taster_links_down==false) { BOOL_TASTER_LINKS_PRESSED = true; } bool_taster_links_down = true; } else { bool_taster_links_down = false; } BOOL_TASTER_RECHTS_PRESSED = false; if (!taster_rechts) { if (bool_taster_rechts_down==false) { BOOL_TASTER_RECHTS_PRESSED = true; } bool_taster_rechts_down = true; } else { bool_taster_rechts_down = false; } } void READ_IO_DIGITAL_IN(char number) { switch(number) { case 1: if (!io1) BOOL_IO1_DIGITAL_VALUE=true; else BOOL_IO1_DIGITAL_VALUE=false; break; case 2: if (!io2) BOOL_IO2_DIGITAL_VALUE=true; else BOOL_IO2_DIGITAL_VALUE=false; break; case 3: if (!io3) BOOL_IO3_DIGITAL_VALUE=true; else BOOL_IO3_DIGITAL_VALUE=false; break; case 4: if (!io4) BOOL_IO4_DIGITAL_VALUE=true; else BOOL_IO4_DIGITAL_VALUE=false; break; case 5: if (!io5) BOOL_IO5_DIGITAL_VALUE=true; else BOOL_IO5_DIGITAL_VALUE=false; break; case 6: if (!io6) BOOL_IO6_DIGITAL_VALUE=true; else BOOL_IO6_DIGITAL_VALUE=false; break; case 7: if (!io7) BOOL_IO7_DIGITAL_VALUE=true; else BOOL_IO7_DIGITAL_VALUE=false; break; case 8: if (!io8) BOOL_IO8_DIGITAL_VALUE=true; else BOOL_IO8_DIGITAL_VALUE=false; break; case 9: if (!io9) BOOL_IO9_DIGITAL_VALUE=true; else BOOL_IO9_DIGITAL_VALUE=false; break; case 10: if (!io10) BOOL_IO10_DIGITAL_VALUE=true; else BOOL_IO10_DIGITAL_VALUE=false; break; case 11: if (!io11) BOOL_IO11_DIGITAL_VALUE=true; else BOOL_IO11_DIGITAL_VALUE=false; break; case 12: if (!io12) BOOL_IO12_DIGITAL_VALUE=true; else BOOL_IO12_DIGITAL_VALUE=false; break; } } void READ_IO_ANALOG_IN(char number) { switch(number) { case 1: BOOL_IO1_ANALOG_VALUE=io1; break; case 2: BOOL_IO2_ANALOG_VALUE=io2; break; case 3: BOOL_IO3_ANALOG_VALUE=io3; break; case 4: BOOL_IO4_ANALOG_VALUE=io4; break; case 5: BOOL_IO5_ANALOG_VALUE=io5; break; } } void READ_I2C_MLX90614(char address) { char cmd[1]; char bytes_env[3]; char bytes_obj[3]; int i2c_Addr = address; cmd[0] = 0x06; i2c.write(i2c_Addr, cmd, 1); i2c.read(i2c_Addr, bytes_env, 3); cmd[0] = 0x07; i2c.write(i2c_Addr, cmd, 1); i2c.read(i2c_Addr, bytes_obj, 3); switch(address) { case 0xB4: INT_I2C_MLX90614_0xB4_ENV_VALUE = (((bytes_env[0] & 0x007F) << 8) + bytes_env[1]); INT_I2C_MLX90614_0xB4_OBJ_VALUE = (((bytes_obj[0] & 0x007F) << 8) + bytes_obj[1]); break; case 0xB6: INT_I2C_MLX90614_0xB6_ENV_VALUE = (((bytes_env[0] & 0x007F) << 8) + bytes_env[1]); INT_I2C_MLX90614_0xB6_OBJ_VALUE = (((bytes_obj[0] & 0x007F) << 8) + bytes_obj[1]); INT_I2C_MLX90614_0xB6_ENV_VALUE = bytes_env[0]; INT_I2C_MLX90614_0xB6_OBJ_VALUE = bytes_obj[0]; break; } } void READ_I2C_HMC6352() { char cmd[1]; char bytes[2]; int i2c_Addr = 0x42; cmd[0] = 0x41; i2c.write(i2c_Addr, cmd, 1); i2c.read(i2c_Addr, bytes, 2); INT_I2C_HMC6352_VALUE = (bytes[0] * 256 + bytes[1]) / 10; } void READ_I2C_LINE() { char cmd[1]; char bytes[8]; int i2c_Addr = 0xA0; cmd[0] = 0x49; i2c.write(i2c_Addr, cmd, 1); i2c.read(i2c_Addr, bytes, 8); CHAR_I2C_LINE_S1_VALUE = bytes[0]; CHAR_I2C_LINE_S2_VALUE = bytes[1]; CHAR_I2C_LINE_S3_VALUE = bytes[2]; CHAR_I2C_LINE_S4_VALUE = bytes[3]; CHAR_I2C_LINE_S5_VALUE = bytes[4]; CHAR_I2C_LINE_S6_VALUE = bytes[5]; CHAR_I2C_LINE_S7_VALUE = bytes[6]; CHAR_I2C_LINE_S8_VALUE = bytes[7]; } void WRITE_IO_ANALOG_OUT(char number, float value) { if (value<0.0) value = 0.0; if (value>1.0) value = 1.0; switch(number) { case 10: // io10.write(value); break; } } void WRITE_IO_PWM(char number, float period, float pulsewidth) { switch(number) { case 11: // io11.period = period; // io11.pulsewidth = pulsewidth; break; case 12: // io12.period = period; // io12.pulsewidth = pulsewidth; break; } } void WRITE_LED_ROT(bool wert) { if (wert==true) led_rot = 1; else led_rot = 0; } void WRITE_LED_GELB(bool wert) { if (wert==true) led_gelb = 1; else led_gelb = 0; } void WRITE_LED_GRUEN(bool wert) { if (wert==true) led_gruen = 1; else led_gruen = 0; } void WRITE_MOTOR_SPEED(int number, float speed) { if (speed>0.9) speed = 0.9; if (speed<-0.9) speed = -0.9; switch(number) { case 1: bool_motor1_coast = false; motor1.speed(speed); break; case 2: bool_motor2_coast = false; motor2.speed(speed); break; case 3: bool_motor3_coast = false; motor3.speed(speed); break; case 4: bool_motor4_coast = false; motor4.speed(speed); break; } } void WRITE_MOTOR_STOP(int number) { switch(number) { case 1: motor1.stop(1.0); bool_motor1_coast = true; wait_motor1_coast.attach(&motor1_coast, 1); break; case 2: motor2.stop(1.0); bool_motor2_coast = true; wait_motor2_coast.attach(&motor2_coast, 1); break; case 3: motor3.stop(1.0); bool_motor3_coast = true; wait_motor3_coast.attach(&motor3_coast, 1); break; case 4: motor4.stop(1.0); bool_motor4_coast = true; wait_motor4_coast.attach(&motor4_coast, 1); break; } } void WRITE_DISPLAY(char zeile, char zeichen, const char *text) { if (zeile<1) zeile = 1; if (zeile>2) zeile = 2; if (zeichen<1) zeichen = 1; if (zeichen>16) zeichen = 16; zeile--; zeichen--; display.locate(zeichen, zeile); display.printf(text); } void READ_I2C_IRSEEKER2() { char cmd[1]; char bytes[6]; int i2c_Addr = 0x10; cmd[0] = 0x49; i2c.write(i2c_Addr, cmd, 1); i2c.read(i2c_Addr, bytes, 6); CHAR_IRSEEKER2_DIRECTION = bytes[0]; CHAR_IRSEEKER2_S1_VALUE = bytes[1]; CHAR_IRSEEKER2_S2_VALUE = bytes[2]; CHAR_IRSEEKER2_S3_VALUE = bytes[3]; CHAR_IRSEEKER2_S4_VALUE = bytes[4]; CHAR_IRSEEKER2_S5_VALUE = bytes[5]; } // #################### End of KeplerBRAIN V3 Library #################### void fahren(float spd1, float spd2) { spd2+=0.05; WRITE_MOTOR_SPEED(1, spd1); WRITE_MOTOR_SPEED(2, spd2); } void gerade(float time) { fahren(0.6, 0.65); wait(time); WRITE_MOTOR_STOP(1); WRITE_MOTOR_STOP(2); } void drehen(int grad) // bool für richtung noch einfügen { bool a=true; int pos=INT_I2C_HMC6352_VALUE; char textzeile1[16]; grad+=pos; if(grad>=360) { grad-=360; } while(a) { fahren(0.25,-0.3); READ_I2C_HMC6352(); pos=INT_I2C_HMC6352_VALUE; pos-=360; if (pos>=grad) { WRITE_MOTOR_STOP(1); WRITE_MOTOR_STOP(2); a=false; } sprintf(textzeile1,"Grad: %3u ",INT_I2C_HMC6352_VALUE); WRITE_DISPLAY(1,1,textzeile1); WRITE_MOTOR_STOP(1); WRITE_MOTOR_STOP(2); wait(0.01); } WRITE_MOTOR_STOP(1); WRITE_MOTOR_STOP(2); } Timer timer; void ausgleichen() { int pos=INT_I2C_HMC6352_VALUE; float error=0; int Lasterror=0; int beginn=0,end=0; float P=0; float I=0; float D=0; float Kp=0.015; float Ki=0.00002/30; float Kd=1; float spd1=0; float spd2=0; float minspeed=0.28; float speed=0.6; char textzeile1[16]; char textzeile2[16]; bool speederror=false; int kompass=0; int kompassNull = INT_I2C_HMC6352_VALUE; while(1) { READ_TASTER(); timer.start(); beginn=timer.read_us()/100; READ_I2C_HMC6352(); end=timer.read_us()/100; kompass = INT_I2C_HMC6352_VALUE + 180 - kompassNull; if(kompass<0) kompass+=360; if(kompass>359) kompass+=-360; error=180-kompass;//INT_I2C_HMC6352_VALUE;//180-kompass; P=Kp*error; I=I+((end-beginn)*error)*Ki; D=Kd*((error-Lasterror)/(end-beginn)); Lasterror=error; if(error==0) I=0; /* if((spd1<minspeed)&&(spd1>0)) spd1=minspeed; if((spd1>-minspeed)&&(spd1<0)) spd1=-minspeed; if((spd2<minspeed)&&(spd2>0)) spd2=minspeed; if((spd2>-minspeed)&&(spd2<0)) spd2=-minspeed;*/ spd1=speed+(P+I+D); spd2=speed-(P+I+D); /* if((spd1>0)&&(spd1<0.25)) spd1=0.28; if((spd1<0)&&(spd1>-0.25)) spd1=-0.28; if((spd2>0)&&(spd2<0.25)) spd2=0.28; if((spd2<0)&&(spd2>-0.25)) spd2=-0.28;*/ WRITE_MOTOR_SPEED(1, spd1); WRITE_MOTOR_SPEED(2, spd2); sprintf(textzeile1,"%.3f %3u ",error,kompass); sprintf(textzeile2,"%.3f %.3f ",spd1,spd2); WRITE_DISPLAY(1,1,textzeile1); WRITE_DISPLAY(2,1,textzeile2); } timer.stop(); } void ballsensor() { float error=0; int Lasterror=0; int beginn=0,end=0; float P=0; float I=0; float D=0; float Kp=0.25; float Ki=0.00002/15; float Kd=1; float spd1=0; float spd2=0; float minspeed=0.28; float speed=0; char textzeile1[16]; char textzeile2[16]; bool speederror=false; int ballsensor=0; while(1) { READ_TASTER(); timer.start(); beginn=timer.read_us()/100; READ_I2C_HMC6352(); READ_I2C_IRSEEKER2(); end=timer.read_us()/100; ballsensor = CHAR_IRSEEKER2_DIRECTION;//ballsensor = INT_I2C_HMC6352_VALUE + 180 - kompassNull; error=(ballsensor-4);//INT_I2C_HMC6352_VALUE;//180-kompass; P=Kp*error; I=I+((end-beginn)*error)*Ki; D=Kd*((error-Lasterror)/(end-beginn)); Lasterror=error; if(error==0) I=0; /* if((spd1<minspeed)&&(spd1>0)) spd1=minspeed; if((spd1>-minspeed)&&(spd1<0)) spd1=-minspeed; if((spd2<minspeed)&&(spd2>0)) spd2=minspeed; if((spd2>-minspeed)&&(spd2<0)) spd2=-minspeed;*/ spd1=speed+(P+I+D); spd2=speed-(P+I+D); /* if((spd1>0)&&(spd1<0.25)) spd1=0.28; if((spd1<0)&&(spd1>-0.25)) spd1=-0.28; if((spd2>0)&&(spd2<0.25)) spd2=0.28; if((spd2<0)&&(spd2>-0.25)) spd2=-0.28;*/ WRITE_MOTOR_SPEED(1, spd1); WRITE_MOTOR_SPEED(2, spd2); sprintf(textzeile1,"%.0f %.3f ",error,P); sprintf(textzeile2,"%.3f %.3f ",I,D); //sprintf(textzeile2,"%.3f %.3f ",spd1,spd2); WRITE_DISPLAY(1,1,textzeile1); WRITE_DISPLAY(2,1,textzeile2); } timer.stop(); } int main() { KEPLERBRAIN_INIT(); // Variablendefinition globale Variablen char status = 1; char textzeile1[16]; char textzeile2[16]; float speed1=0; float speed2=0; float error=0; bool schleife1=true,ausgleichen2=false; while(schleife1==true) { // Sensoren einlesen READ_TASTER(); READ_I2C_HMC6352(); // Ereignisbehandlung if((BOOL_TASTER_RECHTS_PRESSED==true)) { wait(2); ausgleichen2=true; ballsensor(); } if(!ausgleichen2) { WRITE_MOTOR_STOP(1); WRITE_MOTOR_STOP(2); } if((BOOL_TASTER_LINKS_PRESSED==true)&&(speed2<=0.9)) drehen(90); //sprintf(textzeile1,"Grad: %3u ",INT_I2C_HMC6352_VALUE); //sprintf(textzeile1,"Grad: %3u ",INT_I2C_HMC6352_VALUE); //sprintf(textzeile2,"ballsens: %3u ",); //drehen(90); //gerade(0.7); //schleife=false; // Ansteuerung Aktoren WRITE_DISPLAY(1,1,textzeile1); WRITE_DISPLAY(2,1,textzeile2); } }