"ホビーRPN電卓"の関数電卓化と外装製作
RPN電卓にこだわっていると、選択肢の少なさを感じる。代表的なHPの電卓にもいろいろなバリエーションがあるとはいえ、いずれも関数電卓や金融電卓など高機能なものばかりで、単純な電卓は見当たらない。高機能な電卓はキーが多いため、どうしても大きな筐体に小さなキーが並んだものになってしまう。そこで「キーが大ぶりで軽いタッチ」の電卓としてPC用のテンキーを利用した木製外装のRPN電卓を制作したが、ここでは逆に「使いやすさよりも、小ささを優先したRPN電卓」を指向してみた。ただし、持ち歩いてRPNの便利さを布教する・・ためかどうかはさておき、機能にも妥協したくない。そこで見た目は普通の電卓でありながら、関数電卓機能も搭載してみた。
関数電卓化
この電卓のハードウェアは自分で作ったものではなく、TOKYO FLIP-FLOP から頒布(市販)されているホビーRPN電卓のものを用いている。ただし後述するようにこの電卓はソフトウェア(ファームウェア)をユーザが書き換えられるように出来ており、その方法も案内されている。この電卓は CPU に Arduino の各種基板に多く採用されてきた ATmega328P を、ディスプレイにSSD1306 というポピュラーな制御ICを用いた有機ELディスプレイを用いた、とても素直な設計になっているのもありがたい。下の写真は書き込み用の端子に配線して書き換えした様子である。

オリジナル外装のホビーRPN電卓に書き込み端子を装着し、分数による「誤差なしRPN電卓」ファームウェアを書き込んだもの
ホビーRPN電卓の出荷時のソフトウェアは意図的に簡単に作られているようで、数値表示は1行のみとなっている。しかしディスプレイそのものは128x32ピクセルのグラフィックスディスプレイで、文字だけでなく自由な図形を描画することができる。そこでRPNのスタック表示を2段表示に拡張する(加減乗除のような二項演算のとき、演算対象が両方確認できる、という大きなメリットがある)。さらに計算機能も拡張することにした。
上の写真は、数値を常に分数として取り扱うことで、計算を繰り返しても誤差が全く生じない電卓のコード*1を焼き込んだものである。この電卓もなかなか便利で、加減乗除のキーしかないこの電卓に合っている気もするが、せっかくグラフィック表示できるディスプレイを搭載しているので、関数電卓化にもトライしてみた。
*1 分母・分子とも長さが無制限の整数とし、常に約分しながら演算していく。加減乗除を繰り返しても誤差が蓄積していくことはない。同様のRPN電卓は、ウェブアプリとしても公開している。
関数電卓は普通、各関数に対応したキーがあるが、そのかわりにこの電卓ではキーの長押しを使うことにした。長押しと言っても必要なのはたった0.5秒で、しかし数値の入力などでカチリと押す場合に反応してしまうこともない。具体的には、0〜6のキーを長押しすると、画面の下段に4つのファンクションキーが現れる。このとき、最上段のキー(7, 8, 9, ÷)を押すと、その機能が選ばれて実行される、ということになる。機能の配置は上の通りで、三角関数・逆三角関数と対数・指数関数(底が10, e, y の3種類)を搭載している。加えて平方根と、RPNの演算で便利な SWAP(スタックトップの2個の数値の入れ替え)、DROP(スタックトップの1個の削除)、符号反転、逆数なども搭載した。これらのうち使用頻度が高い機能はほかのキーの長押しでも一発で呼び出せるようにしてある。
操作方法の紹介
さらにこの電卓の特徴として、アンドゥ機能がある。+キーを長押しすると、直前の動作を取り消し、その演算直前のスタック状態に戻すことができる。RPN電卓はスタックを用いて演算を進めるため、各演算過程の状態が明確で、アンドゥ機能を実装しやすく、またユーザにとってもその動作が明快であるという利点がある。ATmega328PのRAM容量の制約(2KB)から、スタックの深さは8段、アンドゥ回数は12回までとしたが、実用上十分な深さと回数になっていると思う。
外装製作
ホビーRPN電卓のオリジナル外装はアクリル板のレーザカットで、中身がよく見えるし、シンプルなガジェット感が好ましいものだと思う。ただやはり側面が空いていることや、基板上の文字が見づらいこともあり、外装を3Dプリンタで制作した。以前も何度かチャレンジしたが、そのときのプリンタは多色プリントに対応していなかったため、文字は穴で表現するしかなく、見やすいとは言えないものであった。それに対し今回は BambuLab P1S のマルチマテリアル機能を活かし、見やすいようにできるだけ大きく文字を入れてみた。文字の大きさは、大きいほどプリントが安定になるというメリット(理由)もある。
3Dプリンタのマテリアルを切り替えて出力しているため、当然、文字はインサート成形のようになっており、プリントのようにかすれる心配はない。表示窓の周囲にも濃い色を付けるとデザイン的にも整ったように思う。全体に厚みは1mm程度であるが、裏蓋にはところどころリブを入れて剛性を高めるようにした。
コードやデータはgithubで公開している。