A robot that can detect objects and determine if the object is magnetic while drawing a map of its motion and the object's position.

Dependencies:   4DGL-uLCD-SE Motordriver mbed-rtos mbed

Committer:
aismail1997
Date:
Wed Nov 02 13:37:33 2016 +0000
Revision:
1:5a36b4e912da
Parent:
0:ec413378ee3a
lab4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aismail1997 0:ec413378ee3a 1 #include "mbed.h"
aismail1997 0:ec413378ee3a 2 #include "motordriver.h"
aismail1997 0:ec413378ee3a 3 #include "LSM9DS1.h"
aismail1997 0:ec413378ee3a 4 #include "uLCD_4DGL.h"
aismail1997 0:ec413378ee3a 5 #include "rtos.h"
aismail1997 0:ec413378ee3a 6
aismail1997 0:ec413378ee3a 7 // LCD stuff
aismail1997 0:ec413378ee3a 8 uLCD_4DGL uLCD(p13,p14,p15); // serial tx, serial rx, reset pin;
aismail1997 0:ec413378ee3a 9
aismail1997 0:ec413378ee3a 10 // motor stuff
aismail1997 0:ec413378ee3a 11 Motor left(p21, p26, p25, 1); // pwm, fwd, rev, has brake feature (pb,b2,b2)
aismail1997 0:ec413378ee3a 12 Motor right(p22, p24, p23, 1);
aismail1997 0:ec413378ee3a 13
aismail1997 0:ec413378ee3a 14 // sonar stuff
aismail1997 0:ec413378ee3a 15 // sonar 1
aismail1997 0:ec413378ee3a 16 DigitalOut trigger(p6);
aismail1997 0:ec413378ee3a 17 DigitalIn echo(p7);
aismail1997 0:ec413378ee3a 18 int distance = 0;
aismail1997 0:ec413378ee3a 19 int correction = 0;
aismail1997 0:ec413378ee3a 20 Timer sonar;
aismail1997 0:ec413378ee3a 21 // sonar 2
aismail1997 0:ec413378ee3a 22 /*
aismail1997 0:ec413378ee3a 23 DigitalOut trigger2(p12); // fix this
aismail1997 0:ec413378ee3a 24 DigitalIn echo2(p11); // fix this
aismail1997 0:ec413378ee3a 25 int distance2 = 0;
aismail1997 0:ec413378ee3a 26 int correction2 = 0;
aismail1997 0:ec413378ee3a 27 Timer sonar2;
aismail1997 0:ec413378ee3a 28 */
aismail1997 0:ec413378ee3a 29 // bluetooth stuff
aismail1997 0:ec413378ee3a 30 Serial pc(USBTX, USBRX); // and IMU
aismail1997 0:ec413378ee3a 31 Serial blue(p28,p27);
aismail1997 0:ec413378ee3a 32
aismail1997 0:ec413378ee3a 33 // Mutex for LCD
aismail1997 0:ec413378ee3a 34 Mutex lcd_mutex;
aismail1997 0:ec413378ee3a 35
aismail1997 0:ec413378ee3a 36 // IMU stuff
aismail1997 0:ec413378ee3a 37 LSM9DS1 imu(p9, p10, 0xD6, 0x3C);
aismail1997 0:ec413378ee3a 38 int old_y = 0;
aismail1997 0:ec413378ee3a 39 int old_x = SIZE_X/2;
aismail1997 0:ec413378ee3a 40
aismail1997 0:ec413378ee3a 41 void sonar_thread(void const *args)
aismail1997 0:ec413378ee3a 42 {
aismail1997 0:ec413378ee3a 43 // SETUP SONAR 1
aismail1997 0:ec413378ee3a 44 sonar.reset();
aismail1997 0:ec413378ee3a 45 sonar.start(); // start timer
aismail1997 0:ec413378ee3a 46 // min software polling delay to read echo pin
aismail1997 0:ec413378ee3a 47 while (echo==2) {};
aismail1997 0:ec413378ee3a 48 sonar.stop(); // stop timer
aismail1997 0:ec413378ee3a 49 correction = sonar.read_us();
aismail1997 0:ec413378ee3a 50 /* // SETUP SONAR 2
aismail1997 0:ec413378ee3a 51 sonar2.reset();
aismail1997 0:ec413378ee3a 52 sonar2.start();
aismail1997 0:ec413378ee3a 53 while (echo2==2) {};
aismail1997 0:ec413378ee3a 54 sonar2.stop();
aismail1997 0:ec413378ee3a 55 correction2 = sonar2.read_us();
aismail1997 0:ec413378ee3a 56 */
aismail1997 0:ec413378ee3a 57 while(true) { // thread loop
aismail1997 0:ec413378ee3a 58 // SONAR CODE
aismail1997 0:ec413378ee3a 59 trigger = 1; // trigger sonar to send a ping
aismail1997 0:ec413378ee3a 60 sonar.reset();
aismail1997 0:ec413378ee3a 61 wait_us(10.0);
aismail1997 0:ec413378ee3a 62 trigger = 0;
aismail1997 0:ec413378ee3a 63 while (echo==0) {}; //wait for echo high
aismail1997 0:ec413378ee3a 64 sonar.start(); //echo high, so start timer
aismail1997 0:ec413378ee3a 65 while (echo==1) {}; //wait for echo low
aismail1997 0:ec413378ee3a 66 sonar.stop(); //stop timer and read value
aismail1997 0:ec413378ee3a 67 //subtract software overhead timer delay and scale to cm
aismail1997 0:ec413378ee3a 68 distance = (sonar.read_us()-correction)/58.0;
aismail1997 0:ec413378ee3a 69
aismail1997 0:ec413378ee3a 70 /* // SONAR 2 CODE
aismail1997 0:ec413378ee3a 71 trigger2 = 1;
aismail1997 0:ec413378ee3a 72 sonar2.reset();
aismail1997 0:ec413378ee3a 73 wait_us(10.0);
aismail1997 0:ec413378ee3a 74 trigger2 = 0;
aismail1997 0:ec413378ee3a 75 while (echo2==0) {};
aismail1997 0:ec413378ee3a 76 sonar2.start();
aismail1997 0:ec413378ee3a 77 while (echo2==1) {};
aismail1997 0:ec413378ee3a 78 sonar2.stop();
aismail1997 0:ec413378ee3a 79 distance2 = (sonar2.read_us()-correction2)/58.0; */
aismail1997 0:ec413378ee3a 80 //wait(0.2);
aismail1997 0:ec413378ee3a 81 // if object detected using sonar 1 & 2 - draw a circle
aismail1997 0:ec413378ee3a 82 if (distance <= 8) {
aismail1997 0:ec413378ee3a 83 lcd_mutex.lock();
aismail1997 0:ec413378ee3a 84 uLCD.filled_circle(old_x-2, old_y + 4, 2, RED);
aismail1997 0:ec413378ee3a 85 lcd_mutex.unlock();
aismail1997 0:ec413378ee3a 86 }
aismail1997 0:ec413378ee3a 87 //pc.printf("1: %d cm \n\r",distance);
aismail1997 0:ec413378ee3a 88 Thread::wait(1000); // wait till thread is done
aismail1997 0:ec413378ee3a 89 }
aismail1997 0:ec413378ee3a 90 }
aismail1997 0:ec413378ee3a 91
aismail1997 0:ec413378ee3a 92 void imu_thread(void const *args)
aismail1997 0:ec413378ee3a 93 {
aismail1997 0:ec413378ee3a 94 // SETUP IMU
aismail1997 0:ec413378ee3a 95 imu.begin();
aismail1997 0:ec413378ee3a 96 //if (!imu.begin()) {
aismail1997 0:ec413378ee3a 97 //pc.printf("Failed to communicate with LSM9DS1.\n");
aismail1997 0:ec413378ee3a 98 //}
aismail1997 0:ec413378ee3a 99 imu.calibrate();
aismail1997 0:ec413378ee3a 100 int magnitude = 0;
aismail1997 0:ec413378ee3a 101 //pc.baud(9600);
aismail1997 0:ec413378ee3a 102
aismail1997 0:ec413378ee3a 103 while(true) { // thread loop
aismail1997 0:ec413378ee3a 104 // IMU CODE
aismail1997 0:ec413378ee3a 105 imu.readMag();
aismail1997 0:ec413378ee3a 106 // determine magnitude of the magnetic field
aismail1997 0:ec413378ee3a 107 magnitude = (imu.mx*imu.mx + imu.my*imu.my + imu.mz*imu.mz);
aismail1997 0:ec413378ee3a 108 //pc.printf("mag: %d %d %d %d\n\n\r", imu.mx, imu.my, imu.mz, magnitude);
aismail1997 0:ec413378ee3a 109 if (magnitude > 30000000) {
aismail1997 0:ec413378ee3a 110 lcd_mutex.lock();
aismail1997 0:ec413378ee3a 111 uLCD.filled_circle(old_x+2, old_y + 4, 2, LGREY);
aismail1997 0:ec413378ee3a 112 lcd_mutex.unlock();
aismail1997 0:ec413378ee3a 113 }
aismail1997 0:ec413378ee3a 114 Thread::wait(200); // wait till thread is done
aismail1997 0:ec413378ee3a 115 }
aismail1997 0:ec413378ee3a 116 }
aismail1997 0:ec413378ee3a 117
aismail1997 0:ec413378ee3a 118 int main()
aismail1997 0:ec413378ee3a 119 {
aismail1997 0:ec413378ee3a 120 // pc print
aismail1997 0:ec413378ee3a 121 //pc.baud(9600);
aismail1997 0:ec413378ee3a 122
aismail1997 0:ec413378ee3a 123 // lcd initialization
aismail1997 0:ec413378ee3a 124 uLCD.cls();
aismail1997 0:ec413378ee3a 125 int y = 0;
aismail1997 0:ec413378ee3a 126 int x = SIZE_X/2;
aismail1997 0:ec413378ee3a 127 float theta = 0;
aismail1997 0:ec413378ee3a 128
aismail1997 0:ec413378ee3a 129 // bluetooth stuff
aismail1997 0:ec413378ee3a 130 char bnum=0;
aismail1997 0:ec413378ee3a 131 char bhit=0;
aismail1997 0:ec413378ee3a 132 float s = 0;
aismail1997 0:ec413378ee3a 133
aismail1997 0:ec413378ee3a 134 Thread t2(imu_thread); //start imu thread
aismail1997 0:ec413378ee3a 135 Thread t1(sonar_thread); //start sonar thread
aismail1997 0:ec413378ee3a 136
aismail1997 0:ec413378ee3a 137 while(1) {
aismail1997 0:ec413378ee3a 138 // BLUETOOTH CODE
aismail1997 0:ec413378ee3a 139 if (blue.getc()=='!') {
aismail1997 0:ec413378ee3a 140 if (blue.getc()=='B') { //button data packet
aismail1997 0:ec413378ee3a 141 bnum = blue.getc(); //button number
aismail1997 0:ec413378ee3a 142 bhit = blue.getc(); //1=hit, 0=release
aismail1997 0:ec413378ee3a 143 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
aismail1997 0:ec413378ee3a 144 switch (bnum) {
aismail1997 0:ec413378ee3a 145 case '1': //number button 1
aismail1997 0:ec413378ee3a 146 if (bhit=='1') {
aismail1997 0:ec413378ee3a 147 // MOTOR CODE
aismail1997 0:ec413378ee3a 148 // move forward
aismail1997 0:ec413378ee3a 149 left.speed(0.5);
aismail1997 0:ec413378ee3a 150 right.speed(0.5);
aismail1997 0:ec413378ee3a 151 wait(0.4);
aismail1997 0:ec413378ee3a 152 //}
aismail1997 0:ec413378ee3a 153 left.stop(1);
aismail1997 0:ec413378ee3a 154 right.stop(1);
aismail1997 0:ec413378ee3a 155 y = 6*cos(theta);
aismail1997 0:ec413378ee3a 156 x = 6*sin(theta);
aismail1997 0:ec413378ee3a 157 lcd_mutex.lock();
aismail1997 0:ec413378ee3a 158 uLCD.line(old_x,old_y,old_x+x,old_y+y,GREEN);
aismail1997 0:ec413378ee3a 159 lcd_mutex.unlock();
aismail1997 0:ec413378ee3a 160 old_x += x;
aismail1997 0:ec413378ee3a 161 old_y += y;
aismail1997 0:ec413378ee3a 162 wait(0.25);
aismail1997 0:ec413378ee3a 163 }
aismail1997 0:ec413378ee3a 164 break;
aismail1997 0:ec413378ee3a 165 case '2': //number button 2
aismail1997 0:ec413378ee3a 166 if (bhit=='1') {
aismail1997 0:ec413378ee3a 167 theta += -3.14/6;
aismail1997 0:ec413378ee3a 168 // MOTOR CODE
aismail1997 0:ec413378ee3a 169 // turn right
aismail1997 0:ec413378ee3a 170 s=(-1)*(0.55);
aismail1997 0:ec413378ee3a 171 left.speed(0.55);
aismail1997 0:ec413378ee3a 172 right.speed(s);
aismail1997 0:ec413378ee3a 173 wait(0.25);
aismail1997 0:ec413378ee3a 174 left.stop(1);
aismail1997 0:ec413378ee3a 175 right.stop(1);
aismail1997 0:ec413378ee3a 176 wait(0.25);
aismail1997 0:ec413378ee3a 177 }
aismail1997 0:ec413378ee3a 178 break;
aismail1997 0:ec413378ee3a 179 case '3': //number button 3
aismail1997 0:ec413378ee3a 180 if (bhit=='1') {
aismail1997 0:ec413378ee3a 181 theta += 3.14/6;
aismail1997 0:ec413378ee3a 182 // MOTOR CODE
aismail1997 0:ec413378ee3a 183 // turn left
aismail1997 0:ec413378ee3a 184 s=(-1)*(0.55);
aismail1997 0:ec413378ee3a 185 left.speed(s);
aismail1997 0:ec413378ee3a 186 right.speed(0.55);
aismail1997 0:ec413378ee3a 187 wait(0.25);
aismail1997 0:ec413378ee3a 188 left.stop(1);
aismail1997 0:ec413378ee3a 189 right.stop(1);
aismail1997 0:ec413378ee3a 190 wait(0.25);
aismail1997 0:ec413378ee3a 191 }
aismail1997 0:ec413378ee3a 192 break;
aismail1997 0:ec413378ee3a 193 case '4': //number button 4
aismail1997 0:ec413378ee3a 194 if (bhit=='1') {
aismail1997 0:ec413378ee3a 195 // MOTOR CODE
aismail1997 0:ec413378ee3a 196 // move back
aismail1997 0:ec413378ee3a 197 s=(-1)*(0.5);
aismail1997 0:ec413378ee3a 198 left.speed(s);
aismail1997 0:ec413378ee3a 199 right.speed(s);
aismail1997 0:ec413378ee3a 200 wait(0.4);
aismail1997 0:ec413378ee3a 201 left.stop(1);
aismail1997 0:ec413378ee3a 202 right.stop(1);
aismail1997 0:ec413378ee3a 203 y = 6*cos(theta);
aismail1997 0:ec413378ee3a 204 x = 6*sin(theta);
aismail1997 0:ec413378ee3a 205 lcd_mutex.lock();
aismail1997 0:ec413378ee3a 206 uLCD.line(old_x,old_y,old_x-x,old_y-y,RED);
aismail1997 0:ec413378ee3a 207 lcd_mutex.unlock();
aismail1997 0:ec413378ee3a 208 old_x += -x;
aismail1997 0:ec413378ee3a 209 old_y += -y;
aismail1997 0:ec413378ee3a 210 wait(0.25);
aismail1997 0:ec413378ee3a 211 }
aismail1997 0:ec413378ee3a 212 break;
aismail1997 0:ec413378ee3a 213 }
aismail1997 0:ec413378ee3a 214 }
aismail1997 0:ec413378ee3a 215 }
aismail1997 0:ec413378ee3a 216 }
aismail1997 0:ec413378ee3a 217 Thread::wait(200);
aismail1997 0:ec413378ee3a 218 }
aismail1997 0:ec413378ee3a 219 }