心から温まる技術
この記事はcoins Advent Calendar 2016 19日目の記事です。
毎日毎日寒いですね。今日は寒い日々を耐え忍ぶための技術についてです。
coinsで暖を取ると言えば、一般的には計算機をぶん回すことを指すと思います。 徐ろにGentoo Linuxのインストールを始めたり、撮りためたアニメをエンコードするのは冬の恒例行事とも言えるでしょう。 過去のcoins Advent calendarを眺めてみてもこたつをサーバで温める記事があったり、計算機で暖を取ることはもはや目新しいことでもありません。 そこで、今日はちょっと趣向を変えてみようと思います。
迫りくるクリスマス。 どんなに部屋が暖かくても共に過ごす相手がいなければ、心は冷えきったままで生命の温もりが恋しくなるでしょう。 無ければ作るの精神ということで、今日はちょちょっと生命を作り出してしまいましょう。 coinsで生命と言えば?
そう、ライフゲームですね。
ご存じない方のために説明すると、ライフゲームとは碁盤の目状に並んだセルの状態が簡単なルールに従って更新されていく、シミュレーションゲームの一種です。 各々のセルは生死どちらかの状態で、
- 死んだセルの周囲8セルの内、生きているセルがちょうど3つの時にそのセルは「生」に変わる
- 生きたセルの周囲8セルの内、生きているセルが1つ以下の時にそのセルは死ぬ
- 生きたセルの周囲8セルの内、生きているセルが4つ以上の時にそのセルは死ぬ
- 上記以外の場合、セルの状態は変化しない
の4つのルールに従ってセルの更新を繰り返し、盤面の変化を眺めて楽しみます。
というわけで、ライフゲームを作っていきます。 ただ単に盤面の状態を液晶ディスプレイに表示するだけだと生命の温もり感に欠けるので、Arduinoを使って8x8のマトリクスLEDに表示しようと思います。 マトリクスLED内部は、
(MNA20SR092Gデータシートより引用)
こんな回路をしているので、何も考えずにつなごうとするとArduino Unoではピン数が足りず、金を積んでArduino Megaを買う必要が出てきます。 そんなお金は無いので、今回は8bitのシリパラ変換ICを2つ使ってつなぐことでArduino Unoからでも制御できるようにします。 いい感じにつないだ結果こうなります。
後はパパっとArduinoのスケッチを書いてしまいましょう。 マトリクスLEDの点灯には少し工夫が必要で、そのままだと一度に全てのLEDを任意の点灯状態にすることができません。 各行(もしくは列)1つだけに着目すると任意の点灯状態にすることができるので、まず1行だけ表示して、すぐに次の1行だけを表示して……と表示する行を高速で切り替えることで全てのLEDについて任意の点灯状態にすることができます。 ArduinoにはShiftOutという1byteのデータをシリアル出力してくれる便利な関数があるので、これを使うと各行のデータを簡単にシリアル出力することができます。 最終的なスケッチがこちらです。
このスケッチをArduinoに書き込んで完成です。
どうですか、生命の温もりを感じられますか。 僕は部屋のあまりの寒さに凍え死にそうです。 とはいえ、もともと箱庭シミュレーションを無心で眺めているのが好きなので楽しいことは楽しいです。
完全にただの一発ネタでしたが、ここまでお読みいただきありがとうございました。