Ghost Mouse / Mbed 2 deprecated ghost_mouse

Dependencies:   mbed

Committer:
jennabarton
Date:
Sat Apr 01 22:13:22 2017 +0000
Revision:
11:cd450ce343a8
Parent:
10:d67a15ba5748
Child:
12:e127fa20d609
implemented x,y mvmt for point 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daviwang 0:1c15cf9cc4f9 1 #include "mbed.h"
daviwang 0:1c15cf9cc4f9 2
jennabarton 8:d27efcac2dd7 3 //******************************************************************
jennabarton 8:d27efcac2dd7 4 // All variables defined below
jennabarton 8:d27efcac2dd7 5 //******************************************************************
jennabarton 8:d27efcac2dd7 6
jennabarton 8:d27efcac2dd7 7 //communication
daviwang 0:1c15cf9cc4f9 8 DigitalOut myled(LED1);
daviwang 1:2e895e5272ab 9 Serial pc(USBTX, USBRX);
jennabarton 4:1f443e7a0122 10 Serial keyOut(p13, p14);
daviwang 1:2e895e5272ab 11 I2C camera1(p9, p10);
daviwang 1:2e895e5272ab 12
jennabarton 2:f501e506d62b 13 //initial camera data
daviwang 1:2e895e5272ab 14 int IRsensorAddress = 0xB0;
daviwang 1:2e895e5272ab 15 int slaveAddress;
daviwang 1:2e895e5272ab 16 char data_buf[16];
jennabarton 2:f501e506d62b 17 char s;
daviwang 1:2e895e5272ab 18 int i;
daviwang 1:2e895e5272ab 19
jennabarton 7:6b27977d1800 20 //previous point values
jennabarton 7:6b27977d1800 21 int prevX = 1023;
jennabarton 7:6b27977d1800 22 int prevY = 1023;
jennabarton 7:6b27977d1800 23
jennabarton 2:f501e506d62b 24 //point variables
jennabarton 2:f501e506d62b 25 int point1x = 0;
jennabarton 2:f501e506d62b 26 int point1y = 0;
jennabarton 2:f501e506d62b 27 int point2x = 0;
jennabarton 2:f501e506d62b 28 int point2y = 0;
jennabarton 2:f501e506d62b 29 int point3x = 0;
jennabarton 2:f501e506d62b 30 int point3y = 0;
jennabarton 2:f501e506d62b 31 int point4x = 0;
jennabarton 2:f501e506d62b 32 int point4y = 0;
jennabarton 2:f501e506d62b 33
daviwang 1:2e895e5272ab 34 //sensitivity
daviwang 1:2e895e5272ab 35 //Level 5: p0 = 0x96, p1 = 0xFE, p2 = 0xFE, p3 = 0x05
jennabarton 8:d27efcac2dd7 36 //highest sensitivity to more accurately detect points
daviwang 1:2e895e5272ab 37 int sen0 = 0x96;
daviwang 1:2e895e5272ab 38 int sen1 = 0xFE;
daviwang 1:2e895e5272ab 39 int sen2 = 0xFE;
daviwang 1:2e895e5272ab 40 int sen3 = 0x00;
daviwang 1:2e895e5272ab 41
jennabarton 8:d27efcac2dd7 42 //matrices of x and y coordinates from the first camera
jennabarton 2:f501e506d62b 43 int onex[4];
jennabarton 2:f501e506d62b 44 int oney[4];
daviwang 1:2e895e5272ab 45
jennabarton 8:d27efcac2dd7 46 //******************************************************************
jennabarton 8:d27efcac2dd7 47 // All methods defined below
jennabarton 8:d27efcac2dd7 48 //******************************************************************
daviwang 1:2e895e5272ab 49
jennabarton 4:1f443e7a0122 50
jennabarton 8:d27efcac2dd7 51 //writes two bytes to the camera
daviwang 1:2e895e5272ab 52 void write2bytes(char data1, char data2){
daviwang 1:2e895e5272ab 53 char out[2];
daviwang 1:2e895e5272ab 54 out[0] = data1;
daviwang 1:2e895e5272ab 55 out[1] = data2;
daviwang 1:2e895e5272ab 56 camera1.write(slaveAddress, out, 2);
daviwang 1:2e895e5272ab 57 wait(0.01);
daviwang 1:2e895e5272ab 58 }
daviwang 1:2e895e5272ab 59
jennabarton 8:d27efcac2dd7 60 //TODO: get rid of these b/c they don't work. instead use printc
jennabarton 8:d27efcac2dd7 61 //
jennabarton 10:d67a15ba5748 62 void mouseCommand(char buttons, char x, char y) {
jennabarton 10:d67a15ba5748 63 keyOut.putc(0xFD);
jennabarton 10:d67a15ba5748 64 keyOut.putc(0x00);
jennabarton 10:d67a15ba5748 65 keyOut.putc(0x03);
jennabarton 10:d67a15ba5748 66 keyOut.putc(buttons);
jennabarton 10:d67a15ba5748 67 keyOut.putc(x);
jennabarton 10:d67a15ba5748 68 keyOut.putc(y);
jennabarton 10:d67a15ba5748 69 keyOut.putc(0x00);
jennabarton 10:d67a15ba5748 70 keyOut.putc(0x00);
jennabarton 10:d67a15ba5748 71 keyOut.putc(0x00);
jennabarton 10:d67a15ba5748 72
jennabarton 10:d67a15ba5748 73 //delay for pushing data
jennabarton 10:d67a15ba5748 74 wait(0.1);
jennabarton 10:d67a15ba5748 75 }
jennabarton 10:d67a15ba5748 76
jennabarton 4:1f443e7a0122 77
jennabarton 8:d27efcac2dd7 78 // Initialize WiiMote Camera
daviwang 1:2e895e5272ab 79 void initCamera(void){
daviwang 1:2e895e5272ab 80 write2bytes(0x30, 0x01);
daviwang 1:2e895e5272ab 81 write2bytes(0x00, 0x02);
daviwang 1:2e895e5272ab 82 write2bytes(0x00, 0x00);
daviwang 1:2e895e5272ab 83 write2bytes(0x71, 0x01);
daviwang 1:2e895e5272ab 84 write2bytes(0x00, sen0);
daviwang 1:2e895e5272ab 85 write2bytes(0x07, 0x00);
daviwang 1:2e895e5272ab 86 write2bytes(sen1, 0x1A);
daviwang 1:2e895e5272ab 87 write2bytes(sen2, sen3);
daviwang 1:2e895e5272ab 88 write2bytes(0x33, 0x03);
daviwang 1:2e895e5272ab 89 write2bytes(0x30, 0x08);
jennabarton 3:7b0c215eb6a7 90 //wait(0.1);
daviwang 1:2e895e5272ab 91
daviwang 1:2e895e5272ab 92 }
daviwang 0:1c15cf9cc4f9 93
jennabarton 8:d27efcac2dd7 94 //get data from camera one
jennabarton 8:d27efcac2dd7 95 //populates onex and oney with values depending on the measured points
jennabarton 8:d27efcac2dd7 96 //NOTE: 1023 means nothing was detected
jennabarton 2:f501e506d62b 97 void readCameraData(void){
jennabarton 2:f501e506d62b 98
jennabarton 2:f501e506d62b 99 //request data from camera
jennabarton 2:f501e506d62b 100 char out[1];
jennabarton 2:f501e506d62b 101 out[0] = 0x36;
jennabarton 2:f501e506d62b 102 camera1.write(slaveAddress, out, 1);
jennabarton 2:f501e506d62b 103 //wait(0.2); //do we need this?
jennabarton 2:f501e506d62b 104
jennabarton 2:f501e506d62b 105 //get data from camera
jennabarton 2:f501e506d62b 106 camera1.read(slaveAddress, data_buf, 16);
jennabarton 8:d27efcac2dd7 107
jennabarton 2:f501e506d62b 108 //POINT 1
jennabarton 2:f501e506d62b 109 //get data
jennabarton 2:f501e506d62b 110 point1x = data_buf[1];
jennabarton 2:f501e506d62b 111 point1y = data_buf[2];
jennabarton 2:f501e506d62b 112 s = data_buf[3];
jennabarton 3:7b0c215eb6a7 113 //load x,y
jennabarton 3:7b0c215eb6a7 114 onex[0] = point1x + ((s & 0x30) << 4);
jennabarton 3:7b0c215eb6a7 115 oney[0] = point1y + ((s & 0xC0) << 2);
jennabarton 2:f501e506d62b 116
jennabarton 8:d27efcac2dd7 117
jennabarton 11:cd450ce343a8 118 //>>>>>>>>>>>>>>>>>Begin unfinished code for moving
jennabarton 11:cd450ce343a8 119
jennabarton 11:cd450ce343a8 120 int deadzone = 5;
jennabarton 8:d27efcac2dd7 121 //look at delta btwn prev val and current
jennabarton 8:d27efcac2dd7 122 //TODO: moving average
jennabarton 10:d67a15ba5748 123 if((prevX != 1023 || prevY != 1023) && (onex[0] != 1023 && oney[0] != 1023)){
jennabarton 11:cd450ce343a8 124 int diffX = onex[0] - prevX;
jennabarton 11:cd450ce343a8 125 int diffY = -1*(oney[0] - prevY);
jennabarton 11:cd450ce343a8 126
jennabarton 11:cd450ce343a8 127 //fix diffX
jennabarton 11:cd450ce343a8 128 if(diffX > deadzone){
jennabarton 11:cd450ce343a8 129 diffX -= deadzone;
jennabarton 11:cd450ce343a8 130 } else if (diffX < -1*deadzone){
jennabarton 11:cd450ce343a8 131 diffX += deadzone;
jennabarton 11:cd450ce343a8 132 } else{
jennabarton 11:cd450ce343a8 133 diffX = 0;
jennabarton 7:6b27977d1800 134 }
jennabarton 11:cd450ce343a8 135 //fix diffY
jennabarton 11:cd450ce343a8 136 if(diffY > deadzone){
jennabarton 11:cd450ce343a8 137 diffY -= deadzone;
jennabarton 11:cd450ce343a8 138 } else if (diffX < -1*deadzone){
jennabarton 11:cd450ce343a8 139 diffY += deadzone;
jennabarton 11:cd450ce343a8 140 } else{
jennabarton 11:cd450ce343a8 141 diffY = 0;
jennabarton 11:cd450ce343a8 142 }
jennabarton 11:cd450ce343a8 143
jennabarton 11:cd450ce343a8 144 //move x and y
jennabarton 11:cd450ce343a8 145 mouseCommand(0, (char) diffX, (char) diffY);
jennabarton 7:6b27977d1800 146 }
jennabarton 7:6b27977d1800 147
jennabarton 7:6b27977d1800 148 //update prev values
jennabarton 7:6b27977d1800 149 prevX = onex[0];
jennabarton 7:6b27977d1800 150 prevY = oney[0];
jennabarton 7:6b27977d1800 151
jennabarton 7:6b27977d1800 152
jennabarton 8:d27efcac2dd7 153 //<<<<<<<<<<<<<<<<End unfinished code for moving averages
jennabarton 8:d27efcac2dd7 154
jennabarton 2:f501e506d62b 155 //POINT 2
jennabarton 2:f501e506d62b 156 //get data
jennabarton 2:f501e506d62b 157 point2x = data_buf[4];
jennabarton 2:f501e506d62b 158 point2y = data_buf[5];
jennabarton 2:f501e506d62b 159 s = data_buf[6];
jennabarton 2:f501e506d62b 160 //load x,y
jennabarton 2:f501e506d62b 161 onex[1] = point2x + ((s & 0x30) << 4);
jennabarton 2:f501e506d62b 162 oney[1] = point2y + ((s & 0xC0) << 2);
jennabarton 3:7b0c215eb6a7 163
jennabarton 2:f501e506d62b 164 //POINT 3
jennabarton 2:f501e506d62b 165 //get data
jennabarton 2:f501e506d62b 166 point3x = data_buf[7];
jennabarton 2:f501e506d62b 167 point3y = data_buf[8];
jennabarton 2:f501e506d62b 168 s = data_buf[9];
jennabarton 2:f501e506d62b 169 //load x,y
jennabarton 2:f501e506d62b 170 onex[2] = point3x + ((s & 0x30) << 4);
jennabarton 2:f501e506d62b 171 oney[2] = point3y + ((s & 0xC0) << 2);
jennabarton 2:f501e506d62b 172
jennabarton 2:f501e506d62b 173 //POINT 4
jennabarton 2:f501e506d62b 174 //get data
jennabarton 2:f501e506d62b 175 point4x = data_buf[10];
jennabarton 2:f501e506d62b 176 point4y = data_buf[11];
jennabarton 2:f501e506d62b 177 s = data_buf[12];
jennabarton 2:f501e506d62b 178 //load x,y
jennabarton 2:f501e506d62b 179 onex[3] = point4x + ((s & 0x30) << 4);
jennabarton 2:f501e506d62b 180 oney[3] = point4y + ((s & 0xC0) << 2);
jennabarton 2:f501e506d62b 181
jennabarton 2:f501e506d62b 182 }
jennabarton 2:f501e506d62b 183
jennabarton 8:d27efcac2dd7 184 //print to serial monitor the coordinates of the points stored in
jennabarton 8:d27efcac2dd7 185 //the passed x and y arrays
jennabarton 2:f501e506d62b 186 void printCamData(int xcor[4], int ycor[4]){
jennabarton 2:f501e506d62b 187 for(int i = 0; i<4; i++){
jennabarton 2:f501e506d62b 188 int x = xcor[i];
jennabarton 2:f501e506d62b 189 int y = ycor[i];
jennabarton 2:f501e506d62b 190 //determine what to print
jennabarton 2:f501e506d62b 191 //x coordinate
jennabarton 3:7b0c215eb6a7 192 pc.printf(" %d,", x);
jennabarton 2:f501e506d62b 193
jennabarton 2:f501e506d62b 194 //y coordinate
jennabarton 8:d27efcac2dd7 195 pc.printf(" %d\t", y);
jennabarton 2:f501e506d62b 196 }
jennabarton 2:f501e506d62b 197
jennabarton 2:f501e506d62b 198 //new line and delay
jennabarton 2:f501e506d62b 199 pc.printf("\n");
jennabarton 3:7b0c215eb6a7 200 //wait(0.01);
jennabarton 2:f501e506d62b 201 }
jennabarton 2:f501e506d62b 202
jennabarton 4:1f443e7a0122 203
jennabarton 4:1f443e7a0122 204
jennabarton 4:1f443e7a0122 205
jennabarton 8:d27efcac2dd7 206 //entrance to the code
daviwang 0:1c15cf9cc4f9 207 int main() {
daviwang 1:2e895e5272ab 208 myled = 0;
jennabarton 3:7b0c215eb6a7 209 //slaveAddress = IRsensorAddress >> 1;
jennabarton 3:7b0c215eb6a7 210 slaveAddress = IRsensorAddress;
daviwang 1:2e895e5272ab 211 initCamera();
daviwang 1:2e895e5272ab 212
jennabarton 3:7b0c215eb6a7 213 //update baud rate
jennabarton 3:7b0c215eb6a7 214 pc.baud(115200);
jennabarton 3:7b0c215eb6a7 215
jennabarton 8:d27efcac2dd7 216 //loop to search for new info using the camera
daviwang 0:1c15cf9cc4f9 217 while(1) {
jennabarton 8:d27efcac2dd7 218
jennabarton 8:d27efcac2dd7 219 //wait
jennabarton 7:6b27977d1800 220 wait(0.04);
jennabarton 8:d27efcac2dd7 221
jennabarton 8:d27efcac2dd7 222 //toggle test LED
jennabarton 2:f501e506d62b 223 myled = 1 - myled;
jennabarton 2:f501e506d62b 224
jennabarton 2:f501e506d62b 225 //get the camera data
jennabarton 2:f501e506d62b 226 readCameraData();
daviwang 1:2e895e5272ab 227
jennabarton 2:f501e506d62b 228 //print points
jennabarton 3:7b0c215eb6a7 229 printCamData(onex, oney);
daviwang 1:2e895e5272ab 230
jennabarton 8:d27efcac2dd7 231 //uncomment below to test infinite print
jennabarton 6:4ade0e1a3723 232 //keyOut.putc(0x41);
jennabarton 10:d67a15ba5748 233
jennabarton 4:1f443e7a0122 234
jennabarton 10:d67a15ba5748 235 //uncomment below to infinitely move mouse up and down
jennabarton 10:d67a15ba5748 236 // double delay = 0.1;
jennabarton 10:d67a15ba5748 237 // int change = 75;
jennabarton 10:d67a15ba5748 238 // mouseCommand(0,0, (char) -1*change);
jennabarton 10:d67a15ba5748 239 // wait(delay);
jennabarton 10:d67a15ba5748 240 // mouseCommand(0,(char) -1*change,0);
jennabarton 10:d67a15ba5748 241 // wait(delay);
jennabarton 10:d67a15ba5748 242 // mouseCommand(0,0, (char) change);
jennabarton 10:d67a15ba5748 243 // wait(delay);
jennabarton 10:d67a15ba5748 244 // mouseCommand(0,(char) change,0);
jennabarton 10:d67a15ba5748 245 // wait(delay);
jennabarton 10:d67a15ba5748 246 //mouseCommand(0,0,(char) 100);
jennabarton 10:d67a15ba5748 247 //wait(.05);
jennabarton 9:55473409c585 248
jennabarton 9:55473409c585 249
daviwang 0:1c15cf9cc4f9 250 }
daviwang 0:1c15cf9cc4f9 251 }