以前にライフゲームを抵抗とコンパレータを使って計算する「アナログライフゲーム」という作品を作りました。
自分の作品の中でもお気に入りの作品で、何度かイベントにも展示したりしたのですが、この度バージョンアップさせることにしました。
過去作の製作記事はこちら↓
目次
アナログライフゲームの仕組み
まずはアナログライフゲームの計算の仕組みについて紹介します。ここは今回のバージョンアップでも変わっていない部分です。
なおライフゲームそのものについては知っている前提で話を進めます。
ライフゲームの計算の特徴として以下の2点が挙げられます。
- 自分および周囲8マスの状態のみから次の状態が決定する
- 全体で同時に計算を行う
これらの特徴から、隣接セルとの通信、全体でのクロックの共有ができれば、各セルが自分の状態を計算することでライフゲームが実現できることが分かります。
各セルは0か1(死か生)の状態を持っていて、次の状態の計算は次のように行います。
現在の状態 | 周囲の生きているセルの数 | |||
---|---|---|---|---|
0~1 | 2 | 3 | 4~8 | |
0 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 0 |
現在の状態にも依存しますが、周囲の生きているセルの数が少なすぎず、かつ多すぎない場合に次の状態は1になります。
これを計算するための回路を考えます。まずは周囲の生きているセルの数を計算する部分です。
8個の0/1の入力のうち1の数を数えるのは、論理回路を使おうと思うと大変になりますが、合計だけに注目するならば次のような非常に簡単ながらも画期的な方法があります。
ご覧のとおり、8個の入力に対して8個の抵抗をつなぐだけです。
オームの法則から、同じ大きさの抵抗を用いれば図中のAの電圧はIN0~IN7の平均となります。8個中n個が1だとすると、平均の電圧はn/8です。
1/8はスケールが変わるだけなので、要するにnの値が電圧としてアナログに計算できていることになります。
次にnの値から次の状態を判定する部分を考えます。nの値が小さすぎず、かつ大きすぎなければよかったので、2つのコンパレータを用いて次のように計算できます。
上のコンパレータは「大きすぎない」という条件に、下のコンパレータは「小さすぎない」という条件に対応しています。図中Bはその2つの条件の論理積を取ったもので、次の状態の値です。
アナログの値の比較になるので、「3以下」という条件を「3.5未満」として計算します。
上側の基準値は固定なので抵抗で分圧することで簡単に作れますが、下側の基準値は現在の状態によって異なります。この点の解決策は後ほど紹介します。
最後にクロックに同期する方法ですが、これは計算した次の状態をDフリップフロップを用いてクロックに合わせて更新すればよいです。
ここまでを踏まえると、1セルの回路は次のように作ることができます。
追加のポイントとしては以下の2点があります。
- コンパレータはオープンドレイン出力のものを用いることで、プルアップ抵抗1つで論理積になる。
- Dフリップフロップの反転出力Qを使うことで下側の基準値を上手く調整できる。
この回路を1枚の基板にして同一の基板を何枚も作るのですが、斜めのセルは直接接続できないので下図のように信号をバイパスする必要があります。
アップデート① 入力フローティングに対応
先ほど説明したとおり、この回路では抵抗で分圧することで周囲の1の数を数えているのでした。
では基板の端で入力信号がない場合はどうなるかというと、入力信号の平均を取るという部分は変わりませんが、n/8だったところの分母が減るので電圧値としての計算結果が正しくなくなってしまいます。
そのため、以前の作品では入力がフローティングにならないように、明示的に0に接続したり、上下と左右をループさせたりといった対策が必要でした。
この問題に対応すべく、アナログライフゲーム2.0では以下のように隣のセルがない場合に入力信号を0にする回路を追加しました。
IN0を例にしていますが、すべての入力に対して同じ回路を追加しています。IN0とexistは隣のセルからの入力信号で、existには0が入力されます。
隣のセルが存在してexistが0の場合はNMOSがオフになるのでIN0の値はそのままですが、存在しない場合はIN0とexistはフローティングになり、プルアップ抵抗によってオンになったNMOSによってIN0のラインは0になります。
この変更により、隣との接続に必要なピン数はexistの入出力の2本が増えて合計9本となり、2×5のピンヘッダ/ピンソケットを使用しました。
アップデート② はんだ付け部品点数の大幅減少
前作の基板ではSMDのフリップフロップ、コンパレータを手ではんだ付けしていました。これも大変ではあるのですが、もっと大変だったのは基板1枚あたり17個あったアキシャルリードの抵抗のはんだ付けです。64枚の基板で1000個以上の抵抗をはんだ付けしたのは明らかに無茶でした。
今回はキット化も考えて抵抗はSMDにしてSMD部品の実装までJLCPCBで注文しました。
これによりはんだ付けが必要なのはLEDとピンヘッダ/ピンソケットだけになりました。キットにしては作業が少ない気もしますが、複数の基板を作ることを前提にすればこれくらいでも十分でしょう。
基板はこんな感じです。
アップデート③ 面付けしたままでも使用可能
基板1枚のサイズは小さいので、同一の基板を繰り返し配置する面付けを行って注文するのですが、今回は面付けの方法を工夫して基板を分離しないでもそのまま使用できるようにしてみました。
面付けにはmouse biteというミシン目のような穴を開ける方法と、V-cutという基板に浅い切れ込みを入れる方法があるのですが、今回はmouse biteをアレンジして行いました。
普通はドリル穴を開けてミシン目を作るのですが、ドリル穴の代わりにビアを使い、コネクタのパッド↔ビア↔ビア↔コネクタのパッドの間に配線を引くことで、面付けしてつながったままでも隣のセルとコネクタ同士を接続した状態を作ることができました。
また基板を接続する橋の部分が普通の面付けよりも大きくなっていますが、これはコネクタで接続したときと同じ幅にするためです。(多少のマージンを設けました)
アップデート④ LED大型化
LEDは大きいほうが見栄えが良いだろう!ってことで10mmの大きいLEDを使うことにしました。色は当然緑です。
使用したのは秋月電子で販売している 抵抗内蔵10mm LED です。抵抗内蔵ですが、消費電流を抑えるために外付けの抵抗をつけています。高輝度なのもありがたい。
基板は黒色にしてみました。かっこいいです。
旧バージョンの基板と並べて比較してみるとこんな感じです。
動作例
4×4の繋がったままの基板に分離した基板を4つ繋げて、4×5にして動作テストした動画です。
キット販売
現在はまだ準備が整っていませんが、いずれキットとして販売したいと思っています。
気になった方はXをフォローしていただけると、開発状況を知ることができます。