マリオガシャット詳細 その2(英訳付き) Details of the Mario Gashat −Part 2

th_mario-gashat-30

前回に引き続き、マリオガシャットの作り方の詳細を英訳付きで書いていきます。今回は内部の説明になります。

なお、今回改めて解説を作成するにあたり、一部設計を見直しました。おかげで、以前よりは安定して遊べるようになりました。まあ、見た目は何も変わっていませんけれど。

2. 内側 / Inside

回路図 / Circuit Diagram

回路図は以下のようになります。

The circuit diagram in the Mario Gashat is as follow:

 

th_mario-gashat-23

ボタンは以下に対応しています。

Each number of button switches are corresponding to each number in the  following picture:

th_gashat-9

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:

th_mario-gashat-33

th_mario-gashat-34

ケース加工 / Case Processing

th_mario-gashat-36

とにかくスペースが足りないので、追加の部品と干渉するところはすべてカットしてしまっています。

There is no room in a gashat, so you should cut all what interfere with added parts as you can.

th_mario-gashat-27

この部分は、

In this part, 

th_mario-gashat-29

このようにボタン(タクトスイッチ)をはめ込むため、プラ板を当てて接着剤で固定しています。

you should add extra plastic plates with adhesion bond in order to set a tactile switch.

スライドスイッチ / Slide Switch

th_mario-gashat-26

スライドスイッチはこのように組み込んでいます。

A slide switch is embedded in like this.

バッテリー / Battery

th_mario-gashat-35

バッテリーには3.7Vの最小サイズのリチウムイオンポリマー電池を使用しています。

I use the smallest lithium ion polymer battery whose voltage is 3.7V.

MP3プレーヤー & スピーカー / MP3 Player & Speaker

th_mario-gashat-24

th_mario-gashat-25

元々のガシャットに入っていたスピーカーは大き過ぎるので、小型のスピーカーに置き換えます。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

th_mario-gashat-32

元々のガシャットの基板の代わりに、厚さ1.2mmのプラ板の上に貼り付けます。

You should put a RGB LED on a plastic plate whose thickness is 1.2mm instead of an original electronic substrate.

th_mario-gashat-31

位置はクリアーパーツと合わせます。

You should adjust the position of the LED to a clear parts.

ボタン / Button Switches

th_mario-gashat-38

th_mario-gashat-37

ボタン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さんで販売されているものを使用しています。電気の流れる方向が決まっているので、表面に以下の導電性グリスを塗って面全体での導電性を確保するような感じです。

 

th_mario-gashat-29

ボタン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!


「マリオガシャット詳細 その2(英訳付き) Details of the Mario Gashat −Part 2」への32件のフィードバック

  1. オリジナルガシャット制作すごいですね。
    作っていただくことはできないですか?

    1. Deruta 様

      ありがとうございます◎ ただ、申し訳ないのですが、依頼を受けての作成は難しいです。一つ作るのにかなり時間がかかってしまうというのもありますが、何より、安定性や安全性が全く確保されていないことが大きな理由です。お渡しした後にすぐに動かなくなってしまったり、万が一使用しているリチウムイオンポリマー電池から発火とかなってしまうと、申し訳ないどころでは済まないので。。。そのため、あくまで自己責任ということで、作り方のヒントのみをご紹介させていただく形にしています。ひとえに私の技術力不足が原因です、すみません。

    1. 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の使い方については、こちらもご参照ください。

  2. こちら実際に制作してみたいのですが、完成したらYOUTUBEで動画化してもよろしいでしょうか?
    私のチャンネルです→https://www.youtube.com/channel/UCtA6j9bCcq7T3mLRzo395IA

    1. おとは様

      わざわざご連絡頂きありがとうございます。はい、もちろんOKです◎ 可能であれば、マリオ以外のテーマで作ってみていただけると嬉しいです(←個人的にマリオ以外のテーマのガシャットを見てみたいだけなので、マリオ題材でもOKです)。

      完成したら是非教えてください。宜しくお願い致しますm(_ _)m

      1. 実は音声は結構前に作っていてどうにかできないものかと考えていました。
        動画が完成したら参考にしたものとしてここのリンクとチャンネルのリンクを張ってもよろしいでしょうか?

        1. おとは様

          おお、それは楽しみです! リンクの件も承知致しました。ご丁寧にありがとうございますm(_ _)m

  3. 突然失礼します。基盤のプログラムなどの知識がないのですがオリジナルのガシャットを作りたいです。ソースコードの作り方と入力?覚えさせる方法を教えて頂けないでしょうか。

    1. ジャングルオーズ様

      ヒダカヒロジです。お世話になっております。

      今回のガシャットの製作には、Arduinoという電子基板を使っています。ソースコードの作成とArduinoへのプログラムの書き込みは、Arduino IDEという開発環境(ソフトウェア)を使って行うのですが、このあたりの手順については、Web上や本で「入門」という形で詳細に情報を公開されている方々がたくさんおられます。そのため、まずはそれらの情報を参考に、簡単なサンプルプログラムでLEDを光らせるなどしてみて頂けないでしょうか。そこから先で、いざガシャットを作り始めてみてわからないところが出てきましたら、それについてはご質問頂ければ回答させていただきます。

      直接詳細をお伝えできず申し訳ありませんが、ご承知いただけますと幸いです。宜しくお願い致します。

    1. 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.

  4. こんにちは
    私もガシャットを改造してみようと思いこのサイトを参考にしながら改造をしてきたのですが、サイトに記載されているソースコードをArduinoにコピペして検証ボタンを押すと ボードArduino/Genuino Unoに対するコンパイル時にエラーが発生しました。 というメッセージ現れて書き込みをすることができません。何が原因なのでしょうか?

    1. g18様

      検証ボタンを押した時に表示されたメッセージは「ボードArduino/Genuino Unoに対するコンパイル時にエラーが発生しました。」のみでしょうか? これだけだと少し特定が難しいので、もし他にメッセージが表示されているようでしたら、それもお知らせいただけますと幸いです。

      今のところ思いつく可能性と致しましては、このソースコードで使用している2つのライブラリ(DFPlayerとNeoPixelのライブラリ)がArduino IDEにインストールされていないことが考えられます。もしそうであれば、DFPlayerのライブラリについてはこちら、NeoPixelのライブラリについてはこちらの記事をご参照ください。

  5. 初めまして、今こちらの作品を参考にオリジナルガシャットを作成させていただいています。電子工作は初心者なものですから、四苦八苦しながらようやくブレットボード上での動作まで成功しました。まだ課題は山盛りですが、本当に解りやすく解説していただいているので電子工作が楽しくて仕方ありません。
    趣味と本業頑張ってください!

    1. のり軍曹様

      大変ありがたいお言葉、ありがとうございますm(_ _)m ブログを書いてきた甲斐があるというものです。

      ガシャットについては、これまで他の方からも何度かお問い合わせを頂いているのですが、ブレッドボード上での動作確認がとれたところまでご報告頂いたのは、のり軍曹様が初めてです。ガシャット本体への組み込みは結構力技で押しきってしまって説明が不十分な部分もあるかと思いますので、もしよくわからないところがございましたら、遠慮なくご相談くださいませ。

      1. ご返事ありがとうございます。
        実はド素人根性で最初にマイコンボードにスケッチを書き込んでSDに音データ入れてテストもなくいきなり半田付けして、ガシャットに埋め込んで大失敗をやらかしてます「何故反応しない?」(笑)なのでガシャットへの詰め込みレイアウトについては完成してます。(配線図も独自に書いてます)ただ、配線をジャンパー線をカットしたものを使用していますが、私の考えたレイアウトには元のガシャットに使われているような細身の線を使った方がいいので、その場合線が細くなっても問題ないものか教えて戴けませんでしょうか?

        1. おお、それでは完成までの道がだいぶ見えていますね! 私も元のガシャットと同じぐらいの太さの線を使っていますので、それについては大丈夫だと思いますよ◎

          1. お忙しい中コメントありがとうございます。今組み込みの為にブレットボード上で最終確認と調整を行っています。私の環境では Arduino Pro Miniは初めから壊すことを前提に安い互換機を使用してます。mp3プレーヤーは作例と同じものでしたが、壊してしまったので格安バーゲンの別のプレーヤーに変えました。それですとArduinoの2,3ピンを割当てての動作がせず、(Arduino uno互換機も同じでした) RX,TXに接続しなければなりませんでした。まだ原因特定はできてませんがとりあえずこれでいきます。それからテスト用のボタンにミニスライドスイッチを使用してましたが、+とGNDが逆に繋ぎ全く別な動作になりかなりテンパりましたが勉強になりました。いやー電子工作奥は深い

          2. だいぶトライ&エラーを繰り返されているようですね。私もそんな感じで手探りで作っていきました(笑)。

            個人的には、記事で言うところのボタン1と2の処理が一番苦労したところです。もしここをうまいこと処理できる別の方法を思いつきましたら、是非教えてください。

  6. お久しぶりです。やっとガシャット内部の配線が完成しました。まだバッテリーの搭載はこれからですが、外部電源での動作確認は問題ありませんでした。ただ、ブレットボードでの症状がでたのでスイッチ1,2の配線見直し中です。問題なく完成しましたらまた報告させていただきます。

    1. 素晴らしいです! 初めて他の人が作ったガシャットが見れそうでワクワクしています。完成のご連絡を楽しみに待ってます◎

  7. やっとほぼ完成しました。後は細かい処理とLEDの発光パターンと色の変更を地道に行っています。しかしこのプログラムのLEDのパターンは凄いですね!設定次第では様々な表現ができて面白そうです!それから不具合のボタン1,2はブレットボード上とガシャット組み込みでは逆になるというのを記述に書いてあったのを忘れてました。後程自分の環境に合わせ修正しましたが、この辺りのプログラム処理も良く考えられていて大変勉強になりました。そこで今までの工作の件をネタに初ブログを書いて見ようと考えております。そこで御世話になったこちらのサイトのリンクを貼り、紹介させていただいてもよろしいでしょうか?

    1. わー、おめでとうございます! 自分のことのように嬉しいです(笑) LEDの処理の記述まで踏み込んで褒めて頂いたのも初めてです、ありがとうございますm(_ _)m

      ブログをお書きになるのでしたら、リンクはご自由に貼っていただいて大丈夫です。ブログを書くのはそれなりに手間がかかりますが、自分がやったことがちゃんと形になって残ると「自分も結構がんばったなー」と自信が持てますし、またともすれば、それが他の誰かの役に立つこともありますので(今回のように)、とても良いことだと思います。私も読ませて頂きたいので、是非是非お書きになってくださいませ◎

        1. 記事見ました! 一つ目の記事と二つ目の記事を読ませて頂きましたが、素晴らしいアップグレードですね! 特に、元々の基板を流用してスイッチの処理を実装するところと、アクセス性を考慮した設計は、自分が思いつけなかったのがとても悔しいぐらい見事です。

          今週分の記事は既に上げてしまいましたので、後日になってしまいますが、宜しければ、改めて私のブログの中でもご紹介させてくださいm(_ _)m

          1. 紹介の件了解しました。あまり綺麗には作れませんでしたが、よろしくお願いします。

  8. はじめまして、私もこちらのページの情報を参考にさせてもらってオリジナルガシャット作成に挑戦しています。現在はブレッドボード上で動作するところまではできました。
    ソースコードや回路図などの有用な情報を公開していただき感謝しております。

    1. ちたけうどん様

      いえいえ、こちらこそトライ頂いて嬉しいです。ありがとうございます。情報を公開した甲斐があるというものです◎
      コメントを頂けたということは、おそらく私とのり軍曹様のコメントのやりとりも既にご覧になられているかと思います。
      私以外で初めてオリジナルガシャットの作成に成功された方なので、こちらの方の情報も参考にして頂くと、この先進めやすくなると思います。

      何か不明な点がございましたら、仕事と育児の合間にはなってしまいますが、可能な限りはサポートさせて頂きますので、お気軽にご連絡くださいませ。

      1. 早速のお返事ありがとうございます。
        個人ブログですが、現在の状況はこのような感じです。
        https://chitakekoubou.blogspot.com/2017/08/blog-post_15.html
        武器関係についても、なんとなく原因が分かった気がするので、詳細が判明したらお知らせします。

        話は変わりまして、のり軍曹様とのコメントに記載されてますが、こちらのブログへのリンクはOKということでよろしいでしょうか?

        1. なんだかもうほぼほぼ出来上がっている感じですね! 武器関係の検証が十分でなかったのは、私が武器の玩具を全く持っていなかったからですね。。。それどころか、ゲーマドライバーとキメワザスロットホルダーですら、兄に借りて検証していた始末です。リンクは貼っていただいて大丈夫です!

          ちなみに、ウチも当時、「子供が寝ているときはガシャットを弄るの禁止令」出てましたよ(笑)。DFPlayerの音量を小さめに設定したり、ガシャットの穴を指で抑えたりしながら検証していました。

          1. リンクの件、了解しました。
            また何か進展がありましたらご報告いたします。

†Deruta† にコメントする コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>