Library to control the bike (just basic for now)
BikeControl.cpp
- Committer:
- ptuytsch
- Date:
- 2016-07-18
- Revision:
- 1:39f462024f10
- Parent:
- 0:792a8f167ac0
File content as of revision 1:39f462024f10:
#include "mbed.h" #include "BikeControl.h" #include "BikeData.h" #include "BatteryState.h" BikeControl::BikeControl(BikeData* bikeData, BatteryState* trailerBat, BatteryState* bikeBat, BatteryState* auxBat): trailerCtrl(PB_1), motorRightCtrl(PB_15), motorRightCounter(0), motorRightRpm(0), motorLeftCtrl(PB_13), motorLeftCounter(0), motorLeftRpm(0), motorRightHall(PC_13), motorLeftHall(PC_1), //BRAKE brakeFront(PC_10), brakeRear(PC_12), //GENERATOR generatorHallA(PD_2), generatorBrake(PC_9), generatorHallACounter(0), generatorHallARpm(0), generatorHallB(PC_3), generatorHallBCounter(0), generatorHallBRpm(0), //BUTTONS ON STEERING //userButton(USER_BUTTON), buttonGreen(PB_11), buttonRed(PB_12), buttonDirectionRight(PA_15), buttonDirectionLeft(PB_7), //SWITCH switchOn(PC_11), switchWalk(PB_2), //LIGHT lightFront(PB_14), lightBack(PA_11), lightLeft(PC_6), lightRight(PC_8), bd(bikeData), bikeBat(bikeBat), trailerBat(trailerBat), auxBat(auxBat) { //PullUp on userButton input //userButton.mode(PullUp); //PullUp on brake inputs brakeFront.mode(PullUp); brakeRear.mode(PullUp); //Call function on rise of interruptpin generatorHallA.rise(this, &BikeControl::generatorHallAPulsed); generatorHallB.rise(this, &BikeControl::generatorHallBPulsed); generatorBrake.period_us(50); generatorBrake.write(0.5f); generatorHallACounter=0; generatorHallARpm=0; generatorHallBCounter=0; generatorHallBRpm=0; //motor motorRightCtrl.period_ms(100); motorRightCtrl.write(0.0f); motorRightHall.rise(this, &BikeControl::motorRightPulsed); motorLeftCtrl.period_ms(100); motorLeftCtrl.write(0.0f); motorLeftHall.rise(this, &BikeControl::motorLeftPulsed); //Button inputs buttonGreen.mode(PullUp); buttonRed.mode(PullUp); buttonDirectionRight.mode(PullUp); buttonDirectionLeft.mode(PullUp); //SWITCH switchOn.mode(PullUp); switchWalk.mode(PullUp); //t.attach(this, &BikeControl::periodicCallback, 0.5); } void BikeControl::startControlLoop(){ t.attach(this, &BikeControl::periodicCallback, 0.5); } void BikeControl::periodicCallback(){ //printf("callback\n"); generatorHallARpm = generatorHallACounter*2; //60 rising edges/ rotation means Rpm is equal to the counter value in 1 sec generatorHallACounter = 0; generatorHallBRpm = generatorHallBCounter*2; //60 rising edges/ rotation means Rpm is equal to the counter value in 1 sec generatorHallBCounter = 0; motorRightRpm = motorRightCounter*2; motorRightCounter = 0; motorLeftRpm = motorLeftCounter*2; motorLeftCounter = 0; if (generatorHallARpm>0) { printf("RPM generator Hall A = %i\n",generatorHallARpm); } if (generatorHallBRpm>0) { printf("RPM generator Hall B = %i\n",generatorHallBRpm); } if (motorRightRpm>0) { printf("RPM motor Right = %i\n",motorRightRpm); } if (motorLeftRpm>0) { printf("RPM motor Left = %i\n",motorLeftRpm); } //printf("light control\n"); //Turning LIGHT to RIGHT if (!buttonDirectionRight) { lightRight=!lightRight; } else { lightRight=0; } //Turning LIGHT to Left if (!buttonDirectionLeft) { lightLeft=!lightLeft; } else { lightLeft=0; } // Check if the Lights need to be on if(!buttonRed) { lightFront=1; if (trailerBat->getBatteryPercentage()<30) {lightBack=!lightBack;} else {lightBack=1;} } else { lightFront=0; if (trailerBat->getBatteryPercentage()<30) {lightBack=!lightBack;} else {lightBack=0;} } } void BikeControl::generatorHallAPulsed() { generatorHallACounter++; } void BikeControl::generatorHallBPulsed() { generatorHallBCounter++; } void BikeControl::motorRightPulsed() { motorRightCounter++; } void BikeControl::motorLeftPulsed() { motorLeftCounter++; } void BikeControl::runTestLight() { printf("front\n"); lightFront =1; //wait(1); for(uint32_t i = 0; i<0xFFFFFF; i++); //WAIT STATEMENT CAUSES FREEZING!!!!! USE FOR LOOP IN STEAD, device can not handle wait and interrupts at same time! lightFront = 0; printf("back\n"); lightBack = 1; //wait(1); for(uint32_t i = 0; i<0xFFFFFF; i++); lightBack = 0; printf("left\n"); lightLeft = 1; //wait(1); for(uint32_t i = 0; i<0xFFFFFF; i++); lightLeft = 0; printf("right\n"); lightRight = 1; //wait(1); for(uint32_t i = 0; i<0xFFFFFF; i++); lightRight = 0; //wait(1); } void BikeControl::checkStatus(){ //STATE MACHINE if (!brakeFront || !brakeRear) { if(!brakeFront) { printf("BRAKE front \n"); } if(!brakeRear) { printf("BRAKE rear \n"); } motorRightCtrl.write(0.0f); motorLeftCtrl.write(0.0f); trailerCtrl=0; } else if (!buttonGreen) { if (motorRightRpm<=61) {// motorRightRpm=61 means 6km/h motorRightCtrl.write(1.0f); motorLeftCtrl.write(1.0f); trailerCtrl=1; } else { if (generatorHallARpm<10) { motorRightCtrl.write(0.0f); motorLeftCtrl.write(0.0f); trailerCtrl=0; } else if(generatorHallARpm<=100) { motorRightCtrl.write(generatorHallARpm*0.004f); motorLeftCtrl.write(generatorHallARpm*0.004f); if (motorRightRpm<190) { //boven de 18km/h enkel de trekker aansturen trailerCtrl=1; } else { trailerCtrl=0; } } else if (generatorHallARpm>100) { motorRightCtrl.write(0.4f); motorLeftCtrl.write(0.4f); if (motorRightRpm<190) { //boven de 18km/h enkel de trekker aansturen trailerCtrl=1; } else { trailerCtrl=0; } } } } else if (generatorHallARpm>=0) { if (generatorHallARpm<10) { motorRightCtrl.write(0.0f); motorLeftCtrl.write(0.0f); trailerCtrl=0; } else if(generatorHallARpm<=100) { motorRightCtrl.write(generatorHallARpm*0.004f); motorLeftCtrl.write(generatorHallARpm*0.004f); if (motorRightRpm<190) { trailerCtrl=1; } else { trailerCtrl=0; } } else if (generatorHallARpm>100) { motorRightCtrl.write(0.4f); motorLeftCtrl.write(0.4f); if (motorRightRpm<190) { trailerCtrl=1; } else { trailerCtrl=0; } } } }