きっかけはひと昔前に流行ったビルの窓を使ったテトリスです(参考:Tetris on the Green Building)。
一度やってみたいなと思いつつ実物では難しかったので、3Dプリンター購入を機に小さなモデルを作って再現することにしました。ちょうどいい題材がなかなか見つかりませんでしたが、ゲーミング都庁を思い出し、東京都庁でテトリスと次いでゲーミング都庁・東京アラートも再現することにしました。
テトリスのプログラムも思ったより複雑で大変でしたが、形になったときは謎の感動を覚えました。次は、渋谷のスクランブル交差点とかを題材にしてみたいです。
(参考)
ゲーム自体は、ソ連(現ロシア)発の世界でもっとも有名なパズルゲームです。
基本的には、十字に配置されたボタン4つで操作します。落ちてくるピースを、上キーで回転、左右と下キーで移動させます。下キーは押しっぱなしで素早く下にピースを落とせます。また、右の大きなボタンは決定ボタンで、タイトル画面からメインゲーム、および結果表示からタイトルに移る時に押します。
段をブロックで埋めるとその列が消去されます。消去した列に応じて得点が変わります。列数をxとすると、得点(score)は以下の式で計算できます。
score = 5 * x * (x + 1)
ブロックが一番上に積みあがるまで、得点を稼いでいきましょう。
決定ボタンを押しながら電源を入れると、ゲーミング都庁と東京アラートを再現するモード(ゲーミング都庁モード)になります。
普段はレインボーに光りますが、ボタンを押していると赤く点滅して警告音を発する「東京アラート」が発令できます。
より詳細な作り方は、一番上のURLからご覧ください。
Arduino Pro Mini(5V, 16MHz)に、IDEでファームウェア(スケッチ)を書き込んでゲーム(TOCHORIS)と東京アラートを実装しています。なお、書き込み時はUSBシリアル変換アダプタが必要です(電圧は5Vです)。
電源は、単四電池3本をArduinoのRAWピンにつないで動かしています。4.5Vでは少し電圧が足りないようにも思えますが、問題なく動いています。
マトリックスLEDの各ドットの状態をbyte配列で確保し、0-6(ピースの種類)、または16(空)を入れることでどのマスに何のピースがあるかを管理します。ピースは独自(ID、幅、高さ、構造、回転、中心、色)の構造体で定義しますが、PROGMEMを用いることでRAMの容量を節約しました。
ディスプレイ、および左右の棟のLEDはWS2812Bを使いました。
ディスプレイは2020(2mm四方)サイズのLEDを用いたドットマトリクス基板を2枚つないで8x16の解像度で構成しました。棟の装飾は一般的な5050(5mm四方)サイズを1個ずつ利用しましたが、単品では使いづらいのでモジュールがおすすめです。
信号ピンはディスプレイと装飾用では分けてますが、装飾用LEDは同じピンを分岐させてつないでいます。
アンプ内蔵の小型MP3モジュールDFPlayer Miniを採用しました。安くて使い勝手もいいので重宝しています。microSDカードにmp3ファイルを書き込んでスロットに差し込み、スピーカーを接続してから電源を投入すると音声が再生できます。
なお、USB電源では電力不足で動作しないので、別電源(前述の電池)に直接つないでいます。また、3.3V駆動なので、5Vマイコンとつなぐ際は信号線を1kΩ抵抗で接続することが推奨されています。
Arduinoで使う際は、シリアル通信(ソフトウェアシリアルで対応可)で接続し、DFPlayer Miniライブラリで制御します。
4桁の7セグLEDを2つ使って、今のスコアとこれまでのハイスコアを表示しています。7セグLEDには余ってたバブルディスプレイ(今は生産終了)を使いました。また、TM1640をTM16xxライブラリで制御して、LEDに数字や文字を表示しています。
スコアの保存は、ArduinoのEEPROMを使っています。