Select Your Language

免責事項

  • 本サイトの情報の利用、内容、サービスによって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします。

    本サイトで頒布している基板およびキットは、技術者、またはそれに準ずる電気的知識をお持ちの電子工作ファンの方のためのものです。一般のオーディオファンの方のためのものではありません。
    また、頒布基板およびキットは、いかなる条件でも動作を保証するものではございませんので、あらかじめご了承ください。

    電子工作では、火傷、感電、火災などの可能性があります。十分に注意をして作業して下さい。

    営利目的のご使用は認めておりません。 記事の転載や、基板・キットの商用利用の方は、ご連絡ください。学生やサークルの学習目的でまとめてご購入する場合は特別価格でご提供させていただきます。

スポンサー

無料ブログはココログ

« ArduinoによるOLED表示機の作り方(ソフトウェア編-1) | トップページ | MUSES72323基板の頒布を開始しました。 »

2021年2月14日 (日)

ArduinoによるOLED表示機の作り方(ソフトウェア編-2)

Arduino IDEのインストールとArduino ProMini+OLEDの動作確認が終わったところからの説明になります。

ハードウェア編 はこちら
ソフトウェア編-1はこちら

Aruduino12

このように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_ide21

 

以下の組み合わせの場合ならそのままボードへ書き込んで完成です。

 

書込み方はこちらをご覧ください。

Uno_promini03

使用するボード、プロセッサ、シリアルポートの指定が必要です。

 

 

ちょっとだけソースコードの解説

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でシリアルデバッグ

「ツール」->「シリアルモニタ」を開くと

Arduino_ide22

以下のようなWindowが開きます。上側の1行欄に文字を入れて送信ボタンを押すとArduinoのシリアルポートに送信できます。

Arduino_ide23

中央部の大きな欄は受信した文字を表示するところですが、今回は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の調整も必要になります。

以上をご理解いただける方は、表示機をつけてお楽しみください。

 

 

 

にほんブログ村 PC家電ブログ PCオーディオへ にほんブログ村

ブログランキングに参加中です。 めざせ1位! 

もしよろしければ「ぽちっと」お願いします。 

« ArduinoによるOLED表示機の作り方(ソフトウェア編-1) | トップページ | MUSES72323基板の頒布を開始しました。 »

電子ボリューム」カテゴリの記事

Aruduino」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« ArduinoによるOLED表示機の作り方(ソフトウェア編-1) | トップページ | MUSES72323基板の頒布を開始しました。 »

サイト内検索

Sponsors link

2021年5月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31