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:8d53c6fe8815
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);//如果串口没有发送数据,那么主程序中的程序会继续执行,如果串口有发送数据,则执行函数
+ }
+ }
+ }
+
+ }
+}