トミカ ライトアップシアターを強化改造する feat. シン・仮面ライダー


今回はトミカ版の『シン・仮面ライダー』サイクロン号を激走させながらディスプレイできる装置を作ってみました。こういうくだらない(でも、自分的には面白い)ことに全力投球するのが大好きです。

開発経緯

きっかけはもちろん、この(2023年)春に劇場で上映された『シン・仮面ライダー』です。現在(2023/7/20時点) Amazon Primeで絶賛配信中。内容は賛否両論あるかもしれませんが、個人的にはとても楽しめて、何かしら部屋に飾れるものが欲しくなり、手頃なところでトミカのサイクロン号を購入しました。

本郷Ver.と一文字Ver.。見た目ほぼ変わりませんが(マフラーの色のみ)、映画で一文字隼人にすっかり惚れ込んでしまったので2台購入しました。

このトミカの出来がとても良かったので、綺麗に飾りたくなり、トミカ公式の高級(?)ディスプレイケースである『ライトアップシアター』を購入しました。

ちなみに、2023年7月に新作『ライトアップシアターコネクト』が発売されましたが、今回使用するのは旧版になります。

 

これでライトアップするととてもカッコ良く飾れるのですが、やっぱりバイクは走ってる姿がカッコ良いと思うところがあり、ケースから取り出して手で転がして遊ぶこともしばしばありました。で、

「それならケースの中で走らせてしまえば良いのでは?」

と考えるに至りました。さらに、この『ライトアップシアター』は元々、スマートフォンをケースの後ろに置いて動画を流せばトミカが走っているように見せられる機能があるのですが、これを敢えて、1971年の初代『仮面ライダー』のオープニングのリスペクトで、回転バックに置き換えてしまえば玩具的にも面白いんじゃないかと。回転バックは『シン・仮面ライダー』のPVでも採用されていましたし。

そんなところで、開発をスタートさせました。

特徴

自作の台座にサイクロン号をセットし、トミカの「ライトアップシアター」の上部分をそのまま台座にセットして準備完了です。

左側のボタンを押すとサイクロン号が激走!もう一度押すと停止します。

右側のボタンを押すと、劇中で使用された音楽を再生します。ボタンを押すたびに再生/停止を繰り返し、以下の曲が順に再生されます。

  1. 3A-DB
  2. metamorfose
  3. レッツゴー!!ライダーキック 50th
  4. Where you go ver.J

『シン・仮面ライダー音楽集』に収録されている音声を使用させて頂きました。

また、右側ボタンを長押しすると、変身音が再生されます。劇中ではあんまり変身音の印象がありませんでしたが、玩具の『DX変身ベルト』で聞くことのできる変身音が流れます。

BGMを「2. metamorfose」にして変身音を鳴らすのがベストかと思います。

 

さらに、別パーツで「回転バック」をセットすることができます。序盤「クモオーグ編」をイメージした山林と、エンディングをイメージした水平線の2つを用意してみました。

それぞれ回転速度に差をつけていて、山道、海沿いを走る感じを出すようにしています。

 

 

ちなみに、この台座の中は2レーンになっているので、

(少し前後にする必要がありますが)本郷と一文字のサイクロン号を並走させたり、

通常の車のトミカを走らせることも可能です。

ハードウェア解説

今回使用した部品から説明します。サイクロン号、ライトアップシアター、音楽集、DX変身ベルトは既に紹介済みですので、それ以外をここでご紹介します。

 

今回使用したマイコンです。今回のプログラムはとてもシンプルなので、これで必要十分です。

 

毎度お馴染みのMP3プレイヤーです。劇中音楽の再生にはこちらを使用しています。

DFPlayerは1チャンネルしか再生できないため、これだけだと「BGMを鳴らしながら変身音を鳴らす」ということができません(※”advertise”という機能で短時間だけ効果音を鳴らすことはできるが、その間はメインの音声は停止してしまう)。というわけで、

変身音の再生用に、もう一つMP3プレイヤーを使用しています。DFPlayerより大きいし、8MB弱の音声ファイルしか再生できませんが、マイクロSDカードなしで使用できるのが魅力です。

 

今回使用したスピーカーはこちらです。それぞれのMP3プレイヤーに一つずつ使用。台座の大きさの割にスピーカーの搭載スペースがほとんどなかったので、小型のこちらを使用しました。

 

サイクロン号を走らせる用と、音声を鳴らす用で、2個使用しています。たまたま手持ちであったのがコレでLEDが内蔵されていたので、せっかくなので変身音を鳴らすときだけ光るようにしてみました。

 

ここまでは私の工作では定番なのですが、今回はクローラー(※一般にキャタピラともいう)的な機構を作る必要があり、私としても初の試みだったので、かなり試行錯誤しました。以下では最終的に採用した部品のみ掲載しています。

台座内部のクローラーと回転バック×2で、計3つ使用しました。モーターとかギヤ比がどうとかは本当に全然わからなかったので、

とりあえずタミヤのギヤボックスのキットを一通り全部買って試すという脳筋・物量戦略。

結果、多段ギヤボックスで変更できるギヤ比で全部対応できそうだったので、筐体の3Dモデリングを少しでも楽にするために、全部これで統一することにしました。

 

ギヤボックスに入っているシャフトではちょっと長さが足りなかったので、追加で購入しました。長いのと短いの。

 

シャフトを固定、回転させるためのベアリングです。今回は全部で15個使用しました。精度はよく分かりませんが、上記で用途的には充分でした。

 

今回の工作の要となる、任意の長さのクローラーを簡単に作れるキットです。タミヤは本当に素晴らしい。台座に仕込むだけなら1セットで充分ですが、回転バック分も含めると足りないので2セット購入。

今回使用するギヤやローラーのパーツが、セットに含まれる内容では数量的に少し足りなかったり、少しだけ形状を変更したかったりがあったので、採寸して3Dプリンタで必要数分だけ複製しました。

 

今回はモーターを2個同時(台座と回転バック)に使用することになるので、2個同時コントロール可能なドライバを使用しています。使用しているのは電流消費の少ないミニモーターなので、性能的にもこれ充分です。

 

使用した具材は大体こんな感じで、以下のように配線しています。

電源については、ライトアップシアターに搭載されている電池(単四電池×3)から引っ張ってくることも考えましたが、

  • モーター×2で結構電力を消費する
  • 基本的に据え置いて使用するので有線での電力供給でも特に問題ない
  • 設計・制作が若干めんどくさくなる

ということで、Seeeduino XIAOのUSB差込口から電力供給することにしました。

モータードライバの配線については、特に回転方向を切り替えたりはしないので、なるべくドライバモジュール内で配線が完結するようにして、Seeeduino XIAOとの間の配線が極力シンプルになるようにしています。

 

実際に配線して、台座に入れるとこんな感じ。台座はFusion360で設計して、3Dプリンタで出力しました。

手持ちの3Dプリンタ(Adventure 3 Lite)で出力できる限界ギリギリサイズでした。あとだいぶ試行錯誤したのでフィラメントめっちゃ使いました。

ちなみに私の場合、3Dプリンタで出力したものはあんまり表面処理しない(←積層痕とかはあまり気にならない)のですが、今回は製品版のライトアップシアターと組み合わせて使う関係で、ある程度は磨いておく方が良いかなと思いました。

私は基本的にフィラメントはPLAを使いますが、PLAは研磨にあまり向いていないとされています。が、研磨できると謳われているPLAもあって、今回は以下を使用しました。

磨けば綺麗になるとは言え、今回は過去最大級の造形ということもあって、耐水ペーパーの番号を変えて何度も磨くのは大変そう、ということもあり、今回は以下のツールを導入してみました。

専用のヤスリペーパーを買うのはコストパフォーマンスがよろしくないので、モノタロウやらダイソーやらで入手したペーパーを切って、以下の両面テープで貼り付ける形で使用。

私は手持ちが幅10mmだったのでそれを使用しましたが、四角の先端に貼り付けて使用するときには少し幅が足りなかったので、15mmにしても良いかもしれません。

で、使ってみた感じですが、確かに便利で、楽にガンガン削れます。捗る。が、結構振動が強いので、腕にかなり負担がかかります。道具的にも肉体的にも、あんまり長時間、一気に作業するのは避けた方が良いと思います。でも便利。

 

話がちょっと逸れたので、本題に戻ります。

今回の作品のポイントはクローラーで、台座、回転バック(森)、回転バック(水平線)の計3つを作成しています。上図は回転バックの中身。

回転バック(水平線)だけ回転が目立ってゆっくりですが、これはプログラムではなく、多段ギヤボックスのギア比の設定によって差をつけてます。タミヤの多段ギヤボックスはギヤ比4.6から209.7まで、12種のギヤ比を自分で選んで組み立てられるのですが、回転バック(水平線)は最も回転数の少ないギヤ比”209.7″にして、回転バック(山林)は”42.8″、台座は”9.7″にしています。ギヤ比が小さくなるほど回転は速くなりますが、トルクが小さくなってクローラーを動かせなくなってしまうので、ギヤ比最小の”4.6″とかは使用していません。

 

あと、回転バックのクローラーに巻き付けている背景画像。

これはStable Diffusionさんに描いてもらったものをラベル用紙に印刷して、クローラーに巻き付けています。画像生成AIは、私のような絵が描けない人間には大変ありがたいです。

こんな感じで横長の背景を出力してもらい、

それぞれ左右反転させて元絵と繋げればループする背景が完成する、というわけです。

ソフトウェア解説

今回はコードが短いので、ここで全文掲載します。

////////// 基本定義 ////////////////////////////////////////////////////////////

#define LOOP_DELAY_MS 20

#define PIN_MP3_BGM_RX   0
#define PIN_MP3_BGM_TX   1
#define PIN_MP3_SE_RX    2
#define PIN_MP3_SE_TX    3
#define PIN_MOTOR_ROAD   4
#define PIN_MOTOR_SCREEN 5
#define PIN_LED          6
#define PIN_SW_DRIVE     7
#define PIN_SW_SOUND     8

#define ON  LOW
#define OFF HIGH

#define SPEED_ROAD   128
#define SPEED_SCREEN 224
boolean is_driving = false;

uint8_t sw_drive = OFF;
uint8_t sw_sound = OFF;
uint8_t prev_sw_drive = OFF;
uint8_t prev_sw_sound = OFF;

////////// BGM処理 /////////////////////////////////////////////////////////////
#include <DFPlayerMini_Fast.h>
#include <SoftwareSerial.h>
SoftwareSerial ss_bgm_player(PIN_MP3_BGM_RX, PIN_MP3_BGM_TX);

DFPlayerMini_Fast bgm_player;

#define BGM_VOLUME 20 // 0〜30

uint16_t bgm_num = 0;
uint16_t num_bgms = 0;

void play_bgm(uint16_t track_num){
  if(!ss_bgm_player.isListening()){
    ss_bgm_player.listen();
  }
  bgm_player.playFromMP3Folder(track_num);
  Serial.print(F("Play BGM: "));
  Serial.println(track_num);
}

void pause_bgm(){
  if(!ss_bgm_player.isListening()){
    ss_bgm_player.listen();
  }
  bgm_player.pause();
}

boolean is_playing_bgm(){
  if(!ss_bgm_player.isListening()){
    ss_bgm_player.listen();
  }
  return bgm_player.isPlaying();
}

////////// 効果音処理 /////////////////////////////////////////////////////////////

//#include <SoftwareSerial.h>

SoftwareSerial ss_se_player(PIN_MP3_SE_RX, PIN_MP3_SE_TX);

#define SE_VOLUME 20 // 0〜30

#define SE_POWER_ON 1
#define SE_CHANGE   2

#define BGM_OR_SE_MS 1000
unsigned long sw_sound_on_point_ms = 0;
boolean is_se_ready = false;

#define CHANGE_SE_TIME_MS 18000
unsigned long change_point_ms = 0;
boolean is_changing = false;

void play_se(uint8_t track){
  // この定義だと再生曲数は255に限定されるので注意。
  // Upper-Byte, Lower-Byteをちゃんと処理してやれば65535曲まで対応可能だが、
  // 容量的にそこまで使うことはほぼないと思われる。

  // Macの場合は、MP3データを全て"ZH"フォルダにコピーした後、
  // ターミナルでZHフォルダに入り、"$ rm ._*"のコマンドで、
  // "._01.mp3"のような名前で裏で勝手に生成されているファイル
  // ("$ ls -a"のコマンドでないと見えない、AppleDouble Header file)
  // を削除しないと、挙動がおかしくなるので注意

  if(!ss_se_player.isListening()){
    ss_se_player.listen();
  }
  uint8_t play[6] = {0xAA,0x07,0x02,0x00,track,track+0xB3};
  ss_se_player.write(play,6);
}

void pause_se(){
  if(!ss_se_player.isListening()){
    ss_se_player.listen();
  }
  unsigned char stop[4] = {0xAA,0x04,0x00,0xAE};
  ss_se_player.write(stop,4);
}

void set_volume_se(uint8_t vol){
  if(!ss_se_player.isListening()){
    ss_se_player.listen();
  }
  uint8_t volume[5] = {0xAA,0x13,0x01,vol,vol+0xBE};
  ss_se_player.write(volume,5);
}

////////// メイン処理 ////////////////////////////////////////////////////////////

void setup(){
  Serial.begin(115200);
  pinMode(PIN_MOTOR_ROAD, OUTPUT);
  pinMode(PIN_MOTOR_SCREEN, OUTPUT);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_SW_DRIVE, INPUT_PULLUP);
  pinMode(PIN_SW_SOUND, INPUT_PULLUP);

  // BGM用MP3プレイヤーと効果音用MP3プレイヤーのセットアップ
  ss_bgm_player.begin(9600);
  ss_se_player.begin(9600);

  ss_bgm_player.listen();
  if(!bgm_player.begin(ss_bgm_player)) {
    Serial.println(F("Unable to begin music_player:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("dfplayer online."));

  // SDカード内の曲数を確認 (※ Macの場合、mp3フォルダ内の._*.mp3ファイルを消しておかないと、数が2倍になる)
  num_bgms = bgm_player.numSdTracks();
  Serial.print(F("Num of tracks: "));
  Serial.println(num_bgms);

  bgm_player.volume(BGM_VOLUME);

  // 効果音用MP3プレイヤーセットアップ
  set_volume_se(SE_VOLUME);

  play_se(SE_POWER_ON);
}

void loop(){

  sw_drive = digitalRead(PIN_SW_DRIVE);
  sw_sound = digitalRead(PIN_SW_SOUND);

  unsigned long now_ms = millis();

  if(prev_sw_sound == OFF && sw_sound == ON){
    sw_sound_on_point_ms = now_ms;
    is_se_ready = true;
  }

  if(prev_sw_sound == ON && sw_sound == OFF){
    if(now_ms - sw_sound_on_point_ms < BGM_OR_SE_MS){
      // BGM_OR_SE_MS未満にスイッチを離せばBGM再生
      if(!is_playing_bgm()){
        bgm_num++;
        if(bgm_num > num_bgms){
          bgm_num = 1;
        }
        play_bgm(bgm_num);
      }else{
        pause_bgm();
      }
    }
    is_se_ready = false;
  }

  if(is_se_ready == true && now_ms - sw_sound_on_point_ms >= BGM_OR_SE_MS){
    play_se(SE_CHANGE);
    digitalWrite(PIN_LED, HIGH);
    change_point_ms = now_ms;
    is_se_ready = false;
    is_changing = true;
  }

  if(is_changing && now_ms - change_point_ms >= CHANGE_SE_TIME_MS){
    digitalWrite(PIN_LED, LOW);
    is_changing = false;
  }

  if(prev_sw_drive == ON && sw_drive == OFF){
    if(is_driving){
      analogWrite(PIN_MOTOR_ROAD, 0);
      analogWrite(PIN_MOTOR_SCREEN, 0);
    }else{
      analogWrite(PIN_MOTOR_ROAD, SPEED_ROAD);
      analogWrite(PIN_MOTOR_SCREEN, SPEED_SCREEN);
    }
    is_driving = !is_driving;
  }

  prev_sw_drive = sw_drive;
  prev_sw_sound = sw_sound;

  delay(LOOP_DELAY_MS);
}

全体的にシンプルですが、一つポイントがあるとすれば、ソフトウェアシリアルの切り替えです。DFPlayerとMP3ボイスモジュール、それぞれ別のソフトウェアシリアルを割り当てて制御することになるのですが、ソフトウェアシリアルを複数併用するときは、それぞれ通信前にlistenが必要になります。

まとめ

以上、トミカ ライトアップシアターの強化改造 feat. シン・仮面ライダーのご紹介でした。昭和の特撮を手元で再現できたのがなかなか楽しく、とても気に入っています。

願わくば、水平線バックで『シン・サイクロン号』を走らせたいので、タカラトミー様、是非ともトミカ『シン・サイクロン号』を…!

 

さて、次にチャレンジしたいものはおよそ決まっているのですが(←相変わらず『ギーツ』ネタではない、また珍しい二番煎じ)、とりあえず『ゼルダ』やりたいです。