开启辅助访问 切换到窄版

打印 上一主题 下一主题

单片机菜鸟自学记

[复制链接]
作者:崩死菊花虫 
版块:
MCU单片机技术 单片机入门及综合应用 发布时间:2018-6-25 14:42:33
7080
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一天看到同学在玩节奏大师游戏,不知道为啥就想到用单片机自动玩这个。但是想想节奏大师这个游戏难操作且不好识别,于是想到相似的别踩白块儿这个游戏。
一有想法马上开始做,大家都在紧张的备战期末考试,我这是冒着挂科的风险在玩单片机啊!最先想到的是用Arduino做,这样最快。于是就开始做吧:
花了一晚上焊了个板子

用四个光敏电阻检测游戏里的黑块

一开始打算用舵机去动作触屏,后来觉得舵机太慢了,就改成了电磁铁(把继电器拆了得到~)

再来一张

四个全部就位了~

实在是找不到电容笔,于是把导线弄成这样凑合触屏吧(实际使用有时候不灵)

全家福在此
硬件差不多就是这样啦~ 接下来写个程序试试读取光敏电阻

数据还算正常,不过不够均衡,所以程序上简单的处理了一下数据,全部代码如下:

  • /******************************************************
  • *
  • *
  • * 说明:舵机玩别踩白块儿游戏程序
  • * 日期:2017-01-08
  • * 作者:TDA2030
  • * 硬件:Arduino uno板
  • *
  • *
  • *******************************************************/
  • #include

  • #define u16 unsigned int
  • #define u8 unsigned char

  • //光敏电阻数据校准值,调试得出具体数值
  • #define S1_ADJ (0)
  • #define S2_ADJ (20)
  • #define S3_ADJ (-47)
  • #define S4_ADJ (-120)
  • #define C_V 620 //触发动作阀值

  • #define PRESS_VAL 1//按下所对应的值
  • #define BOUNCE_VAL 0//弹起所对应的值
  • //传感器端口定义
  • #define SENSOR_PORT1 0 // analog pin used to connect the potentiometer
  • #define SENSOR_PORT2 1
  • #define SENSOR_PORT3 2
  • #define SENSOR_PORT4 3
  • //舵机端口定义
  • #define SERVO_PORT4 5
  • #define SERVO_PORT3 6
  • #define SERVO_PORT2 9
  • #define SERVO_PORT1 10


  • void setup()
  • {
  • Serial.begin(115200);
  • while (!Serial) {
  • ; // wait for serial port to connect. Needed for Leonardo only
  • }
  • Serial.println("*****************************************\n");
  • Serial.println(" * Play the game by MCU\n");
  • Serial.println(" * Author: TDA2030\n");
  • Serial.println(" * Date: 2017/01/08\n\n");
  • Serial.println("*****************************************\n\n");

  • pinMode(SENSOR_PORT1,INPUT);
  • pinMode(SENSOR_PORT2,INPUT);
  • pinMode(SENSOR_PORT3,INPUT);
  • pinMode(SENSOR_PORT4,INPUT);
  • pinMode(SERVO_PORT1,OUTPUT);
  • pinMode(SERVO_PORT2,OUTPUT);
  • pinMode(SERVO_PORT3,OUTPUT);
  • pinMode(SERVO_PORT4,OUTPUT);

  • }
  • //全局变量定义
  • u16 sv1,sv2,sv3,sv4;
  • u8 flag1,flag2,flag3,flag4;
  • u16 time1,time2,time3,time4;
  • u16 core=0;

  • u16 MAX1_TIME = 230; //最大按下时间定义
  • u16 MAX2_TIME = MAX1_TIME+300; //免检测时间定义


  • void loop()
  • {
  • //读取光敏电阻AD值
  • sv1=analogRead(SENSOR_PORT1)+S1_ADJ;
  • sv2=analogRead(SENSOR_PORT2)+S2_ADJ;
  • sv3=analogRead(SENSOR_PORT3)+S3_ADJ;
  • sv4=analogRead(SENSOR_PORT4)+S4_ADJ;
  • //串口打印数据,调试时用
  • Serial.print("sensor1:");
  • Serial.println(sv1,DEC);
  • Serial.print("sensor2:");
  • Serial.println(sv2,DEC);
  • Serial.print("sensor3:");
  • Serial.println(sv3,DEC);
  • Serial.print("sensor4:");
  • Serial.println(sv4,DEC);
  • Serial.println("\n");
  • delay(200);
  • //-------当得分大于一定后加快速度按下
  • // if(core>100)
  • // {
  • // MAX1_TIME = 200;
  • // MAX2_TIME = MAX1_TIME+200;
  • // }

  • //判断是否大于阀值,执行按下并标识位
  • if(flag1==0&&sv1>C_V)
  • {
  • digitalWrite(SERVO_PORT1,PRESS_VAL);
  • flag1=1;core++;
  • }
  • if(flag2==0&&sv2>C_V)
  • {
  • digitalWrite(SERVO_PORT2,PRESS_VAL);
  • flag2=1;core++;
  • }
  • if(flag3==0&&sv3>C_V)
  • {
  • digitalWrite(SERVO_PORT3,PRESS_VAL);
  • flag3=1;core++;
  • }
  • if(flag4==0&&sv4>C_V)
  • {
  • digitalWrite(SERVO_PORT4,PRESS_VAL);
  • flag4=1;core++;
  • }
  • /*在按下一段时间后自动弹起,不管是不是还大于阀值,
  • 另外还要等待一段时间不检测,防止一个黑块多次按下*/
  • if(flag1==1)
  • {
  • time1++;
  • if(time1>MAX1_TIME)//大于了弹起时间,则自己弹起
  • {
  • digitalWrite(SERVO_PORT1,BOUNCE_VAL);
  • if(time1>MAX2_TIME)//大于了免检测时间,复位标志位,以开始重新判断阀值
  • {time1=0;flag1=0;}
  • }
  • }
  • if(flag2==1)
  • {
  • time2++;
  • if(time2>MAX1_TIME)
  • {
  • digitalWrite(SERVO_PORT2,BOUNCE_VAL);
  • if(time2>MAX2_TIME)
  • {time2=0;flag2=0;}
  • }
  • }
  • if(flag3==1)
  • {
  • time3++;
  • if(time3>MAX1_TIME)
  • {
  • digitalWrite(SERVO_PORT3,BOUNCE_VAL);
  • if(time3>MAX2_TIME)
  • {time3=0;flag3=0;}
  • }
  • }
  • if(flag4==1)
  • {
  • time4++;
  • if(time4>MAX1_TIME)
  • {
  • digitalWrite(SERVO_PORT4,BOUNCE_VAL);
  • if(time4>MAX2_TIME)
  • {time4=0;flag4=0;}
  • }
  • }


  • }
做完感觉速度很慢,后来还测试了一下游戏的街机模式,发现最多能玩到160分,还没我同学玩的快呢。
简单分析了一下,主要是由于只有一个光敏电阻传感器,不能准确知道黑块走哪了,程序没法在时间上准确控制
所以我就想到了两个方法:
一是采用摄像头采集图像,并进行简单处理,来控制。
开始动手,试了一下用STM32F103驱动不带FIFO的OV7670摄像头,速度慢的不要不要的,大概每秒只有一两帧

这样的速度肯定不行啊,于是又找到了一个学长的视觉识别openmv板:

斑点识别

STM32F427芯片 180MHZ频率 加上 硬件 DCMI接口,这下达到了20帧每秒左右
但是由于使用Python编程,试了一下不太会搞,弄了半天可以识别出手机屏幕上的黑块了,但是干扰太大了,不稳定。
于是放弃这个方法了
我想到的第二个方法就是再加4个光敏电阻在前面,提前预知黑块。
这样Arduino的AD口就不够了,得换其他单片机,加上学校没几天就要封校了,差不多也要收拾收拾回家了,那就到此为止吧。
了解更多源代码,视频,请关注云汉电子社区微信公众号ickeybbs。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表