Program and supporting libraries for cat laser tower bluetooth functionality and auto modes.

Dependencies:   mbed sMotor HC_SR04_Ultrasonic_Library

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?

UserRevisionLine numberNew 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 }