w m / Mbed 2 deprecated DISTANCE_PROJECT1

Dependencies:   mbed

Committer:
mrweilun
Date:
Sun May 12 11:02:13 2019 +0000
Revision:
1:8d53c6fe8815
Parent:
0:3d3331775af2
dasda

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mrweilun 0:3d3331775af2 1 #include "mbed.h"
mrweilun 0:3d3331775af2 2 #include "stdint.h"
mrweilun 0:3d3331775af2 3 #include "MCP23017.h"
mrweilun 0:3d3331775af2 4 #include "WattBob_TextLCD.h"
mrweilun 0:3d3331775af2 5 #include "VL6180.h"
mrweilun 1:8d53c6fe8815 6 #include "time.h"
mrweilun 0:3d3331775af2 7 #define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT)
mrweilun 0:3d3331775af2 8 #define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT)
mrweilun 0:3d3331775af2 9 #define IDENTIFICATIONMODEL_ID 0x0000
mrweilun 0:3d3331775af2 10 VL6180 TOF_sensor(I2C_SDA, I2C_SCL);
mrweilun 0:3d3331775af2 11 MCP23017 *par_port;
mrweilun 0:3d3331775af2 12 WattBob_TextLCD *lcd;
mrweilun 0:3d3331775af2 13 Serial pc(A0,A1,9600);//TX,RX
mrweilun 0:3d3331775af2 14 I2C i2c(PC_1, PC_0); //pins for I2C communication (SDA, SCL)
mrweilun 0:3d3331775af2 15 int sensor_addr = 41 << 1;
mrweilun 1:8d53c6fe8815 16 //#define Random(x) (rand()%x)
mrweilun 1:8d53c6fe8815 17 DigitalOut led(LED2);
mrweilun 0:3d3331775af2 18 int flag_Android=0;
mrweilun 0:3d3331775af2 19 DigitalOut pwm1(D6);
mrweilun 0:3d3331775af2 20 DigitalOut pwm2(D7);
mrweilun 0:3d3331775af2 21 DigitalOut pwm3(D8);
mrweilun 1:8d53c6fe8815 22 DigitalIn mode1(D0);
mrweilun 1:8d53c6fe8815 23 DigitalIn mode2(D1);
mrweilun 0:3d3331775af2 24 int start_signal;
mrweilun 0:3d3331775af2 25 int end_signal;
mrweilun 0:3d3331775af2 26 int a;
mrweilun 1:8d53c6fe8815 27
mrweilun 1:8d53c6fe8815 28
mrweilun 1:8d53c6fe8815 29 /*void echouart1()
mrweilun 0:3d3331775af2 30 {
mrweilun 0:3d3331775af2 31 start_signal=pc.getc();
mrweilun 0:3d3331775af2 32 }
mrweilun 0:3d3331775af2 33 void echouart2()
mrweilun 0:3d3331775af2 34 {
mrweilun 0:3d3331775af2 35 end_signal=pc.getc();
mrweilun 1:8d53c6fe8815 36 }*/
mrweilun 0:3d3331775af2 37 int color_sensor()
mrweilun 0:3d3331775af2 38 {
mrweilun 1:8d53c6fe8815 39 int customer_card=0;
mrweilun 0:3d3331775af2 40 char clear_reg[1] = {148};
mrweilun 0:3d3331775af2 41
mrweilun 0:3d3331775af2 42 char clear_data[2] = {0,0};
mrweilun 0:3d3331775af2 43
mrweilun 0:3d3331775af2 44 i2c.write(sensor_addr,clear_reg,1, true);
mrweilun 0:3d3331775af2 45
mrweilun 0:3d3331775af2 46 i2c.read(sensor_addr,clear_data,2, false);
mrweilun 0:3d3331775af2 47
mrweilun 0:3d3331775af2 48
mrweilun 0:3d3331775af2 49
mrweilun 0:3d3331775af2 50 int clear_value = ((int)clear_data[1] << 8) | clear_data[0];
mrweilun 0:3d3331775af2 51
mrweilun 0:3d3331775af2 52
mrweilun 0:3d3331775af2 53
mrweilun 0:3d3331775af2 54 char red_reg[1] = {150};
mrweilun 0:3d3331775af2 55
mrweilun 0:3d3331775af2 56 char red_data[2] = {0,0};
mrweilun 0:3d3331775af2 57
mrweilun 0:3d3331775af2 58 i2c.write(sensor_addr,red_reg,1, true);
mrweilun 0:3d3331775af2 59
mrweilun 0:3d3331775af2 60 i2c.read(sensor_addr,red_data,2, false);
mrweilun 0:3d3331775af2 61
mrweilun 0:3d3331775af2 62
mrweilun 0:3d3331775af2 63
mrweilun 0:3d3331775af2 64 int red_value = ((int)red_data[1] << 8) | red_data[0];
mrweilun 0:3d3331775af2 65
mrweilun 0:3d3331775af2 66
mrweilun 0:3d3331775af2 67
mrweilun 0:3d3331775af2 68 char green_reg[1] = {152};
mrweilun 0:3d3331775af2 69
mrweilun 0:3d3331775af2 70 char green_data[2] = {0,0};
mrweilun 0:3d3331775af2 71
mrweilun 0:3d3331775af2 72 i2c.write(sensor_addr,green_reg,1, true);
mrweilun 0:3d3331775af2 73
mrweilun 0:3d3331775af2 74 i2c.read(sensor_addr,green_data,2, false);
mrweilun 0:3d3331775af2 75
mrweilun 0:3d3331775af2 76
mrweilun 0:3d3331775af2 77
mrweilun 0:3d3331775af2 78 int green_value = ((int)green_data[1] << 8) | green_data[0];
mrweilun 0:3d3331775af2 79
mrweilun 0:3d3331775af2 80
mrweilun 0:3d3331775af2 81
mrweilun 0:3d3331775af2 82 char blue_reg[1] = {154};
mrweilun 0:3d3331775af2 83
mrweilun 0:3d3331775af2 84 char blue_data[2] = {0,0};
mrweilun 0:3d3331775af2 85
mrweilun 0:3d3331775af2 86 i2c.write(sensor_addr,blue_reg,1, true);
mrweilun 0:3d3331775af2 87
mrweilun 0:3d3331775af2 88 i2c.read(sensor_addr,blue_data,2, false);
mrweilun 0:3d3331775af2 89
mrweilun 0:3d3331775af2 90
mrweilun 0:3d3331775af2 91 int blue_value = ((int)blue_data[1] << 8) | blue_data[0];
mrweilun 0:3d3331775af2 92
mrweilun 0:3d3331775af2 93 //判断颜色
mrweilun 1:8d53c6fe8815 94 while(customer_card==0)
mrweilun 1:8d53c6fe8815 95 {
mrweilun 1:8d53c6fe8815 96 i2c.write(sensor_addr,red_reg,1, true);
mrweilun 1:8d53c6fe8815 97
mrweilun 1:8d53c6fe8815 98 i2c.read(sensor_addr,red_data,2, false);
mrweilun 1:8d53c6fe8815 99 i2c.write(sensor_addr,green_reg,1, true);
mrweilun 1:8d53c6fe8815 100
mrweilun 1:8d53c6fe8815 101 i2c.read(sensor_addr,green_data,2, false);
mrweilun 1:8d53c6fe8815 102 i2c.write(sensor_addr,blue_reg,1, true);
mrweilun 1:8d53c6fe8815 103
mrweilun 1:8d53c6fe8815 104 i2c.read(sensor_addr,blue_data,2, false);
mrweilun 1:8d53c6fe8815 105 if (red_value>green_value&&red_value>blue_value)
mrweilun 0:3d3331775af2 106 customer_card=-2;
mrweilun 0:3d3331775af2 107
mrweilun 0:3d3331775af2 108
mrweilun 0:3d3331775af2 109 else if (green_value>red_value&&green_value>blue_value)
mrweilun 0:3d3331775af2 110 customer_card=1;
mrweilun 0:3d3331775af2 111
mrweilun 0:3d3331775af2 112 else if (blue_value>red_value&&blue_value>green_value)
mrweilun 0:3d3331775af2 113 customer_card=2;
mrweilun 1:8d53c6fe8815 114 }
mrweilun 0:3d3331775af2 115
mrweilun 0:3d3331775af2 116 return customer_card;
mrweilun 0:3d3331775af2 117 }
mrweilun 0:3d3331775af2 118 int main()
mrweilun 0:3d3331775af2 119 {
mrweilun 0:3d3331775af2 120 pc.baud(9600);
mrweilun 0:3d3331775af2 121
mrweilun 0:3d3331775af2 122 // Connect to the Color sensor and verify whether we connected to the correct sensor.
mrweilun 0:3d3331775af2 123
mrweilun 0:3d3331775af2 124 i2c.frequency(100000);//修改为100000,否则报错
mrweilun 0:3d3331775af2 125
mrweilun 0:3d3331775af2 126 char id_regval[1] = {146};
mrweilun 0:3d3331775af2 127 char data[1] = {0};
mrweilun 0:3d3331775af2 128 i2c.write(sensor_addr,id_regval,1, true);
mrweilun 0:3d3331775af2 129 i2c.read(sensor_addr,data,1,false);
mrweilun 0:3d3331775af2 130
mrweilun 0:3d3331775af2 131
mrweilun 0:3d3331775af2 132 // Initialize color sensor
mrweilun 0:3d3331775af2 133
mrweilun 0:3d3331775af2 134 char timing_register[2] = {129,0};
mrweilun 0:3d3331775af2 135 i2c.write(sensor_addr,timing_register,2,false);
mrweilun 0:3d3331775af2 136
mrweilun 0:3d3331775af2 137 char control_register[2] = {143,0};
mrweilun 0:3d3331775af2 138 i2c.write(sensor_addr,control_register,2,false);
mrweilun 0:3d3331775af2 139
mrweilun 0:3d3331775af2 140 char enable_register[2] = {128,3};
mrweilun 0:3d3331775af2 141 i2c.write(sensor_addr,enable_register,2,false);
mrweilun 0:3d3331775af2 142 pc.baud(9600);
mrweilun 0:3d3331775af2 143 uint8_t dist;
mrweilun 1:8d53c6fe8815 144 par_port = new MCP23017(I2C_SDA, I2C_SCL,0x0400);
mrweilun 0:3d3331775af2 145 par_port->config(0x0F00, 0x0F00, 0x0F00); // configure MCP23017 chip on WattBob
mrweilun 0:3d3331775af2 146
mrweilun 0:3d3331775af2 147 lcd = new WattBob_TextLCD(par_port);
mrweilun 0:3d3331775af2 148 int winscore;
mrweilun 1:8d53c6fe8815 149 /* for(;;)
mrweilun 1:8d53c6fe8815 150 {
mrweilun 1:8d53c6fe8815 151 dist = TOF_sensor.getDistance();
mrweilun 1:8d53c6fe8815 152
mrweilun 1:8d53c6fe8815 153
mrweilun 1:8d53c6fe8815 154 wait_ms(100);
mrweilun 1:8d53c6fe8815 155 lcd->cls();
mrweilun 1:8d53c6fe8815 156 lcd->locate(0,0);
mrweilun 1:8d53c6fe8815 157 if(dist==!255)
mrweilun 1:8d53c6fe8815 158 {
mrweilun 1:8d53c6fe8815 159 pc.printf("d=%d ", dist);
mrweilun 1:8d53c6fe8815 160 pc.printf("ready");
mrweilun 1:8d53c6fe8815 161 break;}
mrweilun 1:8d53c6fe8815 162 }*/
mrweilun 1:8d53c6fe8815 163 dist = TOF_sensor.getDistance();
mrweilun 1:8d53c6fe8815 164 while(dist==255)
mrweilun 1:8d53c6fe8815 165 { dist = TOF_sensor.getDistance();
mrweilun 1:8d53c6fe8815 166
mrweilun 1:8d53c6fe8815 167 lcd->cls();
mrweilun 1:8d53c6fe8815 168 lcd->locate(0,0);}
mrweilun 1:8d53c6fe8815 169 pc.printf("ready ", dist);
mrweilun 1:8d53c6fe8815 170
mrweilun 1:8d53c6fe8815 171 /*while(1)
mrweilun 0:3d3331775af2 172 {
mrweilun 0:3d3331775af2 173 dist = TOF_sensor.getDistance();
mrweilun 1:8d53c6fe8815 174 if(dist==!255)
mrweilun 1:8d53c6fe8815 175 {
mrweilun 1:8d53c6fe8815 176 dist = TOF_sensor.getDistance();
mrweilun 1:8d53c6fe8815 177 pc.printf("%d",dist);
mrweilun 1:8d53c6fe8815 178 pc.printf("Ready");
mrweilun 0:3d3331775af2 179 wait(0.2);
mrweilun 0:3d3331775af2 180 lcd->cls();
mrweilun 0:3d3331775af2 181 lcd->locate(0,0);
mrweilun 1:8d53c6fe8815 182 break;
mrweilun 1:8d53c6fe8815 183 }
mrweilun 1:8d53c6fe8815 184 }*/
mrweilun 1:8d53c6fe8815 185 while(mode1==0&&mode2==0)
mrweilun 0:3d3331775af2 186 {}
mrweilun 0:3d3331775af2 187 if(mode1==0&&mode2==1)
mrweilun 1:8d53c6fe8815 188 {winscore=12;pc.printf("%d",winscore);}
mrweilun 0:3d3331775af2 189 else if(mode1==1&&mode2==0)
mrweilun 1:8d53c6fe8815 190 {winscore=14;pc.printf("%d",winscore);}
mrweilun 0:3d3331775af2 191 else if(mode1==1&&mode2==1)
mrweilun 1:8d53c6fe8815 192 {winscore=16;pc.printf("%d",winscore);}
mrweilun 1:8d53c6fe8815 193
mrweilun 0:3d3331775af2 194 int customer_card;
mrweilun 0:3d3331775af2 195 int record[10];
mrweilun 0:3d3331775af2 196 int p;
mrweilun 1:8d53c6fe8815 197
mrweilun 1:8d53c6fe8815 198 while(1)
mrweilun 0:3d3331775af2 199 {
mrweilun 1:8d53c6fe8815 200 //pc.attach(&echouart1,SerialBase::RxIrq);//如果串口没有发送数据,那么主程序中的程序会继续执行,如果串口有发送数据,则执行函数
mrweilun 1:8d53c6fe8815 201 if(pc.readable())
mrweilun 1:8d53c6fe8815 202 {
mrweilun 1:8d53c6fe8815 203 pc.scanf("%d",&p);
mrweilun 0:3d3331775af2 204 start_signal=p;
mrweilun 0:3d3331775af2 205 break;
mrweilun 1:8d53c6fe8815 206 }
mrweilun 0:3d3331775af2 207 }
mrweilun 1:8d53c6fe8815 208
mrweilun 1:8d53c6fe8815 209 led=p;
mrweilun 1:8d53c6fe8815 210
mrweilun 0:3d3331775af2 211 if(start_signal==1)
mrweilun 0:3d3331775af2 212 {
mrweilun 0:3d3331775af2 213 int score[10];
mrweilun 0:3d3331775af2 214 score[0]=10;
mrweilun 0:3d3331775af2 215 int robot_card;
mrweilun 0:3d3331775af2 216 int a;
mrweilun 0:3d3331775af2 217 int i;
mrweilun 1:8d53c6fe8815 218 srand((unsigned)time(NULL));
mrweilun 0:3d3331775af2 219 for(i=1;i<5;i++)
mrweilun 0:3d3331775af2 220 {
mrweilun 1:8d53c6fe8815 221 pwm1=1;pwm2=1;pwm3=1;//控制遮挡电机关闭
mrweilun 1:8d53c6fe8815 222 wait_ms(4000);
mrweilun 1:8d53c6fe8815 223 a=(rand()%4);//电脑出牌,产生[0, dis)之间的随机数,注意不包括4
mrweilun 0:3d3331775af2 224 switch(a)
mrweilun 1:8d53c6fe8815 225 {
mrweilun 1:8d53c6fe8815 226 case 0: robot_card=-2;pwm1=0;pwm2=0;pwm3=1;break;
mrweilun 1:8d53c6fe8815 227 case 1: robot_card=-1;pwm1=0;pwm2=1;pwm3=0;break;
mrweilun 1:8d53c6fe8815 228 case 2: robot_card=1;pwm1=0;pwm2=1;pwm3=1;break;
mrweilun 1:8d53c6fe8815 229 case 3: robot_card=2;pwm1=1;pwm2=0;pwm3=0;break;
mrweilun 0:3d3331775af2 230 }
mrweilun 1:8d53c6fe8815 231 wait_ms(2000);
mrweilun 0:3d3331775af2 232 customer_card=color_sensor();
mrweilun 0:3d3331775af2 233 switch(customer_card)
mrweilun 0:3d3331775af2 234 {case -2:{record[i]=2;break;}
mrweilun 1:8d53c6fe8815 235 case 1:{record[i]=(rand()%2);break;}
mrweilun 0:3d3331775af2 236 case 2:{record[i]=-2;break;}
mrweilun 0:3d3331775af2 237 }
mrweilun 1:8d53c6fe8815 238
mrweilun 1:8d53c6fe8815 239
mrweilun 1:8d53c6fe8815 240 {pwm1=1;pwm2=1;pwm3=0;}//控制遮挡电机显示电脑出牌
mrweilun 1:8d53c6fe8815 241
mrweilun 1:8d53c6fe8815 242 wait_ms(3000);
mrweilun 1:8d53c6fe8815 243 score[i]=score[i-1]+robot_card*color_sensor();
mrweilun 0:3d3331775af2 244 pc.printf("%d",score[i]);//每一轮传给上位机总分
mrweilun 0:3d3331775af2 245 if(score[i]>=winscore)
mrweilun 0:3d3331775af2 246 {
mrweilun 0:3d3331775af2 247 pc.printf("%d",score[i]);
mrweilun 1:8d53c6fe8815 248 pc.printf("win");
mrweilun 0:3d3331775af2 249 break;
mrweilun 0:3d3331775af2 250 }
mrweilun 1:8d53c6fe8815 251 while(1)//这一轮结束信号(即25秒以后产生)
mrweilun 1:8d53c6fe8815 252 {
mrweilun 1:8d53c6fe8815 253 if(pc.readable())
mrweilun 1:8d53c6fe8815 254 {
mrweilun 1:8d53c6fe8815 255 pc.scanf("%d",&p);
mrweilun 1:8d53c6fe8815 256 end_signal=p;
mrweilun 1:8d53c6fe8815 257 break;
mrweilun 1:8d53c6fe8815 258 }
mrweilun 1:8d53c6fe8815 259 }
mrweilun 0:3d3331775af2 260
mrweilun 0:3d3331775af2 261 }
mrweilun 1:8d53c6fe8815 262 if(score[i]<winscore)
mrweilun 1:8d53c6fe8815 263 {
mrweilun 1:8d53c6fe8815 264 for(i;i<9;i++)
mrweilun 0:3d3331775af2 265 {
mrweilun 1:8d53c6fe8815 266 pwm1=1;pwm2=1;pwm3=1;//控制遮挡电机关闭
mrweilun 1:8d53c6fe8815 267 wait_ms(4000);
mrweilun 1:8d53c6fe8815 268 robot_card=record[(rand()%(i-1))+1];
mrweilun 0:3d3331775af2 269 switch(robot_card)
mrweilun 0:3d3331775af2 270 {case -2: {pwm1=0;pwm2=0;pwm3=1;break;}
mrweilun 0:3d3331775af2 271 case -1: {pwm1=0;pwm2=1;pwm3=0;break;}
mrweilun 0:3d3331775af2 272 case 1: {pwm1=0;pwm2=1;pwm3=1;break;}
mrweilun 0:3d3331775af2 273 case 2: {pwm1=1;pwm2=0;pwm3=0;break;}
mrweilun 0:3d3331775af2 274 }
mrweilun 1:8d53c6fe8815 275 wait_ms(2000);
mrweilun 0:3d3331775af2 276 customer_card=color_sensor();
mrweilun 0:3d3331775af2 277 switch(customer_card)
mrweilun 0:3d3331775af2 278 {case -2:{record[i]=2;break;}
mrweilun 1:8d53c6fe8815 279 case 1:{record[i]=(rand()%2);break;}
mrweilun 0:3d3331775af2 280 case 2:{record[i]=-2;break;}
mrweilun 0:3d3331775af2 281 }
mrweilun 1:8d53c6fe8815 282
mrweilun 1:8d53c6fe8815 283
mrweilun 1:8d53c6fe8815 284 pwm1=1;pwm2=1;pwm3=0;//控制遮挡电机显示电脑出牌
mrweilun 1:8d53c6fe8815 285
mrweilun 1:8d53c6fe8815 286 wait_ms(3000);
mrweilun 0:3d3331775af2 287 score[i]=score[i-1]+robot_card*customer_card;
mrweilun 0:3d3331775af2 288 pc.printf("%d",score[i]);//每一轮传给上位机总分
mrweilun 0:3d3331775af2 289 if(score[i]>=winscore)
mrweilun 0:3d3331775af2 290 {
mrweilun 0:3d3331775af2 291 pc.printf("%d",score[i]);
mrweilun 1:8d53c6fe8815 292 pc.printf("win");
mrweilun 0:3d3331775af2 293 break;
mrweilun 0:3d3331775af2 294 }
mrweilun 1:8d53c6fe8815 295 while(1)//这一轮结束信号(即25秒以后产生)
mrweilun 0:3d3331775af2 296 {
mrweilun 1:8d53c6fe8815 297 //pc.attach(&echouart1,SerialBase::RxIrq);//如果串口没有发送数据,那么主程序中的程序会继续执行,如果串口有发送数据,则执行函数
mrweilun 1:8d53c6fe8815 298
mrweilun 1:8d53c6fe8815 299 if(pc.readable())
mrweilun 1:8d53c6fe8815 300 {
mrweilun 1:8d53c6fe8815 301 pc.scanf("%d",&p);
mrweilun 1:8d53c6fe8815 302 end_signal=p;
mrweilun 1:8d53c6fe8815 303 break;
mrweilun 1:8d53c6fe8815 304 }
mrweilun 0:3d3331775af2 305 }
mrweilun 0:3d3331775af2 306 }
mrweilun 0:3d3331775af2 307 }
mrweilun 0:3d3331775af2 308
mrweilun 0:3d3331775af2 309 }
mrweilun 0:3d3331775af2 310 }
mrweilun 1:8d53c6fe8815 311