PICマイコンで電卓(部品縛りあり、構想編)
2016/09/28
学生実験「マイコンプログラミング設計」
昔々、まだ私が学部の2年生だった頃、「学生実験」なるものがありました。テーマはいくつかあり、各人希望を出して抽選に通れば希望のテーマを実験できるというものでしたが、その中でも私の目に留まったのは「マイコンプログラミング設計」でした。内容としてはPICマイコンで電卓を作るというものでしたが、難易度がほかの実験に比べて段違いということで同級生の間では「地雷」とされていた実験テーマでした(笑)。 自分は「まあPICマイコンなら比較的得意だし…」ということでそのテーマに希望を出したところ(人気が低いせいか)何のことはなくそのテーマに当たり電卓製作をすることになりました。 その後数多の苦難が待ち受けているとも知らずに…
ちなみに本記事のタイトル画像は、実際に自分が2年生の時に製作した電卓です。実物は大学に寄付してしまったのでもうないですが…
なぜ地雷?
さて、無事(?)希望の実験テーマに当たったわけですが、開始早々軽やかに地雷を踏み抜いたことを知ります。
地雷その1・・・プログラミングはアセンブラで行う
PICマイコンは確かに好きでしたが、アセンブリ言語でやるとなると、ちょっと厄介です。しかし低いレイヤーで活動するエンジニアにとっては機械語やアセンブリ言語をいじった経験があっても悪くないと思うので、納得できました。問題は次です。
地雷その2・・・使える部品の数・種類ともに厳しい制限がある。
うーむ。これは問題です。実験の最後には「各チームとも最低でも加減算ができる2桁電卓を作れ」という課題が出るのですが、「技術があれば多機能4桁表示のものを作ってもよい」となっていました。 もちろん私は「周りが驚くレベルの多機能なものを作ってやろう」と思っていましたが、「トランジスタの使用禁止」など結構使用部品に厳しい制限があり、複数桁表示ですらそう簡単にはいかないことがわかります。これは困った。 しかしそれが面白いのです。だって、厳しい縛りの中、何かを完成させるって、不思議な達成感があるじゃないですか! なんかこう、ダメな子を教育していい学校に合格させるみたいな。
そこで、今回はこの実験を振り返り、同じ条件下で実際にある程度使える4桁電卓を作ってみましょう。 以下にこの実験における条件を示します。
使える部品
さて、「部品縛りありPIC電卓」で使用できる部品の一覧を見ていきましょう。(ようやくタイトル回収)
- PICマイコン 16F84A-20P ・・・ 1つのみ使用可
まあ、マイコンの使用個数が無制限になったら何でもできてしまうので面白くありません。当然と言えるでしょう - TTL ロジックIC 74LS00 ・・・ 使用個数無制限
NANDゲートは理論上あらゆる論理回路を構成できる(完全系)ので、今回はこの石を積極的に「スイッチ」として使うことになりそうです。 - TTL ロジックIC 74LS47 ・・・ 4つまで使用可
7セグメントLEDドライバーです。一応この石の入力を調整すればゼロサプレスやダイナミック表示は割合簡単に実現できますが。ただ、手元に74LS47が1つしかないのでそれじゃあ面白くないので今回は使用個数を一つに制限してしまいましょう。 - 金属皮膜抵抗 220Ω, 330Ω, 470Ω ・・・ 使用個数無制限
なぜ金属皮膜抵抗なのかは不明です。また、なぜ使用可能な抵抗値がこの3つなのかも不明です。プルアップなどを考えると、10kΩとか使いたいですよね?
まあ、実験ではACアダプタで5Vを供給してやったので、消費電力なんて知るか!!ってことで大きな抵抗値でも問題はなかったのでしょう(笑)
今回はカーボン抵抗で代用します。 - セラロック10MHz ・・・ 1つのみ使用可
- アノードコモン7セグメントLED ・・・ 4つまで使用可
今回はたまたま家にあった2桁7セグLEDHDSP-K211を二つ用いることで代用します。 - タクトスイッチ ・・・ 使用個数無制限
大雑把に仕様の決定
まずはゴールを決めます。16F84Aはお世辞にも高性能なマイコンとはいえないので、複数な演算処理はできません。また、I/Oのピン数も著しく少ない(最大13ピン)ので、一つのピンに多くの仕事をさせることになります。そこで、ほしい機能を決めると同時にどの機能を持ったIOならピンの共用が可能かを見ていきましょう。
- 4桁表示
当然、16F84Aのピン数ではスタティック表示はできないので、ダイナミック表示をすることになります。アノードコモンの7セグLEDのカソード側(LEDドライバ)への入力に最低4ピン分IOを使用します。また、点灯する7セグの選択に最低2ピン(2ビットあれば4種類の情報を表せるので)必要になります。 - 最低でも15ボタン
電卓というには、最低でも0~9の数字ボタンに加え、加減乗除及び「=」ボタンの15ボタンは欲しいです。(実験の際には自分のチーム以外で数字ボタンを実装しているチームはありませんでした。数字の選択にはなんと、ボタンを押し続けている間だけカウントアップするようなシステムを用いていました。)
これだけの数のボタンを16F84Aで制御するにはやはり、キーマトリクスを使うしかありません。そして、キーマトリクスのカラム選択には、ダイナミック表示の表示桁選択のIOがそのまま流用できそうです。
以上の二つを今回のゴールとして定めます。 上で言及した「7セグの桁選択およびキーマトリクスのカラム選択」に2ピン、「7セグのカソード側」に4ピンを使用するので残り7ピンが使用可能です。すると、理屈上は4×7で28個のボタンを使用可能になるわけですが…はてさてどうなることやら。
長くなってしまいましたので、今回はここまでとします。(まだ何も言ってない!
次回以降、具体的に回路図を引き製作をしていこうと思います。 お楽しみに。