« tweet埋め込みのテスト | トップページ | 自作電卓ならではの着せ替え遊び »

2021/01/13

ATtiny85でRPN電卓を作ってみました(2021/06/19追記)

お正月早々、Twitterのタイムラインに衝撃的な記事が流れてきました:

今を遡ること27年前、1994年にHP 100LXを買ってnifty-serve FYHP(後のFHPPC)でRPN(逆ポーランド記法)を教わったことから単体の電卓もHP-42Sを入手して使いだし、もう「普通の(数式通り入力の)電卓」が使えない体になっています。
ただ、日常的に使っているのは四則演算だけなので、HP電卓はサイズも機能もオーバーだと思う気持ちはありました。また、古典とも言える徳田雄洋・村井宗二著「カッコのない国」が昨年3月に電子化されたのを機に20数年ぶりに再読了して、あらためてRPNを意識していたところでもあり、なおさら上記DPZの記事が刺さったわけです。

さて、
自分でも作ってみようかなと思って調べてみたところ、色々と情報が見つかりました。
まず、ArduinoによるRPN電卓スケッチはGitHubにいくつかあり、この中で次のものが機能豊富でソースも読みやすいと思いました:
zooxo/arc: Arduino RPN Calculator
また、電卓のキーと言えばマトリックス方式が多いと認識していたのですが、ADC一発でキー読み取りできる方法をまとめ、さらに、抵抗値の計算からサンプルスケッチまでwebアプリで公開されている方がいらっしゃいました:
I/Oピン一つで読めるキーパッドの設計サービス - しなぷすのハード製作記

これらを眺めていたところ、そもそもRPNは高度な関数を使わない限りメモリ消費が少ないですし、必要なI/O数も少ないのならATtiny85で作れるかも、そうしたらタブレット菓子のケースにでも収まるかも、とコンセプトが固まってきて、トライしてみた次第です。

前置きが長くなりましたが、外観はこんな感じになりました(1/14にラベルを作り直して写真を差し換えました)。
Tinyrpn1
タクトスイッチのキーがプチプチと気持ちいいです。表示は10^-3未満と10^6以上は指数部を3の倍数で区切る(小さい方はマイクロ・ナノ・ピコ…、大きい方はメガ・ギガ・テラ…に合わせて技術者が使いやすくする)ENGモードにしています。
ここでENGモードにこだわったことがフラッシュ(プログラムメモリ)を消費して、最終的にATtiny85の8192byteのうち8182byteを使ってギリギリ入りました。これが仮数部桁数固定のSCIモードだと6402byteと余裕です(Δ1780byte)。
Tinyrpn3
動作電流は約7mAで、2分間キー入力が無ければオートパワーオフで0.4μAに落ちるようにしました。ATtiny85は外部割り込みINTが1つしかなく、そのピンがI2CのSCLとバッティングしているので、ピン変化割り込みPCINTを初めて使ってみました。この部分については、東京お気楽カメラさんの記事がとても参考になりました。あと、ATtiny85自体の使い方やLCDの駆動周りは暑さ指数計を作ったときのメモが役に立ちました。

結果としてできた回路図は、次の通り:
Tinyrpn4sch
スケッチ(プログラム)はGitHubにアップしてあります。

ケースは大きい方のMINTIAの、美味しい上に色味がいいフレッシュピーチを採用しました。左上のボタンはリセットスイッチです。
Tinyrpn2

中身を見ていきます。タブレット取り出し口に指を掛けてケースをパカッと開きます。
Tinyrpn5
今回、先日入手したLi-Po電池を使ってみました。左上にあるのがTP4056というICを使った充電モジュールで、こちらの記事が参考になりました:
中国製 TP4056 Li-ion バッテリー充電基板を試す
右の上方に液晶の裏面があり、SOP品のATtiny85とリセットスイッチをサブボードに載せて小亀実装しています。あちこちにある白い樹脂は消しゴムを切って作ったスペーサーです。
右の下方がキーパッドの裏面です。キーの方にノイズが乗ると読み取りエラーが出る可能性があるので、キーの入口にパスコンを置いています。

キーパッドの表側には、スイッチと分圧抵抗が並んでいます。スイッチを密に並べるため、タクトスイッチは2端子だけ使いました。
Tinyrpn6
最終的なBOMは次の通りで、合計1449円でした。電線・ハンダ・ラベル・テープはカウントしていません:
itemdetailpricepcssubtotal
AVRATTINY85-20SUR1201120
LCDAE-AQM08026001600
ChargerTP4056 module26126
Li-Po1200mAh2101210
MINTIA BREEZEFRESH PEACH2101210
Electrolytic C47uF10110
R 1/6W 5%listed below11818
Tactile SWex.1020200
keypad subs.D-type universal40140
AVR subs.pitch converter1501/1015
Resister list:
100x1, 220x3, 470x2, 1kx3, 2.2kx2, 4,7kx3, 10kx2, 22kx1, 100kx1

無事にできたところで、私の持っているRPN電卓たちと集合写真を撮っておきました。あと、48SXもあるのですが、ぱっと取り出せるところにありませんでした…
Tinyrpn7
また、作りながら何か既視感があったのですが、Willcomのnico.になんとなく似ています。
Tinyrpn8

以上、思ったとおりのものができて満足しています。といいつつ、すぐ何かしたくなるんだろうな…
参考になれば幸いです。

パドラッパ from MacBook Air (2017)

【2021/01/17追記】
ケースを着せ替えて遊んでいます。よろしければご笑覧下さい。

【2021/03/06追記】
・その後HP 200LXのキーを使ったものも作っていて、いま常用しているのはこちらです。
・DPZの記事を書かれた斎藤さんがソースと回路図をGitHubにアップして下さいました。

【2021/06/19追記】
次の2点についてバグレポートを頂き、修正したものをGitHubにアップしました。ついでに変数・コメント等も手直ししています:
1. 8文字入力すると、バックスペースが利かない
2. SCIモードで大きい数(5桁程度以上)を入れると動作がおかしくなる
この2.については、FIXモードでも同じ問題がありました。いずれも文字変数の領域確保不足でした。

| |

« tweet埋め込みのテスト | トップページ | 自作電卓ならではの着せ替え遊び »

コメント

コメントを書く



(ウェブ上には掲載しません)




« tweet埋め込みのテスト | トップページ | 自作電卓ならではの着せ替え遊び »