前回の続きです。
AVRで活用できるようになった「大きな電卓」を電卓として復活させるためスケッチ作成に取り組んできましたが、やっと完成しました。
液晶画面が16桁あるのでこの桁数をフルに利用する電卓を作っていたのですが、これが結構大変でした。ATmega328Pで使える実数は内部32ビットのfloat(doubleも同じ精度)しか無いのでとても16桁の実数を扱えません。電卓で浮動小数点表示を使うのも嫌なので、整数で演算して小数は自前で処理することにしました。
Arduinoで扱える整数のうち最大なのは内部64ビットのlong long(long long int)なのですが、sprintfなど表示関連のライブラリで正しく表示してくれません。なので内部32ビットのlong×2個の変数で16桁を扱ってみました。この場合、加算と減算はそれほど難しくないのですが、乗算と乗算の処理がかなり大変でした。筆算に近い方法で処理してみたのですが、桁をずらしての計算とか、除算の商と余りの処理などコードが肥大化する上に処理時間も馬鹿になりません。
そのためlong×2個はあきらめて、計算はlong longで行い表示の時にlongx2に変換するという方式に変更しました。表示周りの処理は面倒になってしまいましたが、除算以外の演算処理は簡単になりました。
完成したスケッチがこちらです。
DigitClass.h
ATmega328BigCalc.ino
※アップデートしました。こちらを参照下さい。
このスケッチは「大きな電卓」を逆ポーランド方式の電卓にします。通常の電卓では内部で使われていて意識することがないスタックを活用する電卓なので初めて使うときは戸惑いますが、なれるとすごく使いやすい電卓になります。
数値をスタックに入れるには"="キーを押します。スタックは5段まで用意してありますが、スケッチの
#define STACK 5
のところを好きな数に書き換えて変更することが出来ます。
数値は16桁まで扱えますが、マイナスや小数点表示があると最大で14桁までしか表示できません。
普通の電卓と違って"."や"-"も1文字になってしまうのがややこしいですね。演算結果が16桁を越えたときはエラーが表示されます。このときはACキーを押してエラー表示画面から抜けます。
割り算のときだけ、演算後に少数以下の数値が続くときは画面に表示できる範囲まで表示して、残りは切り捨てます。また、当然ですが0で除算するとエラーが表示されます。
この電卓はキーが沢山あるのですが、M+やM-とかGTなどのメモリー関連のキーはスタックを利用する逆ポーランド電卓には必要ありません。その代わりMRCはスタックを含めた全ての数値の消去に、GTは入力した数値の+−の切り替えに使うことにしました。M+とM-は使いません。将来の機能拡張用です。
その他、ACは入力した数値の消去、→は入力した数値から1桁削除にしました。
%はパーセントを求めます。スタックにパーセントを求めたい数値を積んで、パーセント数を入力したら%キーを押します。このとき通常の計算と違って、スタックに積んだ数を取り出しません。この後+を押せば税込みなどの値を求めるのに使えますし、-を押せば計算したパーセント分を引いた数値を求めたりするのに便利だからです。
今のところ目立ったバグは見つかっていません。手元に16桁を扱える電卓がないので12桁まで扱える関数電卓で検算した範囲では、計算上の問題はなさそうでした。
ただし、この電卓のキーマトリックスが変則的なので、複数キーの同時押しをしてしまうと想定と違うキー入力になることがあります。
スケッチの電卓処理に必要な定義とコードはなるべく一箇所にまとまるように記述したので、表示とキー入力の部分だけを変更すれば他のデバイスに移植するのはそれほど手間ではないと思います。前に作った赤外線リモコンに簡易電卓機能をのせていたので、これを今回の物に置き換えてみようと考えています。
この「大きな電卓」はデバイスとして魅力的なので、また後で電卓以外の機能も追加していきたいと思います。
最新の画像[もっと見る]
- 2025 福箱に入っていたお楽しみ袋 10時間前
- 2025 福箱に入っていたお楽しみ袋 10時間前
- 2025 福箱に入っていたお楽しみ袋 10時間前
- 2025 福箱に入っていたお楽しみ袋 10時間前
- 2025 秋月電子通商 八潮店 福箱 1日前
- 2025 秋月電子通商 八潮店 福箱 1日前
- 2025 秋月電子通商 八潮店 福箱 1日前
- 2025 秋月電子通商 八潮店 福箱 1日前
- 2025 秋月電子通商 八潮店 福箱 1日前
- 2025 秋月電子通商 八潮店 福箱 1日前
※コメント投稿者のブログIDはブログ作成者のみに通知されます