Oluwagbemiga Mabogunje / Mbed 2 deprecated 4180_Lab4_ScaredBot

Dependencies:   HALLFX_ENCODER Motor SDFileSystem mbed-rtos mbed wave_player

Committer:
omabogunje3
Date:
Thu Nov 03 20:50:10 2016 +0000
Revision:
0:d341b3ad1e2e
Code that implements 'ScaredBot' behavior.; Reacts to loud sounds (microphone) by rapidly moving away; Reacts to objects (IR sensor) by turning away; Uses Hall effect motor encoder to achieve more accurate motion

Who changed what in which revision?

UserRevisionLine numberNew contents of line
omabogunje3 0:d341b3ad1e2e 1 #include "mbed.h"
omabogunje3 0:d341b3ad1e2e 2 #include "rtos.h"
omabogunje3 0:d341b3ad1e2e 3 #include "Motor.h"
omabogunje3 0:d341b3ad1e2e 4 #include "HALLFX_ENCODER.h"
omabogunje3 0:d341b3ad1e2e 5 //#include "SDFileSystem.h"
omabogunje3 0:d341b3ad1e2e 6 //#include "wave_player.h"
omabogunje3 0:d341b3ad1e2e 7
omabogunje3 0:d341b3ad1e2e 8 class microphone
omabogunje3 0:d341b3ad1e2e 9 {
omabogunje3 0:d341b3ad1e2e 10 public :
omabogunje3 0:d341b3ad1e2e 11 microphone(PinName pin);
omabogunje3 0:d341b3ad1e2e 12 float read();
omabogunje3 0:d341b3ad1e2e 13 operator float ();
omabogunje3 0:d341b3ad1e2e 14 private :
omabogunje3 0:d341b3ad1e2e 15 AnalogIn _pin;
omabogunje3 0:d341b3ad1e2e 16 };
omabogunje3 0:d341b3ad1e2e 17 microphone::microphone (PinName pin):
omabogunje3 0:d341b3ad1e2e 18 _pin(pin)
omabogunje3 0:d341b3ad1e2e 19 {
omabogunje3 0:d341b3ad1e2e 20 }
omabogunje3 0:d341b3ad1e2e 21 float microphone::read()
omabogunje3 0:d341b3ad1e2e 22 {
omabogunje3 0:d341b3ad1e2e 23 return _pin.read();
omabogunje3 0:d341b3ad1e2e 24 }
omabogunje3 0:d341b3ad1e2e 25 inline microphone::operator float ()
omabogunje3 0:d341b3ad1e2e 26 {
omabogunje3 0:d341b3ad1e2e 27 return _pin.read();
omabogunje3 0:d341b3ad1e2e 28 }
omabogunje3 0:d341b3ad1e2e 29
omabogunje3 0:d341b3ad1e2e 30
omabogunje3 0:d341b3ad1e2e 31 // Declare Components
omabogunje3 0:d341b3ad1e2e 32
omabogunje3 0:d341b3ad1e2e 33 //Adafruit MEMs SPW2430 microphone demo - LEDs display audio level
omabogunje3 0:d341b3ad1e2e 34 BusOut myleds(LED1,LED2,LED3,LED4);
omabogunje3 0:d341b3ad1e2e 35 microphone mymicrophone(p16);
omabogunje3 0:d341b3ad1e2e 36 Mutex movement_mutex;
omabogunje3 0:d341b3ad1e2e 37 Motor left_motor(p26,p24,p25); // pwm, fwd, rev
omabogunje3 0:d341b3ad1e2e 38 Motor right_motor(p21, p23, p22); // pwm, fwd, rev
omabogunje3 0:d341b3ad1e2e 39 HALLFX_ENCODER hall_left(p13);
omabogunje3 0:d341b3ad1e2e 40 HALLFX_ENCODER hall_right(p14);
omabogunje3 0:d341b3ad1e2e 41 AnalogIn IRSound(p17);
omabogunje3 0:d341b3ad1e2e 42
omabogunje3 0:d341b3ad1e2e 43
omabogunje3 0:d341b3ad1e2e 44
omabogunje3 0:d341b3ad1e2e 45 // Robot functions
omabogunje3 0:d341b3ad1e2e 46 /* For debugging IR sensor
omabogunje3 0:d341b3ad1e2e 47 void IRsoundRead() {
omabogunje3 0:d341b3ad1e2e 48 distance = IRSound.read();
omabogunje3 0:d341b3ad1e2e 49 if (distance >= 0.0f && distance <= .5f/3.3f) { // Furthest away
omabogunje3 0:d341b3ad1e2e 50 myleds = 1;
omabogunje3 0:d341b3ad1e2e 51 } else if (distance >= .5f/3.3f && distance <= .75f/3.3f) {
omabogunje3 0:d341b3ad1e2e 52 myleds = 3;
omabogunje3 0:d341b3ad1e2e 53 } else if (distance >= .75f/3.3f && distance <= 1.25f/3.3f) {
omabogunje3 0:d341b3ad1e2e 54 myleds = 7;
omabogunje3 0:d341b3ad1e2e 55 } else if (distance >= 1.25f/3.3f ) { // closest
omabogunje3 0:d341b3ad1e2e 56 myleds = 15;
omabogunje3 0:d341b3ad1e2e 57 tooClose = 1;
omabogunje3 0:d341b3ad1e2e 58 }
omabogunje3 0:d341b3ad1e2e 59 }
omabogunje3 0:d341b3ad1e2e 60 */
omabogunje3 0:d341b3ad1e2e 61 // forward
omabogunje3 0:d341b3ad1e2e 62 void forward( float vol ){
omabogunje3 0:d341b3ad1e2e 63 long diff = hall_left.read()-hall_right.read();
omabogunje3 0:d341b3ad1e2e 64 float k = 0.8;
omabogunje3 0:d341b3ad1e2e 65 if (diff < 0) { // left has moved less than right
omabogunje3 0:d341b3ad1e2e 66 left_motor.speed(vol);
omabogunje3 0:d341b3ad1e2e 67 right_motor.speed(k*vol);
omabogunje3 0:d341b3ad1e2e 68 }else if (diff > 0) { // right has moved less than left
omabogunje3 0:d341b3ad1e2e 69 left_motor.speed(k*vol);
omabogunje3 0:d341b3ad1e2e 70 right_motor.speed(vol);
omabogunje3 0:d341b3ad1e2e 71 } else {
omabogunje3 0:d341b3ad1e2e 72 left_motor.speed(vol);
omabogunje3 0:d341b3ad1e2e 73 right_motor.speed(vol);
omabogunje3 0:d341b3ad1e2e 74 }
omabogunje3 0:d341b3ad1e2e 75 }
omabogunje3 0:d341b3ad1e2e 76
omabogunje3 0:d341b3ad1e2e 77 // spin
omabogunje3 0:d341b3ad1e2e 78 void panicSpin() {
omabogunje3 0:d341b3ad1e2e 79 //Spin really scaredly
omabogunje3 0:d341b3ad1e2e 80 left_motor.speed(1);
omabogunje3 0:d341b3ad1e2e 81 right_motor.speed(-1);
omabogunje3 0:d341b3ad1e2e 82 Thread::wait(2000);
omabogunje3 0:d341b3ad1e2e 83
omabogunje3 0:d341b3ad1e2e 84 //Try to avoid ojbect
omabogunje3 0:d341b3ad1e2e 85 left_motor.speed(0.5);
omabogunje3 0:d341b3ad1e2e 86 right_motor.speed(-0.5);
omabogunje3 0:d341b3ad1e2e 87 while(IRSound.read()>= 1.25f/3.3f ) {};
omabogunje3 0:d341b3ad1e2e 88 Thread::wait(100);
omabogunje3 0:d341b3ad1e2e 89 forward(0);
omabogunje3 0:d341b3ad1e2e 90 }
omabogunje3 0:d341b3ad1e2e 91
omabogunje3 0:d341b3ad1e2e 92
omabogunje3 0:d341b3ad1e2e 93 // Listen mic Function (Continuous, thread)
omabogunje3 0:d341b3ad1e2e 94 float listen() {
omabogunje3 0:d341b3ad1e2e 95 //read in sample value using AC coupled input option
omabogunje3 0:d341b3ad1e2e 96 float sample = mymicrophone;
omabogunje3 0:d341b3ad1e2e 97
omabogunje3 0:d341b3ad1e2e 98 int a = int(abs((sample-0.5)*300.0));
omabogunje3 0:d341b3ad1e2e 99 if (a < 15 ) {
omabogunje3 0:d341b3ad1e2e 100 myleds = a;
omabogunje3 0:d341b3ad1e2e 101 } else {
omabogunje3 0:d341b3ad1e2e 102 myleds = 12;
omabogunje3 0:d341b3ad1e2e 103 }
omabogunje3 0:d341b3ad1e2e 104 //myleds = int(abs((sample-0.5)*300.0)); //scale to around 15 for LEDs
omabogunje3 0:d341b3ad1e2e 105 return abs((sample-0.5)*300.0/15.0);
omabogunje3 0:d341b3ad1e2e 106 }
omabogunje3 0:d341b3ad1e2e 107
omabogunje3 0:d341b3ad1e2e 108 // IRsound Function (Continuous, thread)
omabogunje3 0:d341b3ad1e2e 109 // When run everything else supspended
omabogunje3 0:d341b3ad1e2e 110 void ActScared(void)
omabogunje3 0:d341b3ad1e2e 111 {
omabogunje3 0:d341b3ad1e2e 112 Thread::wait(1000);
omabogunje3 0:d341b3ad1e2e 113 float loudnessBuffer[10] = {0,0,0,0,0,0,0,0,0,0};
omabogunje3 0:d341b3ad1e2e 114 float volume = 0, currentVal = 0;
omabogunje3 0:d341b3ad1e2e 115 int i = 0;
omabogunje3 0:d341b3ad1e2e 116 //float speed = 0;
omabogunje3 0:d341b3ad1e2e 117 while(1) {
omabogunje3 0:d341b3ad1e2e 118 currentVal = listen();
omabogunje3 0:d341b3ad1e2e 119 volume += (currentVal-loudnessBuffer[i])/10;
omabogunje3 0:d341b3ad1e2e 120 loudnessBuffer[i] = currentVal;
omabogunje3 0:d341b3ad1e2e 121 i++;
omabogunje3 0:d341b3ad1e2e 122 if (i==10) {i=0;}
omabogunje3 0:d341b3ad1e2e 123 if(2.0*volume>0.1){
omabogunje3 0:d341b3ad1e2e 124 movement_mutex.lock();
omabogunje3 0:d341b3ad1e2e 125 forward(1);
omabogunje3 0:d341b3ad1e2e 126 movement_mutex.unlock();
omabogunje3 0:d341b3ad1e2e 127 } else {
omabogunje3 0:d341b3ad1e2e 128 hall_left.reset(); hall_right.reset();
omabogunje3 0:d341b3ad1e2e 129 movement_mutex.lock();
omabogunje3 0:d341b3ad1e2e 130 forward(0.1);
omabogunje3 0:d341b3ad1e2e 131 movement_mutex.unlock();
omabogunje3 0:d341b3ad1e2e 132 }
omabogunje3 0:d341b3ad1e2e 133 Thread::wait(100);
omabogunje3 0:d341b3ad1e2e 134 /**/
omabogunje3 0:d341b3ad1e2e 135 }
omabogunje3 0:d341b3ad1e2e 136 }
omabogunje3 0:d341b3ad1e2e 137
omabogunje3 0:d341b3ad1e2e 138 void AvoidObject(void)
omabogunje3 0:d341b3ad1e2e 139 {
omabogunje3 0:d341b3ad1e2e 140 Thread::wait(500);
omabogunje3 0:d341b3ad1e2e 141 float closenessBuffer[10] = {0,0,0,0,0,0,0,0,0,0};
omabogunje3 0:d341b3ad1e2e 142 float closeness = 0, currentVal = 0;
omabogunje3 0:d341b3ad1e2e 143 int i = 0;
omabogunje3 0:d341b3ad1e2e 144 while(1) {
omabogunje3 0:d341b3ad1e2e 145 // average 10 values over 1 seconds.
omabogunje3 0:d341b3ad1e2e 146 currentVal = IRSound.read();
omabogunje3 0:d341b3ad1e2e 147 closeness += (currentVal-closenessBuffer[i])/10;
omabogunje3 0:d341b3ad1e2e 148 closenessBuffer[i] = currentVal;
omabogunje3 0:d341b3ad1e2e 149 i++;
omabogunje3 0:d341b3ad1e2e 150 if (i==10) {i=0;}
omabogunje3 0:d341b3ad1e2e 151 //float distance = IRSound.read();
omabogunje3 0:d341b3ad1e2e 152 movement_mutex.lock();
omabogunje3 0:d341b3ad1e2e 153 if (closeness >= 1.0f/3.3f ) { // close object detected
omabogunje3 0:d341b3ad1e2e 154 for (int j = 0; j < 10; j++) {
omabogunje3 0:d341b3ad1e2e 155 closenessBuffer[j] = 0;
omabogunje3 0:d341b3ad1e2e 156 }
omabogunje3 0:d341b3ad1e2e 157 closeness = 0;
omabogunje3 0:d341b3ad1e2e 158 forward(0);
omabogunje3 0:d341b3ad1e2e 159 Thread::wait(250);
omabogunje3 0:d341b3ad1e2e 160 panicSpin();
omabogunje3 0:d341b3ad1e2e 161 }
omabogunje3 0:d341b3ad1e2e 162 movement_mutex.unlock();
omabogunje3 0:d341b3ad1e2e 163 Thread::wait(50);
omabogunje3 0:d341b3ad1e2e 164 }
omabogunje3 0:d341b3ad1e2e 165 }
omabogunje3 0:d341b3ad1e2e 166
omabogunje3 0:d341b3ad1e2e 167 int main()
omabogunje3 0:d341b3ad1e2e 168 {
omabogunje3 0:d341b3ad1e2e 169 Thread t2(ActScared);
omabogunje3 0:d341b3ad1e2e 170 while(1) {
omabogunje3 0:d341b3ad1e2e 171 AvoidObject();
omabogunje3 0:d341b3ad1e2e 172 }
omabogunje3 0:d341b3ad1e2e 173 }