OBONO’s Diary

へっぽこプログラマの戯言

逆ポーランド電卓

今年初めにこの記事を見て、
「おやカワイイ。自分も作ってみたいな…」と思いつつも、当時は他の事で忙しくて、なかなか手を出せずにいた。

7月に入ってちょっと余裕が出てきたので、AliExpress で 128×32 の OLED を注文。この頃にはソースコードも公開されていたので、aitendo で何かのついでに買った 4×4 キーパッドと、余っている Arduino Nano と組み合わせて動かしてみた。
f:id:OBONO:20210718211124j:plain
おおお、なかなかステキではないか。ただ、これだけのために Arduino を一つ使うのは勿体ないな~という思いもあったりするわけで。


実は、もう一つ注目していた記事があって、
ATtiny85 で逆ポーランド電卓を作っている方がいらっしゃったのだ。analogRead 関数で複数のボタンの状態を判別するというのは Tiny Joypad で経験済みだが、同時押しを気にしなければ10個以上でも判定できるというのは目からウロコだった。
ということで、さらに AliExpress でタクトスイッチをたくさん注文し、事前に計算しておいた抵抗を繋いで回路を組んでみた。
f:id:OBONO:20210809191801j:plain
おお、ちゃんとボタンの判別ができているぞ。スバラシイ。


ここまで来たら、あとは計算の精度を上げるべく電卓ソフトウェアの改修にとりかかる。
そもそも何で float で計算してんの? double にすればいいのに…と思って調べたら、Arduino の世界では基本的に float と double は同じ扱いだという事を知る。な、なんだってー!!
となると、Arduino 界隈ではどうやって高精度の計算をしてるのかといろいろ調べたところ、fp64lib なるライブラリを発見。早速、コイツを導入しようとしたところ、ATtiny85 はサポートしていないと言われてしまった。ナンテコッタイ。
しからば、多倍長精度の演算処理をどこかから移植しようか…とも思ったが、調べているうちに、そこまで一生懸命になる必要はないと冷静に思えるようになり、最終的には、「4バイトの整数型で仮数8桁と符号」と「1バイトの整数型で指数」の5バイトを使ったオレオレ浮動小数点数構造体を定義して、四則演算の処理を自前で実装することにした。

あと、何だかんだでメモリにまだ余裕があるから、スタックが4段だけなんてケチ臭いこと言わずにもっと増やそう、とか、スタックが溢れても何も処理しないなんてイカン、溢れそうだったらこれ以上スタックに積めないようにしよう、とか、いろいろ思いついた改善を盛り込んでみた。
ただ、自分は逆ポーランド電卓の何たるかを全然知らない人間なので、もしかしたらこれらの改善は、逆ポーランド電卓を使いこなしている人からしてみれば余計なお世話なのではないか、そんな気がしないでもない。

何はともあれ、とりあえず逆ポーランド電卓としての体裁は整ったので、ここらで開発を終了。
f:id:OBONO:20210815221647j:plain
回路図とソースコードGitHub で公開した

ちなみに、現状のコードサイズはこんな感じで、それなりに余裕がある。

最大8192バイトのフラッシュメモリのうち、スケッチが4044バイト(49%)を使っています。
最大512バイトのRAMのうち、グローバル変数が228バイト(44%)を使っていて、ローカル変数で284バイト使うことができます。

電卓としてはまだまだ改善の余地があるので、あれもやりたい、これもやりたい…というのはあるのだが、作り込んだところで所詮は自己満足でしかないので、もう終わりにしようっと。