基于M5StickC Plus平台的掷骰子手柄游戏
基于M5StickC PLUS平台,使用mpu6886六轴姿态传感器捕获X/Y方向的加速度,根据设定的阈值判断板子摇晃的剧烈程度,当数值达到设定阈值后运行掷骰子程序,骰子点数由内部随机函数产生,当掷骰子的动画结束后,会显示随机出来的点数。
标签
嵌入式系统
ESP32
M5Stick
柯西的彷徨
更新2022-09-02
493

本次任务:使用姿态传感器完成体感游戏手柄,并设计完成一个游戏。

硬件平台介绍

Fpkv3Meq2Jv6KjWq30QL3areek_p

M5StickC PLUS M5StickC的大屏幕版本,主控采用ESP32-PICO-D4模组,具备蓝牙4.2与WIFI功能,小巧的机身内部集成了丰富的硬件资源,如红外、RTC、麦克风、LED、IMU、按键、蜂鸣器、PMU等。

ESP32-PICO-D4

FswK_Rs2vZipyBVs35gh2Yt73sP6

ESP32-PICO-D4具有520KB片上RAM与4MB的外部 SPI flash,同时兼备Wi-Fi和蓝牙功能,主频高达240M。

MPU68866

FiUv_hd20SxoGJe9Ecq0clOXRykT

轴IMU单元是带有3轴重力加速度计和3轴陀螺仪的6轴姿态传感器,可以实时计算倾斜角度和加速度。该芯片采用mpu6886,具有16位ADC,内置可编程数字滤波器和片上温度传感器,采用I2C接口(addr:0x68)与上位机通信,并支持低功耗模式。

AXP192

AXP192是可配置的智能电源选择系统,可实时监测功耗(mA或mW),剩余电池状态(%或mAh),剩余电池或充电时间,集成备用电池为RTC模块供电,具有过压保护/欠压保护/ 过流保护 过温保护功能。

软件平台搭建

首先,去arduino官网下载软件:

FhPTQkvJBmxpY77BBzHm6UR9bCD8

复制下方的 M5Stack 板管理网址到 附加开发板管理器: 中:

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

FhATfzb2hP0ap3XnKrneLcFPyVVo

在开发板管理器输入并搜索 M5Stack进行安装,然后选择对应的开发板配置:

FuWWCVbiRgUY6ELY97V5_Guomo-Q

软件设计

FvSi9r6ZdQO9Z8Pq8UkNCGFIIc71

▲ 最终效果图

FidV9izUwoCufp9FhZO_yXiyTkp_

▲ 软件运行流程图

  • 外设初始化

M5.begin();                         // 开发板初始化
M5.IMU.Init();                      // 陀螺仪初始化
M5.Lcd.setRotation(1);              // 设定屏幕方向
M5.Lcd.fillScreen(TFT_ORANGE);      // 设定背景颜色
M5.Lcd.setTextColor(TFT_BLACK);     // 设定字体颜色
M5.Lcd.setCursor(30, 30);           // 设定打印位置
M5.Lcd.setTextSize(4);              // 设定字体大小
M5.Lcd.print("SHAKE");
  • 建立骰子点坐标数组

// 点位置
int dot[6][6][2]
{
    {{35, 35}},
    {{15, 15}, {55, 55}},
    {{15, 15}, {35, 35}, {55, 55}},
    {{15, 15}, {15, 55}, {55, 15}, {55, 55}},
    {{15, 15}, {15, 55}, {35, 35}, {55, 15}, {55, 55}},
    {{15, 15}, {15, 35}, {15, 55}, {55, 15}, {55, 35}, {55, 55}},
};
  • 画骰子动画函数

void draw_dice(uint16_t x, uint16_t y, uint8_t n) 
{
    M5.Lcd.fillRect(x-1, y-1, 72, 72, BLACK);
    M5.Lcd.fillRect(x, y, 70, 70, WHITE);
    for (int d = 0; d < 6; d++) 
        if (dot[n][d][0] > 0)   
            M5.Lcd.fillCircle(x + dot[n][d][0], y + dot[n][d][1], 7, TFT_BLACK);
}
  • 陀螺仪姿态阈值判断与骰子点数随机生成动画绘制
void loop(void) 
{
    while (1) 
    {
        M5.IMU.getAccelData(&accX, &accY, &accZ);
        if (accX > 2 || accY > 2)   break;
    }
    M5.Lcd.fillScreen(TFT_ORANGE);

    delay(250);
    draw_dice(40, 30, random(0, 6));

    delay(250);
    draw_dice(135, 30, random(0, 6));
}
不足与展望
不足
  • 陀螺仪长时间存在零漂问题,导致后期摇骰子精度不准确;

  • 随机数生成使用的C库random函数,且没有增加随机种子,属于伪随机;

  • 主程序采用循环模式运行,导致系统实时性较低。

展望
  • 使用互补滤波算法使用加速度计弥补陀螺仪长时间的零漂,增大系统精度;

  • 使用RTC时间作为随机种子,增强游戏的随机性。

 

附件下载
掷骰子.zip
团队介绍
ESP32产品开发小白
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号