This version has sonar added to the rest of the code, but the sonar is not currently working. I suspect that the interrupts from the bluetooth are interfering with the sonar working
Dependencies: mbed sMotor HC_SR04_Ultrasonic_Library
main.cpp@3:510441742cf6, 2021-04-22 (annotated)
- Committer:
- shearn
- Date:
- Thu Apr 22 22:32:18 2021 +0000
- Revision:
- 3:510441742cf6
- Parent:
- 2:710e07252f28
Just sonar
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
XtaticO | 0:6999a083fb46 | 1 | #include "mbed.h" |
XtaticO | 0:6999a083fb46 | 2 | #include "sMotor.h" |
shearn | 3:510441742cf6 | 3 | #include "ultrasonic.h" |
shearn | 3:510441742cf6 | 4 | |
shearn | 3:510441742cf6 | 5 | float CAT_COOLDOWN = 4.0; // Number of seconds of inactivity before power saving mode |
bseleb3 | 2:710e07252f28 | 6 | |
bseleb3 | 1:8b9c0e69c6c9 | 7 | Serial pc(USBTX, USBRX); |
bseleb3 | 1:8b9c0e69c6c9 | 8 | Serial Blue(p28,p27); |
bseleb3 | 1:8b9c0e69c6c9 | 9 | sMotor motor(p9, p10, p11, p12); // creates new stepper motor: IN1, IN2, IN3, IN4 |
bseleb3 | 1:8b9c0e69c6c9 | 10 | DigitalOut laser(p20); |
shearn | 3:510441742cf6 | 11 | DigitalOut led2(LED2); |
bseleb3 | 2:710e07252f28 | 12 | |
bseleb3 | 1:8b9c0e69c6c9 | 13 | int step_speed = 1100; // set default motor speed |
bseleb3 | 2:710e07252f28 | 14 | volatile int dir = 0; //0 is CW, 1 is CCW |
bseleb3 | 2:710e07252f28 | 15 | |
bseleb3 | 1:8b9c0e69c6c9 | 16 | volatile int C = 30; |
bseleb3 | 1:8b9c0e69c6c9 | 17 | volatile int numstep; // defines basic turn distance -- 256 steps == 360 degrees |
bseleb3 | 1:8b9c0e69c6c9 | 18 | volatile bool stationary = 1; |
bseleb3 | 1:8b9c0e69c6c9 | 19 | volatile bool isrand = 0; |
bseleb3 | 2:710e07252f28 | 20 | volatile bool manual = 0; |
shearn | 3:510441742cf6 | 21 | volatile bool power; |
shearn | 3:510441742cf6 | 22 | volatile bool powerSave; // If 1, the laser is turned off until detected motion |
bseleb3 | 1:8b9c0e69c6c9 | 23 | volatile int bnum = 0; |
bseleb3 | 1:8b9c0e69c6c9 | 24 | volatile int bhit; |
shearn | 3:510441742cf6 | 25 | volatile int catMoves = 0; |
shearn | 3:510441742cf6 | 26 | Ticker catTicker; |
bseleb3 | 1:8b9c0e69c6c9 | 27 | //state used to remember previous characters read in a button message |
shearn | 3:510441742cf6 | 28 | enum statetype {start = 0, got_exclm, got_S, got_B, got_num, got_hit}; |
bseleb3 | 1:8b9c0e69c6c9 | 29 | statetype state = start; |
shearn | 3:510441742cf6 | 30 | // State used to keep track of cat activity |
shearn | 3:510441742cf6 | 31 | int c_inactive = 0; int c_some = 1; int c_uptime = 2; int c_active = 3; |
shearn | 3:510441742cf6 | 32 | volatile int catState = c_active; |
bseleb3 | 1:8b9c0e69c6c9 | 33 | //Interrupt routine to parse message with one new character per serial RX interrupt |
bseleb3 | 1:8b9c0e69c6c9 | 34 | void parse_message() { |
shearn | 3:510441742cf6 | 35 | led2 = !led2; |
bseleb3 | 1:8b9c0e69c6c9 | 36 | switch (state) { |
bseleb3 | 1:8b9c0e69c6c9 | 37 | case start: |
bseleb3 | 1:8b9c0e69c6c9 | 38 | if (Blue.getc()=='!') state = got_exclm; |
bseleb3 | 1:8b9c0e69c6c9 | 39 | else state = start; |
bseleb3 | 1:8b9c0e69c6c9 | 40 | break; |
bseleb3 | 1:8b9c0e69c6c9 | 41 | case got_exclm: |
bseleb3 | 1:8b9c0e69c6c9 | 42 | if (Blue.getc() == 'B') state = got_B; |
bseleb3 | 1:8b9c0e69c6c9 | 43 | else state = start; |
bseleb3 | 1:8b9c0e69c6c9 | 44 | break; |
bseleb3 | 1:8b9c0e69c6c9 | 45 | case got_B: |
bseleb3 | 1:8b9c0e69c6c9 | 46 | bnum = Blue.getc(); |
bseleb3 | 1:8b9c0e69c6c9 | 47 | state = got_num; |
bseleb3 | 1:8b9c0e69c6c9 | 48 | break; |
bseleb3 | 1:8b9c0e69c6c9 | 49 | case got_num: |
bseleb3 | 1:8b9c0e69c6c9 | 50 | bhit = Blue.getc(); |
bseleb3 | 1:8b9c0e69c6c9 | 51 | state = got_hit; |
bseleb3 | 1:8b9c0e69c6c9 | 52 | break; |
bseleb3 | 1:8b9c0e69c6c9 | 53 | case got_hit: |
shearn | 3:510441742cf6 | 54 | if (Blue.getc() == char(~('!' + 'B' + bnum + bhit))) { |
bseleb3 | 1:8b9c0e69c6c9 | 55 | switch (bnum) { |
bseleb3 | 1:8b9c0e69c6c9 | 56 | case '1': //number button 1 |
bseleb3 | 1:8b9c0e69c6c9 | 57 | isrand = 0; |
bseleb3 | 2:710e07252f28 | 58 | manual = 0; |
bseleb3 | 1:8b9c0e69c6c9 | 59 | stationary = 1; |
bseleb3 | 1:8b9c0e69c6c9 | 60 | break; |
bseleb3 | 1:8b9c0e69c6c9 | 61 | case '2': //number button 2 |
bseleb3 | 1:8b9c0e69c6c9 | 62 | stationary = 0; |
shearn | 3:510441742cf6 | 63 | manual = 0; |
bseleb3 | 1:8b9c0e69c6c9 | 64 | isrand = 0; |
bseleb3 | 1:8b9c0e69c6c9 | 65 | numstep = C; |
bseleb3 | 1:8b9c0e69c6c9 | 66 | break; |
bseleb3 | 1:8b9c0e69c6c9 | 67 | case '3': //number button 3 |
bseleb3 | 1:8b9c0e69c6c9 | 68 | stationary = 0; |
bseleb3 | 2:710e07252f28 | 69 | manual = 0; |
bseleb3 | 1:8b9c0e69c6c9 | 70 | isrand = 1; |
bseleb3 | 1:8b9c0e69c6c9 | 71 | break; |
bseleb3 | 1:8b9c0e69c6c9 | 72 | case '4': //number button 4 |
bseleb3 | 1:8b9c0e69c6c9 | 73 | power = !power; |
bseleb3 | 2:710e07252f28 | 74 | break; |
shearn | 3:510441742cf6 | 75 | case '5': //button 5 up arrow |
shearn | 3:510441742cf6 | 76 | powerSave = 1; |
shearn | 3:510441742cf6 | 77 | printf("powerSave mode is %d\r\n", powerSave); |
shearn | 3:510441742cf6 | 78 | break; |
shearn | 3:510441742cf6 | 79 | case '6': //button 6 down arrow |
shearn | 3:510441742cf6 | 80 | powerSave = 0; |
shearn | 3:510441742cf6 | 81 | printf("powerSave mode is %d\r\n", powerSave); |
shearn | 3:510441742cf6 | 82 | break; |
bseleb3 | 2:710e07252f28 | 83 | case '7': |
bseleb3 | 2:710e07252f28 | 84 | stationary = 0; |
bseleb3 | 2:710e07252f28 | 85 | isrand = 0; |
bseleb3 | 2:710e07252f28 | 86 | manual = 1; |
bseleb3 | 2:710e07252f28 | 87 | dir = 0; |
bseleb3 | 2:710e07252f28 | 88 | numstep = 1; |
bseleb3 | 2:710e07252f28 | 89 | break; |
bseleb3 | 2:710e07252f28 | 90 | case '8': |
bseleb3 | 2:710e07252f28 | 91 | stationary = 0; |
bseleb3 | 2:710e07252f28 | 92 | isrand = 0; |
bseleb3 | 2:710e07252f28 | 93 | manual = 1; |
bseleb3 | 2:710e07252f28 | 94 | dir = 1; |
bseleb3 | 2:710e07252f28 | 95 | numstep = 1; |
bseleb3 | 2:710e07252f28 | 96 | break; |
bseleb3 | 1:8b9c0e69c6c9 | 97 | } |
bseleb3 | 1:8b9c0e69c6c9 | 98 | } |
shearn | 3:510441742cf6 | 99 | state = start; |
shearn | 3:510441742cf6 | 100 | break; |
bseleb3 | 1:8b9c0e69c6c9 | 101 | default: |
bseleb3 | 1:8b9c0e69c6c9 | 102 | Blue.getc(); |
bseleb3 | 1:8b9c0e69c6c9 | 103 | state = start; |
bseleb3 | 1:8b9c0e69c6c9 | 104 | } |
bseleb3 | 1:8b9c0e69c6c9 | 105 | } |
shearn | 3:510441742cf6 | 106 | |
shearn | 3:510441742cf6 | 107 | // Interrupt that takes effect when motion is detected |
shearn | 3:510441742cf6 | 108 | float feet = 0; |
shearn | 3:510441742cf6 | 109 | void mDetect(int distance) |
shearn | 3:510441742cf6 | 110 | { |
shearn | 3:510441742cf6 | 111 | float oldFeet = feet; |
shearn | 3:510441742cf6 | 112 | feet = distance / 305.0; |
shearn | 3:510441742cf6 | 113 | if (abs(oldFeet - feet) >= .2) { // The difference is greater than a margin of error |
shearn | 3:510441742cf6 | 114 | if (catState < c_uptime) catState++; |
shearn | 3:510441742cf6 | 115 | if (catState == c_active) catMoves++; // The initial motion sensed does not count |
shearn | 3:510441742cf6 | 116 | printf("\tMotion detected at %.3f!\n\r", feet); |
shearn | 3:510441742cf6 | 117 | } |
shearn | 3:510441742cf6 | 118 | } |
shearn | 3:510441742cf6 | 119 | |
shearn | 3:510441742cf6 | 120 | /* Set the trigger pin to D8 and the echo pin to D9. |
shearn | 3:510441742cf6 | 121 | Updates every .1 seconds, timeout after 1 |
shearn | 3:510441742cf6 | 122 | second, function when the distance changes */ |
shearn | 3:510441742cf6 | 123 | ultrasonic mu(p6, p7, .1, 1, &mDetect); |
shearn | 3:510441742cf6 | 124 | |
shearn | 3:510441742cf6 | 125 | void activityBeep() { |
shearn | 3:510441742cf6 | 126 | if (catMoves < 2) { |
shearn | 3:510441742cf6 | 127 | catState = c_inactive; |
shearn | 3:510441742cf6 | 128 | printf("Cat is inactive.\n\r"); |
shearn | 3:510441742cf6 | 129 | } else printf("\t\tCat moved %d times since timer began.\n\r", catMoves); |
shearn | 3:510441742cf6 | 130 | catMoves = 0; |
shearn | 3:510441742cf6 | 131 | } |
bseleb3 | 2:710e07252f28 | 132 | |
XtaticO | 0:6999a083fb46 | 133 | int main() { |
bseleb3 | 2:710e07252f28 | 134 | |
XtaticO | 0:6999a083fb46 | 135 | //Credits |
shearn | 3:510441742cf6 | 136 | printf("\nCat Tower - Test Program\r\n"); |
XtaticO | 0:6999a083fb46 | 137 | printf("\n\r"); |
bseleb3 | 2:710e07252f28 | 138 | |
XtaticO | 0:6999a083fb46 | 139 | // Screen Menu |
XtaticO | 0:6999a083fb46 | 140 | printf("Default Speed: %d\n\r",step_speed); |
shearn | 3:510441742cf6 | 141 | printf("Use Adafruit Bluefruit buttons to select mode\n\r"); |
bseleb3 | 1:8b9c0e69c6c9 | 142 | |
bseleb3 | 1:8b9c0e69c6c9 | 143 | // attach interrupt function for each new Bluetooth serial character |
bseleb3 | 1:8b9c0e69c6c9 | 144 | Blue.attach(&parse_message,Serial::RxIrq); |
shearn | 3:510441742cf6 | 145 | |
shearn | 3:510441742cf6 | 146 | powerSave = 0; |
bseleb3 | 2:710e07252f28 | 147 | |
bseleb3 | 2:710e07252f28 | 148 | int temp1 = 0; |
bseleb3 | 2:710e07252f28 | 149 | int temp2 = 0; |
bseleb3 | 1:8b9c0e69c6c9 | 150 | |
XtaticO | 0:6999a083fb46 | 151 | while (1) { |
shearn | 3:510441742cf6 | 152 | mu.checkDistance(); |
shearn | 3:510441742cf6 | 153 | if (catState == c_uptime) { |
shearn | 3:510441742cf6 | 154 | printf("Beginning inactivity timer\n\r"); |
shearn | 3:510441742cf6 | 155 | // Activate countdown on cat activity |
shearn | 3:510441742cf6 | 156 | catTicker.attach(&activityBeep, CAT_COOLDOWN); // function and interval in seconds |
shearn | 3:510441742cf6 | 157 | catState = c_active; |
shearn | 3:510441742cf6 | 158 | } |
shearn | 3:510441742cf6 | 159 | if (powerSave == 0 || catState == c_active) { // If it is not in power save mode or the cat is active |
shearn | 3:510441742cf6 | 160 | laser = power; |
shearn | 3:510441742cf6 | 161 | if (stationary != 1) { |
shearn | 3:510441742cf6 | 162 | |
shearn | 3:510441742cf6 | 163 | if (isrand == 1) { |
shearn | 3:510441742cf6 | 164 | temp2 = rand() % C+1; |
shearn | 3:510441742cf6 | 165 | numstep = temp2 - temp1; |
shearn | 3:510441742cf6 | 166 | if (numstep < 0) { |
shearn | 3:510441742cf6 | 167 | dir = 0; |
shearn | 3:510441742cf6 | 168 | } else if (numstep > 0) { |
shearn | 3:510441742cf6 | 169 | dir = 1; |
shearn | 3:510441742cf6 | 170 | } |
shearn | 3:510441742cf6 | 171 | temp1 = temp2; |
shearn | 3:510441742cf6 | 172 | numstep = abs(numstep); |
shearn | 3:510441742cf6 | 173 | } |
shearn | 3:510441742cf6 | 174 | |
shearn | 3:510441742cf6 | 175 | if (manual == 1) { |
shearn | 3:510441742cf6 | 176 | dir = dir; |
shearn | 3:510441742cf6 | 177 | } else { |
shearn | 3:510441742cf6 | 178 | dir = 1 - dir; |
bseleb3 | 2:710e07252f28 | 179 | } |
shearn | 3:510441742cf6 | 180 | |
shearn | 3:510441742cf6 | 181 | motor.step(numstep, dir, step_speed); // number of steps, direction, speed |
XtaticO | 0:6999a083fb46 | 182 | } |
shearn | 3:510441742cf6 | 183 | } else laser = 0; |
XtaticO | 0:6999a083fb46 | 184 | } |
XtaticO | 0:6999a083fb46 | 185 | } |