マリオガシャット詳細 その2(英訳付き) Details of the Mario Gashat −Part 2
前回に引き続き、マリオガシャットの作り方の詳細を英訳付きで書いていきます。今回は内部の説明になります。
なお、今回改めて解説を作成するにあたり、一部設計を見直しました。おかげで、以前よりは安定して遊べるようになりました。まあ、見た目は何も変わっていませんけれど。
2. 内側 / Inside
回路図 / Circuit Diagram
回路図は以下のようになります。
The circuit diagram in the Mario Gashat is as follow:
ボタンは以下に対応しています。
Each number of button switches are corresponding to each number in the following picture:
ArduinoはArduion Pro mini 3.3V 8MHz版を使用しています。
The Arduino board I use is “Arduino Pro mini 3.3V 8MHz.”
実際に配線したものが以下になります。
The actual wiring are as follows:
ケース加工 / Case Processing
とにかくスペースが足りないので、追加の部品と干渉するところはすべてカットしてしまっています。
There is no room in a gashat, so you should cut all what interfere with added parts as you can.
この部分は、
In this part,
このようにボタン(タクトスイッチ)をはめ込むため、プラ板を当てて接着剤で固定しています。
you should add extra plastic plates with adhesion bond in order to set a tactile switch.
スライドスイッチ / Slide Switch
スライドスイッチはこのように組み込んでいます。
A slide switch is embedded in like this.
バッテリー / Battery
バッテリーには3.7Vの最小サイズのリチウムイオンポリマー電池を使用しています。
I use the smallest lithium ion polymer battery whose voltage is 3.7V.
MP3プレーヤー & スピーカー / MP3 Player & Speaker
元々のガシャットに入っていたスピーカーは大き過ぎるので、小型のスピーカーに置き換えます。MP3プレイヤーとしてはDF PlayerMiniを使用し、小型スピーカーと重ねて収納しています。
A speaker which an original gashat has is too large, so you should replace it with smaller one. I use a “DFPlayer mini” as MP3 player, and set it over the small speaker.
フルカラーLED / RGB LED
元々のガシャットの基板の代わりに、厚さ1.2mmのプラ板の上に貼り付けます。
You should put a RGB LED on a plastic plate whose thickness is 1.2mm instead of an original electronic substrate.
位置はクリアーパーツと合わせます。
You should adjust the position of the LED to a clear parts.
ボタン / Button Switches
ボタン1と2は、元々のガシャットでは軽い力で動作するプッシュスイッチを使用していますが、今回は導電ゴムを使う方法をとっています。ただ、この方法は調整が難しいので、可能であれば、元々のガシャットについているプッシュスイッチをそのまま流用するのが良いと思います。
An original gashat uses push-button switches for button 1 & 2, which we can push with weak force. Instead I use conductive rubber sheets, but it’s difficult to adjust them. If you can, you should use the same push-button switches as what an original gashat has.
(2017/3/5 追記)
上記の部分は色々試行錯誤したのですが、今のところは導電ゴム+導電性グリスの組み合わせで落ち着いています。導電ゴムはaitendoさんで販売されているものを使用しています。電気の流れる方向が決まっているので、表面に以下の導電性グリスを塗って面全体での導電性を確保するような感じです。
ボタン3は、ゴム性のタクトスイッチを新しく追加しています。
For button switch 3, I add a rubber tactile switch.
ソースコード / Source Code
今回設計を一部見直したため、それに伴い、ソースコードも一部変更致しました。
I modified a part of design from that in this article, so the source code also needs to be modified as follow:
#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 BT1_ON HIGH #define BT1_OFF LOW #define BT2_ON HIGH #define BT2_OFF LOW #define BT3_ON LOW #define BT3_OFF HIGH #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[] = {BT1_OFF, BT2_OFF, BT3_OFF}; const uint8_t ON_OFF_OFF[] = {BT1_ON, BT2_OFF, BT3_OFF}; const uint8_t OFF_ON_OFF[] = {BT1_OFF, BT2_ON, BT3_OFF}; const uint8_t OFF_OFF_ON[] = {BT1_OFF, BT2_OFF, BT3_ON }; const uint8_t ON_ON_OFF[] = {BT1_ON, BT2_ON, BT3_OFF}; const uint8_t ON_OFF_ON[] = {BT1_ON, BT2_OFF, BT3_ON }; const uint8_t OFF_ON_ON[] = {BT1_OFF, BT2_ON, BT3_ON }; const uint8_t ON_ON_ON[] = {BT1_ON, BT2_ON, BT3_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[] = {BT1_OFF, BT2_OFF, BT3_OFF}; uint8_t current_state[] = {BT1_OFF, BT2_OFF, BT3_OFF}; boolean single_mode_flag = false; boolean game_clear_flag = false; boolean critical_mode_flag = false; 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 == false){ 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 == false){ 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 == false){ 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 == false){ 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(); }
以上がマリオガシャットの仕組みです。思うに、ボタン1と2の処理がイマイチなので、ここがもう少し改善されたら、もっと遊びやすくなると思います。
That’s all for my explanation. I think the design for button switch 1 & 2 is not good. If you can refine it, your gashat becomes robuster and you can enjoy it more!
ディスカッション
コメント一覧
オリジナルガシャット制作すごいですね。
作っていただくことはできないですか?
Deruta 様
ありがとうございます◎ ただ、申し訳ないのですが、依頼を受けての作成は難しいです。一つ作るのにかなり時間がかかってしまうというのもありますが、何より、安定性や安全性が全く確保されていないことが大きな理由です。お渡しした後にすぐに動かなくなってしまったり、万が一使用しているリチウムイオンポリマー電池から発火とかなってしまうと、申し訳ないどころでは済まないので。。。そのため、あくまで自己責任ということで、作り方のヒントのみをご紹介させていただく形にしています。ひとえに私の技術力不足が原因です、すみません。
LEDの色や音声を変えるにはプログラムのどこ変えればいいですか?
ex様
LEDの色を指定しているのは、掲載しているソースコードの50行目から349行目のところです。ここで、各パターンごとに、0.1秒ごとのLEDの色をRGBで指定しています。1パターンにつき配列の要素を200個にしているので、最大20秒まで、0.1秒刻みで色指定できるようになっています。
一方、音声を変えるのにソースコードを変更する必要はありません。どういうことかと言いますと、557〜561行目のset_action関数内の”mp3_play(action)”というところで実際に音声を指定して音を鳴らしているのですが、この”action”に入る数字は、13〜26行目でdefineしている数字のいずれかです。このいずれかの数字がDFPlayer mini(=MP3プレーヤー)に送られて、DFPlayerは送られた数字に対応するMP3音声ファイルを再生します。例えば、”set_action(LEVEL_1)”の場合は、LEVEL_1 = 4ですので、DFPlayerは、マイクロSDカードのmp3フォルダに保存されている”0004_xxxx.mp3″を再生します。この”0004_xxx.mp3″をマイティアクションXの音声にしていればマイティアクションXになりますし、タドルクエストにしていればタドルクエストになります。つまり、必要なのはプログラムの変更ではなく、DFPlayerのマイクロSDカードに保存する音声ファイルの変更、ということになります。DFPlayerの使い方については、こちらもご参照ください。
こちら実際に制作してみたいのですが、完成したらYOUTUBEで動画化してもよろしいでしょうか?
私のチャンネルです→https://www.youtube.com/channel/UCtA6j9bCcq7T3mLRzo395IA
おとは様
わざわざご連絡頂きありがとうございます。はい、もちろんOKです◎ 可能であれば、マリオ以外のテーマで作ってみていただけると嬉しいです(←個人的にマリオ以外のテーマのガシャットを見てみたいだけなので、マリオ題材でもOKです)。
完成したら是非教えてください。宜しくお願い致しますm(_ _)m
実は音声は結構前に作っていてどうにかできないものかと考えていました。
動画が完成したら参考にしたものとしてここのリンクとチャンネルのリンクを張ってもよろしいでしょうか?
おとは様
おお、それは楽しみです! リンクの件も承知致しました。ご丁寧にありがとうございますm(_ _)m
突然失礼します。基盤のプログラムなどの知識がないのですがオリジナルのガシャットを作りたいです。ソースコードの作り方と入力?覚えさせる方法を教えて頂けないでしょうか。
ジャングルオーズ様
ヒダカヒロジです。お世話になっております。
今回のガシャットの製作には、Arduinoという電子基板を使っています。ソースコードの作成とArduinoへのプログラムの書き込みは、Arduino IDEという開発環境(ソフトウェア)を使って行うのですが、このあたりの手順については、Web上や本で「入門」という形で詳細に情報を公開されている方々がたくさんおられます。そのため、まずはそれらの情報を参考に、簡単なサンプルプログラムでLEDを光らせるなどしてみて頂けないでしょうか。そこから先で、いざガシャットを作り始めてみてわからないところが出てきましたら、それについてはご質問頂ければ回答させていただきます。
直接詳細をお伝えできず申し訳ありませんが、ご承知いただけますと幸いです。宜しくお願い致します。
Good morning
I contacted you because I wanted to ask you
Can you tell me how many mp3 files you have used?
Hi shi,
I use 13 mp3 files for this gashat. In my source code, each of lines from 14 to 26 shows the name of my mp3 files.
こんにちは
私もガシャットを改造してみようと思いこのサイトを参考にしながら改造をしてきたのですが、サイトに記載されているソースコードをArduinoにコピペして検証ボタンを押すと ボードArduino/Genuino Unoに対するコンパイル時にエラーが発生しました。 というメッセージ現れて書き込みをすることができません。何が原因なのでしょうか?
g18様
検証ボタンを押した時に表示されたメッセージは「ボードArduino/Genuino Unoに対するコンパイル時にエラーが発生しました。」のみでしょうか? これだけだと少し特定が難しいので、もし他にメッセージが表示されているようでしたら、それもお知らせいただけますと幸いです。
今のところ思いつく可能性と致しましては、このソースコードで使用している2つのライブラリ(DFPlayerとNeoPixelのライブラリ)がArduino IDEにインストールされていないことが考えられます。もしそうであれば、DFPlayerのライブラリについてはこちら、NeoPixelのライブラリについてはこちらの記事をご参照ください。
初めまして、今こちらの作品を参考にオリジナルガシャットを作成させていただいています。電子工作は初心者なものですから、四苦八苦しながらようやくブレットボード上での動作まで成功しました。まだ課題は山盛りですが、本当に解りやすく解説していただいているので電子工作が楽しくて仕方ありません。
趣味と本業頑張ってください!
のり軍曹様
大変ありがたいお言葉、ありがとうございますm(_ _)m ブログを書いてきた甲斐があるというものです。
ガシャットについては、これまで他の方からも何度かお問い合わせを頂いているのですが、ブレッドボード上での動作確認がとれたところまでご報告頂いたのは、のり軍曹様が初めてです。ガシャット本体への組み込みは結構力技で押しきってしまって説明が不十分な部分もあるかと思いますので、もしよくわからないところがございましたら、遠慮なくご相談くださいませ。
ご返事ありがとうございます。
実はド素人根性で最初にマイコンボードにスケッチを書き込んでSDに音データ入れてテストもなくいきなり半田付けして、ガシャットに埋め込んで大失敗をやらかしてます「何故反応しない?」(笑)なのでガシャットへの詰め込みレイアウトについては完成してます。(配線図も独自に書いてます)ただ、配線をジャンパー線をカットしたものを使用していますが、私の考えたレイアウトには元のガシャットに使われているような細身の線を使った方がいいので、その場合線が細くなっても問題ないものか教えて戴けませんでしょうか?
おお、それでは完成までの道がだいぶ見えていますね! 私も元のガシャットと同じぐらいの太さの線を使っていますので、それについては大丈夫だと思いますよ◎
お忙しい中コメントありがとうございます。今組み込みの為にブレットボード上で最終確認と調整を行っています。私の環境では Arduino Pro Miniは初めから壊すことを前提に安い互換機を使用してます。mp3プレーヤーは作例と同じものでしたが、壊してしまったので格安バーゲンの別のプレーヤーに変えました。それですとArduinoの2,3ピンを割当てての動作がせず、(Arduino uno互換機も同じでした) RX,TXに接続しなければなりませんでした。まだ原因特定はできてませんがとりあえずこれでいきます。それからテスト用のボタンにミニスライドスイッチを使用してましたが、+とGNDが逆に繋ぎ全く別な動作になりかなりテンパりましたが勉強になりました。いやー電子工作奥は深い
だいぶトライ&エラーを繰り返されているようですね。私もそんな感じで手探りで作っていきました(笑)。
個人的には、記事で言うところのボタン1と2の処理が一番苦労したところです。もしここをうまいこと処理できる別の方法を思いつきましたら、是非教えてください。
お久しぶりです。やっとガシャット内部の配線が完成しました。まだバッテリーの搭載はこれからですが、外部電源での動作確認は問題ありませんでした。ただ、ブレットボードでの症状がでたのでスイッチ1,2の配線見直し中です。問題なく完成しましたらまた報告させていただきます。
素晴らしいです! 初めて他の人が作ったガシャットが見れそうでワクワクしています。完成のご連絡を楽しみに待ってます◎
やっとほぼ完成しました。後は細かい処理とLEDの発光パターンと色の変更を地道に行っています。しかしこのプログラムのLEDのパターンは凄いですね!設定次第では様々な表現ができて面白そうです!それから不具合のボタン1,2はブレットボード上とガシャット組み込みでは逆になるというのを記述に書いてあったのを忘れてました。後程自分の環境に合わせ修正しましたが、この辺りのプログラム処理も良く考えられていて大変勉強になりました。そこで今までの工作の件をネタに初ブログを書いて見ようと考えております。そこで御世話になったこちらのサイトのリンクを貼り、紹介させていただいてもよろしいでしょうか?
わー、おめでとうございます! 自分のことのように嬉しいです(笑) LEDの処理の記述まで踏み込んで褒めて頂いたのも初めてです、ありがとうございますm(_ _)m
ブログをお書きになるのでしたら、リンクはご自由に貼っていただいて大丈夫です。ブログを書くのはそれなりに手間がかかりますが、自分がやったことがちゃんと形になって残ると「自分も結構がんばったなー」と自信が持てますし、またともすれば、それが他の誰かの役に立つこともありますので(今回のように)、とても良いことだと思います。私も読ませて頂きたいので、是非是非お書きになってくださいませ◎
まだ途中で簡単ではありますがブログをアップしたので、もしよろしければ見に来てください。
http://ameblo.jp/norigunso/entry-12292424766.html
記事見ました! 一つ目の記事と二つ目の記事を読ませて頂きましたが、素晴らしいアップグレードですね! 特に、元々の基板を流用してスイッチの処理を実装するところと、アクセス性を考慮した設計は、自分が思いつけなかったのがとても悔しいぐらい見事です。
今週分の記事は既に上げてしまいましたので、後日になってしまいますが、宜しければ、改めて私のブログの中でもご紹介させてくださいm(_ _)m
紹介の件了解しました。あまり綺麗には作れませんでしたが、よろしくお願いします。
はじめまして、私もこちらのページの情報を参考にさせてもらってオリジナルガシャット作成に挑戦しています。現在はブレッドボード上で動作するところまではできました。
ソースコードや回路図などの有用な情報を公開していただき感謝しております。
ちたけうどん様
いえいえ、こちらこそトライ頂いて嬉しいです。ありがとうございます。情報を公開した甲斐があるというものです◎
コメントを頂けたということは、おそらく私とのり軍曹様のコメントのやりとりも既にご覧になられているかと思います。
私以外で初めてオリジナルガシャットの作成に成功された方なので、こちらの方の情報も参考にして頂くと、この先進めやすくなると思います。
何か不明な点がございましたら、仕事と育児の合間にはなってしまいますが、可能な限りはサポートさせて頂きますので、お気軽にご連絡くださいませ。
早速のお返事ありがとうございます。
個人ブログですが、現在の状況はこのような感じです。
https://chitakekoubou.blogspot.com/2017/08/blog-post_15.html
武器関係についても、なんとなく原因が分かった気がするので、詳細が判明したらお知らせします。
話は変わりまして、のり軍曹様とのコメントに記載されてますが、こちらのブログへのリンクはOKということでよろしいでしょうか?
なんだかもうほぼほぼ出来上がっている感じですね! 武器関係の検証が十分でなかったのは、私が武器の玩具を全く持っていなかったからですね。。。それどころか、ゲーマドライバーとキメワザスロットホルダーですら、兄に借りて検証していた始末です。リンクは貼っていただいて大丈夫です!
ちなみに、ウチも当時、「子供が寝ているときはガシャットを弄るの禁止令」出てましたよ(笑)。DFPlayerの音量を小さめに設定したり、ガシャットの穴を指で抑えたりしながら検証していました。
リンクの件、了解しました。
また何か進展がありましたらご報告いたします。
さて、8月のコメントから8ヶ月も経ってしまいましたが、私のオリジナルガシャット作製もようやくひと区切りつきました。
発光部やラベルなど、まだまだ手を入れなければいけない点は沢山ありますが、よろしければ見てください。
https://chitakekoubou.blogspot.com/2018/04/blog-post.html
ちたけうどん様
見ました!なるほど、Google翻訳で音声を作るのは面白いアイデアだと思いました。オリジナルガシャットをつくっていると、行き着く先は「いかに音源を用意するか」なんですよね。自然に聞こえるかどうかはさておき、音声合成で音を用意するのは考え方として十分アリかと思います。
はじめまして。
Arduinoは持ってたけどLチカしかやってないレベルの力量ですが、
hidaka様を始めとした先駆者の方々の後追いでちまちまやっています。
横着にして接触不良起こしたり、スイッチの処理で頭を抱えたり(逆のままやってました)、苦労しつつもおかげさまで楽しみながら工作できております。
ブレッドボード上で音声差し替えて遊んでる段階ですが、音声素材集めが一番のネックかもしれません。想定外の大音量が流れて心臓止まるかと思いました。。。
Sasakkie様
ありがとうございます、楽しんで頂いているようでなによりです◎ Lチカとかを試すだけだとなかなか後が続かないんですが、自分の好きなものを対象にすると、いろいろやってみたくなるんですよね。そうすると、どうしても今までできなかったことにちょっと背伸びする必要が出てきて、それを繰り返していると、いつのまにかいろんなノウハウが自分の中にたまってきて、作れるものが増えて、それが楽しくてまたいろんなものを作りたくなる。そんな感じの正のスパイラルに乗ることができると、とても楽しいと思います。
ガシャットの場合は、おっしゃるとおり、実は音声素材集めが最終的なネックになります。どういう音声ならレベル2にふさわしいのか…とかは、題材に対する愛が深くないと、なかなかできないです(笑)。音量は接続しているスピーカーに結構左右されますが、DFPlayerならプログラムで音量を0から30の間で設定できるはずですので、まずは小さめに設定しておくと安心かもしれません。
返信いただきありがとうございます。
興味はありつつも、マイコンとなると敷居が上がるので、なかなか踏み出せずにいました。車の簡単な電装系はよく触ってるのですが、今回の制作を通してこちら方面にも幅を拡げられればなといった思いです。今回、制作方法であったりソースコードを公開して頂いたおかげで、そのきっかけを作ることが出来ました。
欲しい音声自体は入手できても、色々混ぜて使うとソース元によって音量も音質もまばらなので悩ましいところです。
私は案は出てくるけども、音源が上手いこと行かないのが多いです。。。
音量についてのアドバイスありがとうございます。
DF Player側の音量も調整してみたいと思います。
現在はブレッドボード上での確認で、元々DX版のガシャットに入っていたスピーカーを使っていますが、結構すぐに音が割れてしまいます。
差し支えなければ、使用しているスピーカーを教えて頂けますと幸いです。
Sasakkie様
私はMacで開発しているので、音源はGarageBandを使っていろいろいじりながら合成していました。これなら一応、フェードアウトや音源の切り貼り、各音源の音量のバランス調整は比較的簡単に実施できました。ただ、音質はさすがにちょっと、どうにもならないですね。。。
DX版に入っているスピーカーを使うと確かにものすごく大きな音が鳴ったり、割れたりします。スマブラガシャットを作ったときに、私も経験しました(笑)。マリオガシャットに使った薄型スピーカーについては、電子部品屋さんでたまたま見つけたもので、型番が書いていないのです。。。申し訳ありません。ただ、450円したので、あのサイズのスピーカーとしてはちょっと高めではありました。
自分もMacです。慣れてしまえば色々やりやすくて良いですよね。
切り貼り音量調節自体は手間ではないのですがね…
サントラに変身音とか入ってくれてれば良かったんですが…
DX版スピーカーに悩まされているのが自分だけでなく安心しました。笑
使用されているスピーカーの件、とんでもございません。
奇跡的な巡り合わせだったのですね!
ゲームの効果音だけのCDとか本当に重宝しています(笑)。どうにもならないときは、音質はどうしても悪くなりますが、iPhoneのボイスメモで録音した音声を使用しています。
今後Sasakkie様のオリジナルガシャットが完成しましたら、宜ければお見せくださいませm(_ _)m
そのような素材があると随分違うでしょうね!
ボイスメモでも元の音質がそこそこ良ければ、問題なく使えそうですね。
発光パターンも何も変えてない上に、ガシャットに組み込んですらいないのですが、動作確認したものをYouTubeにアップロードしてみました。スピーカー問題も含め、どうガシャットにねじ込むか考えないといけませんね…。
https://youtu.be/PuLbTsXFkkM
動画見ました! ガシャットギアデュアルのシングルバージョンですね! コードが出てるのが開発中感があって、これはこれで檀黎斗神っぽくて良いなあと思いました(笑)
ガシャットへのねじ込みは、なんというか、苦行でした。。。蓋を閉じる直前まではちゃんと動いてくれるのに、ネジ止めしたら動かなくなるとかもザラにあり。。。ここから先は根気の勝負かもしれません。がんばってください!
再販してくれないので作ってしまおうかと!
タドルレガシーじゃないですけど、いっそ収まらないなら上手いこと曝け出してしまうのも一つの手かもしれないですね。笑
スイッチの類はガシャポン版の基盤流用するので平気かと思いますが、メンテナンス性を保ちつつねじ込むのは至難の業かもしれません。。。
合間合間で完成させたいと思います!
各種部品のガシャット内への詰め込みは、以前やりとりさせて頂いたのり軍曹様が、私よりも綺麗に部品を収納されています。
メンテナンス性を高めるのであれば、参考になると思います。
https://ameblo.jp/norigunso/entry-12292718592.html
ここまで来るとあとは意地の勝負(?)になりますので、根気よくがんばってくださいませ◎
はじめまして
hidaka様のマリオガシャットに魅了されArdiuino等の機材を一通り揃えて、少しずつ完成に向けて試行錯誤しています。
今、ドライバーをオープンした際の音声を5種類ほど準備してランダムで音声が鳴るようにしたいと考えているのですが、どのようなソースコードにすればよいのか全く見当がつかずコメントした所存です。
どのようなソースコードを組み込めばいいか、お教えいただけないでしょうか。
鯵缶様
そうですね、まず「ドライバーをオープンしたとき」というのが二種類考えられます。レベル2になるときと、レベル3になるときです。そのどちらかで音声をランダム再生するかをまず決める必要があります。
ここで、仮にレベル2になるときの音声をランダム再生にする場合は、ソースコードのなかで
set_action(LEVEL_2);
となっている部分を探します。ここで処理をランダムに分岐させればよさそうです。例えば、Arduinoには一応乱数を発生させる関数が存在するようなので、例えばこんな感じでしょうか。
long rand = random(0, 5);
switch(rand){
case 0: set_action(LEVEL_2_0); break;
case 1: set_action(LEVEL_2_1); break;
case 2: set_action(LEVEL_2_2); break;
case 3: set_action(LEVEL_2_3); break;
case 4: set_action(LEVEL_2_4); break;
}
ただ、random関数が本当にrandomで値を返してくれるかどうかは未知数です。
LEVEL_2_0などの定数は、以下のように先頭の方で先に定義しておく必要があります。
#define LEVEL_2_0 14
#define LEVEL_2_1 15
#define LEVEL_2_2 16
#define LEVEL_2_3 17
#define LEVEL_2_4 18
このときに設定している数字が、DFPlayerがmp3ファイルを再生するときの番号になります。これでとりあえず、音声だけはランダムで切り替わるようになるのではないかと思います。さらに発光パターンも各音声ごとに設定するのであれば、flash_led関数内でLEVEL_2_0に対応したときの動作と、対応する発光パターンを定義する必要があります。
とりあえず「私ならこうするかなあ」というものをエイやと書いてみましたので、これをヒントに試行錯誤していただけますと幸いです。
返信ありがとうございます。
このアドバイスをもとに試行錯誤していこうと思います
お久しぶりです。
このブログに掲載していただいているソースコードと先日のアドバイスをもとにLEVEL_2の音声をランダムに鳴らすことができそうなプログラムを組んだのですが、いざブレッドボードでテストを行うとボタン2→ボタン1→ボタン3の順番でボタンを押さないとガシャットの起動音声が鳴らないという状況に陥ってしまいました…
鯵缶様
状況としては「ランダム再生はできるようになったけれど、ボタン3を押すのに一定の手順を踏まないと起動音声(「マイティアクションX!」みたいな音声)が鳴らない」ということでしょうか?
とりあえずデバッグの手順としては、まず今のブレッドボードの配線の状態のままで、ソースコードをランダム再生機能追加前の状態に戻して書き込み、正しく動作をするかを確認することになります。
この時点で動作がおかしければ、ソースコードの修正より先に、ブレッドボードの配線上で何かしらの問題が発生しています。
そこで問題がないことを確認した上で、改めてソースコードを確認します。お聞きした症状から判断致しますがと、鯵缶様の追加されたソースコードが、ガシャットの状態遷移に何かしら影響を与えてしまっているようです。
ガシャットの状態遷移については、お手数ですが以下の記事をご確認ください。
プログラミングのためのライダーガシャット解析メモ
私が書いたオリジナルガシャットのソースコードは、上記の分析結果を元に作成しています。
内容理解に少し骨が折れるかもしれませんが、上記内容を理解した上で、ガシャットの起動音が鳴る時と鳴らない時で何が違っているのかをご確認頂ければと思います。
時間があれば鯵缶様の作成されたソースコードをこちらで確認するという手もあるのですが、生憎今はブログの通常更新もままならない程度に忙しくなってしまっているため、それができない状況です。申し訳ありません。10月〜11月ぐらいに改めてご連絡いただければ、対応可能かもしれません。
お忙しいところ返信いただき、恐縮です。
もう一度ソースコードを見直したところ、何らかの手違いで29行目~34行目のHIGHとLOWが逆になってしまっていました。
その部分を修正したところ正常に動作し、LEVEL_2の音声も無事ランダムで鳴りました。
まだAlduino UNOでのテストプレイ段階なので、まだ先は長い…ような気もしますが、完成まで突っ走っていこう思います。
鯵缶様
なるほど、そこが原因でしたか。すぐに気づけず申し訳ありません。
#define BT1_ON HIGH
#define BT1_OFF LOW
#define BT2_ON HIGH
#define BT2_OFF LOW
#define BT3_ON LOW
#define BT3_OFF HIGH
この部分は「スイッチの部分をどう処理するか」で定義の仕方が変わってきます。おそらく、鯵缶様のブレッドボードでのテスト段階では、以下のようにすると正しく動作したのではないでしょうか。
#define BT1_ON LOW
#define BT1_OFF HIGH
#define BT2_ON LOW
#define BT2_OFF HIGH
#define BT3_ON LOW
#define BT3_OFF HIGH
これは、ブレッドボード上では、すべてのボタンについて「ボタンを押す=GNDが接続される=LOW」となるためです。ではなぜ公開しているソースコードではボタン1と2のHIGHとLOWの定義が入れ替わっていたかというと、これは私が最終的にすべての部品をガシャット内部に組み込む際に、ボタン1と2(←ゲーマドライバーと連動する部分)について、「ボタンを押す=GNDの接続が解除される=HIGH」となるようにボタン部分の配線を処理するようにしたためです。この部分は、ボタン部分の配線処理の方法によっては、ブレッドボード上で試した定義と同じままでうまくいくこともありますので、実際に部品をガシャットに組み込む際には、とりあえずどちらかの定義でソースを書き込んでみて、うまくいかなければもう一方の定義を試す、ということでもよいと思います。
はじめまして。
電子工作は全くの素人なのですが、hidaka様のブログを見て触発され、自分もオリジナルガシャット製作に取り組んでいます。
自分は、DFRobotDFPlayerMiniに対応したDFPlayerMiniを使用しているのですが、351行目からのコードをvoid setup () {
;DFRobotDFPlayerMini myDFPlayer;
myDFPlayer.begin(0001);//set softwareSerial for DFRobotDFPlayer
myDFPlayer.playMp3Folder(25);
mp3_set_serial (0001); /set softwareSerial for DFRobotDFPlayerMini mp3 module
;mp3_set_volume (25);
としたところ、no matching function for call to DFRobotDFPlayerMini begin(int)
というコンパイルエラーが表示されました。
この場合、どうすればいいのでしょうか。
sou様
気になるのは、
myDFPlayer.begin(0001);//set softwareSerial for DFRobotDFPlayer
mp3_set_serial(0001); /set softwareSerial for DFRobotDFPlayerMini mp3 module
ここで、ソフトウェアシリアルではなくDFPlayerをbeginしようとし、またその引数を0001としているところです。
私のコードでは
SoftwareSerial mySerial(2, 3); // RX, TX
mySerial.begin(9600);
mp3_set_serial(mySerial);
となっていたと思いますので、まずこのとおりにやってみてもらうのが良いと思います。DFPlayerではなくソフトウェアシリアルをbeginし、それをDFPlayerにセットしているようなイメージです。
それから、ここで使っているDFPlayer Miniのライブラリは、旧バージョンのライブラリです。もし、新バージョンのライブラリをお使いであれば、例えば以下の記事などを参考にして、関数名を適宜置き換えてください。
以下の作例では、新バージョンのライブラリを使用しています。
https://make-muda.net/2018/08/6176/
返信していただき、ありがとうございます。
先程のコードを試してみたところ、前回述べたエラーは無くなりました。
しかし、今度は
void setup () {
;DFRobotDFPlayerMini mp3player;
SoftwareSerial mySerial(2, 3); // RX, TX
mySerial.begin(9600);//set softwareSerial for DFRobotDFPlayer
mp3 set serial(mySerial);
mp3player.playMp3Folder(25);
;mp3_set_volume (25);
でmp3 was not declared in this scopeと出てしまいました。(set serialのところです)
御時間を頂けたら、ご教授願います。
sou様
mp3 set serial(mySerial);
これは、C言語では文法エラーです。コンパイラが解釈できません。それをコンパイラが無理やり解釈しようとして、”mp3″を変数として解釈しようとしたけれど、”mp3″という変数はプログラム中で宣言されていなかったため、
mp3 was not declared in this scope
というエラーになっています。
私のプログラム中では、
mp3_set_serial(mySerial);
のように、スペースではなくアンダースコアで単語を繋いでいるはずですので、ご確認ください。
また、おそらく”mp3_set_serial”が解決しても、その次の”mp3player.playMp3Folder(25)”で失敗します。理由は2つです。
一つは、”mp3player”という変数は存在しないこと。もう一つは、旧ライブラリと新ライブラリの関数をごちゃ混ぜにしてしまっていることです。
旧ライブラリを使っているのであれば、
mySerial.begin(9600);
mp3_set_serial(mySerial);
mp3_play(25);
mp3_set_volume(25);
が一連の流れで、新ライブラリを使っているのであれば、
ss_mp3_player.begin(9600);
mp3_player.begin(ss_mp3_player)
mp3_player.playMp3Folder(25);
mp3_player.volume(25);
とすると、同じように動作します。まずは、ご自身がどちらのライブラリを使っているかをご確認ください。
先程のアドバイスと、貴方の他のページを見て、先に述べたところは解決しました。
厚かましい様ですみませんが、今度は548行目の
flash_led(action); で flash_led was not declared in this scopeとなってしまいました。
よろしければ、此方の方もご教授願います。
sou様
エラー文の通りで、flash_led関数がソースコード上で定義されていないのではないでしょうか。flash_led関数は559行目以下で定義しています。
なお、明日で私の本業の夏季休暇が終わってしまいますので、今ほど高頻度にレスポンスはできなくなってしまいます。予めご了承ください。
なんとかコンパイルエラーが出ないようになりました。ありがとうございます。
しかし、arduinoの基盤に書き込もうとした時、エラーが発生してしまいました。どうすればいいでしょうか。
sou様
原因は色々あると思うのですが、情報が足りないため絞りきれません。。。これはおそらく、私の書いたプログラムがどうこうという話ではないかと思います。まずは、LEDを一つ光らせるだけのような短いサンプルプログラムを基板に書き込めるかどうかを確認してください。それでエラーになる場合は、Arduinoの一般的な問題になりますので、ネット上で色々解決の手段が見つかると思います。
バグルドライバーに対応させるにはどうしたら良いでしょうか。
じゃがいも様
申し訳ありません、バグルドライバーは所持していないため、確かなことは言えないのですが、基本はこのソースコードがほぼそのまま使えると思います。状態遷移としてはゲーマドライバーよりは単純だと思いますので、ボタン①②③がOFF-ON-OFFの状態から、OFF-ON-ONの状態になるときの動作だけを記述すれば良いのではないか、と思います。
ありがとうございます。
度々失礼します。
スライドスイッチはどのようなものを使っているのでしょうか。
じゃがいも様
すみません、これといった型番とかは特に意識して使っておらず…電子部品屋さんでいつも「このへんのは後々使えそうかな」というのをいくつか買ってきて、その中から工作に合いそうなものを適当に選んで使っています。