w m / Mbed 2 deprecated DISTANCE_PROJECT1

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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