Final Version of food controller
Dependencies: MMA8451Q TSI mbed
Fork of foodcontroller_NoWiFi by
main.cpp
- Committer:
- danlock10y
- Date:
- 2016-06-10
- Revision:
- 10:c0514aae862c
- Parent:
- 9:de6dd11d89ba
File content as of revision 10:c0514aae862c:
/** Food Controller main.cpp Board ID: 1 Purpose: This function runs on a FRDM KL25Z. It uses the accelerometer to measure the tilt of the board. It outputs a 2 bit number that describes the direction. The board is also fitted with four LEDS oriented in the following configuration: o8o to provide feedback to the user. This board also makes use of the touch sensor input to set a variable speed for the food, formerly indicated by RGB LED (functionality removed due to power issues) @author Daniel Lock @author Jamie Gnodde @version */ #include "mbed.h" #include "TSISensor.h" #include "MMA8451Q.h" #define MMA8451_I2C_ADDRESS (0x1d<<1) Serial pc(USBTX, USBRX); // tx, rx used for printing to the PC screen during debugging TSISensor tsi; //Setup touch sensor MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); //Setup accelerometer DigitalOut lefthigh(PTC5); //LED for left DigitalOut leftlow(PTA4); DigitalOut righthigh(PTC11); //LED for right DigitalOut rightlow(PTC9); DigitalOut forwardhigh(PTC6); //LED for forward DigitalOut forwardlow(PTC10); DigitalOut backwardhigh(PTA5); //LED for backward DigitalOut backwardlow(PTC8); RawSerial dev(PTE0,PTE1); // for KL25Z... asuming one can't use the PTA1 version which is the stdio DigitalOut rst(PTD1); // single digital pin to drive the esp8266 reset line int Direction; //2 bit number to describe direction 0 forward assigned CW int PrevDirection; //2 bit number to describe last direction sent ot server int Velocity; //2 bit number to vary velocity in game int PrevVelocity; //2 bit number to describe last velocity sent ot server bool right; //Right or left? right = 1 bool forward; //Forward or Backward? forward = 1 // subroutine to run anytime a serial interrupt arrives from the device // this basically passes everything thatthe device produces on to the pc terminal screen void dev_recv() { //led1 = !led1; while(dev.readable()) { pc.putc(dev.getc()); //wait_us(1); } } // subroutine to service the serial interrupt on the pc connection // this is a bit more complex - it takes what the use sends on the pc and copies it on to the device // the esp should echo these straight back to the the pc if all is well // this also detects the end of command character which is ascii 13 (0x0d) adn adds a linefeed after it =asscii 10 (0x0a) void pc_recv() { char c; //led4 = !led4; while(pc.readable()) { c=pc.getc(); dev.putc(c); pc.putc(c); // echo back if(c==13) {dev.putc(10); // send the linefeed to complement the carriage return generated by return key on the pc pc.putc(10); } } } void setupWiFi() { dev.printf("AT+RST\r\n"); //Reset WiFi pc.printf("RESET\r\n"); wait(2); dev.printf("AT+CWMODE=1\r\n"); //Set mode to client wait(2); dev.printf("AT+CWJAP=\"CWMWIFI\",\"CWM2016TT\"\r\n"); //Login to the WiFi wait(7); dev.printf("AT+CIFSR\r\n"); //Find IP and MAC address - not necessary? wait(5); dev.printf("AT+CIPMUX=1\r\n"); //Allow multiple connections wait(2); dev.printf("AT+CIPSTART=0,\"TCP\",\"192.168.1.6\",5050\r\n"); //Open connection with the server } int main() { //Initialise WiFi stuff rst=0; wait(1); rst=1; // send the esp8266 reset wait(1); pc.printf("ok off we go....\n\r"); pc.baud(115200); // NB maybe this should go before this dev.baud(115200); pc.attach(&pc_recv, Serial::RxIrq); // attach the two interrupt services dev.attach(&dev_recv, Serial::RxIrq); PrevDirection = 4; //Initialise PrevDirection with a value that will mean it will always pass throught he if at the end PrevVelocity = 4; //Initialise PrevVelocity with a value that will mean it will always pass throught he if at the end setupWiFi(); //Run the WiFi setup while (1) { float accX=acc.getAccX(); //Measure acceleration in X direction float accY=acc.getAccY(); //Measure acceleration in Y direction if (tsi.readDistance() != 0) //Only execute if the touch sensor is being pressed { if (tsi.readDistance() <= 13) //Length of touch sensor divided into three distinct zones, this defines top zone { Velocity = 3; //Top zone -> highest velocity (varies 1-3) /*rled = 0; //Use the RGB LED as an indicator for which speed is selected bled = 1; gled = 1;*/ //removed due to power issues } if (tsi.readDistance() > 13 && tsi.readDistance() < 26) //Middle zone of touch sensor { Velocity = 2; //Middle zone -> middle velocity /*rled = 1; //Use the RGB LED as an indicator for which speed is selected bled = 0; gled = 1; */ } if (tsi.readDistance() >= 26) { Velocity = 1; //Bottom zone -> lowest velocity /* rled = 1; //Use the RGB LED as an indicator for which speed is selected bled = 1; gled = 0;*/ } //printf("x=%d\r\n",Velocity); //Print the velocity to the serial for debugging wait(0.2); //May be left over from debugging? }//endif touch sensor //Establish whether the board is tilted left or right if (accX > 0.1) { right = false; //printf("left \r\n"); }//endif if (accX < -0.1) { right = true; //printf("right \r\n"); }//endif wait(0.1); //May be left over from debugging? //Establish whether the board is tilted front or back if (accY > 0.1) { forward = false; //printf("back \r\n"); }//endif if (accY < -0.1) { forward = true; //printf("for \r\n"); }//endif wait(0.1); //May be left over from debugging? //Establish the main axis of tilting so that the control outputs one direction if(abs(accY) > abs(accX)) { if(forward == true) { Direction = 0; //Direction variable is a two bit number 0-3 0 is forward lefthigh = 0; //Light up the forward LED, make sure all others are off leftlow = 0; righthigh = 0; rightlow = 0; forwardhigh = 1; forwardlow = 0; backwardhigh = 0; backwardlow = 0; }//endif else { Direction = 2; //Direction variable is a two bit number 0-3 2 is backward lefthigh = 0; //Light up the backward LED, make sure all others are off leftlow = 0; righthigh = 0; rightlow = 0; forwardhigh = 0; forwardlow = 0; backwardhigh = 1; backwardlow = 0; }//endelse }//endif else { if(right == true) { Direction = 1; //Direction variable is a two bit number 0-3 1 is right lefthigh = 0; //Light up the right LED, make sure all others are off leftlow = 0; righthigh = 1; rightlow = 0; forwardhigh = 0; forwardlow = 0; backwardhigh = 0; backwardlow = 0; }//endif else { Direction = 3; //Direction variable is a two bit number 0-3 3 is left lefthigh = 1; //Light up the left LED, make sure all others are off leftlow = 0; righthigh = 0; rightlow = 0; forwardhigh = 0; forwardlow = 0; backwardhigh = 0; backwardlow = 0; }//endelse }//endelse //pc.printf("Direction = %d \r\n", Direction); //Print the direction variable to screen for debugging //Only send data to the server if the direction has changed if(Direction != PrevDirection || Velocity != PrevVelocity) { //Send Direction and Velocity to server dev.printf("AT+CIPSEND=0,11\r\n"); wait(0.1); //pc.printf("1dir%dvel%d\r\n",Direction,Velocity); //Identifier,Direction Tag,Direction Value,Velocity Tag,Velocity Value dev.printf("1dir%dvel%d\r\n",Direction,Velocity); //Identifier,Direction Tag,Direction Value,Velocity Tag,Velocity Value PrevDirection = Direction; //Store Direction just sent as last sent direction PrevVelocity = Velocity; //Store Velocity just sent as last sent velocity } }//endwhile }//endmain