查看: 1584|回复: 0

简易半自动和弦辅助演奏装置

[复制链接]

该用户从未签到

发表于 2020-9-25 18:14 | 显示全部楼层 |阅读模式
本帖最后由 vany5921 于 2020-9-25 18:16 编辑

    只需在M5stickC上连接舵机,通过加速度传感器检测姿势并按压琴弦,超简单。按压的和弦是FM7。虽然出现频率不高,但是平时使用的1-3品移动的话会比较远,所以试着自动化了。
picture_pc_52805a6b53e5b01b0f5cfc00d5cbd4bd.png picture_pc_22c34c9862bf1f053f8d81711e3d815b.jpg
固定也只是用金属零件夹着达米亚的通用板。
picture_pc_bb8c3fec55ec829298169cabba0bb72f.jpg
安装支架是用3D打印机制作的。
picture_pc_77751d7a328fbe0ff1b8f57cefcfd02c.jpg
源代码也非常简单。
  1. #include <M5StickC.h> #include "utility/M5Servo.h"//M5Servo.hをM5StickC/utilityフォルダに入れておく

  2. float accX = 0.0F;
  3. float accY = 0.0F;
  4. float accZ = 0.0F;
  5. float gyroX = 0.0F;
  6. float gyroY = 0.0F;
  7. float gyroZ = 0.0F;
  8. float pitch = 0.0F;
  9. float roll  = 0.0F;
  10. float yaw   = 0.0F;

  11. //把阈值调整到合适的值
  12. float accX_max = -0.92F; //X轴阈值
  13. float accY_max = 0.30F; //Y轴阈值
  14. float accZ_max = 1.5F; //Z轴阈值
  15. float gyroX_max = 0.5F; //X轴阈值
  16. float gyroY_max = 0.5F; //Y轴阈值
  17. float gyroZ_max = 1.5F; //Z轴阈值

  18. int pmin = ((0.5 / 20) * 1024) + 0.5; // (0.5ms/20ms)*1024 + 0.5(四舍五入) = 26 (-90°)
  19. int pmax = ((2.4 / 20) * 1024) + 0.5; // (2.4ms/20ms)*1024 + 0.5(四舍五入) = 123 (+90°)
  20. int pd = 1;
  21. int p = pmin;

  22. M5Servo myServo;//舵机类实例化
  23. void setup() {

  24. M5.begin();
  25. M5.MPU6886.Init();
  26. M5.Lcd.setRotation(3);
  27. M5.Lcd.fillScreen(BLACK);
  28. M5.Lcd.setTextSize(1);
  29. M5.Lcd.setCursor(0, 15);
  30. M5.Lcd.println("  X       Y       Z");
  31. pinMode(10, OUTPUT); //内置LED
  32. myServo.attach(26);//GPIO26pin接舵机
  33. }

  34. void loop() {
  35. M5.MPU6886.getGyroData(&gyroX, &gyroY, &gyroZ);//获取角速度
  36. M5.MPU6886.getAccelData(&accX, &accY, &accZ);//获取加速度
  37. M5.Lcd.setCursor(0, 30);//显示角速度值
  38. M5.Lcd.printf("%6.2f  %6.2f  %6.2f      ", gyroX, gyroY, gyroZ);
  39. M5.Lcd.setCursor(140, 30);
  40. M5.Lcd.print("o/s");
  41. M5.Lcd.setCursor(0, 45);//显示加速度值
  42. M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", accX, accY, accZ);
  43. M5.Lcd.setCursor(140, 45);
  44. M5.Lcd.print("G");
  45. ledcWrite(0, p);
  46. Serial.printf("p = %d\n", p);

  47. // 修改值
  48. p += pd;
  49. if (p > pmax) {
  50.    p = pmax;
  51.    pd = -pd;
  52. } else if (pmin > p) {
  53.    p = pmin;
  54.    pd = -pd;
  55. }

  56. delay(100);
  57. //把阈值调整到合适的值
  58. if (accX_max < accX & accY > accY_max ) {
  59.    digitalWrite(10, LOW); //LED亮灯※注意LOW亮灯
  60.    myServo.write(-18);//按弦的角度调整到合适位置
  61. }
  62. else {
  63.    digitalWrite(10, HIGH); //LED灭
  64.    myServo.write(20);//离弦
  65. }
  66. delay(100);
  67. }
复制代码


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

本版积分规则

arduino程序设计基础 blinker物联网解决方案

热门推荐

【教程】pico+hx711电子秤
【教程】pico+hx711电子秤
pico+hx711电子秤 【前言】 我做过多款电子秤,这次移植到pico上
ESP8266+Onenet平台远程数据传输和控制
ESP8266+Onenet平台远程数
这是我的第一个diy,主要功能实现了onenet云平台温湿度数据的传输和远程控制LED灯平台
【Arduino】108种传感器模块系列实验(48)---三轴ADXL345模块
【Arduino】108种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
ps2遥控小车——uno实现
ps2遥控小车——uno实现
前几天在阁楼发现了好久以前3d打印,激光切割的底盘,于是决定做这个东西 正好手上又
震惊!OLED菜单竟只用10行代码就可以完成到完美!!!
震惊!OLED菜单竟只用10行
震惊!OLED菜单竟只用10行代码就可
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表