ArduinoによるOLED表示機の作り方(ソフトウェア編-2)
Arduino IDEのインストールとArduino ProMini+OLEDの動作確認が終わったところからの説明になります。
このようにUART信号を受信して、文字を解析、グラフィックを生成してOLEDに表示するというプログラム本体を書きます。
とは言っても、私が作ったものを取り込むだけなので簡単です。
ソースコードは以下からダウンロードしてください。
ダウンロード - oled_disp_promini.zip
これを解凍すると「OLED_disp_promini.ino」というファイルが出てきます。通常だと.cや.cppといった拡張子になるところ.inoという見慣れない拡張子になっています。
中身は単なるテキストファイルです。IDEをインストールすると.inoに関連付けされているのでダブルクリックすればArduino IDEが起動します。IDEの設定情報なども全く入っていない純粋なプレーンテキストなcppファイルです。
OLED確認で使用したHello Worldのいらないコメントアウト行を削除したものに、UART受信をつけてATT値を表示するようにしただけです。
以下の組み合わせの場合ならそのままボードへ書き込んで完成です。
書込み方はこちらをご覧ください。
使用するボード、プロセッサ、シリアルポートの指定が必要です。
ちょっとだけソースコードの解説
Arduino IDEのプログラミング言語は基本的にC++言語ですがmain関数を隠蔽していて、どこからコードが実行されるのかが不透明で判りにくいです。が、慣れですね。
void setup(void)が初期化するときに呼ばれる関数で、void loop(void) がメインループから毎回呼ばれる関数とだけ覚えておくと良いです。
loop()関数内でずっとループさせるのではなく、関数を抜けてもまたすぐに呼ばるものです。
では、そのloop()関数内を見ていきましょう。
Serial.available()
UARTの受信バッファにデータが入っているか確認しているところです。
str = Serial.readStringUntil('\n');
\n(LF)までのデータを読み出しています。
if(Serial.available() > 4)
読みだした直後に、まだ4バイト以上データが残っていたら、読みだした文字データを捨ててloop()を一旦抜けます。
というのも、19200bpsで受信したデータよりもOLEDへ1画面描画する方が遅いので、どんどん受信データが溜まって描画が遅れてしまう現象が発生するからです。
次から次へと上書きされる画面は、どうせ読めないですから受信データを捨てることにしました。
str.toInt()
数字の文字列をint型へ変換しています。
if(data < 250){ // 125dBより大きなデータは破棄
u8g.firstPage();
do {
draw(data);
}while( u8g.nextPage() );
}
ここが画面を描画しているところです。ATTの最大値は111.5dBなのでその2倍の223以上の数値は来ないハズです。が、先ほどの描画遅れの関係か、データが溢れてしまっておかしな表示がでたので、250以上の数値の場合は何もしないようにしました。
それ以外としては
void setBrightness(uint8_t brightness) は OLED表示の輝度設定する関数
void draw(int val) が 画面を描画するためにu8glibグラフィックライブラリを使っているところです。数字を1/2にして「.0」「.5」や「dB」などもここで作っています。もう少しスマートなコーディングがあるとは思うのですが私が書くとこんなものです。悪しからず。
Arduino IDEでシリアルデバッグ
「ツール」->「シリアルモニタ」を開くと
以下のようなWindowが開きます。上側の1行欄に文字を入れて送信ボタンを押すとArduinoのシリアルポートに送信できます。
中央部の大きな欄は受信した文字を表示するところですが、今回はArduinoから送信してきませんので何も出ません。
一番下の欄に通信設定があります。今回は、送信ボタンを押したときに「LF」を付けたいので「LFのみ」を選択します。
あと通信速度ですね。今回は19200bpsです。
「0」を送信するとOLEDに「0.0dB」と表示されるはずです。
「10」なら「-5.0dB」
「-1」なら「MUTE」 と表示されるハズです。
以上でデバッグ完了です。
ハードウェア編のとおり電子ボリューム基板へ接続すればATT値を表示します。
受信するUART信号の仕様
通信仕様:19200bps 8bit ノンパリティ ストップビット1
データ:ASCII文字で0~223。ATT値の2倍の数値。-1 はミュート。
終端文字:\n (LF)
注意事項的なもの
MUSES72323電子ボリューム基板では、可変抵抗の値を読むとき、電源電圧変動などで値がフラつかないようにヒステリシスをつけています。厳密に可変抵抗の位置を出しても「上から下げたとき」「下から上げたとき」「電源をONしたとき」とで、0.5dBほど数値が変わるときがあります。そういう仕様ということでお許しください。
可変抵抗を延長配線で伸ばしたとき、値がチラチラと動くようでしたら外来ノイズを拾っている可能性があります。配線を短くするかノイズが乗らない取り回しにしてください。シールド線を使うのも効果的かもしれません。
MUSES72323電子ボリューム基板にATT値の表示機を付けるのを推奨している訳ではありません。MUSES72323の制御系5V電源から表示機へ電流(27mA)を分け与えることになるので電源ノイズ面では不利になります。通常、MUSES72323とPICとの合計で2~3mA程度の電流なので、表示機の電流がいかに多いかが判ると思います。MUSES72323基板のシャント抵抗R1の調整も必要になります。
以上をご理解いただける方は、表示機をつけてお楽しみください。
にほんブログ村
ブログランキングに参加中です。 めざせ1位!
もしよろしければ「ぽちっと」お願いします。
« ArduinoによるOLED表示機の作り方(ソフトウェア編-1) | トップページ | MUSES72323基板の頒布を開始しました。 »
「電子ボリューム」カテゴリの記事
- ArduinoによるOLED表示機の作り方(ソフトウェア編-2)(2021.02.14)
- ArduinoによるOLED表示機の作り方(ソフトウェア編-1)(2021.02.13)
- Arduino UNOでArduino ProMiniにプログラムを書く方法(2021.02.12)
- ArduinoによるOLED表示機の作り方(ハードウェア編)(2021.02.11)
- MUSES72323コントローラのプログラム変更 ボリューム表示が可能になる?(2021.02.09)
「Aruduino」カテゴリの記事
- ArduinoによるOLED表示機 電流削減に挑戦してみました(2021.02.21)
- ArduinoによるOLED表示機の作り方(ソフトウェア編-2)(2021.02.14)
- ArduinoによるOLED表示機の作り方(ソフトウェア編-1)(2021.02.13)
- Arduino UNOでArduino ProMiniにプログラムを書く方法(2021.02.12)
- ArduinoによるOLED表示機の作り方(ハードウェア編)(2021.02.11)
« ArduinoによるOLED表示機の作り方(ソフトウェア編-1) | トップページ | MUSES72323基板の頒布を開始しました。 »
コメント