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: HALLFX_ENCODER Motor SDFileSystem mbed-rtos mbed wave_player
main.cpp@0:d341b3ad1e2e, 2016-11-03 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |