|
本帖最后由 vany5921 于 2020-9-25 18:16 编辑
只需在M5stickC上连接舵机,通过加速度传感器检测姿势并按压琴弦,超简单。按压的和弦是FM7。虽然出现频率不高,但是平时使用的1-3品移动的话会比较远,所以试着自动化了。
固定也只是用金属零件夹着达米亚的通用板。
安装支架是用3D打印机制作的。
源代码也非常简单。
- #include <M5StickC.h> #include "utility/M5Servo.h"//M5Servo.hをM5StickC/utilityフォルダに入れておく
- float accX = 0.0F;
- float accY = 0.0F;
- float accZ = 0.0F;
- float gyroX = 0.0F;
- float gyroY = 0.0F;
- float gyroZ = 0.0F;
- float pitch = 0.0F;
- float roll = 0.0F;
- float yaw = 0.0F;
- //把阈值调整到合适的值
- float accX_max = -0.92F; //X轴阈值
- float accY_max = 0.30F; //Y轴阈值
- float accZ_max = 1.5F; //Z轴阈值
- float gyroX_max = 0.5F; //X轴阈值
- float gyroY_max = 0.5F; //Y轴阈值
- float gyroZ_max = 1.5F; //Z轴阈值
- int pmin = ((0.5 / 20) * 1024) + 0.5; // (0.5ms/20ms)*1024 + 0.5(四舍五入) = 26 (-90°)
- int pmax = ((2.4 / 20) * 1024) + 0.5; // (2.4ms/20ms)*1024 + 0.5(四舍五入) = 123 (+90°)
- int pd = 1;
- int p = pmin;
- M5Servo myServo;//舵机类实例化
- void setup() {
- M5.begin();
- M5.MPU6886.Init();
- M5.Lcd.setRotation(3);
- M5.Lcd.fillScreen(BLACK);
- M5.Lcd.setTextSize(1);
- M5.Lcd.setCursor(0, 15);
- M5.Lcd.println(" X Y Z");
- pinMode(10, OUTPUT); //内置LED
- myServo.attach(26);//GPIO26pin接舵机
- }
- void loop() {
- M5.MPU6886.getGyroData(&gyroX, &gyroY, &gyroZ);//获取角速度
- M5.MPU6886.getAccelData(&accX, &accY, &accZ);//获取加速度
- M5.Lcd.setCursor(0, 30);//显示角速度值
- M5.Lcd.printf("%6.2f %6.2f %6.2f ", gyroX, gyroY, gyroZ);
- M5.Lcd.setCursor(140, 30);
- M5.Lcd.print("o/s");
- M5.Lcd.setCursor(0, 45);//显示加速度值
- M5.Lcd.printf(" %5.2f %5.2f %5.2f ", accX, accY, accZ);
- M5.Lcd.setCursor(140, 45);
- M5.Lcd.print("G");
- ledcWrite(0, p);
- Serial.printf("p = %d\n", p);
- // 修改值
- p += pd;
- if (p > pmax) {
- p = pmax;
- pd = -pd;
- } else if (pmin > p) {
- p = pmin;
- pd = -pd;
- }
- delay(100);
- //把阈值调整到合适的值
- if (accX_max < accX & accY > accY_max ) {
- digitalWrite(10, LOW); //LED亮灯※注意LOW亮灯
- myServo.write(-18);//按弦的角度调整到合适位置
- }
- else {
- digitalWrite(10, HIGH); //LED灭
- myServo.write(20);//离弦
- }
- delay(100);
- }
复制代码
|
|