Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp
- Committer:
- fraserhmbed
- Date:
- 2015-03-11
- Revision:
- 0:f54028dab58f
- Child:
- 1:c4af0bbe20b9
File content as of revision 0:f54028dab58f:
/* what target am i at?
wait for input from phone
if input is 1 or 2 then return number to choose target choice function which then fires at target
did i hit the target?
wait for input from phone
if input is yes then go back to maze navigation function
if input is no then try again
********************************************************** */
#include "mbed.h"
Serial blue(PTC4,PTC3);
DigitalOut led(LED1);
// which target are we at?
int TargetChoice(){
blue.printf("Which target am I at?"); // ask user question
char TargetIn = blue.getc(); // assign user input to TargetIn
int command=0, choice = 0;
while(command==0) { // loop until a command has been given
switch (TargetIn) { // input is either 1 or 2 in DECIMAL
case 0x31: // if target 1
choice=1; //
command = 1; // exit while
break;
case 0x32: // if target 2
choice=2; // return 2 to ball firing or call ball fire 2
command = 1; // exit while
break; }
}
return choice; // return which target to fire at
}
// did we hit the target
int SuccessCheck(){
blue.printf("Did I hit the target?"); // ask user question
char SuccessIn = blue.getc(); // assign user input to SuccessIn
int command=0, success=0;
while(command==0) { // loop until a command has been given
switch (SuccessIn) { // input either y (0x79) or n (0x6E)
case 0x79: // if input is y
success=1; // return 1 directs to go back to the maze and locate next target
command = 1;
break;
case 0x6E: // if input is n
success=0; // return 0 to go back to trying to hit the target
command = 1;
break; }
}
return success;
}
//main bluetooth operation function
void MazeBluetoothing() {
// int bluetooth=0; does this still initialise int bluetooth to 0? for the while loop?
while(int bluetooth=0){
int target = TargetChoice(); // call target choosing function
// if target = 1 then call function to fire at target 1, if target = 2 then call fire function 2
switch (target) {
case 1:
//call target 1 function
break;
case 2:
//call target 2 function
break;
}
int success = SuccessCheck();
// if success is 0, then reposition & go back to start of bluetoothing()
switch (success) {
case 0:
// call repositioning functionthen break to go back to loop of bluetoothing
break;
case 1:
bluetooth=1;
break;
}
}
}
//motor select pins
DigitalOut motor_lf(PTE2);
DigitalOut motor_lb(PTE3);
DigitalOut motor_rf(PTE4);
DigitalOut motor_rb(PTE5);
//Frequency of Pulse Width Modulated signal in Hz
#define PWM_FREQ 1000
//PWM pin (Enable 1 and 2)
PwmOut motor_l (PTC2);
PwmOut motor_r (PTE29);
//LED to test
DigitalOut myled(LED_BLUE);
void set_direction( int direction, float speed, float angle)
{
/* *******************Example Use*****************
set_direction("11", 0.5, 0); //This would set the robot to go forward, at half speed, straight
set_directin( "11", 0.8, 0.2); //this would set robot to go forward, at 100% to the right and 60% to the left (turn right)
set_direction("00", 0.3, 0.7); //robot back, 100% rightmotor; 0%left (technically -40%, but 0% is min)
set_direction("11", 0.5, 0.5); // robot pivots forward, to the right, full speed (100% duty right ; 0% duty left)
set_direction("11", 0.5, -0.5); //robot pivots forward, to the left, full speed (0% duty right ; 100% duty left)
set_direction("11", 0.3, 0.5); //robot pivots forard, to the right , at 80% speed (80% right; 0% left)
set_direction("11", -0.3, 0.5); //robot pivotrs foward, to the right, AT 20% SPEED (20%, 0%)
set_direction("10", 0.5, 0); //robot spins to teh right, at half speed. Left forward 50% ; Right forward 50%
set_direction("10", 0.5, 0.3); //robot spins to the right, 80% right forward ; 20% left backward
*/
float r_result = (speed + angle); //where angle can be postive and negative and will TURN the robot
float l_result = (speed - angle); //if turning left, you'd make the angle postive (right motor goes faster left motor goes slwoer)
switch( direction ) {
case 0x11: { //forward
motor_r.write( r_result < 0 ? 0 : r_result > 1 ? 1 : r_result);
//Look up ternary statements -- {condition ? value_if_true : value_if_false} This makes 0<result<1
motor_l.write( l_result < 0 ? 0 : l_result > 1 ? 1 : l_result);
motor_rf=1;
motor_rb=0;
motor_lf=1;
motor_lb=0;
}
case 0x00: { //backward
motor_r.write( r_result < 0 ? 0 : r_result > 1 ? 1 : r_result);
motor_l.write( l_result < 0 ? 0 : l_result > 1 ? 1 : l_result);
motor_rf=0;
motor_rb=1;
motor_lf=0;
motor_lb=1;
}
case 0x01: { //spin left -- Right forward, left backward
motor_r.write( r_result < 0 ? 0 : r_result > 1 ? 1 : r_result);
motor_l.write( l_result < 0 ? 0 : l_result > 1 ? 1 : l_result);
motor_rf=1;
motor_rb=0;
motor_lf=0;
motor_lb=1;
}
case 0x10: { //spin right
motor_r.write( r_result < 0 ? 0 : r_result > 1 ? 1 : r_result);
motor_l.write( l_result < 0 ? 0 : l_result > 1 ? 1 : l_result);
motor_rf=0;
motor_rb=1;
motor_lf=1;
motor_lb=0;
}
}
}
void SpinFunct() {
//Set PWM frequency to 1000Hz
motor_l.period( 1.0f / (float) PWM_FREQ);
motor_r.period( 1.0f / (float) PWM_FREQ);
//Initialise direction to nothing.
motor_rf=0;
motor_rb=0;
motor_lf=0;
motor_lb=0;
led=1;
set_direction(0x10, 0.5, 0.3); //robot spins to the right, 80% right forward ; 20% left backward
wait(5); led=0;
}
void JiveFunct() {
//Set PWM frequency to 1000Hz
motor_l.period( 1.0f / (float) PWM_FREQ);
motor_r.period( 1.0f / (float) PWM_FREQ);
//Initialise direction to nothing.
motor_rf=0;
motor_rb=0;
motor_lf=0;
motor_lb=0;
//forward + right spin
wait(2);
myled = !myled;
set_direction(0x11, 0.3, 0.5); //robot pivots forard, to the right , at 80% speed (80% right; 0% left)
// back spin
wait(2);
myled = !myled;
set_direction(0x00, 0.3, 0.7); //robot back, 100% rightmotor; 0%left (technically -40%, but 0% is min)
//
wait(2);
myled = !myled;
set_direction(0x01, 0.3, 0.4); //robot spins to teh left, at half speed. Left forward 70% ; Right 0% (technically -30%, but 0% is min)
wait(2);
myled = !myled;
set_direction(0x10, 0.5, 0); //robot spins to teh right, at half speed. Left forward 50% ; Right forward 50%
/*
wait(2);
led = !led;
set_direction(0x11, 0.5, 0); //This would set the robot to go forward, at half speed, straight
wait(2);
led = !led;
set_direction(0x11, 0.8, 0.2); //this would set robot to go forward, at 100% to the right and 60% to the left (turn right)
wait(2);
led = !led;
set_direction(0x11, 0.5, 0.5); // robot pivots forward, to the right, full speed (100% duty right ; 0% duty left)
wait(2);
led = !led;
set_direction(0x11, 0.5, -0.5); //robot pivots forward, to the left, full speed (0% duty right ; 100% duty left)
wait(2);
led = !led;
set_direction(0x11, -0.3, 0.5); //robot pivotrs foward, to the right, AT 20% SPEED (20%, 0%)
wait(2);
led = !led;
set_direction(0x10, 0.5, 0); //robot spins to teh right, at half speed. Left forward 50% ; Right forward 50%
wait(2);
led = !led;
set_direction(0x10, 0.5, 0.3); //robot spins to the right, 80% right forward ; 20% left backward
*/
}
// will just make a question at the end to say quit? yes or no. it's possible to make a quitter function and test the input for quit
// at every point but it's too annoying to get it to work... so fuk dat
void RemoteControl(){ char dir[2]; /*speed=0, angle=0, time=0, */ int quit=0;
while(quit==0) {
wait(1);
//dir
blue.printf("Direction?\n");
while ( blue.readable() ) {} // loops until there is an input from the user
for(int i=0; i<2; i++) { dir[2] = blue.getc(); } //Store incoming response into array
blue.printf("%c dir\n", dir);
}
}
//for(int i=0; i<4; i++) { quitarray[i]= blue.getc(); blue.printf("get %c", quitarray[i]); } //Store incoming response into array
//quit=Quitter(quitarray);
/*
//speed
blue.printf("Speed?");
while ( blue.readable() ) {} // loops until there is an input from the user
speed=blue.getc();
quit=Quitter();
//angle
blue.printf("Angle?");
while (blue.readable()==0) {} // loops until there is an input from the user
angle=blue.getc();
quit=Quitter();
//time
blue.printf("How long?");
while (blue.readable()==0) {} // loops until there is an input from the user
time=blue.getc();
quit=Quitter();
*/
//set_direction(dir, speed, angle); //also find a way to do time too
//wait(time);
/*
send 11, 0.5, 0.2 in one string
for the floats, it will send (num)(point)(num) ef 0.3 = 30, 2E, 33
all in ASCII remember
so for:
11 0.5 0.2
it will send:
31 31 20 30 2e 35 20 30 2e 32
sending 313120302e3520302e32 would cause a stack overload
going to have to split the user into 3 different lines of tx
so it'd be simpler too but more difficult for the user to control.
might need to add in a "for how long for?" function that will only drive the motors for a short period of time
user would have to be knowledgeable of the set direction function aka get daniel to do the demonstration
so then user sends: direction 11,10,01; speed 0.2,0.5,0.7; angle 0.2,0.4,0.8; time 1,2,3,4;
yes it is slow, but it allows for exact computation of distance, speed and angle
so 1 function with 4 different while loops
while user has not input a direction, loop again
one function : remote control
*/
int main(){
int spin[4] = {0x73, 0x70, 0x69, 0x6e};
int jive[4] = {0x6a, 0x69, 0x76, 0x65};
int ctrl[4] = {0x63, 0x74, 0x72, 0x6c};
int maze[4] = {0x6d, 0x61, 0x7a, 0x65};
unsigned char x[4];
while (1) {
blue.printf("What will I do?\n"); // ask user question
while (blue.readable()==0) {} // loops until there is an input from the user
for(int i=0; i<4; i++) { x[i] = blue.getc(); } //Store incoming response into array
int FindSpin=0, FindJive=0, FindCtrl=0, FindMaze=0;
for(int s=0; s<4; s++) {
if (x[s]==spin[s]) { FindSpin++; }
if (x[s]==jive[s]) { FindJive++; }
if (x[s]==ctrl[s]) { FindCtrl++; }
if (x[s]==maze[s]) { FindMaze++; }
}
if (FindSpin==4) { SpinFunct();}
if (FindJive==4) { JiveFunct();}
if (FindCtrl==4) { RemoteControl() ;}
if (FindMaze==4) {led=1; wait(4); led=0;}
}
}
/*
int Quitter(char x[4]) { int quit=0; char quitting[4]={0x71, 0x75, 0x69, 0x74};
blue.printf ("works");
for(int i=0; i<4; i++) { x[i] = blue.getc(); } //Store incoming response into array
for(int s=0; s<4; s++) {
if (x[s]==quitting[s]) { quit++; }
}
if (quit==4) { quit=1;}
return quit;
}
*/