前回、前々回とでライダーガシャットの仕組みについておおよそは理解したので、今回は学んだことを活かして、オリジナルのライダーガシャットを作ってみたいと思います。カラーリングとかLEDの色とかだけじゃなくて、音声もLEDの発光パターンも全部独自のものに差し替えたいと思います。
ガシャットをつくるということは何かしらのゲームを題材にするということなのですが、最初に作るべきものは何かと考えたら、自分の中では答えは一つでした。
ということで作ってみました、『スーパーマリオブラザーズガシャット』。
ゲームの代名詞と言っても過言ではなく、一発目に作るものとしてはこれ以上にふさわしいものはないと思います。
ということで、以下ではマリオを題材に、どんな感じで作ったのかを簡単にご紹介していきたいと思います。
今回使用した主な具材は以下になります。
ベースとなるガシャットは何でもよいです。ただ、徹底的に破壊することになる点だけご注意ください。
HYPER DETAIL GEARのときも使用しましたが、今回もお世話になります。これにプログラムを書いて全体を制御します。
こちらのセットもHYPER DETAIL GEARのときに使用しましたが、音声再生はこれにかかっています。なかなか気難しいモジュールですが。
それから、小型・薄型のスピーカーが別途必要です。ガシャットの中はスペースの余裕が全然ないので、元々ガシャットに入っている大きめのスピーカーは外して、代わりに小型・薄型のものを使うことでMP3プレーヤーを入れるスペースを確保します。
こちらもHYPER DETAIL GEARのときに使用しました。フルカラーLEDなので、(今のところの)普通のガシャットではできない色変化が可能になります。
実はこれが今回の工作の要かもしれません。最初はデフォルトのLR44電池3個、ないしは1個追加の4個で電力を賄えないか頑張ってみたのですが、LEDも音声モジュールも、どうしても安定してくれませんでした。そこで、やむなしでリチウムイオンポリマー電池を使うことにしました。ここで紹介している電池で、無事にArduino, LED, 音声モジュールを安定して動作させることができました。
ただ、ご存知の方は多いと思いますが、リチウムイオン電池は取り扱い方を誤ると非常に危険です。利用にあたっては自己責任で、細心の注意を払って利用するようにしてください。一緒に紹介している充電器を使用することを強くお勧めします。
今回、ガシャットに入っている元々の基板は使いません。ただ、それと同サイズの板が必要になるので、1.2mmのプラ板を基板と同サイズに切って使用します。
あとは細々したところで、導線やスライドスイッチ、絶縁テープなどが必要です。
以上が、電子的なところで必要な具材です。次は見た目を変えるために必要な具材です。
自分はどうしてもマリオのゲームソフトと同じ色にしたかったので、上記の色を使いました。スイッチのパーツを厚く塗ってしまうと、あとでスイッチがうまく稼動しなくなったりするので、そこだけ注意が必要です(後で削ったり色々大変でした)。
ホワイトの方が持ち手のところのラベル用と発光部分のイラスト用、透明の方が背中のガシャット名のところ用です。自分は塗装技術が全然なので、印刷したものを貼り付ける、というやり方で見た目を変えました。ただ、このやり方だと白色の印刷ができないという難点があります。自分で塗装ができる人なら、ガシャットのクリアパーツについては、自分で白を塗装した方が、ドライバーの中で綺麗に見えると思います。
あとは、もともとクリアーパーツにプリントされているものを消すものが必要です。自分はマニキュアの除光液を使いましたが、こちらで書いているとおり、どうしても全体が白っぽくなってしまうので、他に良いやり方を知っている方は是非教えてください。
必要なものは以上です。あとは、これらをスペースに余裕のないガシャット内部にどう詰め込んでいくかですが、その前に先に、プログラムの方を片付けておきます。
プログラムについては、基本は前々回に調べた内容を実装するだけです。以下、少し長いですが、全文掲載します。
#include <string.h>
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include <Adafruit_NeoPixel.h>
#define BUTTON_1_PIN 4
#define BUTTON_2_PIN 5
#define BUTTON_3_PIN 6
#define LED_PIN 7
#define NUM_OF_LED 1
#define GASHAT_OFF 0
#define GASHAT_NAME 1
#define GAME_CLEAR 2
#define GAME_OVER 3
#define LEVEL_1 4
#define LEVEL_2 5
#define LEVEL_3 6
#define GASHAT_IN 7
#define GASHAT_OUT 8
#define DRIVER_CLOSE 9
#define CRITICAL_STRIKE 10
#define CRITICAL_READY 11
#define CRITICAL_FINISH 12
#define GENRE 13
#define N_BUTTON 3
#define ON HIGH
#define OFF LOW
#define LED_PATTERN 200
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_OF_LED, LED_PIN, NEO_GRB + NEO_KHZ400);
SoftwareSerial mySerial(2, 3); // RX, TX
const uint8_t OFF_OFF_OFF[] = {OFF, OFF, OFF};
const uint8_t ON_OFF_OFF[] = {ON, OFF, OFF};
const uint8_t OFF_ON_OFF[] = {OFF, ON, OFF};
const uint8_t OFF_OFF_ON[] = {OFF, OFF, ON };
const uint8_t ON_ON_OFF[] = {ON, ON, OFF};
const uint8_t ON_OFF_ON[] = {ON, OFF, ON };
const uint8_t OFF_ON_ON[] = {OFF, ON, ON };
const uint8_t ON_ON_ON[] = {ON, ON, ON };
const uint8_t LED_GASHAT_NAME[][3] PROGMEM = {
{128, 0, 0},{ 0, 0, 0},{128, 0, 0},{108, 0, 0},{ 88, 0, 0},{ 68, 0, 0},{ 48, 0, 0},{ 28, 0, 0},{ 8, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{ 0, 0, 0},{128, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{ 0, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{120, 0, 0},{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 64, 0, 0},{ 48, 0, 0},{ 32, 0, 0},{ 24, 0, 0},{ 12, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_GAME_CLEAR[][3] PROGMEM = {
{ 0, 0, 12},{ 0, 0, 24},{ 0, 0, 32},{ 0, 0, 48},{ 0, 0, 60},{ 0, 0, 72},{ 0, 0, 84},{ 0, 0, 96},{ 0, 0,108},{ 0, 0,120},
{ 0, 0, 96},{ 0, 0, 72},{ 0, 0, 48},{ 0, 0, 24},{ 0, 0, 0},{ 0, 0, 12},{ 0, 0, 24},{ 0, 0, 32},{ 0, 0, 48},{ 0, 0, 60},
{ 0, 0, 72},{ 0, 0, 84},{ 0, 0, 96},{ 0, 0,108},{ 0, 0,120},{ 0, 0, 96},{ 0, 0, 72},{ 0, 0, 48},{ 0, 0, 24},{ 0, 0, 0},
{ 0, 0, 12},{ 0, 0, 24},{ 0, 0, 32},{ 0, 0, 48},{ 0, 0, 60},{ 0, 0, 72},{ 0, 0, 84},{ 0, 0, 96},{ 0, 0,108},{ 0, 0,120},
{ 0, 0, 96},{ 0, 0, 72},{ 0, 0, 48},{ 0, 0, 24},{ 0, 0, 0},{ 0, 0, 12},{ 0, 0, 24},{ 0, 0, 32},{ 0, 0, 48},{ 0, 0, 60},
{ 0, 0, 72},{ 0, 0, 84},{ 0, 0, 96},{ 0, 0,108},{ 0, 0,120},{ 0, 0, 96},{ 0, 0, 72},{ 0, 0, 48},{ 0, 0, 24},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_GAME_OVER[][3] PROGMEM = {
{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_GASHAT_LEVEL1[][3] PROGMEM = {
{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 64, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 64, 0, 0},{128, 0, 0},
{108, 0, 0},{ 88, 0, 0},{ 68, 0, 0},{ 48, 0, 0},{ 28, 0, 0},{ 8, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{ 32, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 32, 0, 0},{ 0, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 32, 0, 0},{ 0, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 32, 0, 0},{ 0, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 32, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 32, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 32, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 64, 0, 0},
{ 32, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 32, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},{ 48, 0, 0},{ 32, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 12, 0, 0},{ 24, 0, 0},{ 36, 0, 0},{ 48, 0, 0},{ 60, 0, 0},{ 72, 0, 0},{ 84, 0, 0},{ 96, 0, 0},{108, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},
{ 48, 0, 0},{ 32, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_GASHAT_LEVEL2[][3] PROGMEM = {
{128, 0, 0},{ 64, 0, 0},{ 32, 0, 0},{128, 0, 0},{108, 0, 0},{ 88, 0, 0},{ 68, 0, 0},{ 48, 0, 0},{ 28, 0, 0},{ 20, 0, 0},
{ 8, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},
{ 32, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},
{ 36, 0, 0},{ 18, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},
{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},
{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},
{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{ 32, 0, 0},{128, 0, 0},{ 32, 0, 0},{128, 0, 0},
{ 32, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},{ 48, 0, 0},{ 32, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_GASHAT_LEVEL3[][3] PROGMEM = {
{128, 0, 0},{ 64, 0, 0},{ 32, 0, 0},{128, 0, 0},{108, 0, 0},{ 88, 0, 0},{ 68, 0, 0},{ 48, 0, 0},{ 28, 0, 0},{ 20, 0, 0},
{ 8, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},
{ 32, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},
{ 36, 0, 0},{ 18, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},
{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},
{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},
{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},
{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},
{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},
{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},
{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},
{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},{128,128, 0},{128,128, 0},{ 64, 64, 0},{ 32, 32, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},
{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},
{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,128, 0},{ 0,108, 0},{ 0, 96, 0},{ 0, 84, 0},{ 0, 72, 0},{ 0, 60, 0},
{ 0, 48, 0},{ 0, 36, 0},{ 0, 24, 0},{ 0, 12, 0},{ 0, 0, 0}
};
const uint8_t LED_GASHAT_IN[][3] PROGMEM = {
{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 64, 0, 0},{128, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 64, 0, 0},{128, 0, 0},
{108, 0, 0},{ 88, 0, 0},{ 68, 0, 0},{ 48, 0, 0},{ 28, 0, 0},{ 8, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_GASHAT_OUT[][3] PROGMEM = {
{ 64, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},{ 88, 0, 0},{ 68, 0, 0},{ 48, 0, 0},{ 28, 0, 0},{ 20, 0, 0},{ 8, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_DRIVER_CLOSE[][3] PROGMEM = {
{128, 0, 0},{ 0, 0, 0},{128, 0, 0},{108, 0, 0},{ 88, 0, 0},{ 68, 0, 0},{ 48, 0, 0},{ 28, 0, 0},{ 20, 0, 0},{ 8, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_CRITICAL_STRIKE[][3] PROGMEM = {
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},
{ 48, 0, 0},{ 32, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{128, 0, 0},{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},
{ 48, 0, 0},{ 32, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},
{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},{ 48, 0, 0},{ 36, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{ 0, 0,128},{ 0, 0,128},
{ 64, 64,128},{ 64, 64,128},{ 0, 0, 64},{ 0, 0, 64},{ 64, 0,128},{ 64, 0,128},{ 64, 0, 64},{ 64, 0, 64},{128, 0,128},{128, 0,128},
{128, 0, 64},{128, 0, 64},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 64, 0, 0},{128, 64, 64},{128, 64, 64},{128, 64, 0},{128, 64, 0},
{128, 128, 0},{128,128, 0},{ 64, 64, 0},{ 64, 64, 0},{ 64,128, 0},{ 64,128, 0},{ 0,128, 0},{ 0,128, 0},{ 64,128, 64},{ 64,128, 64},
{ 0, 64, 0},{ 0, 64, 0},{ 0,128, 64},{ 0,128, 64},{ 0,128,128},{ 0,128,128},{ 0, 64, 64},{ 0, 64, 64},{ 0, 64,128},{128, 0, 0},
{ 64, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},{ 48, 0, 0},{ 36, 0, 0},
{ 24, 0, 0},{ 12, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_CRITICAL_READY[][3] PROGMEM = {
{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 64, 0, 0},{ 64, 0, 0},{128, 64, 64},{128, 64, 64},{128, 64, 0},{128, 64, 0},{128, 128, 0},{128,128, 0},
{ 64, 64, 0},{ 64, 64, 0},{ 64,128, 0},{ 64,128, 0},{ 0,128, 0},{ 0,128, 0},{ 64,128, 64},{ 64,128, 64},{ 0, 64, 0},{ 0, 64, 0},
{ 0,128, 64},{ 0,128, 64},{ 0,128,128},{ 0,128,128},{ 0, 64, 64},{ 0, 64, 64},{ 0, 64,128},{ 0, 64,128},{ 0, 0,128},{ 0, 0,128},
{ 64, 64,128},{ 64, 64,128},{ 0, 0, 64},{ 0, 0, 64},{ 64, 0,128},{ 64, 0,128},{ 64, 0, 64},{ 64, 0, 64},{128, 0,128},{128, 0,128},
{128, 0, 64},{128, 0, 64},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 64, 0, 0},{128, 64, 64},{128, 64, 64},{128, 64, 0},{128, 64, 0},
{128, 128, 0},{128,128, 0},{ 64, 64, 0},{ 64, 64, 0},{ 64,128, 0},{ 64,128, 0},{ 0,128, 0},{ 0,128, 0},{ 64,128, 64},{ 64,128, 64},
{ 0, 64, 0},{ 0, 64, 0},{ 0,128, 64},{ 0,128, 64},{ 0,128,128},{ 0,128,128},{ 0, 64, 64},{ 0, 64, 64},{ 0, 64,128},{ 0, 64,128},
{ 0, 0,128},{ 0, 0,128},{ 64, 64,128},{ 64, 64,128},{ 0, 0, 64},{ 0, 0, 64},{ 64, 0,128},{ 64, 0,128},{ 64, 0, 64},{ 64, 0, 64},
{128, 0,128},{128, 0,128},{128, 0, 64},{128, 0, 64},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 64, 0, 0},{128, 64, 64},{128, 64, 64},
{128, 64, 0},{128, 64, 0},{128, 128, 0},{128,128, 0},{ 64, 64, 0},{ 64, 64, 0},{ 64,128, 0},{ 64,128, 0},{ 0,128, 0},{ 0,128, 0},
{ 64,128, 64},{ 64,128, 64},{ 0, 64, 0},{ 0, 64, 0},{ 0,128, 64},{ 0,128, 64},{ 0,128,128},{ 0,128,128},{ 0, 64, 64},{ 0, 64, 64},
{ 0, 64,128},{ 0, 64,128},{ 0, 0,128},{ 0, 0,128},{ 64, 64,128},{ 64, 64,128},{ 0, 0, 64},{ 0, 0, 64},{ 64, 0,128},{ 64, 0,128},
{ 64, 0, 64},{ 64, 0, 64},{128, 0,128},{128, 0,128},{128, 0, 64},{128, 0, 64},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 64, 0, 0},
{128, 64, 64},{128, 64, 64},{128, 64, 0},{128, 64, 0},{128, 128, 0},{128,128, 0},{ 64, 64, 0},{ 64, 64, 0},{ 64,128, 0},{ 64,128, 0},
{ 0,128, 0},{ 0,128, 0},{ 64,128, 64},{ 64,128, 64},{ 0, 64, 0},{ 0, 64, 0},{ 0,128, 64},{ 0,128, 64},{ 0,128,128},{ 0,128,128},
{ 0, 64, 64},{ 0, 64, 64},{ 0, 64,128},{ 0, 64,128},{ 0, 0,128},{ 0, 0,128},{ 64, 64,128},{ 64, 64,128},{ 0, 0, 64},{ 0, 0, 64},
{ 64, 0,128},{ 64, 0,128},{ 64, 0, 64},{ 64, 0, 64},{128, 0,128},{128, 0,128},{128, 0, 64},{128, 0, 64},{128, 0, 0},{128, 0, 0},
{ 64, 0, 0},{ 64, 0, 0},{128, 64, 64},{128, 64, 64},{128, 64, 0},{128, 64, 0},{128, 128, 0},{128,128, 0},{ 64, 64, 0},{ 64, 64, 0},
{ 64,128, 0},{ 64,128, 0},{ 0,128, 0},{ 0,128, 0},{ 64,128, 64},{ 64,128, 64},{ 0, 64, 0},{ 0, 64, 0},{ 0, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_CRITICAL_FINISH[][3] PROGMEM = {
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},
{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},{ 48, 0, 0},{ 32, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{128, 0, 0},{108, 0, 0},
{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},{ 48, 0, 0},{ 32, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{128, 0, 0},{128, 0, 0},
{128, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},{ 48, 0, 0},{ 36, 0, 0},
{ 24, 0, 0},{ 12, 0, 0},{ 0, 0,128},{ 0, 0,128},{ 64, 64,128},{ 64, 64,128},{ 0, 0, 64},{ 0, 0, 64},{ 64, 0,128},{ 64, 0,128},
{ 64, 0, 64},{ 64, 0, 64},{128, 0,128},{128, 0,128},{128, 0, 64},{128, 0, 64},{128, 0, 0},{128, 0, 0},{ 64, 0, 0},{ 64, 0, 0},
{128, 64, 64},{128, 64, 64},{128, 64, 0},{128, 64, 0},{128, 128, 0},{128,128, 0},{ 64, 64, 0},{ 64, 64, 0},{ 64,128, 0},{ 64,128, 0},
{ 0,128, 0},{ 0,128, 0},{ 64,128, 64},{ 64,128, 64},{ 0, 64, 0},{ 0, 64, 0},{ 0,128, 64},{ 0,128, 64},{ 0,128,128},{ 0,128,128},
{ 0, 64, 64},{ 0, 64, 64},{ 0, 64,128},{128, 0, 0},{ 64, 0, 0},{128, 0, 0},{128, 0, 0},{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},
{ 72, 0, 0},{ 60, 0, 0},{ 48, 0, 0},{ 36, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0}
};
const uint8_t LED_GENRE[][3] PROGMEM = {
{ 64, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},{128, 0, 0},
{108, 0, 0},{ 96, 0, 0},{ 84, 0, 0},{ 72, 0, 0},{ 60, 0, 0},{ 48, 0, 0},{ 32, 0, 0},{ 24, 0, 0},{ 12, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},
{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0}
};
void setup () {
mySerial.begin (9600);
mp3_set_serial (mySerial); //set softwareSerial for DFPlayer-mini mp3 module
mp3_set_volume (25);
pinMode(BUTTON_1_PIN, INPUT_PULLUP);
pinMode(BUTTON_2_PIN, INPUT_PULLUP);
pinMode(BUTTON_3_PIN, INPUT_PULLUP);
pixels.begin();
pixels.show();
}
uint8_t before_state[] = {OFF, OFF, OFF};
uint8_t current_state[] = {OFF, OFF, OFF};
uint8_t single_mode_flag = OFF;
uint8_t game_clear_flag = OFF;
uint8_t critical_mode_flag = OFF;
uint8_t action = GASHAT_OFF;
uint8_t led_index = 0;
void loop(){
current_state[0] = digitalRead(BUTTON_1_PIN);
current_state[1] = digitalRead(BUTTON_2_PIN);
current_state[2] = digitalRead(BUTTON_3_PIN);
if(memcmp(before_state, OFF_OFF_OFF, N_BUTTON) == 0){
if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
action = set_action(LEVEL_1);
}else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
action = set_action(GASHAT_IN);
}else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
if(single_mode_flag == OFF){
action = set_action(GASHAT_NAME);
}else{
if(game_clear_flag){
action = set_action(GAME_CLEAR);
}else{
action = set_action(GAME_OVER);
}
game_clear_flag = !game_clear_flag;
}
single_mode_flag = !single_mode_flag;
}else if(memcmp(current_state, ON_ON_OFF, N_BUTTON) == 0){
action = set_action(GASHAT_IN);
}else if(memcmp(current_state, ON_OFF_ON, N_BUTTON) == 0){
action = set_action(LEVEL_1);
}else if(memcmp(current_state, OFF_ON_ON, N_BUTTON) == 0){
action = set_action(GASHAT_IN);
}else if(memcmp(current_state, ON_ON_ON, N_BUTTON) == 0){
if(critical_mode_flag == OFF){
action = set_action(CRITICAL_READY);
}else{
action = set_action(CRITICAL_STRIKE);
}
critical_mode_flag = !critical_mode_flag;
}
}else if(memcmp(before_state, ON_OFF_OFF, N_BUTTON) == 0){
if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
action = set_action(GASHAT_OUT);
}else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_ON_OFF, N_BUTTON) == 0){
action = set_action(LEVEL_2);
}else if(memcmp(current_state, ON_OFF_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_ON_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_ON_ON, N_BUTTON) == 0){
action = set_action(LEVEL_2);
}
}else if(memcmp(before_state, OFF_ON_OFF, N_BUTTON) == 0){
if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
action = set_action(GASHAT_OUT);
}else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_ON_OFF, N_BUTTON) == 0){
action = set_action(LEVEL_3);
}else if(memcmp(current_state, ON_OFF_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_ON_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_ON_ON, N_BUTTON) == 0){
action = set_action(LEVEL_3);
}
}else if(memcmp(before_state, OFF_OFF_ON, N_BUTTON) == 0){
if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_ON_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_OFF_ON, N_BUTTON) == 0){
action = set_action(LEVEL_1);
}else if(memcmp(current_state, OFF_ON_ON, N_BUTTON) == 0){
action = set_action(GASHAT_IN);
}else if(memcmp(current_state, ON_ON_ON, N_BUTTON) == 0){
if(critical_mode_flag == OFF){
action = set_action(CRITICAL_READY);
}else{
action = set_action(CRITICAL_STRIKE);
}
critical_mode_flag = !critical_mode_flag;
}
}else if(memcmp(before_state, ON_ON_OFF, N_BUTTON) == 0){
if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
action = set_action(GASHAT_OUT);
}else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
action = set_action(DRIVER_CLOSE);
}else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
action = set_action(DRIVER_CLOSE);
}else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_ON_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_OFF_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_ON_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_ON_ON, N_BUTTON) == 0){
if(critical_mode_flag == OFF){
action = set_action(CRITICAL_READY);
}else{
action = set_action(CRITICAL_STRIKE);
}
critical_mode_flag = !critical_mode_flag;
}
}else if(memcmp(before_state, ON_OFF_ON, N_BUTTON) == 0){
if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
action = set_action(GASHAT_OUT);
}else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
action = set_action(GASHAT_OUT);
}else if(memcmp(current_state, ON_ON_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_OFF_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_ON_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_ON_ON, N_BUTTON) == 0){
action = set_action(LEVEL_2);
}
}else if(memcmp(before_state, OFF_ON_ON, N_BUTTON) == 0){
if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
action = set_action(GASHAT_OUT);
}else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
action = set_action(GASHAT_OUT);
}else if(memcmp(current_state, ON_ON_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_OFF_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, OFF_ON_ON, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_ON_ON, N_BUTTON) == 0){
action = set_action(LEVEL_3);
}
}else if(memcmp(before_state, ON_ON_ON, N_BUTTON) == 0){
if(memcmp(current_state, OFF_OFF_OFF, N_BUTTON) == 0){
action = set_action(GASHAT_OUT);
}else if(memcmp(current_state, ON_OFF_OFF, N_BUTTON) == 0){
action = set_action(CRITICAL_FINISH);
}else if(memcmp(current_state, OFF_ON_OFF, N_BUTTON) == 0){
action = set_action(GENRE);
}else if(memcmp(current_state, OFF_OFF_ON, N_BUTTON) == 0){
action = set_action(GASHAT_OUT);
}else if(memcmp(current_state, ON_ON_OFF, N_BUTTON) == 0){
;
}else if(memcmp(current_state, ON_OFF_ON, N_BUTTON) == 0){
action = set_action(CRITICAL_FINISH);
}else if(memcmp(current_state, OFF_ON_ON, N_BUTTON) == 0){
action = set_action(GENRE);
}else if(memcmp(current_state, ON_ON_ON, N_BUTTON) == 0){
;
}
}
flash_led(action);
before_state[0] = current_state[0];
before_state[1] = current_state[1];
before_state[2] = current_state[2];
delay(100);
}
uint8_t set_action(uint8_t action){
mp3_play(action);
led_index = 0;
return action;
}
void flash_led(uint8_t action){
switch(action){
case GASHAT_NAME:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_GASHAT_NAME[led_index][0])),
pgm_read_byte(&(LED_GASHAT_NAME[led_index][1])),
pgm_read_byte(&(LED_GASHAT_NAME[led_index][2]))));
break;
case GAME_CLEAR:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_GAME_CLEAR[led_index][0])),
pgm_read_byte(&(LED_GAME_CLEAR[led_index][1])),
pgm_read_byte(&(LED_GAME_CLEAR[led_index][2]))));
break;
case GAME_OVER:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_GAME_OVER[led_index][0])),
pgm_read_byte(&(LED_GAME_OVER[led_index][1])),
pgm_read_byte(&(LED_GAME_OVER[led_index][2]))));
break;
case LEVEL_1:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_GASHAT_LEVEL1[led_index][0])),
pgm_read_byte(&(LED_GASHAT_LEVEL1[led_index][1])),
pgm_read_byte(&(LED_GASHAT_LEVEL1[led_index][2]))));
break;
case LEVEL_2:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_GASHAT_LEVEL2[led_index][0])),
pgm_read_byte(&(LED_GASHAT_LEVEL2[led_index][1])),
pgm_read_byte(&(LED_GASHAT_LEVEL2[led_index][2]))));
break;
case LEVEL_3:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_GASHAT_LEVEL3[led_index][0])),
pgm_read_byte(&(LED_GASHAT_LEVEL3[led_index][1])),
pgm_read_byte(&(LED_GASHAT_LEVEL3[led_index][2]))));
break;
case GASHAT_IN:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_GASHAT_IN[led_index][0])),
pgm_read_byte(&(LED_GASHAT_IN[led_index][1])),
pgm_read_byte(&(LED_GASHAT_IN[led_index][2]))));
break;
case GASHAT_OUT:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_GASHAT_OUT[led_index][0])),
pgm_read_byte(&(LED_GASHAT_OUT[led_index][1])),
pgm_read_byte(&(LED_GASHAT_OUT[led_index][2]))));
break;
case DRIVER_CLOSE:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_DRIVER_CLOSE[led_index][0])),
pgm_read_byte(&(LED_DRIVER_CLOSE[led_index][1])),
pgm_read_byte(&(LED_DRIVER_CLOSE[led_index][2]))));
break;
case CRITICAL_STRIKE:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_CRITICAL_STRIKE[led_index][0])),
pgm_read_byte(&(LED_CRITICAL_STRIKE[led_index][1])),
pgm_read_byte(&(LED_CRITICAL_STRIKE[led_index][2]))));
break;
case CRITICAL_READY:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_CRITICAL_READY[led_index][0])),
pgm_read_byte(&(LED_CRITICAL_READY[led_index][1])),
pgm_read_byte(&(LED_CRITICAL_READY[led_index][2]))));
break;
case CRITICAL_FINISH:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_CRITICAL_FINISH[led_index][0])),
pgm_read_byte(&(LED_CRITICAL_FINISH[led_index][1])),
pgm_read_byte(&(LED_CRITICAL_FINISH[led_index][2]))));
break;
case GENRE:
pixels.setPixelColor(0, pixels.Color(pgm_read_byte(&(LED_GENRE[led_index][0])),
pgm_read_byte(&(LED_GENRE[led_index][1])),
pgm_read_byte(&(LED_GENRE[led_index][2]))));
break;
case GASHAT_OFF:
default:
pixels.setPixelColor(0, pixels.Color(0,0,0));
}
if(led_index < LED_PATTERN){
led_index++;
}else{
pixels.setPixelColor(0, pixels.Color(0,0,0));
}
pixels.show();
}
最初の方にずらずらっと大量の配列がありますが、この部分で、音声再生中のLEDの発光パターンをおよそ0.1秒間隔でRGB指定できるようにしています。実際の音声に同期させようとするとトライ&エラーが超超超めんどくさいですが、簡単に済ませたいなら全部同じ値にしてしまってもよいと思います。
プログラムができたら、いきなりガシャットに組み込む前に、ブレッドボードでプロトタイピングします。
見ての通り、配線はとてもシンプルです。ただ、これを実際にガシャットの中に組み込もうとすると、いつものごとくエライことに。。。ブレッドボードは本当に便利だなあと思います。
以下、動作の様子です。
ちなみに、上記のプロトの段階では、スイッチのON/OFFの定義(29, 30行目)が、最終的にガシャットに組み込むときと逆になっています(ON:LOW, OFF:HIGH)。上で公開しているソースは、最終的にガシャットに組み込むArduinoに書き込むソースになります。
これで制御ロジックの方はOKなので、後は実際に組み込むだけです。
で、いきなりですがこんな風になります。とにかく邪魔になりそうなものはすべてカットして、できるだけスペースを確保するようにしています。
元々スピーカーがあった部分には、小型スピーカーとMP3プレーヤー、それから元々はなかったスライドスイッチを追加しています。さすがに常時通電にしてしまうと、リチウムイオン電池があっという間になくなってしまうので。
ちなみに、MP3プレーヤーはMicroSDカード内の音声を再生しているだけなので、音声の差し替えは簡単にできます。ただ、先にも書いたとおり、LEDの発光パターンを音声に同期させようと思うと、それは相当面倒なことになりますので、頻繁に音声を差し替えたい方は、LEDの発光パターンはシンプルなものにしておいた方がよいと思います。
ど真ん中に、Arduino Pro Miniとリチウムイオンポリマー電池を入れています。絶縁対策は最小限です。本当はもっとちゃんとした方が良いと思うのですが、すみません、力尽きました。
元々基板があった部分には、同サイズに切ったプラ板(1.2mm)を当て込み、そこに穴を開けたりして色々組み付けています。
実は一番大変だったのが、物理スイッチの実装でした。元々の基板にあった仕組みは使えないので、何とか別の手段で再現を試みたところ、誤作動の連発。。。最後は微調整の嵐で、何とか元々のガシャットと同様に動作するようになりました。ただ、結構奇跡的なバランス(?)で成り立っている気がするので、時が経てばうまく動かなくなってしまうかもしれません。ああもう、自分で基板を起こせる人が本当に羨ましい。。。
まあともあれ、これで何とか動いてくれました。あとは見た目とか音声とか、コンテンツの準備ですが。。。
まず、ライダーガシャットの音声。これについては、以下のようにしてMP3データを用意しました。
- 実物のガシャットの音声をiPhoneのボイスメモで録音
- ボイスメモアプリ上で必要な部分のみトリミング
- PCとiPhoneを同期させてiTunesにボイスメモを取り込み
- iTunes上で、取り込んだボイスメモのファイルをMP3に変換
音量が小さかったりした場合は、さらに音声編集ソフト(自分の場合はMacのGarageBand)で音量を調整しました。
次にマリオ関係のデータですが。。。当然、マリオは任天堂の財産です。そのため、マリオの画像や音声の使用には任天堂の許可が必要という認識ですが(ガシャットもですが)、今回はあくまで個人が趣味で楽しむ範囲内での創作として、非営利目的での使用として何とか許容してもらえないでしょうか。。。と、お祈りだけはさせていただいて、以下進みます。
マリオのBGMについては、手持ちの以下のCDのデータを使いました。
マリオの効果音については、以下のソフトの特典CD(SUPER MARIO HISTORY 1985-2010)のデータを使いました。
マリオのボイスについては、こちらの方が公開されていたデータを使用させていただきました。
これらのマリオの音声データと、あとは先に録音したガシャットの音声データを音声編集ソフト(自分の場合はMacのGarageBand)で切ったり貼ったり音量調整したりしながら、必要な音声データを作成していきました。これも地味に、かなり時間がかかりました。。。
最後に、イラスト関係です。
ラベルについては、これはネット上にあったマリオブラザーズのパッケージイラストに対して、パワーポイントのワードアートでタイトルをつけて、ホワイトラベルの用紙に印刷し、シャカリキスポーツガシャットのラベルの大きさに合わせてカットしただけです。ゲーマドライバーのロゴ?(GD)と黒枠については、シャカリキスポーツガシャットのものを切り取って上から貼り付けています。
こちらについては、シャカリキスポーツのイラストを溶かして消した後、ホワイトラベルにドット絵マリオを印刷して、クリアパーツを分解した中に貼り付けました。初めは透明ラベルに印刷したものを貼り付けていたのですが、ドライバーの中で全然見えなかったので、ホワイトラベルに印刷したものを上から重ねて貼りつけました。
さて、随分長くなってしまいましたが、これで何とか完成です。ではいざ!
うん、塗装が雑なのが心残りと言えば心残りですが、まあ何とか出来上がって良かった。。。ちなみに動画には収めていませんが、ちゃんと「クリティカルフィニッシュ!」とジャンル名の音声(「アクション!」)にも対応しています。「会心の一発!」は、ちょっと力尽きてしまって入れていません。レベル1については、あくまで「スーパーマリオブラザーズ」の「ライダーガシャット」という位置付けにしておりますので、ここは『I’m a Kamen Rider!』のままにしています。
ということで、思った以上に苦労してしまいましたが、何とかオリジナルガシャットを作成することができました。今回はマリオを題材に作りましたが、ゼルダとかドラクエとか、ロックマンとかを題材に作ってみるのも楽しいと思います。
最後に事務連絡(?)ですが、本業のお仕事の方が本気で頑張らないと大変にマズそうですので、ちょっと一ヶ月ぐらい更新がストップする見込みです。また遅くとも年末ぐらいには戻ってくると思いますので、宜しければまたそのときにでも訪れていただければ幸いでございます。