Mouse code for the MacroRat
main.cpp
- Committer:
- kyleliangus
- Date:
- 2017-05-06
- Revision:
- 9:1d8e4da058cd
- Parent:
- 8:a0760acdc59e
- Child:
- 10:810d1849da9d
File content as of revision 9:1d8e4da058cd:
#include "mbed.h" #include "irpair.h" #include "main.h" #include "motor.h" #include <stdlib.h> #include "ITG3200.h" #include "QEI.h" // PID #define P_CONSTANT 0 #define I_CONSTANT 0 #define D_CONSTANT 0 #define IP_CONSTANT 6 #define II_CONSTANT 0 #define ID_CONSTANT 1 #include "QEI.h" #define PULSES 880 #define SAMPLE_NUM 100 void moveForwardUntilWallIr() { double currentError = 0; double previousError = 0; double derivError = 0; double sumError = 0; double HIGH_PWM_VOLTAGE = 0.2; double rightSpeed = 0.2; double leftSpeed = 0.2; float ir2 = IRP_2.getSamples( SAMPLE_NUM ); float ir3 = IRP_3.getSamples( SAMPLE_NUM ); while ((IRP_1.getSamples( SAMPLE_NUM ) + IRP_4.getSamples( SAMPLE_NUM ) )/2 < 0.05f) { currentError = ( (IRP_2.getSamples( SAMPLE_NUM ) - IRP_2.sensorAvg) ) - ( (IRP_3.getSamples( SAMPLE_NUM ) - IRP_3.sensorAvg) ) ; derivError = currentError - previousError; double PIDSum = IP_CONSTANT*currentError + II_CONSTANT*sumError + ID_CONSTANT*derivError; if (PIDSum > 0) { // this means the leftWheel is faster than the right. So right speeds up, left slows down rightSpeed = HIGH_PWM_VOLTAGE - abs(PIDSum*HIGH_PWM_VOLTAGE); leftSpeed = HIGH_PWM_VOLTAGE + abs(PIDSum*HIGH_PWM_VOLTAGE); } else { // r is faster than L. speed up l, slow down r rightSpeed = HIGH_PWM_VOLTAGE + abs(PIDSum*HIGH_PWM_VOLTAGE); leftSpeed = HIGH_PWM_VOLTAGE - abs(PIDSum*HIGH_PWM_VOLTAGE); } if (leftSpeed > 0.30) leftSpeed = 0.30; if (leftSpeed < 0) leftSpeed = 0; if (rightSpeed > 0.30) rightSpeed = 0.30; if (rightSpeed < 0) rightSpeed = 0; right_motor.forward(rightSpeed); left_motor.forward(leftSpeed); previousError = currentError; ir2 = IRP_2.getSamples( SAMPLE_NUM ); ir3 = IRP_3.getSamples( SAMPLE_NUM ); } //sensor1Turn = IR_Sensor1.read(); //sensor4Turn = IR_Sensor4.read(); //backward(); wait_ms(40); //brake(); left_motor.brake(); right_motor.brake(); while( 1 ) { } } int main() { //enableMotors(); //Set highest bandwidth. gyro.setLpBandwidth(LPFBW_42HZ); serial.baud(9600); serial.printf("The gyro's address is %s", gyro.getWhoAmI()); wait (0.1); // IR_1.write(1); // IR_2.write(1); // IR_3.write(1); // IR_4.write(1); redLed.write(1); greenLed.write(0); blueLed.write(1); //left_motor.forward(0.1); //right_motor.forward(0.1); // PA_1 is A of right // PA_0 is B of right // PA_5 is A of left // PB_3 is B of left QEI encoder0( PA_5, PB_3, NC, PULSES, QEI::X4_ENCODING ); QEI encoder1( PA_1, PA_0, NC, PULSES, QEI::X4_ENCODING ); while (1) { moveForwardUntilWallIr(); wait(0.1); //serial.printf("%i, %i, %i\n", gyro.getGyroX(), gyro.getGyroY(), gyro.getGyroZ()); //serial.printf("Pulse Count=> e0:%d, e1:%d \r\n", encoder0.getPulses(),encoder1.getPulses()); //double currentError = ( (IRP_2.getSamples( SAMPLE_NUM ) - IRP_2.sensorAvg) ) - ( (IRP_3.getSamples( SAMPLE_NUM ) - IRP_3.sensorAvg) ) ; //serial.printf("IRS= >: %f, %f, %f, %f, %f \r\n", // IRP_1.getSamples( 100 ), IRP_2.getSamples( 100 ), IRP_3.getSamples( 100 ), IRP_4.getSamples(100), currentError ); //reading = Rec_4.read(); // serial.printf("reading: %f\n", reading); // redLed.write(0); // wait_ms(1000); // redLed.write(1); // greenLed.write(0); // wait_ms(1000); // greenLed.write(1); // blueLed.write(0); // wait_ms(1000); // blueLed.write(1); } }