ボタンを押すと表示の数字が1増える。ただそれだけの装置を、ハンガリーのNagy Krisztiánさんが3通りのやり方で組み上げ、並べて比べています。専用ICを並べた回路、EEPROMを変換表として使う回路、マイコン1個で済ませる回路。集積度が上がるにつれて部品は減り、基板も小さくなっていきます。ただし、最初の版で目に見えていた複雑さは、消えたわけではありません。メモリの中へ、そしてプログラムの中へと移っただけでした。

製作のきっかけ
そもそもの動機が正直で面白いところです。本人によれば、別に進めている電子工作があって、残りはプログラムを書くだけ。なのになかなか手が進まず、他のことに気を取られやすい状態だったといいます。そんなときに動画で見かけたのが、手に持って数を数える機械式のカウンターでした。ボタンを押すと数字が増え、ノブを回すとゼロに戻る、あれです。
さらに、ブレッドボード(配線用の穴が並んだ、はんだ付けなしで試作できる板)に挿さりそうな小さな3桁の表示パネルも目に留まりました。だったらデジタル版を作ればいい。マイコンとボタンと7セグメントLED(棒状の光る部分を7本組み合わせて数字を作る、電卓や時計でおなじみの表示器)と、あとは数行のコード——そう考えるところから話が始まります。
ただ、本人もはっきり書いているとおり、目的はカウンターを完成させることではありませんでした。あくまで、本来やるべき作業から逃げるための口実です。だから、いちばん簡単な道は選ばれませんでした。
専用ICを並べた最大版
とはいえ、NANDゲート(もっとも基本的な論理素子)から数える回路を自作するところまでは戻りません。数えるための専用IC、7セグメントLEDの点灯パターンを知っている専用ICが世の中にはあるので、それを使います。
選ばれたのがCD4026B。0から9まで数え、その出力がそのまま7セグメントの各セグメントに対応しているチップです。9から0に戻るときに桁上げの信号が出るので、3個つなげば0〜999が数えられます。
ここで最初の壁がボタンでした。押しボタンの接点は、押した一瞬のあいだに何度も触れたり離れたりします(チャタリング)。そのまま数える回路につなぐと、1回押しただけなのに数字がいくつも飛んでしまう。カウンターとしては致命的です。これを、555タイマーIC(時間の長さを作る定番チップ)を使って「押されたら一定時間だけ1回の信号を出す」形に整えて解決しています。
次の壁が表示です。3桁の表示器は、3つの桁が同じ配線でセグメントを共有していて、どの桁を光らせるかを選ぶ入力が別にあります。つまり、3桁を同時に出しているように見せるには、桁を高速で切り替え続けるしかない。そのための時計信号をもう1個の555で作り、CD4017Bというチップで3方向に振り分けます。
ところが、3個のカウンターICの出力をそのまま1つの表示器につなぐと、片方が「点けろ」、もう片方が「消せ」と言い合って短絡してしまいます。ここでさらに74HC541(使わないときは出力を切り離せるバッファIC)を3個追加し、信号の向きを合わせるために74HC240(入力を反転するIC)まで足すことになりました。
こうしてできあがった第1版は、ブレッドボード2枚を占める大所帯です。電源投入時に中途半端な値から始まってしまうことがあるので、ゼロに戻すためのリセットボタンも別に付いています。見た目は立派ですが、手に持って数を数える道具としては、まったく現実的ではありません。
EEPROMを変換表として使う手法
2つめの版で持ち込まれたのが、EEPROM(電源を切っても内容が消えないメモリIC)です。発想はシンプルで、「この数字のこの桁を表示するには、7本のセグメントのどれを光らせればいいか」を、あらかじめ全パターン書き込んでおく。回路で計算するのではなく、表を引くわけです。
使ったのはAT28C64B。入力13本のうち10本を「いまの数」、3本を「いま表示している桁」に割り当て、出力の7本がセグメントの状態になります。数えるほうはCD4040Bという2進数で数えるICに置き換わり、ボタンのチャタリング対策と桁の切り替えは第1版と同じ仕掛けが流用されています。
EEPROMへの書き込みには、Raspberry Pi Picoを使ったそうです。タイミングの仕様書を読み込むのが面倒で、待ち時間をかなり余裕を持って取ったところ、遅いうえに動作も不安定になり、正しい値が入るまで何度か走らせる羽目になったと本人は書いています。
回路の規模は第1版のおよそ半分になりました。ただし、しわ寄せもあります。カウンターICは12ビットのうち10ビットしか使っていないため、0〜1023まで数えてしまう。表示は3桁しかないので、999の次は0から23まで進んで、また999へ、というおかしなふるまいを見せます。さらに、桁を切り替えるICが十分な電流を流せないらしく、表示がかなり暗い。どちらも直せない問題ではありませんが、直せば部品が増え、せっかく縮んだ回路がまた大きくなります。
マイコン1個への集約
3つめが、最初に却下したはずの選択肢——マイコンです。必要なのは、セグメント用に7本、桁の選択に3本、ボタンに2本の合計12本。ATtiny24Aがちょうど収まりました。回路はマイコン1個とボタン2個と表示器だけで、これ以上簡単にしようがない構成です。
そのぶん、すべてがソフトウェア側の仕事になります。桁を高速に切り替えて3桁に見せるのも、ボタンのチャタリングを抑えるのも、プログラムの中です。チャタリング対策は「一度押されたら150ミリ秒は次の押下を受け付けない」という簡素なもので、本人も完璧ではないと認めつつ、いまはこれで十分だとしています。表示の明るさが桁ごとに揃わないのも、切り替えの速さがまだ足りていないせいだろう、と。
ちなみに、このATtinyにプログラムを書き込むのがまたひと苦労で、Raspberry Piでは何故かうまくいかず、結局Arduino UNOを書き込み器として使っています。回路図から部品が消えても、作業そのものが消えたわけではない、という話がここにも顔を出します。
移動しただけの複雑さ
3台ぶんの決算として本人が挙げているのが、ブレッドボード3枚半、IC16個、長さを揃えて切った配線が数百本、工作に費やした夜が半ダースほど、そしてショートによる過熱でやけどが1回。
できあがったのは、専用チップを並べた巨大な回路、独特のクセを持つEEPROM版、そして、うっかりするとハードウェアの制約に足をすくわれるマイコン版の3台です。サイズは順に小さくなりました。しかし、第1版で机の上にはっきり広がっていた複雑さは、どこにも消えていません。メモリの中に移り、次にプログラムコードの中へ移った——それだけのことでした。
Hackadayの記事は、ここにもう一点付け加えています。複雑さの移動先は、ソフトウェアだけではありません。コンパイラや書き込み器といった「周辺の道具」もまた、その受け皿になっている。手元の部品点数が減ったぶん、見えないところに積み上がっているものがある、というわけです。
安く手に入る便利なモジュールが山ほどある今、数を1ずつ増やして表示する程度のことは、当たり前にできて当たり前だと思いがちです。その「当たり前」を、いったん全部ばらして机に並べ直してみせたのが、この3台なのだと思います。
出典
The great count-up(Nagy Krisztián/deadlime・製作者本人の記事)
Three Different Digital Counters To Remind Us How Good We Have It(Hackaday)


コメント