M5Stackで任天堂スイッチ用インターバルタイマーロボを作る!(6/10追記)
※有料記事ですが無料でほぼ読めます※
任天堂スイッチの「あつまれ!どうぶつの森」(以下あつ森)にはまりまくっている今日この頃です。
それもまあ普通の遊び方じゃなくて、
↑のあたりから書いているような天体観測にハマっているのですがw
そこで、あつ森の夜空を定点観測するための、インターバル撮影ができるような仕掛けを作れないかなあと思い立ちました。
いくつか方法はあると思います。HDMIで画像が出力できるので、PCでキャプチャーするのが比較的楽かなという感じです、が、まともなキャプチャーデバイスって結構お高いので(今調べたら千円台からあった・・・そっちでやればよかったかも?><)、まあ、せっかく手元にM5Stackがあるので、
指定時間ごとにシャッターボタンを押すロボット
を造っちゃおう! とやってみたのが今回の記事となります。
※つまりトップ画像のあ~る君(『究極超人あ~る』@ゆうきまさみより引用)(無断ですいません!><)がやらされているやつと同じことです。
仕組みは簡単。単にM5Stackからの指令でアームを動かして、ボタンを押すようにしたいのです。
ボタンを押す信号をハックして電気的にやっつけるのがスマートな気もしますけれど、今回は機械的に、物理的にスイッチを「押す」仕掛けをつくります。
そういうロボット的な動作に使うための電子部品はステッピングモーターやらソレノイドやらいろいろあります、それぞれ一長一短(なので、詳しくはググりましょう)です。
今回は、お安いのと手軽なので「サーボ」というやつを使います。ラジコンとかでよく使われているやつです。アナログ的に角度を指定してそこまでアームを動かせる便利な子です。
単にボタン押すだけなのでそんなに高級なヤツじゃなくてOKなので、この子をチョイスしました。
マイクロサーボ9g SG-90
そして、M5Stackからサーボを動かすために
サーボドライバモジュール
これをゲット。なんと12チャンネルも動かせるヤツ。
今回はボタン1つ(1チャンネル動かしたい)ためだけなので、完全にオーバースペックですw
(いろんなボタン用に何個もサーボを買ってきて組み合わせたらシャッター用のボタンだけじゃなくてゲームを自動運転できるようなのも作れちゃうかもしれませんねw)
また、このサーボとサーボドライバを買ってから気が付きましたが、
接続
みてください、これ
↑下の灰色のがM5Stackに重なっているサーボドライバ。0~7までのポート(8~11は別の側面にあります)が2つづつ重なってついているのがわかります。
そして、SVG(Signal / Voltage / GND)の3本がこういう順番よと色で分かるようになっていて、でもって、サーボ側から来ているコネクタも(Gが黒ではなくて茶色ですが)どうやらその順番。
ばっちりそのまま刺さりました。これはうれしい♪
(ピッチ変換したりはんだ付けしたりしなくていいなんてラクちんです!☆)
※もちろん、よい子は接続が正しいかどうかは色で判断するのではなくてちゃんとデータシートを見ましょうね。
プログラム(スケッチ)
ArduinoIDEから、デフォルトのスケッチを呼び出してみます。
スケッチ例>M5Stack>Modules>Servo
内容は以下の通り
#include <Arduino.h>
#include <M5Stack.h>
#include <Wire.h>
#define SERVO_ADDR 0x53
void setup() {
M5.begin(true, false, true);
M5.Lcd.setTextFont(4);
M5.Lcd.setCursor(70, 100);
M5.Lcd.print("Servo Example");
Wire.begin(21, 22, 100000);
// put your setup code here, to run once:
}
// addr 0x01 mean control the number 1 servo by us
void Servo_write_us(uint8_t number, uint16_t us) {
Wire.beginTransmission(SERVO_ADDR);
Wire.write(0x00 | number);
Wire.write(us & 0x00ff);
Wire.write(us >> 8 & 0x00ff);
Wire.endTransmission();
}
// addr 0x11 mean control the number 1 servo by angle
void Servo_write_angle(uint8_t number, uint8_t angle) {
Wire.beginTransmission(SERVO_ADDR);
Wire.write(0x10 | number);
Wire.write(angle);
Wire.endTransmission();
}
void loop() {
for(uint8_t i = 0; i < 12; i++){
Servo_write_us(i, 700);
// Servo_write_angle(i, 0);
}
delay(1000);
for(uint8_t i = 0; i < 12; i++){
Servo_write_us(i, 2300);
// Servo_write_angle(i, 180);
}
delay(1000);
}
詳しい解説はやめておきますが、後半のloop()の中で、12個のポート全部を700~2300に1秒間隔でうごかすよ。となってるようです。
実行してみましょう。
なんにも手を加えずそのまんま動きますw
良いですねぇ~☆
あとは、これの角度とインターバルな時間を調整するのと、適切な位置(ボタン)を押すようにしてあげればいいわけです。かんたんかんたん♪
3Dプリンタでホルダーを作成
こんなかんじをCADでデザインしてみます。
アームのついたサーボを「コ」の字がたのホルダにつけ、ネジで固定するイメージです。
実際には「コ」の字の内側にゴムのシートを張り、アームの力を逃がすのと任天堂スイッチ本体をホールドするようにしました。
さて、実験♪
ちゃんと動作しています! すばらしい!☆
2秒ごとにアームが押し下がり、ボタンが押されて任天堂スイッチのキャプチャー機能が呼び出されているのがわかります。
ちょっと見難いけど、ゲーム画面左上に
「保存しました」と出るのがキャプチャできた証拠です。
この画像データは、任天堂スイッチに取り付けたSDカードに自動保存されます。あとからその画像をパソコンに吸い出して、静止画を動画にしてしまえばよいわけです。
しっかりした枠をつくろう!
上の動画はちょっとスイッチ押すときにゆらゆらしていますね。
テストはこれでも良いですが、本当に一晩中とか動かすにはちょっと不安が残ります。
なので、しっかりした木の枠を作りました。
3Dプリンタで全部つくっちゃっても良いのですが、大きな部分は3Dプリンタで刷るとやたら時間がかかるので、簡単な構造は日曜大工で作った方が楽で速いのです。
100円ショップの工作コーナーで買ってきた木の板を木工ボンドで貼り付け、先ほどのサーボをねじ止めします。(土台が大きくなったのでブレが少なくなることを期待しています)
M5Stackも付けられるようにして、
このようになりました。(∩´∀`)∩☆
ばっちりしっかり! 安定していますね! すばらしー☆
↑この画像ではインターバル時間は5秒にしているので5秒ごとにシャッターが押されますが、これを60秒(1分)や3600秒(一時間)にして夜空を撮影すれば、理想のインターバル撮影マシンができあがることになります。(∩´∀`)∩☆
※さっそくやってみようと思ったら、今夜はあつ森の中の世界は雨ふりで星空どころか月すら見えませんでした…残念!!
実際に一晩回すのは、また天気の良い夜にしようと思います><
撮影成功!(6/10追記)
6月9日の晩から10日にかけてセットして無事撮影できました!
↑できれば拡大してよーくみてください。中盤で雲がなくなり、星の動きがはっきり見えます。
どうも小さな光(星々?)よりも大きめの光点(惑星?)のほうが早く動いていて、月は出るときと沈む時に加速してますね(中央付近では惑星のほうが月より早い??)
はてさてどういうこと!? また謎が謎を読んでいるきがします><
まあ、詳しい考察はまたにしておきましょう。
とりあえず撮影成功なのでよかったよかった☆
さて、これで完成ですが、以下、オマケ部分で3Dの設計データやインターバル撮影用スケッチ等を公開しておきます♪
―――オマケの前に
わずか数日で引退させるとはおもいませんでした><
つづきの記事はこちらー
以下、引退させてもオマケは付けてありますので興味ある方はどうぞ―♪ ↓
ここから先は
¥ 200
この記事が参加している募集
よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費にさせていただきます!感謝!,,Ծ‸Ծ,,