Program and supporting libraries for cat laser tower bluetooth functionality and auto modes.
Dependencies: mbed sMotor HC_SR04_Ultrasonic_Library
main.cpp@0:ff32f0b3cfa5, 2021-04-30 (annotated)
- Committer:
- bseleb3
- Date:
- Fri Apr 30 05:00:22 2021 +0000
- Revision:
- 0:ff32f0b3cfa5
revision_01 of cat laser toy program
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bseleb3 | 0:ff32f0b3cfa5 | 1 | #include "mbed.h" |
bseleb3 | 0:ff32f0b3cfa5 | 2 | #include "sMotor.h" |
bseleb3 | 0:ff32f0b3cfa5 | 3 | #include "ultrasonic.h" |
bseleb3 | 0:ff32f0b3cfa5 | 4 | |
bseleb3 | 0:ff32f0b3cfa5 | 5 | Serial pc(USBTX, USBRX); |
bseleb3 | 0:ff32f0b3cfa5 | 6 | Serial Blue(p28,p27); |
bseleb3 | 0:ff32f0b3cfa5 | 7 | sMotor motor(p9, p10, p11, p12); // creates new stepper motor: IN1, IN2, IN3, IN4 |
bseleb3 | 0:ff32f0b3cfa5 | 8 | DigitalOut laser(p20); |
bseleb3 | 0:ff32f0b3cfa5 | 9 | Timer t; |
bseleb3 | 0:ff32f0b3cfa5 | 10 | |
bseleb3 | 0:ff32f0b3cfa5 | 11 | int step_speed = 1100; // set default motor speed |
bseleb3 | 0:ff32f0b3cfa5 | 12 | volatile int dir = 0; //0 is CW, 1 is CCW |
bseleb3 | 0:ff32f0b3cfa5 | 13 | |
bseleb3 | 0:ff32f0b3cfa5 | 14 | volatile int C = 30; |
bseleb3 | 0:ff32f0b3cfa5 | 15 | volatile int numstep; // defines basic turn distance -- 256 steps == 360 degrees |
bseleb3 | 0:ff32f0b3cfa5 | 16 | volatile bool stationary = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 17 | volatile bool regular = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 18 | volatile bool isrand = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 19 | volatile bool manual = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 20 | volatile bool sonic = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 21 | volatile bool trigger = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 22 | volatile int bnum = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 23 | volatile int bhit; |
bseleb3 | 0:ff32f0b3cfa5 | 24 | volatile int power = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 25 | //state used to remember previous characters read in a button message |
bseleb3 | 0:ff32f0b3cfa5 | 26 | enum statetype {start = 0, got_exclm, got_B, got_num, got_hit}; |
bseleb3 | 0:ff32f0b3cfa5 | 27 | statetype state = start; |
bseleb3 | 0:ff32f0b3cfa5 | 28 | |
bseleb3 | 0:ff32f0b3cfa5 | 29 | //Interrupt routine to determine distance |
bseleb3 | 0:ff32f0b3cfa5 | 30 | void dist(int distance) { |
bseleb3 | 0:ff32f0b3cfa5 | 31 | //put code here to execute when the distance has changed |
bseleb3 | 0:ff32f0b3cfa5 | 32 | printf("Distance %d mm\r\n", distance); |
bseleb3 | 0:ff32f0b3cfa5 | 33 | if (distance < 500) { |
bseleb3 | 0:ff32f0b3cfa5 | 34 | trigger = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 35 | printf("where the kitty cat?\r\n"); |
bseleb3 | 0:ff32f0b3cfa5 | 36 | } |
bseleb3 | 0:ff32f0b3cfa5 | 37 | |
bseleb3 | 0:ff32f0b3cfa5 | 38 | } |
bseleb3 | 0:ff32f0b3cfa5 | 39 | //Define ultrasonic sensor |
bseleb3 | 0:ff32f0b3cfa5 | 40 | ultrasonic mu(p6, p7, .5, 1, &dist); |
bseleb3 | 0:ff32f0b3cfa5 | 41 | |
bseleb3 | 0:ff32f0b3cfa5 | 42 | //Interrupt routine to parse message with one new character per serial RX interrupt |
bseleb3 | 0:ff32f0b3cfa5 | 43 | void parse_message() { |
bseleb3 | 0:ff32f0b3cfa5 | 44 | switch (state) { |
bseleb3 | 0:ff32f0b3cfa5 | 45 | case start: |
bseleb3 | 0:ff32f0b3cfa5 | 46 | if (Blue.getc()=='!') state = got_exclm; |
bseleb3 | 0:ff32f0b3cfa5 | 47 | else state = start; |
bseleb3 | 0:ff32f0b3cfa5 | 48 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 49 | case got_exclm: |
bseleb3 | 0:ff32f0b3cfa5 | 50 | if (Blue.getc() == 'B') state = got_B; |
bseleb3 | 0:ff32f0b3cfa5 | 51 | else state = start; |
bseleb3 | 0:ff32f0b3cfa5 | 52 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 53 | case got_B: |
bseleb3 | 0:ff32f0b3cfa5 | 54 | bnum = Blue.getc(); |
bseleb3 | 0:ff32f0b3cfa5 | 55 | state = got_num; |
bseleb3 | 0:ff32f0b3cfa5 | 56 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 57 | case got_num: |
bseleb3 | 0:ff32f0b3cfa5 | 58 | bhit = Blue.getc(); |
bseleb3 | 0:ff32f0b3cfa5 | 59 | state = got_hit; |
bseleb3 | 0:ff32f0b3cfa5 | 60 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 61 | case got_hit: |
bseleb3 | 0:ff32f0b3cfa5 | 62 | if (Blue.getc() == char(~('!' + ' B' + bnum + bhit))) { |
bseleb3 | 0:ff32f0b3cfa5 | 63 | switch (bnum) { |
bseleb3 | 0:ff32f0b3cfa5 | 64 | case '1': //number button 1 |
bseleb3 | 0:ff32f0b3cfa5 | 65 | regular = isrand = manual = sonic = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 66 | stationary = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 67 | printf("! B %d %d: Button 1 hit!\r\n", bnum, bhit); |
bseleb3 | 0:ff32f0b3cfa5 | 68 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 69 | case '2': //number button 2 |
bseleb3 | 0:ff32f0b3cfa5 | 70 | stationary = manual = isrand = sonic = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 71 | regular = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 72 | numstep = C; |
bseleb3 | 0:ff32f0b3cfa5 | 73 | printf("! B %d %d: Button 2 hit!\r\n", bnum, bhit); |
bseleb3 | 0:ff32f0b3cfa5 | 74 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 75 | case '3': //number button 3 |
bseleb3 | 0:ff32f0b3cfa5 | 76 | stationary = regular = manual = sonic = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 77 | isrand = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 78 | printf("! B %d %d: Button 3 hit!\r\n", bnum, bhit); |
bseleb3 | 0:ff32f0b3cfa5 | 79 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 80 | case '4': //number button 4 |
bseleb3 | 0:ff32f0b3cfa5 | 81 | regular = isrand = manual = stationary = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 82 | sonic = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 83 | printf("! B %d %d: Button 4 hit! Going ultrasonic.\r\n", bnum, bhit); |
bseleb3 | 0:ff32f0b3cfa5 | 84 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 85 | case '5': //up arrow |
bseleb3 | 0:ff32f0b3cfa5 | 86 | power = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 87 | printf("! B %d %d: Up arrow hit!\r\n", bnum, bhit); |
bseleb3 | 0:ff32f0b3cfa5 | 88 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 89 | case '6': //down arrow |
bseleb3 | 0:ff32f0b3cfa5 | 90 | power = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 91 | printf("! B %d %d: Down arrow hit!\r\n", bnum, bhit); |
bseleb3 | 0:ff32f0b3cfa5 | 92 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 93 | case '7': |
bseleb3 | 0:ff32f0b3cfa5 | 94 | stationary = regular = isrand = sonic = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 95 | manual = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 96 | dir = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 97 | printf("! B %d %d: Left arrow hit!\r\n", bnum, bhit); |
bseleb3 | 0:ff32f0b3cfa5 | 98 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 99 | case '8': |
bseleb3 | 0:ff32f0b3cfa5 | 100 | stationary = regular = isrand = sonic = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 101 | manual = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 102 | dir = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 103 | printf("! B %d %d: Right arrow hit!\r\n", bnum, bhit); |
bseleb3 | 0:ff32f0b3cfa5 | 104 | break; |
bseleb3 | 0:ff32f0b3cfa5 | 105 | } |
bseleb3 | 0:ff32f0b3cfa5 | 106 | } |
bseleb3 | 0:ff32f0b3cfa5 | 107 | default: |
bseleb3 | 0:ff32f0b3cfa5 | 108 | Blue.getc(); |
bseleb3 | 0:ff32f0b3cfa5 | 109 | state = start; |
bseleb3 | 0:ff32f0b3cfa5 | 110 | } |
bseleb3 | 0:ff32f0b3cfa5 | 111 | } |
bseleb3 | 0:ff32f0b3cfa5 | 112 | |
bseleb3 | 0:ff32f0b3cfa5 | 113 | int main() { |
bseleb3 | 0:ff32f0b3cfa5 | 114 | |
bseleb3 | 0:ff32f0b3cfa5 | 115 | // Screen Menu |
bseleb3 | 0:ff32f0b3cfa5 | 116 | printf("Default Speed: %d\n\r", step_speed); |
bseleb3 | 0:ff32f0b3cfa5 | 117 | printf("Use Adafruit Bluefruit buttons to select mode\n\r"); |
bseleb3 | 0:ff32f0b3cfa5 | 118 | |
bseleb3 | 0:ff32f0b3cfa5 | 119 | // attach interrupt function for each new Bluetooth serial character |
bseleb3 | 0:ff32f0b3cfa5 | 120 | Blue.attach(&parse_message,Serial::RxIrq); |
bseleb3 | 0:ff32f0b3cfa5 | 121 | |
bseleb3 | 0:ff32f0b3cfa5 | 122 | int temp1 = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 123 | int temp2 = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 124 | |
bseleb3 | 0:ff32f0b3cfa5 | 125 | while (1) { |
bseleb3 | 0:ff32f0b3cfa5 | 126 | laser = power; |
bseleb3 | 0:ff32f0b3cfa5 | 127 | |
bseleb3 | 0:ff32f0b3cfa5 | 128 | //IF STATIONARY, DONT DO ANYTHING, OTHERWISE: |
bseleb3 | 0:ff32f0b3cfa5 | 129 | if (stationary != 1) { |
bseleb3 | 0:ff32f0b3cfa5 | 130 | |
bseleb3 | 0:ff32f0b3cfa5 | 131 | //IF REGULAR, TURN BACK AND FORTH WITH C |
bseleb3 | 0:ff32f0b3cfa5 | 132 | if (regular == 1) { |
bseleb3 | 0:ff32f0b3cfa5 | 133 | dir = 1 - dir; |
bseleb3 | 0:ff32f0b3cfa5 | 134 | motor.step(numstep, dir, step_speed); |
bseleb3 | 0:ff32f0b3cfa5 | 135 | } |
bseleb3 | 0:ff32f0b3cfa5 | 136 | //IF RANDOM, TURN RANDOMLY BASED ON C |
bseleb3 | 0:ff32f0b3cfa5 | 137 | else if (isrand == 1) { |
bseleb3 | 0:ff32f0b3cfa5 | 138 | temp2 = rand() % C+1; |
bseleb3 | 0:ff32f0b3cfa5 | 139 | numstep = temp2 - temp1; |
bseleb3 | 0:ff32f0b3cfa5 | 140 | if (numstep < 0) { |
bseleb3 | 0:ff32f0b3cfa5 | 141 | dir = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 142 | } else if (numstep > 0) { |
bseleb3 | 0:ff32f0b3cfa5 | 143 | dir = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 144 | } |
bseleb3 | 0:ff32f0b3cfa5 | 145 | temp1 = temp2; |
bseleb3 | 0:ff32f0b3cfa5 | 146 | numstep = abs(numstep); |
bseleb3 | 0:ff32f0b3cfa5 | 147 | motor.step(numstep, dir, step_speed); |
bseleb3 | 0:ff32f0b3cfa5 | 148 | } |
bseleb3 | 0:ff32f0b3cfa5 | 149 | //IF MANUAL, USE DIRECTION TO TURN |
bseleb3 | 0:ff32f0b3cfa5 | 150 | else if (manual == 1) { |
bseleb3 | 0:ff32f0b3cfa5 | 151 | dir = dir; |
bseleb3 | 0:ff32f0b3cfa5 | 152 | numstep = C; |
bseleb3 | 0:ff32f0b3cfa5 | 153 | motor.step(numstep, dir, step_speed); |
bseleb3 | 0:ff32f0b3cfa5 | 154 | manual = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 155 | stationary = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 156 | } |
bseleb3 | 0:ff32f0b3cfa5 | 157 | //GOING ULTRASONIC |
bseleb3 | 0:ff32f0b3cfa5 | 158 | else if (sonic == 1) { |
bseleb3 | 0:ff32f0b3cfa5 | 159 | laser = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 160 | mu.startUpdates();//start measuring the distance |
bseleb3 | 0:ff32f0b3cfa5 | 161 | while (sonic) { |
bseleb3 | 0:ff32f0b3cfa5 | 162 | mu.checkDistance(); |
bseleb3 | 0:ff32f0b3cfa5 | 163 | if (trigger) { |
bseleb3 | 0:ff32f0b3cfa5 | 164 | t.start(); |
bseleb3 | 0:ff32f0b3cfa5 | 165 | while (t.read() < 60.0 && sonic == 1) { |
bseleb3 | 0:ff32f0b3cfa5 | 166 | laser = 1; |
bseleb3 | 0:ff32f0b3cfa5 | 167 | printf("%f seconds\n", t.read()); |
bseleb3 | 0:ff32f0b3cfa5 | 168 | numstep = rand() % C+1; |
bseleb3 | 0:ff32f0b3cfa5 | 169 | dir = !dir; |
bseleb3 | 0:ff32f0b3cfa5 | 170 | motor.step(numstep, dir, step_speed); |
bseleb3 | 0:ff32f0b3cfa5 | 171 | } |
bseleb3 | 0:ff32f0b3cfa5 | 172 | laser = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 173 | trigger = 0; |
bseleb3 | 0:ff32f0b3cfa5 | 174 | t.stop(); |
bseleb3 | 0:ff32f0b3cfa5 | 175 | t.reset(); |
bseleb3 | 0:ff32f0b3cfa5 | 176 | } |
bseleb3 | 0:ff32f0b3cfa5 | 177 | } |
bseleb3 | 0:ff32f0b3cfa5 | 178 | mu.pauseUpdates();//stop measureing the distance |
bseleb3 | 0:ff32f0b3cfa5 | 179 | } |
bseleb3 | 0:ff32f0b3cfa5 | 180 | } |
bseleb3 | 0:ff32f0b3cfa5 | 181 | } |
bseleb3 | 0:ff32f0b3cfa5 | 182 | } |