見出し画像

半自動ウクレレコード押さえ機を作った

M5Stack Japan Creativity Contest 2020の応募が9/23に締め切られました。161作品がエントリーされたそうです。すごい。

というわけで自分も参加賞目当てでエントリーしてみました。

M5stickCにサーボ繋いで加速度センサで姿勢検知してON/OFFするだけ、超シンプル。押さえるコードはFM7。時々出てくる割に普段使う1~3フレットあたりから移動すると地味に遠いので自動化してみました。

画像4

画像2

固定もタミヤのユニバーサルプレートを金具で挟んでるだけ。

画像2

取付ブラケットは3Dプリンタで作りました。サーボの固定、いまだ正解がわからん。

画像3

ソースコードも超簡単。全応募作の中で一番短いまである。

#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);//チャタリングするときはここを増やす
}

M5Stack系統(というかESP32)はArduino IDEのSrevo.hが使えないの代わりにこちらライブラリをお借りしてます。

受賞作品の発表は10/3。どれが栄光を勝ち取るのか、とても楽しみですね。参加賞、お待ちしております。

↓応募作品の一覧。いろんなアイディアがいっぱい。


以上

余談

ほんとは弦を押さえる方じゃなくて、弦を弾くほうを自動化しようと試みたんですが、意外と難しくて断念しました。

弦を指で弾くのって意外と複雑な認知機能と運動が必要というのがよくわかりました。

まんまモラベックのパラドクスの再発見なんですけども。

この記事が気に入ったらサポートをしてみませんか?