こんにちは!!!
突然ですがみなさん、勇者になりたくありませんか?
私はなりたいです。
「カッコいいゴテゴテの剣をジャキジャキ振り回して敵を倒したい!!!!!」 という欲望は、誰しもが持っている1番の欲求でしょう。マズローの法則でも、5段階の欲求の一番上に君臨するのが「自己実現の欲求」。勇者になることで自己を実現したいというのは人間の性です。
しかし、勇者の剣を日常生活で活用できる場が無いのがこの世界の現状...
さらに刃渡り5.5cm以上の剣を持ち歩くなどすれば、銃刀法違反で逮捕されてしまいます。
「勇者になりたい!、だけど捕まりたくはない...」そんな思いを抱える葛藤の日々が長く続きました...
しかし、そんな私にふと、それなら普段使っている身近な道具を勇者っぽくカッコよくすればいいのではないか? という考えが舞い降りてきたのです。
ということで今回は、切ると「ジャキ〜ン!!!」と音が鳴るカッコいいはさみを作って勇者になる夢を叶えていきたいと思います!!!
完成品
勇者になりたいので切ると「ジャキ〜ン!!」と音が鳴るカッコいいはさみを作った#M5Stack pic.twitter.com/E2HvtDLNBg
— むらかみ (@murakami_reiwa) August 14, 2020
カッコいいですね。
用意するもの
-
M5Stack
Wifiで通信ができるESP-32、小型ディスプレイ、microSDカードスロット、スピーカーなどがコンパクトに内蔵されたスマートなマイコンです。 -
microSDカード
M5Stackに表示する画像と流す音源を保存するために使います。 -
タクトスイッチ
はさみの持ち手に埋め込むので、なるべく小さいものがいいです。 -
はさみ
ゴリゴリ削ることになるので、持ち手が削りやすいものがいいです。 -
耐震ジェル
そこらへんにあったので使ったのですが、ゴムっぽくて薄く切りやすいものであればなんでもOKです。 -
ケーブル
-
はんだごて/はんだ
タクトスイッチとケーブルを接続させるために使います。 -
平やすり
はさみの持ち手を削るために使います。 -
接着剤
タクトスイッチをはさみの持ち手に接着させるために使います。 -
時計
腕に画面を付けてカッコよく切りたい人は用意しましょう。
下準備
作成していく前にまずは下準備が2つ必要です!
表示する画像の用意
320×240で表示する画像を用意します。今回は勇ましい勇者のイラストを用いて、倒した敵の人数を表示してくれるデザインにしました。かっこいいですね。
画像が完成したら、必ず「画像名.jpg」で保存してmicroSDカードに書き込んでください。
流す効果音の用意
こちらのサイトの音源を3つお借りし、mp3ファイルをwavファイルに変換したのち、microSDカードに書き込みました。
ハードウェアの作成をする
下準備ができたら、いよいよ本体部分のハードウェアの作成をします!
順番に見て行きましょう👀
1. はさみの持ち手をタクトスイッチの形に合わせて平ヤスリで削る
下と上どちらも削ります。削り過ぎないように慎重に削りましょう。
2. タクトスイッチの上部が収まるスペースに細かく切った耐震マットを入れて接着する
タクトスイッチを押しやすくするために、ゴム状の加工しやすいものを埋め込みます。
3. 持ち手にタクトスイッチを接着する
接着材で落ちないようにしっかりと接着します。
4. タクトスイッチとケーブルをはんだ付けする
はんだ付けをしたらはさみの部分の完成です✨
5. 回路を組む
最後にM5Stackとケーブルを接続します。
今回はGNDと21番ピンに差し込みました。
また、腕に画面を付けるとカッコよさがかなり上がるので、いらなくなった時計の表面に両面テープでM5Stackを付けてみてもgoodです。
コードを書く
今回やりたいことは以下の通りです!
- 勇者の画像が表示される
- タクトスイッチが押されたらランダムで3種類のうちのどれかの効果音が鳴る
- タクトスイッチが押されたら「倒した人数」をカウントしたのちに画面に表示される
- M5Stackの一番左のボタンを押したら倒した敵の数がリセットされる
これを踏まえてM5Stackに以下のようなコードを書き込みました!
※wavファイルを再生するプログラムを書き込む際に以下の2つのライブラリが必要だったので、こちらの追加も忘れないようにしてください!
#include <M5Stack.h>
#include "AudioFileSourceSD.h"
#include "AudioGeneratorWAV.h"
#include "AudioOutputI2S.h"
// ピンの定義
#define DIN_PIN 21
AudioGeneratorWAV *wav;
AudioFileSourceSD *file;
AudioOutputI2S *out;
// 配列にWAVファイル名を入れる
char* wavFiles[] = {"/sword-clash1.wav", "/sword-clash2.wav", "/sword-clash4.wav"};
// 乱数用の変数の定義
int randomNumber = 0;
// 敵の数の変数の定義
int enemyCount = 0;
void setup(){
M5.begin();
// プルアップする
pinMode(DIN_PIN, INPUT_PULLUP);
// デフォルト画像設定
M5.Lcd.drawJpgFile(SD, "/yusha.jpg");
// テキスト初期表示
M5.Lcd.setTextSize(6);
M5.Lcd.setCursor(40, 105);
M5.Lcd.setTextColor(BLACK);
M5.Lcd.print(enemyCount);
out = new AudioOutputI2S(0, 1);
out->SetOutputModeMono(true);
// 音量が大きかったら小さい値にする
out->SetGain(0.5);
wav = new AudioGeneratorWAV();
}
void loop(){
// 内蔵ボタンの状態更新
M5.update();
// スイッチの値を入れる変数を定義
int value;
// スイッチの値を読み込む
value = digitalRead(DIN_PIN);
// 乱数の作成
randomNumber = random(3);
// スイッチが押された場合
if (value == LOW){
// ランダムでSDカード内のWAVファイルを流す
file = new AudioFileSourceSD(wavFiles[randomNumber]);
wav->begin(file, out);
while(wav->isRunning()) {
if(!wav->loop()) wav->stop();
}
// 敵の数をカウント
enemyCount++;
// 敵の数を表示
M5.Lcd.clear();
M5.Lcd.setCursor(40, 105);
M5.Lcd.drawJpgFile(SD, "/yusha.jpg");
M5.Lcd.print(enemyCount);
}
// リセットボタンの設定
if (M5.BtnA.wasPressed()) {
// 敵の数をリセット
enemyCount = 0;
// リセットした数を表示
M5.Lcd.clear();
M5.Lcd.setCursor(40, 105);
M5.Lcd.drawJpgFile(SD, "/yusha.jpg");
M5.Lcd.print(enemyCount);
}
delay(100);
}
正常に書き込みが完了したら、カッコいいはさみの完成です!!!!!
終わりに
いかがでしたか?
カッコいいはさみはできたでしょうか?
私はこのはさみで溜まりに溜まった郵便物(という名の敵)の封を開けて行きたいと思います!!!!
スイッチを押すだけの単純な設計なので、進化した勇者になりたい方はセンサなどを付けて速度や距離感を測ってみるとより面白い機能が追加できるかもしれません👀
それでは、よい勇者ライフをお過ごしください🗡