Jacob Katz
/
Superball_Ball2
This is the code we used in our final implementation of our spherical robot.
main.cpp
- Committer:
- katzjacob
- Date:
- 2012-05-06
- Revision:
- 0:63c4c959e87f
File content as of revision 0:63c4c959e87f:
#include "mbed.h" #include "MODSERIAL.h" DigitalOut myled1(LED1); DigitalOut myled2(LED2); DigitalOut myled3(LED3); DigitalOut myled4(LED4); //motor a PwmOut motFront(p21); DigitalOut frontIN1(p24); DigitalOut frontIN2(p25); //motor b PwmOut motLeft(p22); DigitalOut leftIN1(p27); DigitalOut leftIN2(p26); //motor c/d - motors are same in control just opposite direction so hardware can accomplish this PwmOut motRight(p23); DigitalOut rightIN1(p28); DigitalOut rightIN2(p29); //motor standby DigitalOut motRLstby(p30); DigitalOut motFstby(p20); //xBee configurations MODSERIAL pc(USBTX, USBRX); // tx, rx MODSERIAL xbee(p13, p14); //tx, rx //MODSERIAL bluetooth(p9, p10); DigitalOut rstXbee(p15); //motor globals int rightMotor; int leftMotor; DigitalOut LEDlow(p19); DigitalOut LEDmid(p18); DigitalOut LEDhigh(p17); DigitalOut LEDantenna(p16); /************************************************* function to receive packets from controller xbee *************************************************/ void xbeeReceive() { char packetFound = 0; char currentByte; if(xbee.rxBufferGetCount() == 0) { return; } while(xbee.rxBufferGetCount() >= 5) { currentByte = xbee.getc(); if(currentByte == 0xAA) { currentByte = xbee.getc(); if(currentByte == 0xBB) { //pc.printf("found the preamble"); currentByte = xbee.getc(); if(currentByte == 0x02) { //pc.printf("found a packet"); packetFound = 1; break; } } } } if(packetFound == 1) { //pc.printf("reading the packet"); //read in the motor commands int rightTemp = xbee.getc(); int leftTemp = xbee.getc(); //calculate checksum char checkSumCalc = 0; checkSumCalc ^= rightTemp; checkSumCalc ^= leftTemp; char checkSumSent = xbee.getc(); if(checkSumCalc == checkSumSent) { rightMotor = rightTemp; leftMotor = leftTemp; } else { // pc.printf("\n bad packet \n"); } } } /************************************************* main function *************************************************/ int main() { //reset the xbee rstXbee = 0; wait_ms(1); rstXbee=1; wait_ms(1); //led reset verification myled1 = 1; wait(0.1); myled2 = 1; myled1 = 0; wait(0.1); myled2=0; //initialize motor stuff motRLstby=1; motFstby=1; motFront = motLeft = motRight=0; frontIN1 = 0; frontIN2 = 0; leftIN1 = 0; leftIN2 = 0; rightIN1 = 0; rightIN2 = 0; rightMotor = 0; leftMotor = 0; LEDlow=LEDmid=LEDhigh=LEDantenna=0; while(1) { // bluetooth.putc('q'); xbeeReceive(); //read data from xbee // printf("right: %d ", rightMotor); // printf("left: %d \r\n", leftMotor); //rightMotor=rightMotor-8; //motor control //right motor if(rightMotor <= 135 && rightMotor >= 128) { //turn off motor motRight = 0.0; } else if(rightMotor > 135) { //right motor forward rightIN1=1; rightIN2=0; motRight = (((float)rightMotor-135.0)/120.0); } else if(rightMotor < 128) { //right motor backwards rightIN1=0; rightIN2=1; motRight = ((255.0-(float)rightMotor)/255.0); } //left motor if(leftMotor <= 142 && leftMotor >= 136) { //turn off motor motLeft = 0.0; } else if(leftMotor > 142) { //left motor forward leftIN1=0; leftIN2=1; motLeft = (((float)leftMotor-142.0)/113.0); } else if(leftMotor < 136) { //left motor backwards leftIN1=1; leftIN2=0; motLeft = ((255.0-(float)leftMotor)/255.0); } //front and back motors if(rightMotor < 15 && leftMotor > 240) //only kick in if there is a large different in directions of motors { //rotate clockwise motFstby=1; frontIN1 = 1; frontIN2 = 0; motFront = 1; LEDantenna=LEDlow=LEDmid=LEDhigh=1; // printf(" } else if(leftMotor < 15 && rightMotor > 240) { //rotate counter-clockwise motFstby=1; frontIN1 = 0; frontIN2 = 1; motFront = 1; LEDantenna=LEDlow=LEDmid=LEDhigh=1; } else { motFront=0; motFstby = 0; LEDantenna=LEDlow=LEDmid=LEDhigh=0; } } }