Mingcheng Lin / Mbed 2 deprecated TEST

Dependencies:   mbed

Committer:
mrweilun
Date:
Wed May 08 03:37:43 2019 +0000
Revision:
0:3d3331775af2
Child:
1:9bafb8db5980
jjj

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