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.
Diff: main.cpp
- Revision:
- 0:3d3331775af2
- Child:
- 1:9bafb8db5980
diff -r 000000000000 -r 3d3331775af2 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed May 08 03:37:43 2019 +0000 @@ -0,0 +1,241 @@ +#include "mbed.h" +#include "stdint.h" +#include "MCP23017.h" +#include "WattBob_TextLCD.h" +#include "VL6180.h" +#define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT) +#define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT) +#define IDENTIFICATIONMODEL_ID 0x0000 +VL6180 TOF_sensor(I2C_SDA, I2C_SCL); +MCP23017 *par_port; +WattBob_TextLCD *lcd; +Serial pc(A0,A1,9600);//TX,RX +I2C i2c(PC_1, PC_0); //pins for I2C communication (SDA, SCL) +int sensor_addr = 41 << 1; +#define Random(x)(rand()%x) +DigitalOut green(LED1); +int flag_Android=0; +DigitalOut pwm1(D6); +DigitalOut pwm2(D7); +DigitalOut pwm3(D8); +DigitalIn mode1(A3); +DigitalIn mode2(A4); +int start_signal; +int end_signal; +int a; +void echouart1() +{ + start_signal=pc.getc(); +} +void echouart2() +{ + end_signal=pc.getc(); +} +int color_sensor() +{ + int customer_card; + char clear_reg[1] = {148}; + + char clear_data[2] = {0,0}; + + i2c.write(sensor_addr,clear_reg,1, true); + + i2c.read(sensor_addr,clear_data,2, false); + + + + int clear_value = ((int)clear_data[1] << 8) | clear_data[0]; + + + + char red_reg[1] = {150}; + + char red_data[2] = {0,0}; + + i2c.write(sensor_addr,red_reg,1, true); + + i2c.read(sensor_addr,red_data,2, false); + + + + int red_value = ((int)red_data[1] << 8) | red_data[0]; + + + + char green_reg[1] = {152}; + + char green_data[2] = {0,0}; + + i2c.write(sensor_addr,green_reg,1, true); + + i2c.read(sensor_addr,green_data,2, false); + + + + int green_value = ((int)green_data[1] << 8) | green_data[0]; + + + + char blue_reg[1] = {154}; + + char blue_data[2] = {0,0}; + + i2c.write(sensor_addr,blue_reg,1, true); + + i2c.read(sensor_addr,blue_data,2, false); + + + int blue_value = ((int)blue_data[1] << 8) | blue_data[0]; + + //判断颜色 + if (red_value>green_value&&red_value>blue_value) + customer_card=-2; + + + else if (green_value>red_value&&green_value>blue_value) + customer_card=1; + + else if (blue_value>red_value&&blue_value>green_value) + customer_card=2; + + return customer_card; + } +int main() +{ +pc.baud(9600); + + // Connect to the Color sensor and verify whether we connected to the correct sensor. + + i2c.frequency(100000);//修改为100000,否则报错 + + char id_regval[1] = {146}; + char data[1] = {0}; + i2c.write(sensor_addr,id_regval,1, true); + i2c.read(sensor_addr,data,1,false); + + + // Initialize color sensor + + char timing_register[2] = {129,0}; + i2c.write(sensor_addr,timing_register,2,false); + + char control_register[2] = {143,0}; + i2c.write(sensor_addr,control_register,2,false); + + char enable_register[2] = {128,3}; + i2c.write(sensor_addr,enable_register,2,false); + pc.baud(9600); + uint8_t dist; + par_port = new MCP23017(I2C_SDA, I2C_SCL,0x0400); + par_port->config(0x0F00, 0x0F00, 0x0F00); // configure MCP23017 chip on WattBob + + lcd = new WattBob_TextLCD(par_port); + int winscore; +while(dist==255) +{ + dist = TOF_sensor.getDistance(); + + pc.printf("d=%d", dist); + wait(0.2); + lcd->cls(); + lcd->locate(0,0); +} +/*while(mode1==0&&mode2==0) +{} +if(mode1==0&&mode2==1) + {winscore=15;} + else if(mode1==1&&mode2==0) +{winscore=20;} +else if(mode1==1&&mode2==1) +{winscore=25;}*/ + int customer_card; + int record[10]; + int p; +while(1) +{ +/*pc.attach(&echouart1,SerialBase::RxIrq);//如果串口没有发送数据,那么主程序中的程序会继续执行,如果串口有发送数据,则执行函数*/ +if(pc.readable()) + { + p=pc.getc(); + start_signal=p; + break; + } +} + if(start_signal==1) + { + int score[10]; + score[0]=10; + int robot_card; + int a; + int i; + for(i=1;i<5;i++) + { + pwm1=1;pwm2=1;pwm3=0;//控制遮挡电机关闭 + a=Random(4);//电脑出牌,产生[0, dis)之间的随机数,注意不包括4 + switch(a) + {case 0:{robot_card=-2;pwm1=0;pwm2=0;pwm3=1;break;} + case 1: {robot_card=-1;pwm1=0;pwm2=1;pwm3=0;break;} + case 2: {robot_card=1;pwm1=0;pwm2=1;pwm3=1;break;} + case 3: {robot_card=2;pwm1=1;pwm2=0;pwm3=0;break;} + } + /*wait_ms(15000);*/ + customer_card=color_sensor(); + switch(customer_card) + {case -2:{record[i]=2;break;} + case 1:{record[i]=Random(2);break;} + case 2:{record[i]=-2;break;} + } + if(customer_card==!0) + { + pwm1=1;pwm2=1;pwm3=1;//控制遮挡电机显示电脑出牌 + } + score[i]=score[i-1]+robot_card*customer_card; + pc.printf("%d",score[i]);//每一轮传给上位机总分 + if(score[i]>=winscore) + { + pc.printf("%d",score[i]); + break; + } + while(end_signal==0)//这一轮结束信号(即25秒以后产生) + {} + + } + if(score[i]<20) + { + for(i;i<7;i++) + { + pwm1=1;pwm2=1;pwm3=0;//控制遮挡电机关闭 + robot_card=record[Random(i-1)+1]; + switch(robot_card) + {case -2: {pwm1=0;pwm2=0;pwm3=1;break;} + case -1: {pwm1=0;pwm2=1;pwm3=0;break;} + case 1: {pwm1=0;pwm2=1;pwm3=1;break;} + case 2: {pwm1=1;pwm2=0;pwm3=0;break;} + } + wait_ms(15000); + customer_card=color_sensor(); + switch(customer_card) + {case -2:{record[i]=2;break;} + case 1:{record[i]=Random(2);break;} + case 2:{record[i]=-2;break;} + } + if(customer_card==!0) + { + pwm1=1;pwm2=1;pwm3=1;//控制遮挡电机显示电脑出牌 + } + score[i]=score[i-1]+robot_card*customer_card; + pc.printf("%d",score[i]);//每一轮传给上位机总分 + if(score[i]>=winscore) + { + pc.printf("%d",score[i]); + break; + } + while(end_signal==0)//这一轮结束信号(即25秒以后产生) + { + pc.attach(&echouart1,SerialBase::RxIrq);//如果串口没有发送数据,那么主程序中的程序会继续执行,如果串口有发送数据,则执行函数 + } + } + } + + } +}