普段は主に PIC を使って電子工作をしている私ですが、今回はマイコンを使わないでライフゲームを作ってみました。
ライフゲームを知らない人は恐らくこんな記事を読まないと思うので、ライフゲーム自体についての説明はしません。
(もし知らない方がこの記事を読んでくれているならとても嬉しいです。ぜひこちらでルールを確認してください。)
完成品概観
まず初めにイメージをつかんでもらうために完成品を軽く紹介したいと思います。
基板(1セル)がこちら↓
中央の LED がセルの生死を表します。大きい方の IC がコンパレータ、小さい方の IC がフリップフロップです。
同じものを大量生産して上下左右のピンヘッダ/ピンソケットで連結します。
連結したものがこちら↓
8×8 の 64セル作りました。基板1枚が 33mm 四方でピンソケット含めて1枚当たり 40mm になるので、8×8 だと一辺 30cm 以上のサイズになります。デカいです。
ニコニコ動画に動画も投稿しているので、よろしければそちらもご覧ください。
さて、どんなものを作ったのかは理解してもらえたと思うので、次からはその中身を紹介したいと思います。
材料
回路の解説に入る前に材料(1セルあたり)を紹介したいと思います。
- 2回路コンパレーター LM393D
- 1回路Dフリップフロップ TC7WH74FU
- LED
- 抵抗(10kΩ x14, 6.8kΩ x2, 2.2kΩ x1)
- コンデンサ (0.1uF x2)
- ピンヘッダ (7p x2)
- ピンソケット (7p x2)
基板含めての単価は約150円となりました。
回路
先程紹介した基板の回路はこのようになっています。(動作原理の図なので LED やパスコンは省略してます。)
これで1セルの回路です。
各部分についてこれから説明します。
入力部
入力部は周囲8セルのうち何セルが生きているかの情報を手に入れる部分です。
見た通り8個の抵抗を繋げただけです。8個の in は周囲8セルの各 out に繋がっています。
out の値は0(GND)または1(5V)なので以下のように周囲8セル中の生きているセルの数に比例したアナログな電圧が得られます。(0から8のデジタルじゃないかというツッコミはご遠慮ください。)
生死判定部
続いて入力を基に生死判定を行う部分です。
ライフゲームのルールは次のようになってるので、上の境界と下の境界のそれぞれとコンパレータで比較して論理積を取ってやればいいです。
ただし、今回使うコンパレータはオープンドレイン出力なのでプルアップ抵抗一つで論理積の役割を果たしています。
回路図上側のコンパレータが上の境界判定です。+入力には約3.2/8 (5Vを1として)の電圧がかかっているので生存数が3以下であれば出力は真となります。
一方回路図下側のコンパレータが下の境界判定ですが、これは自身の生死によって境界が変わるので少し工夫が必要です。
後に登場する出力部のフリップフロップの反転出力を利用することによって、計算は省略しますが生のときは約2.8/8、死のときは約1.7/8 となります。
この電圧がコンパレータのー入力にかかっているので、入力がこれよりも大きければ真となります。
先程も書きましたがこのコンパレータはオープンドレインなので2つのどちらかが偽となれば合計の出力は0となります。両方とも真のときだけプルアップ抵抗により出力は1となります。
出力部
単なるDフリップフロップです。
ライフゲームでは全部のセルに対して同時に計算を行わなければならないので、コンパレータの計算結果をクロックによって同時に出力します。
出力が変わるとすぐに入力値が変わってコンパレータの計算結果も変化するため、本当に同時に(他のセルの計算結果が変わる前に)すべてのセルの出力を更新できるのかという問題がありますが、結果としては特に問題ありませんでした。
IC の入力容量や抵抗によって計算結果の変化に十分時間がかかるものと思われます。
接続方法
1セルの回路は出来ましたが、次に考えるのは入出力をどのようにやり取りするかという問題になります。
周囲8セルと入出力をやり取りする必要があるのですが、斜めのセルと直接つなぐのは無理なので、次のように接続することにしました。
注目してほしいのは、すべてのセルが同じ回路だったときにきちんと入力と出力の対応が取れている点です。
例えば、左辺の1番上を見てみると、左のセルからの入力となっています。そこと繋がっているのは左のセルにとっては右辺の1番上に当たるわけですが、これは出力になっているので入出力の対応が取れているというわけです。
入出力に加えて、電源2本とクロック1本も各辺で接続することにします。
結果として、1辺7ピンで接続することになりました。(上下と左右でオスとメスの対応が取れている点にも注意してください。)
基板設計
今回はプリント基板を発注するので KiCad を用いて基板の設計を行いました。KiCad の使い方については他のサイトを参照してください。
まずは完全な回路図を描きます。
左下のコンデンサは実際は2つの IC のそばに置きます。フリップフロップの PR, CLR は GND に落とすことによって Q(出力) を H, L にすることが出来るピンです。基板上にランドを出しておいてそれをショートさせることによってセルの生死を手動で切り替えられるようにします。
接続部は分かりやすいように実際の配置通りに回路図にしてみました。
回路図が描けたら次に部品配置、配線を行います。
中心に LED、4辺にコネクタが来るようにして残りは配線がしやすそうな場所を想像しながら詰め込みます。
配線は自動配線ツールがあるはずなのですが、自分の環境ではちゃんと動かなかったので手動で配線しました。
左側が表面、右側が裏面です。
基板の設計が出来たらガーバーファイルを出力して業者に送ります。
今回は ALLPCB を利用しました。ここら辺の流れについても他のサイトに丁寧な説明があるのでそれを見てください。
この基板を 3×4=12枚割り付けたものを5枚注文しました。その際 V-cut のオプションを利用しました。(合計60枚なので足りないですが、事前に同じデータで5枚試作を注文していたので大丈夫です。)
値段は送料を含めて 32.17ドル、約3800円でした。
注文から約2週間後、6枚の基板が届きました。予備が手に入ってラッキーです。
組み立て
基板が到着したらあとは部品を組み立てるだけです。あえて特筆すべきことを挙げるとすれば、L字ピンソケットの加工でしょうか。
L字ピンソケットは秋月電子でも手ごろなものが売ってないので、Aliexpress でまとめて購入しました。40p x10 を単位としてそれを3つ、つまり40p x30個購入しました。
ピンヘッダと違ってピンソケットには分割用の切れ目が入ってないので、自分で 7p に加工することになります。
1ピンを犠牲にしてニッパーで切断して、その切り口をまたニッパーで整えます。整えるときにあまり攻めすぎるともう1ピン死んでしまうことがあるので、だいぶ適当にしました。
ただピンソケットの加工よりも面倒だったのが大量の抵抗の実装です。
値段のことだけを考えて表面実装ではなく普通のリード線のものを使用したのですが、このリード線を曲げたり切ったりするのがとにかく面倒でした。
一応こんな感じで多数の抵抗を一気に曲げる治具を作ってはみたのですが、上手く曲がらないやつがたくさんできたので、それを修正するなら初めから手で曲げた方が早かったです。
右手のラジオペンチでつかんで左手で曲げるという動作が最適化されました。()
というわけでセルの出来上がりです。この写真もう3回目ですね。ちなみに右のピンヘッダが曲がってますが、これはセルどうしを抜き差しするときに誤って曲がりました。
動作テスト
12セルが完成した時点でひとまず動作テストをしてみました。3×4だとブリンカーぐらいしか作れませんが、ひとまずきちんと動作することが確認できて一安心です。
PICマイコンでクロック信号を生成しています(青色LED)。電源とクロックは左下のセルの左側から供給されています。
周囲から伸びている線は外周部の入力を0にするための線です。入力が浮いたままだと正しく計算ができません。
最後に
12セルを作るのに大体3~4時間かかりました。それを5回+αで64セル作りました。大変でした。
これで本体は完成ということになりますが、クロックなど周辺部品がまだ必要になります。
全部入れると記事が長くなりすぎてしまうので一旦ここで区切りたいと思います。ご覧いただきありがとうございました。
次回はクロックコントローラーを作ります。こちらもぜひご覧ください。