基于M5StickC Plus的综合应用 重力感应电子乐器
M5StickC PLUS内部集成了丰富的硬件资源,如红外、RTC、麦克风、LED、IMU、按键、蜂鸣器、PMU等传感器资源,通过上下旋转,调节音调,按37 39 任意一个按键可以触发对应的声音
标签
嵌入式系统
显示
2022暑假在家练
wwwds
更新2022-09-07
西安交通大学
707
 
2022暑假练 M5StickC PLUS
 硬件
主控采用ESP32-PICO-D4模组,具备WIFI功能,小巧的机身内部集成了丰富的硬件资源,如红外、RTC、麦克风、LED、IMU、按键、蜂鸣器、PMU等,在保留原有M5StickC功能的基础上加入了无源蜂鸣器,同时屏幕尺寸升级到1.14寸、**135*240分辨率的TFT屏幕**,相较之前的0.96寸屏幕增加18.7%的显示面积,电池容量达到120mAh,接口同样支持HAT与Unit系列产品。
*开机:按复位按键,持续至少 2 秒 关机:按复位按键,持续至少 6 秒*
|LCD屏幕|ESP32|Flash闪存|
|1.14 inch, 135*240 Colorful TFT LCD, ST7789v2|240MHz dual core, 600 DMIPS, 520KB SRAM, Wi-Fi|4MB Flash|

FpBd-UcOqLW9IAj1lA-m8dGhypSl

 环境配置
使用arduino进行配置,项目的库文件在github M5StickC-Plus, arduino环境的配置见[Arduino IDE 环境搭建 - M5StickC Plus]
由于github文件都是近期更新的, 所以arduino的库版本也安装最新的,  验证没有出现问题

 

软件
软件的逻辑是:
初始化-->显示界面-->检测位置,按键-->重新绘制,播放声音
Fpx2CdoCLBVtOYO_skaTJszBjPPc
``setup``程序中使用了lcd库进行界面的绘制的初始化,对内置陀螺仪和蜂鸣器分别初始化。``showUI``程序中是界面的绘制,方便再次调用实现刷新。这块lcd屏幕使用的时rgb565的色彩,在对图像进行转换的时候,可以使用[ImageConverter (UTFT)],同时对一些数据进行宏定义。
主程序
```c_cpp
#include <M5StickCPlus.h>




#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#include "arow.h"
#include"logo6055.h"
float accX = 0;
float accY = 0;
float accZ = 0;
char nn[8]={'c','d','e','f','g','a','b','c'};
int notes[8]={NOTE_C6,NOTE_D6,NOTE_E6,NOTE_F6,NOTE_G6,NOTE_A6,NOTE_B6,NOTE_C7};
float temp = 0;
void showUI()
{
  M5.Lcd.drawString("BEEPER",0,10,2);
  M5.Lcd.fillRect(90,20,0,240,TFT_RED);
  for(int i=0;i<8;i++){
  M5.Lcd.drawString(String(nn[i]),112,210-(i*25),2);
  M5.Lcd.fillRect(90,220-(i*25),20,4,TFT_YELLOW);
  M5.Lcd.pushImage(0,180,60,55,logo6055);
  }
}
void setup() {
  //pinMode(37,INPUT);
  M5.begin();
  M5.Lcd.setRotation(0);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setSwapBytes(true);
  delay(100);
  M5.imu.Init();
  //pinMode(37,INPUT_PULLUP);
  showUI();
  M5.Beep.begin();
  }




int y=0;
int y2=0;
int i=0;
bool pres=false;
void loop() {
  M5.begin();
  showUI();
 if(pres==0){
  delay(10);
  M5.imu.getAccelData(&accX,&accY,&accZ);
    int v=int(accY*1000);
    i=map(v,0,1000,0,8);
    y=220-(i*25);
    if(i>7)
    i=7;
    if(i<0)
    i=0;
 if(y!=y2){
 M5.Lcd.fillRect(66,y2,16,16,TFT_BLACK);
 M5.Lcd.pushImage(66,y,16,16,arr);
 y2=y;
 }}
M5.update();
  if((M5.BtnA.isPressed()) || (M5.BtnB.isPressed())) {
    delay(20);
    pres=1;
    M5.lcd.fillScreen(BLACK);
    M5.lcd.drawString("i:"+String(i),1,50,1);
    showUI();
    M5.Beep.tone(notes[i],200);
    M5.Lcd.drawString(String(nn[i]),0,100,2);
    M5.update();
    }
  else
  {
    //M5.Lcd.fillRect(1,50,40,40,TFT_BLACK);
    //M5.Lcd.fillRect(0,100,40,40,TFT_BLACK);
    M5.Beep.mute();
    pres=0;
  }
}
```
进入主程序,初始化陀螺仪,上下旋转M5Stick时,陀螺仪读出的加速度值通过map函数映射到我们需要的范围内,比如这里时八个音。也可以通过修改这个map,来实现更小范围内的移动。使用``M5.update()``进行按键状态的检测。位置的移动检测通过了对比当前位置信息是否变化,在按键松开的情况下,如果位置出现了移动,则更新位置,同时提供当前位置的信息,记录在``i``。当按键按下时,通过这个位置读取对应音调的频率,使用``Beep.tone``输出对应的频率。按键不松开时,将一直播放该声音。同时屏幕显示播放的音调,在下一次按下更新。
效果展示
通过上下旋转,调节音调,按37 39 任意一个按键可以触发声音

FhemFeIhe927KTbFwTqSwhVSfjwd

 

项目收获
m5stickplus开发板的体积小巧,颜值高,同时集合了很多传感器,非常适合新手进行编程的学习。通过本次项目也得到了很多收获。
附件下载
M5beeper.zip
团队介绍
wds
团队成员
wwwds
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号