Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #include "mbed.h" 00002 #include "stdint.h" 00003 #include "MCP23017.h" 00004 #include "WattBob_TextLCD.h" 00005 #include "VL6180.h" 00006 #include "time.h" 00007 #define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT) 00008 #define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT) 00009 #define IDENTIFICATIONMODEL_ID 0x0000 00010 VL6180 TOF_sensor(I2C_SDA, I2C_SCL); 00011 MCP23017 *par_port; 00012 WattBob_TextLCD *lcd; 00013 Serial pc(A0,A1,9600);//TX,RX 00014 I2C i2c(PC_1, PC_0); //pins for I2C communication (SDA, SCL) 00015 int sensor_addr = 41 << 1; 00016 //#define Random(x) (rand()%x) 00017 DigitalOut led(LED2); 00018 int flag_Android=0; 00019 DigitalOut pwm1(D6); 00020 DigitalOut pwm2(D7); 00021 DigitalOut pwm3(D8); 00022 DigitalIn mode1(D0); 00023 DigitalIn mode2(D1); 00024 int start_signal; 00025 int end_signal; 00026 int a; 00027 00028 00029 /*void echouart1() 00030 { 00031 start_signal=pc.getc(); 00032 } 00033 void echouart2() 00034 { 00035 end_signal=pc.getc(); 00036 }*/ 00037 int color_sensor() 00038 { 00039 int customer_card=0; 00040 char clear_reg[1] = {148}; 00041 00042 char clear_data[2] = {0,0}; 00043 00044 i2c.write(sensor_addr,clear_reg,1, true); 00045 00046 i2c.read(sensor_addr,clear_data,2, false); 00047 00048 00049 00050 int clear_value = ((int)clear_data[1] << 8) | clear_data[0]; 00051 00052 00053 00054 char red_reg[1] = {150}; 00055 00056 char red_data[2] = {0,0}; 00057 00058 i2c.write(sensor_addr,red_reg,1, true); 00059 00060 i2c.read(sensor_addr,red_data,2, false); 00061 00062 00063 00064 int red_value = ((int)red_data[1] << 8) | red_data[0]; 00065 00066 00067 00068 char green_reg[1] = {152}; 00069 00070 char green_data[2] = {0,0}; 00071 00072 i2c.write(sensor_addr,green_reg,1, true); 00073 00074 i2c.read(sensor_addr,green_data,2, false); 00075 00076 00077 00078 int green_value = ((int)green_data[1] << 8) | green_data[0]; 00079 00080 00081 00082 char blue_reg[1] = {154}; 00083 00084 char blue_data[2] = {0,0}; 00085 00086 i2c.write(sensor_addr,blue_reg,1, true); 00087 00088 i2c.read(sensor_addr,blue_data,2, false); 00089 00090 00091 int blue_value = ((int)blue_data[1] << 8) | blue_data[0]; 00092 00093 //判断颜色 00094 while(customer_card==0) 00095 { 00096 i2c.write(sensor_addr,red_reg,1, true); 00097 00098 i2c.read(sensor_addr,red_data,2, false); 00099 i2c.write(sensor_addr,green_reg,1, true); 00100 00101 i2c.read(sensor_addr,green_data,2, false); 00102 i2c.write(sensor_addr,blue_reg,1, true); 00103 00104 i2c.read(sensor_addr,blue_data,2, false); 00105 if (red_value>green_value&&red_value>blue_value) 00106 customer_card=-2; 00107 00108 00109 else if (green_value>red_value&&green_value>blue_value) 00110 customer_card=1; 00111 00112 else if (blue_value>red_value&&blue_value>green_value) 00113 customer_card=2; 00114 } 00115 00116 return customer_card; 00117 } 00118 int main() 00119 { 00120 pc.baud(9600); 00121 00122 // Connect to the Color sensor and verify whether we connected to the correct sensor. 00123 00124 i2c.frequency(100000);//修改为100000,否则报错 00125 00126 char id_regval[1] = {146}; 00127 char data[1] = {0}; 00128 i2c.write(sensor_addr,id_regval,1, true); 00129 i2c.read(sensor_addr,data,1,false); 00130 00131 00132 // Initialize color sensor 00133 00134 char timing_register[2] = {129,0}; 00135 i2c.write(sensor_addr,timing_register,2,false); 00136 00137 char control_register[2] = {143,0}; 00138 i2c.write(sensor_addr,control_register,2,false); 00139 00140 char enable_register[2] = {128,3}; 00141 i2c.write(sensor_addr,enable_register,2,false); 00142 pc.baud(9600); 00143 uint8_t dist; 00144 par_port = new MCP23017(I2C_SDA, I2C_SCL,0x0400); 00145 par_port->config(0x0F00, 0x0F00, 0x0F00); // configure MCP23017 chip on WattBob 00146 00147 lcd = new WattBob_TextLCD(par_port); 00148 int winscore; 00149 /* for(;;) 00150 { 00151 dist = TOF_sensor.getDistance(); 00152 00153 00154 wait_ms(100); 00155 lcd->cls(); 00156 lcd->locate(0,0); 00157 if(dist==!255) 00158 { 00159 pc.printf("d=%d ", dist); 00160 pc.printf("ready"); 00161 break;} 00162 }*/ 00163 dist = TOF_sensor.getDistance(); 00164 while(dist==255) 00165 { dist = TOF_sensor.getDistance(); 00166 00167 lcd->cls(); 00168 lcd->locate(0,0);} 00169 pc.printf("ready ", dist); 00170 00171 /*while(1) 00172 { 00173 dist = TOF_sensor.getDistance(); 00174 if(dist==!255) 00175 { 00176 dist = TOF_sensor.getDistance(); 00177 pc.printf("%d",dist); 00178 pc.printf("Ready"); 00179 wait(0.2); 00180 lcd->cls(); 00181 lcd->locate(0,0); 00182 break; 00183 } 00184 }*/ 00185 while(mode1==0&&mode2==0) 00186 {} 00187 if(mode1==0&&mode2==1) 00188 {winscore=12;pc.printf("%d",winscore);} 00189 else if(mode1==1&&mode2==0) 00190 {winscore=14;pc.printf("%d",winscore);} 00191 else if(mode1==1&&mode2==1) 00192 {winscore=16;pc.printf("%d",winscore);} 00193 00194 int customer_card; 00195 int record[10]; 00196 int p; 00197 00198 while(1) 00199 { 00200 //pc.attach(&echouart1,SerialBase::RxIrq);//如果串口没有发送数据,那么主程序中的程序会继续执行,如果串口有发送数据,则执行函数 00201 if(pc.readable()) 00202 { 00203 pc.scanf("%d",&p); 00204 start_signal=p; 00205 break; 00206 } 00207 } 00208 00209 led=p; 00210 00211 if(start_signal==1) 00212 { 00213 int score[10]; 00214 score[0]=10; 00215 int robot_card; 00216 int a; 00217 int i; 00218 srand((unsigned)time(NULL)); 00219 for(i=1;i<5;i++) 00220 { 00221 pwm1=1;pwm2=1;pwm3=1;//控制遮挡电机关闭 00222 wait_ms(4000); 00223 a=(rand()%4);//电脑出牌,产生[0, dis)之间的随机数,注意不包括4 00224 switch(a) 00225 { 00226 case 0: robot_card=-2;pwm1=0;pwm2=0;pwm3=1;break; 00227 case 1: robot_card=-1;pwm1=0;pwm2=1;pwm3=0;break; 00228 case 2: robot_card=1;pwm1=0;pwm2=1;pwm3=1;break; 00229 case 3: robot_card=2;pwm1=1;pwm2=0;pwm3=0;break; 00230 } 00231 wait_ms(2000); 00232 customer_card=color_sensor(); 00233 switch(customer_card) 00234 {case -2:{record[i]=2;break;} 00235 case 1:{record[i]=(rand()%2);break;} 00236 case 2:{record[i]=-2;break;} 00237 } 00238 00239 00240 {pwm1=1;pwm2=1;pwm3=0;}//控制遮挡电机显示电脑出牌 00241 00242 wait_ms(3000); 00243 score[i]=score[i-1]+robot_card*color_sensor(); 00244 pc.printf("%d",score[i]);//每一轮传给上位机总分 00245 if(score[i]>=winscore) 00246 { 00247 pc.printf("%d",score[i]); 00248 pc.printf("win"); 00249 break; 00250 } 00251 while(1)//这一轮结束信号(即25秒以后产生) 00252 { 00253 if(pc.readable()) 00254 { 00255 pc.scanf("%d",&p); 00256 end_signal=p; 00257 break; 00258 } 00259 } 00260 00261 } 00262 if(score[i]<winscore) 00263 { 00264 for(i;i<9;i++) 00265 { 00266 pwm1=1;pwm2=1;pwm3=1;//控制遮挡电机关闭 00267 wait_ms(4000); 00268 robot_card=record[(rand()%(i-1))+1]; 00269 switch(robot_card) 00270 {case -2: {pwm1=0;pwm2=0;pwm3=1;break;} 00271 case -1: {pwm1=0;pwm2=1;pwm3=0;break;} 00272 case 1: {pwm1=0;pwm2=1;pwm3=1;break;} 00273 case 2: {pwm1=1;pwm2=0;pwm3=0;break;} 00274 } 00275 wait_ms(2000); 00276 customer_card=color_sensor(); 00277 switch(customer_card) 00278 {case -2:{record[i]=2;break;} 00279 case 1:{record[i]=(rand()%2);break;} 00280 case 2:{record[i]=-2;break;} 00281 } 00282 00283 00284 pwm1=1;pwm2=1;pwm3=0;//控制遮挡电机显示电脑出牌 00285 00286 wait_ms(3000); 00287 score[i]=score[i-1]+robot_card*customer_card; 00288 pc.printf("%d",score[i]);//每一轮传给上位机总分 00289 if(score[i]>=winscore) 00290 { 00291 pc.printf("%d",score[i]); 00292 pc.printf("win"); 00293 break; 00294 } 00295 while(1)//这一轮结束信号(即25秒以后产生) 00296 { 00297 //pc.attach(&echouart1,SerialBase::RxIrq);//如果串口没有发送数据,那么主程序中的程序会继续执行,如果串口有发送数据,则执行函数 00298 00299 if(pc.readable()) 00300 { 00301 pc.scanf("%d",&p); 00302 end_signal=p; 00303 break; 00304 } 00305 } 00306 } 00307 } 00308 00309 } 00310 } 00311
Generated on Wed Jul 13 2022 00:50:23 by
