再びのキッチンスケール(下図)ですが、今度はArduino UNOを使って作ります。
Cmod A7ボード(FPGA)を使って開発している、オリジナル16ビットCPUコアMoscoviumを使ったキッチンスケールの記事が以下です。
「#35-5 キッチンスケール組み立て」
「#35-6 AD変換器HX711を使う」
「#35-7 重量測定」
主たる回路としては、キッチンスケールキットに含まれるAD変換器HX711モジュールとArduino UNOを接続したら完了です。ソフトウェアに実装するゼロ点補正用として、タクトスイッチを1個設けておきます。回路図は以下となります。
HX711モジュールを、ノイズの影響を受け難い5V駆動可能なのはUNOの優位点です。
上に示した回路以外に、表示器としてOLEDディスプレイ/漢字ROMシールド(以下単にOLED/漢字シールド)をUNOへ装着します。参考までに、回路図は以下の通りです。
前回完成させた、OLED/漢字シールド(日本語表示器)を使った応用となります。
最初に示した通り、既にMoscoviumを使ったキッチンスケールを実装済みなので、Blockly for Moscovium版のソフトウェアが存在しています。
従って今回は、BlocklyからArduino IDE(C言語)への移植です。
Blocklyはグラフィカルにブロックを組み立てるビジュアルプログラミング環境なので、テキストベースのソースコードは存在しませんが、C言語などに近い高級言語なので、移植は、さほど難しくないはずです。
元のBlockly版もそうですが、キッチンスケールの表示は「AD変換値:」と「重量[g]:」だけなので、折角の日本語フォント環境があまり活かせない様に思いました(下図)。
そこで、ちょっとした遊び心を発揮して、アラビア数字を漢数字に置き換えて表示するモードを作っておきました。
//#define USE_UI_JP_KDGT // ui: use Japanese KANJI digits
//#define USE_UI_JP_KDGT_D3 // ui: + DAIJI 0~3
//#define USE_UI_JP_KDGT_D9 // ui: + DAIJI 0~9
//#define USE_UI_EN // ui: use English
ついでなので、日本語を使わない英語表示モードも用意してあります。
それぞれ、コメント(//)を外してコンパイルすると有効化されます。ただし、どのオプションを使っても、フォントは漢字ROMから吸い上げるので、UNO用漢字ROMは必須です。
大字(USE_UI_JP_KDGT_D3/D9)は、金融機関などで使われる「一 → 壱」、「二 → 弐」など、改ざんを困難にするなどの目的で、わざと複雑な文字を使う文化です。普通の漢数字と比べて、「日本語フォント使ってますよ感」を醸し出せるため、選択可能としておきました。
アラビア数字 | 0123456789− |
漢数字 | 〇一二三四五六七八九負 |
大字0〜3 | 零壱弐参四五六七八九負 |
大字0〜9 | 零壱弐参肆伍陸漆捌玖負 |
「大字0〜9」なんて、鬼滅の世界(大正)ですよね?慣れるまでは数値として読み取るのが難しいかも?です。なお、マイナス記号(−)は漢数字の「一」と紛らわしいので、「負」と言う漢字に置き換えて表示します。
※ちなみに、漢数字(大字含む)の中では、「肆」だけが第二水準で、他は全て第一水準でした。また、丸い記号(文字)はS-JIS符号範囲に3種類あって、漢数字ゼロ「〇(0x815a)」、白丸記号「○(0x819b)」、大白丸記号「◯(0x81fc)」と、全て異なる文字コードが割り当てられています。
完成したUNO用のキッチンスケールプログラムを以下にリンクします。
完成プログラム:kitchen_scale.ino
コンパイルしてUNOへ書き込むと、シリアルモニタからこちらのコマンドを受け付けています。
移植元としたBlockly for Moscovium版と比べてほぼ同等機能を実装してあります。
校正はシリアルモニタを使う必要がありますが、一度校正してソースコード中の定数に埋め込んでおけば、シリアルモニタ無しで自立します。UNO版はタクトスイッチを追加したので、ゼロ点補正機能(【zero】コマンド)もシリアルモニタ無しで使用可能となっています。
UNOにOLED/漢字シールドを装着して、こちらの回路を接続したら準備完了です。実験中の様子を以下図に示します。
追加したタクトスイッチは、UNOのD4⇔D6間に接続します。敢えて1端子飛ばしている(D5端子)のは、上図の様に2端子タクトスイッチをOLED/漢字シールドのピンソケットに直挿しすることができる設計です。
最初の校正や実験の進め方などは、こちらと同じですのでご参照ください。
加えて、UNOで追加したタクトスイッチによってゼロ点補正機能が発動する事を確かめて見てください。
測定に使う受け皿などの重量を差し引いて、対象物の重量だけを計測するための機能です。
ゼロ点補正機能を使って、緑茶葉大さじ一杯の重さを計量する様子を以下動画に示します。
数字、読めましたか?表示画面(OLEDディスプレイ)が小さい為、PC等の大画面かつ高解像度でご確認ください。0〜3までの大字(漢数字)版なので、日本人には数値が読み取れたはずです。非漢字圏の方にとっては、暗号みたいに見えたかも知れませんね。
大さじ一杯の緑茶葉が8.2gだと判ったのですが、適量は10〜15[g](※)だそうなので、ちょっと少なめですね。大さじ1杯半くらいが適量みたいです。
※撮影後、水だし緑茶🍵を作って、美味しく頂きました(1^−^)d。
今回のUNO版プログラムには、Blockly for Moscovium版プログラムと、ほぼ同等機能を実装しました。良い機会なので、それぞれのプログラムをコンパイルして、プログラムとデータのサイズを比較してみようと思います(下表)。
マイコン | CPU | 開発環境 |
プログラム サイズ[バイト] |
データ サイズ[バイト] |
Arduino UNO | ATmega328 | Arduino IDE (GCC) | 10,470 | 918 |
NHOC113DB9808 | Nihonium | Blockly for Moscovium | 9,512 | 1,004 |
8ビットCPU(ATmega328)のUNOと、FPU持ちで32ビットCPUのNihoniumを比較するのは、どうかと思います。ですが開発環境に目を移すと、方や最適化コンパイラのGCCと、他方最適化なしの自作Blocklyなので、そこそこ良い比較相手ではないでしょうか?
上表の通り、プログラムサイズ/データサイズ共、ほぼ同じと言う結果であり、GCCとBlockly for Moscoviumで差が無かったという事を示しています。満足です。
今回は、OLED/漢字シールドの応用が主たるテーマでしたが、最後にGCCとBlockly for Moscoviumのプログラムおよびコードサイズを比較できたことも収穫でした。