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 #define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT) 00007 #define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT) 00008 #define IDENTIFICATIONMODEL_ID 0x0000 00009 VL6180 TOF_sensor(I2C_SDA, I2C_SCL); 00010 MCP23017 *par_port; 00011 WattBob_TextLCD *lcd; 00012 Serial pc(A0,A1,9600);//TX,RX 00013 I2C i2c(PC_1, PC_0); //pins for I2C communication (SDA, SCL) 00014 int sensor_addr = 41 << 1; 00015 #define Random(x)(rand()%x) 00016 DigitalOut green(LED1); 00017 int flag_Android=0; 00018 DigitalOut pwm1(D6); 00019 DigitalOut pwm2(D7); 00020 DigitalOut pwm3(D8); 00021 DigitalIn mode1(A3); 00022 DigitalIn mode2(A4); 00023 int start_signal; 00024 int end_signal; 00025 int a; 00026 void echouart1() 00027 { 00028 start_signal=pc.getc(); 00029 } 00030 void echouart2() 00031 { 00032 end_signal=pc.getc(); 00033 } 00034 int color_sensor() 00035 { 00036 int customer_card; 00037 char clear_reg[1] = {148}; 00038 00039 char clear_data[2] = {0,0}; 00040 00041 i2c.write(sensor_addr,clear_reg,1, true); 00042 00043 i2c.read(sensor_addr,clear_data,2, false); 00044 00045 00046 00047 int clear_value = ((int)clear_data[1] << 8) | clear_data[0]; 00048 00049 00050 00051 char red_reg[1] = {150}; 00052 00053 char red_data[2] = {0,0}; 00054 00055 i2c.write(sensor_addr,red_reg,1, true); 00056 00057 i2c.read(sensor_addr,red_data,2, false); 00058 00059 00060 00061 int red_value = ((int)red_data[1] << 8) | red_data[0]; 00062 00063 00064 00065 char green_reg[1] = {152}; 00066 00067 char green_data[2] = {0,0}; 00068 00069 i2c.write(sensor_addr,green_reg,1, true); 00070 00071 i2c.read(sensor_addr,green_data,2, false); 00072 00073 00074 00075 int green_value = ((int)green_data[1] << 8) | green_data[0]; 00076 00077 00078 00079 char blue_reg[1] = {154}; 00080 00081 char blue_data[2] = {0,0}; 00082 00083 i2c.write(sensor_addr,blue_reg,1, true); 00084 00085 i2c.read(sensor_addr,blue_data,2, false); 00086 00087 00088 int blue_value = ((int)blue_data[1] << 8) | blue_data[0]; 00089 00090 //判断颜色 00091 if (red_value>green_value&&red_value>blue_value) 00092 customer_card=-2; 00093 00094 00095 else if (green_value>red_value&&green_value>blue_value) 00096 customer_card=1; 00097 00098 else if (blue_value>red_value&&blue_value>green_value) 00099 customer_card=2; 00100 00101 return customer_card; 00102 } 00103 int main() 00104 { 00105 pc.baud(9600); 00106 00107 // Connect to the Color sensor and verify whether we connected to the correct sensor. 00108 00109 i2c.frequency(100000);//修改为100000,否则报错 00110 00111 char id_regval[1] = {146}; 00112 char data[1] = {0}; 00113 i2c.write(sensor_addr,id_regval,1, true); 00114 i2c.read(sensor_addr,data,1,false); 00115 00116 00117 // Initialize color sensor 00118 00119 char timing_register[2] = {129,0}; 00120 i2c.write(sensor_addr,timing_register,2,false); 00121 00122 char control_register[2] = {143,0}; 00123 i2c.write(sensor_addr,control_register,2,false); 00124 00125 char enable_register[2] = {128,3}; 00126 i2c.write(sensor_addr,enable_register,2,false); 00127 pc.baud(9600); 00128 uint8_t dist; 00129 par_port = new MCP23017(I2C_SDA, I2C_SCL,0x0400); 00130 par_port->config(0x0F00, 0x0F00, 0x0F00); // configure MCP23017 chip on WattBob 00131 00132 lcd = new WattBob_TextLCD(par_port); 00133 int winscore; 00134 while(dist==255) 00135 { 00136 dist = TOF_sensor.getDistance(); 00137 00138 pc.printf("d=%d", dist); 00139 wait(0.2); 00140 lcd->cls(); 00141 lcd->locate(0,0); 00142 } 00143 /*while(mode1==0&&mode2==0) 00144 {} 00145 if(mode1==0&&mode2==1) 00146 {winscore=15;} 00147 else if(mode1==1&&mode2==0) 00148 {winscore=20;} 00149 else if(mode1==1&&mode2==1) 00150 {winscore=25;}*/ 00151 int customer_card; 00152 int record[10]; 00153 int p; 00154 while(1) 00155 { 00156 /*pc.attach(&echouart1,SerialBase::RxIrq);//如果串口没有发送数据,那么主程序中的程序会继续执行,如果串口有发送数据,则执行函数*/ 00157 if(pc.readable()) 00158 { 00159 p=pc.getc(); 00160 start_signal=p; 00161 break; 00162 } 00163 } 00164 if(start_signal==1) 00165 { 00166 int score[10]; 00167 score[0]=10; 00168 int robot_card; 00169 int a; 00170 int i; 00171 for(i=1;i<5;i++) 00172 { 00173 pwm1=1;pwm2=1;pwm3=0;//控制遮挡电机关闭 00174 a=Random(4);//电脑出牌,产生[0, dis)之间的随机数,注意不包括4 00175 switch(a) 00176 {case 0:{robot_card=-2;pwm1=0;pwm2=0;pwm3=1;break;} 00177 case 1: {robot_card=-1;pwm1=0;pwm2=1;pwm3=0;break;} 00178 case 2: {robot_card=1;pwm1=0;pwm2=1;pwm3=1;break;} 00179 case 3: {robot_card=2;pwm1=1;pwm2=0;pwm3=0;break;} 00180 } 00181 /*wait_ms(15000);*/ 00182 customer_card=color_sensor(); 00183 switch(customer_card) 00184 {case -2:{record[i]=2;break;} 00185 case 1:{record[i]=Random(2);break;} 00186 case 2:{record[i]=-2;break;} 00187 } 00188 if(customer_card==!0) 00189 { 00190 pwm1=1;pwm2=1;pwm3=1;//控制遮挡电机显示电脑出牌 00191 } 00192 score[i]=score[i-1]+robot_card*customer_card; 00193 pc.printf("%d",score[i]);//每一轮传给上位机总分 00194 if(score[i]>=winscore) 00195 { 00196 pc.printf("%d",score[i]); 00197 break; 00198 } 00199 while(end_signal==0)//这一轮结束信号(即25秒以后产生) 00200 {} 00201 00202 } 00203 if(score[i]<20) 00204 { 00205 for(i;i<7;i++) 00206 { 00207 pwm1=1;pwm2=1;pwm3=0;//控制遮挡电机关闭 00208 robot_card=record[Random(i-1)+1]; 00209 switch(robot_card) 00210 {case -2: {pwm1=0;pwm2=0;pwm3=1;break;} 00211 case -1: {pwm1=0;pwm2=1;pwm3=0;break;} 00212 case 1: {pwm1=0;pwm2=1;pwm3=1;break;} 00213 case 2: {pwm1=1;pwm2=0;pwm3=0;break;} 00214 } 00215 wait_ms(15000); 00216 customer_card=color_sensor(); 00217 switch(customer_card) 00218 {case -2:{record[i]=2;break;} 00219 case 1:{record[i]=Random(2);break;} 00220 case 2:{record[i]=-2;break;} 00221 } 00222 if(customer_card==!0) 00223 { 00224 pwm1=1;pwm2=1;pwm3=1;//控制遮挡电机显示电脑出牌 00225 } 00226 score[i]=score[i-1]+robot_card*customer_card; 00227 pc.printf("%d",score[i]);//每一轮传给上位机总分 00228 if(score[i]>=winscore) 00229 { 00230 pc.printf("%d",score[i]); 00231 break; 00232 } 00233 while(end_signal==0)//这一轮结束信号(即25秒以后产生) 00234 { 00235 pc.attach(&echouart1,SerialBase::RxIrq);//如果串口没有发送数据,那么主程序中的程序会继续执行,如果串口有发送数据,则执行函数 00236 } 00237 } 00238 } 00239 00240 } 00241 }
Generated on Sat Jul 23 2022 07:41:48 by
1.7.2