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

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?

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