w m / Mbed 2 deprecated DISTANCE_PROJECT

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 #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 }