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基板の頒布を開始しました。 »
「電子ボリューム」カテゴリの記事
- MUSES72323 Balanceボリュームの表示機追加について(2022.12.24)
- MUSES72323 バランスボリュームもうじき頒布開始(2022.11.26)
- MUSES72323バランスボリューム基板 進捗(3)(2022.05.14)
- MUSES72323バランスボリューム基板 進捗(2)(2022.05.08)
- MN型ボリュームとは(2022.05.03)
「Arduino」カテゴリの記事
- MUSES72323 Balanceボリュームの表示機追加について(2022.12.24)
- BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(メニュー操作編)(2021.11.27)
- BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(ソフトウェア編)(2021.11.24)
- BlueSnowDACにIRリモコンを増設する方法 Seeeduino XIAO(準備とハードウェア編)(2021.11.23)
- ArduinoによるOLED表示機 電流削減に挑戦してみました(2021.02.21)
コメント
« ArduinoによるOLED表示機の作り方(ソフトウェア編-1) | トップページ | MUSES72323基板の頒布を開始しました。 »
たかじんさん
こんにちは
こちらや関連記事が大変参考になっています。
10年ほど前の、トランジスタ技術/マルツ/Linkmanのコラボ?、と言うのが適切か分かりませんが、LV-1.0というUSBオーディオシステムが最近になって気になっていたところ、デッドストック状態のフルセットを格安で入手することができました。
使用されているUSB-FPGA基板からDAC基板(PCM1795)へのI2S信号はLVDS伝送というのが興味のきっかけなのですが・・・。
完成を楽しみに組み立てたところ、システムマイコン(LPC1343)基板に取り付けられているOLEDが全く表示されません。たまたま持っていた別のLPC1343にLV-1.0のファームウェアを書き込んで換装しても変化はありませんでした。リモコンによる操作は全く問題なく、システムマイコン基板は全体を正常に制御できているようなので、OLEDが自然劣化か何かしらの故障のようです。
(OLEDの信号線に信号が伝わっているかまでは確認していませんが。)
それで、マイコンのファームウェアのソースコードを見ると、電子ボリューム(PGA2311)基板にはSPIでボリューム値を数値で送っているようなので、その値を別のマイコンで、SPI接続して読み取る、あるいはソースコードを書き換えてSerialPrintさせUART受信し、別の画面にボリューム値だけでも表示させようか等、いろいろ検討中です。
受信マイコンの候補の一つとしてXIAOも買ってみました。
一番手っ取り早いのは、頒布していただいた電子ボリューム基板と交換し、表示器をつける方法だと思いますが・・・。
投稿: たーきー | 2022年7月19日 (火) 15時23分
たーきー さん
トラ技に載っていたD級アンプのですね。 結構デザインもよく、センスのよいアンプキットでしたね。
OLEDが故障品だったのでしょうか。 その部分だけサービスパーツとして購入可能か聞いてみるのも良いかもしれません。
SPIを受信して画面に出すというのは、アリといえばアリかもしれません。LV-1.0の画面のところにぴったりなサイズにするのがキモですかね。カラーOLEDよりも液晶の方が選択しが豊富な気もします。
投稿: たかじん | 2022年7月19日 (火) 19時35分
たかじんさん
そのD級アンプのです。なかなか面白いです。
OLEDはすでに廃番でサービスパーツとしての購入はできませんでした。コントローラが同じ「SSD1353」のものを探そうとしても、あまり流通してなかったのか、AliExpressで数点販売しているのみでした。素のOLEDモジュールだけの販売なので、OLEDの電源回路は自作しないといけなくなります。
システム構成、通信方法が異なるため使用できませんが、LV-2.0用であれば、開発に携わった方のHPに、開発責任者の方からの問い合わせを発端に現在も秋月で販売されているTFTに対応したファームウェア、換装手順が記載されていますが、ソースコードは開示されいません。
問い合わせたところ、たまたま手持ちのTFTがあったことと、ラズパイでTFT制御を行っていて手法が分かっていたという偶然が重なり、無償で対応できたそうです。
OLEDに関しては問い合わせが多いのかマルツかLinkmanのサポートページに、「使用してもしなくても寿命は約2年」の記載がありました。
10年前の技術ではそれくらいなのでしょうかね。
事情により、仕事を8月末まで休むことになっていて時間はあるので、ちょっと良い方法の検討を続けようと思います。
投稿: たーきー | 2022年7月20日 (水) 02時16分