DERPS
Dependencies: BMP280 BNO055_fusion PowerControl mbed
Fork of STRAIGHT_DRIVE_NO_SEP by
main.cpp
- Committer:
- 12104404
- Date:
- 2016-04-27
- Revision:
- 39:ecc9defe3dc0
- Parent:
- 38:16208e003dc9
File content as of revision 39:ecc9defe3dc0:
#include "LOCALIZE.h" #include "LOCOMOTION.h" #include "SAFETY.h" #include "BMP280.h" #define WATCHDOG_TIME 10 //#define PC_MODE 1 #define IMPELLER_OFF 1000 #define IMPELLER_SPEED 1285 #define IMPELLER_STEPS 5 #define IMPELLER_STEP ((IMPELLER_SPEED-IMPELLER_OFF)/IMPELLER_STEPS) #if defined (PC_MODE) Serial pc(USBTX, USBRX); #else Serial pc(p13, p14); Ticker t; void send(); #endif DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); SAFETY safe; PwmOut suction(p26); I2C i2c2(p28, p27); I2C i2c1(p9, p10); BMP280 pres(i2c2); LOCALIZE loc(i2c1, i2c2, p29, p5, p6, p7, p8, led1, led2, led3, led4); LOCALIZE_xya xya; LOCOMOTION motion(p11, p23, p24, p21, p22, p16, p15, led1, led2, led3, led4); void BrownOut(); int xTarget=FRAME_W; int angle_error=1; bool xGood=false; bool yGood=false; bool angleGood=false; int angleTarget=355; int pressure; int cmd=-1; int main() { //Set ESC Period suction.period_ms(2); //Initialize to 0 suction.pulsewidth_us(1000); wait(2); //Watchdog Reset Indicator if ((LPC_WDT->WDMOD>>2)&1) led4=1; else led3=1; //Start Watchdog safe.kick(WATCHDOG_TIME); //Power Down Ethernet and USB and Enable Brown Out Interrupt safe.init((unsigned)BrownOut); //Serial Baudrate pc.baud(9600); //Initialize Locomotion loc.init(); //pres.initialize(); //Attach Periodic Wireless Printing #if not defined(PC_MODE) pc.attach(&callback); t.attach(&send,1); #endif led1=0; led2=0; led3=0; led4=0; for(int i=0; i<IMPELLER_STEPS; i++) { suction.pulsewidth_us((i*IMPELLER_STEP)+IMPELLER_OFF); wait(0.5); } while(1) { suction.pulsewidth_us(1285); //Finish if (xya.y>FRAME_H*0.75) { while(1) { uint8_t i=0; suction.pulsewidth_us(1285); motion.mStop(); led1= (i & (1<<0))>>0; led2= (i & (1<<1))>>1; led3= (i & (1<<2))>>2; led4= (i & (1<<3))>>3; i++; safe.kick(); } } loc.get_xy(&xya); xGood=motion.setXPos(xTarget,xya.x,2,0); if(!xGood) motion.setAngle(angleTarget,xya.a,angle_error,ANGLE_BIAS); else { xTarget=(xTarget==FRAME_W)?0:FRAME_W; angleTarget=(angleTarget==5)?-5:5; } #if defined(PC_MODE) pc.printf("X: %3d\tY: %3d\tP: %3d\txGood: %d\tAngleGood: %d\tState: %d \n",xya.y,yTarget,xya.a,xGood,angleGood,xState); #endif //Feed the dog safe.kick(); } } void callback() { __disable_irq(); while(pc.readable()==1) cmd=pc.getc(); switch(cmd) { case 2: break; default: break; } __enable_irq(); } void send() { if(pc.readable()==0) { //Print over serial port to WiFi MCU pc.printf("%c%c%c%c\n",(char)xya.x,(char)xya.y,xya.a/10,xya.a%10); } } void BrownOut() { //Stop Motors and Driver motion.eStop(); //Ensure suction on suction.pulsewidth_us(1250); //Light Up Error Light Pattern led1=1; led2=0; led3=1; led4=0; //Power Down Non Essential Peripheral_PowerDown(~(LPC1768_PCONP_PCPWM1 | LPC1768_PCONP_PCGPIO)); //Sleep wake by interrupt //Sleep(); }