音楽之友社のムック本付録のラックスマンFMチューナーキットにArduino Nano、OLEDとu8gライブラリを使って受信中のFM局名を表示するプチ改造を行いました。FM局名を表示することでアナログ感のあるチューニングダイヤルの使い勝手が少しアップです。
受信中のFM局名を表示できれば便利かも
パネル前面のチューニングダイヤルを廻して選局するタイプはアナログ感があって良いのですが、受信中のFM局名を表示できないか思案しました。
このFMチューナーキットはDSP(Digital Signal Processing)方式で、受信機としての心臓部はプリントパターン面に実装されているラジオIC:4831 B30 GU。ケース前面パネルから見える真空管12AU7はラジオICからのステレオ信号の増幅とハーモライズする役目を担っていると思われます。
チューニングにはケース前面パネルのダイアルとつながる100kΩのボリューム(可変抵抗)が使われています。このボリュームをよく見ると、2つのボリュームが連結された2連構造となっていますが、パネル側のボリュームは未配線です。
この未配線側のボリュームを使います。プリントパターン両端の(1)(3)間に5Vを印可すると、可変部の端子(2)の電圧は回転角に応じて分圧(0~5V)されます。
この電圧値をArduinoのADコンバータで読み取り、ステレオ受信できた時にFM局の名称をOLEDディスプレイに表示します。
受信周波数表示ではありませんが、FM局名が表示されれば選局の目安になります。
ArduinoのAD変換、analogRead()
Arduino UnoやNanoには、10ビットのADコンバータにつながるアナログ入力ポート(UnoはA0~A5、NanoはA0~A7)を持っており、本体のみで0~5Vの電圧測定ができます。
Arduino公式サイトのドキュメントにArduinoシリーズの分解能を纏めた表があります。10ビットのADコンバータを持つArduinoシリーズのanalogRead()関数は、読み取った値を0~1023の整数値(1024単位)で返します。アナログ入力電圧は0~5Vなので、1単位当たりの電圧は、5(V) / 1024(単位) = 0.0048828125(約4.9mV)です。
https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/
準備したパーツと組み立て(2022/01/22更新)
前面パネル右側の真空管が見えるアクリル窓の内側に実装したかったので、小型のOLEDモジュールと Arduino Nano互換ボードを使いました。OLEDは素子そのものが発光するのでバックライトがなくモジュールが薄くできています。
# | パーツ | 仕様 | 個数 |
1 | ELEGOO Nano互換ボード | CH340/ATmega328P ※PCとの接続にはmini-BのUSBケーブルが必要 | 1 |
2 | 0.96インチ OLEDモジュール | 128 x 64 SSD1306チップ I2C接続 ※4線が接着したジャンパーワイヤが2組付属 | 1 |
3 | ジャンパーワイヤ | ・メス-メス:Nano互換ボードとOLED間の結線に利用 ・メス-オス:Nano互換ボードと基板間の結線に利用、 オス側はピンを切断してはんだ付け ・プリントパターンGNDとボリューム(1)間の結線 | 適量 |
4 | 固定用バンド | 結束バンドベース、結束バンド、布絶縁テープ | 適量 |
LXV-OT8基板裏面のボリュームのプリントパターン(1)(2)(3)から引き出した配線をNano互換ボードのGNDピン、A0ピン、5Vピンに、電源スイッチがオンになった後の電源パターン(12VとGND)から引き出した配線をNano互換ボードのVinピンとGNDピンに接続します。GNDは共通として配線数を減らします。Vinピン入力が12Vと電圧が高いので配線ミスが無いように注意します。
OLEDモジュールとNano互換ボードはI2Cで接続。OLEDモジュールのVcc、GND、SCL、SDAの4線をNano互換ボードの3V3ピン、GNDピン、A5ピン、A4ピンにつなぎます。Nano互換ボードへのピン配線のみ(ブレッドボード無し)でワイヤ接続が完了しました。
LXV-OT8ケースにOLEDディスプレイを組み込んで動作確認
Nano互換ボードと配線ワイヤは、背面パネルの2箇所に接着した結束バンドベースに電極端子がプリント基板のパーツに接触しないように離して結束バンドで固定。OLEDディスプレイは薄くて軽いので、黒色の布絶縁テープで前面パネル右側の真空管が見えるアクリル窓の内側に仮固定しています。しばらく使ってみてOLEDディスプレイの見やすさに問題ないようであればグルーガンで固定予定です。
前面パネルのチューニングダイヤルを回すとOLEDディスプレイにFM局名が表示されるので使い勝手が少しアップしました。
電圧の読み取り値をFM局名に変換してOLEDに表示するスケッチ
analogRead()値のレンジ設定
チューニングダイヤルを廻しながら、橙色のランプが点灯(ステレオ受信)するanalogRead()値のレンジと受信中のFM局名をメモします。今回のレンジ設定は橙色のランプが点灯するステレオ受信範囲としましたが、モノラルでも聞こえ始めた時点から幅広くレンジ指定した方がチューニングダイヤルを速く廻したときの追従がもっと容易かもしれません。
NORMAL/WIDE切替には未対応です(こちらの記事で対応しました@2022/06/26追加)。
なお、ケーブルTVのFM波再送信を受信しているので、東京タワーや東京スカイツリーなどFM局の送信所からの送信周波数とはレンジが異なっています。
# | FM局 | ステレオ受信時の analogRead() レンジ | 電圧換算 中央値(Ⅴ) |
1 | bayfm | 80 ~ 110 | 0.42 |
2 | NACK5 | 136 ~ 150 | 0.72 |
3 | TOKYO FM | 190 ~ 202 | 0.95 |
4 | NHK横浜-FM | 226 ~ 236 | 1.14 |
5 | J-WAVE | 366 ~ 382 | 1.83 |
6 | NHK東京-FM | 512 ~ 528 | 2.52 |
7 | Fm yokohama | 582 ~ 616 | 2.90 |
8 | InterFM897 | 710 ~ 728 | 3.52 |
レンジ設定に対応するFM局名をOLEDに日本語で表示(2022/01/19更新)
OLED画面の上段左にチャンネルに紐づけたNo(1~8)、その横にanalogRead値(0~1023)、下段にFM局名の表示を割り当てます。
Andiunoはメモリ領域が小さく高解像度の日本語フォントセットの格納が難しいので、漢字を含むFM局名は128X30ピクセルの画像データとしてu8g.drawXBMP()で表示しました。
漢字を含まないFM局名でも文字数に応じて最適なサイズの英数フォントセットを多く使いすぎるとArduinoのメモリ領域を圧迫するので、6文字以上のFM局名も128X30ピクセルの画像データとして表示。 5文字以下のFM局名、チャンネルに紐づけたNo、analogRead値は、英数フォントセット u8g_font_fub25 を使っています。
画像データはWindows標準アプリのペイント3Dで作ったFM局名のビットマップ画像(BMP)を128X30ピクセルに整形した後、BMPからHEXデータに変換しています。 BMPからHEXデータへの変換にはProgramResource.netサイトの「nfBmptoHex.exe」を利用させていただきました。
OLEDモジュール表示に必要なライブラリ「U8glib.h」は、Arduino IDEメニューの ツール –> ライブラリの管理 からライブラリマネージャで「U8glib」を検索してインストールします。
u8g.setFont()で使うフォント見本は fontsize | olikraus/u8glib を参考にさせていただきました。
arduino_lxv-ot8_fm_lcd.ino
※ここをクリックするとコード表示を開閉できます。
#include <U8glib.h>
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST);
int analog_pin = A0; // アナログ入力ポートの番号
int analog_value = 0; // 読み取り値を格納する変数
int vol_value = 0; // 電圧換算値を格納する変数
// FM局名(128x30BMP)画像から変換したHEXデータ
const unsigned char nhkyokohamafm[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xE7, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xE7, 0x60, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x70, 0x38, 0x70, 0x38, 0x70, 0x9C, 0xFF, 0xF3, 0xFC, 0x0F, 0x00, 0xFC, 0xC7, 0x01, 0x0E, 0x78, 0x70, 0x38, 0x70, 0x38, 0x78, 0x9C, 0xFF, 0xE3, 0xFD, 0x07, 0x00, 0xFE, 0xCF, 0x03, 0x0F, 0xF8, 0x70, 0x38, 0x70, 0x38, 0x3C, 0x9C, 0xE7, 0xC1, 0x7D, 0x00, 0x00, 0xFE, 0xCF, 0x03, 0x0F, 0xF8, 0x70, 0x38, 0x70, 0x38, 0x3C, 0x3E, 0xE7, 0xC0, 0x1C, 0x00, 0x00, 0x1E, 0xC0, 0x03, 0x0F, 0xF8, 0x70, 0x38, 0x70, 0x38, 0x1E, 0x3F, 0xE7, 0x00, 0x1C, 0x00, 0x00, 0x1E, 0xC0, 0x87, 0x0F, 0xF8, 0x71, 0x38, 0x70, 0x38, 0x0E, 0xFF, 0xFF, 0x33, 0xFC, 0x1F, 0x00, 0x1E, 0xC0, 0x87, 0x0F, 0xF8, 0x71, 0x38, 0x70, 0x38, 0x0F, 0xDE, 0xFF, 0x73, 0xFC, 0x1F, 0x00, 0x1E, 0xC0, 0x87, 0x0F, 0xF8, 0x73, 0x38, 0x70, 0x38, 0x07, 0xDC, 0xFF, 0xF3, 0xFC, 0x1F, 0x00, 0x1E, 0xC0, 0xC7, 0x0F, 0xB8, 0x73, 0x38, 0x70, 0xB8, 0x07, 0x1C, 0x18, 0xE0, 0x1C, 0x0E, 0x00, 0x1E, 0xC0, 0xCF, 0x0E, 0xB8, 0x73, 0x38, 0x70, 0xF8, 0x03, 0x9C, 0xFF, 0xE1, 0x1C, 0x0E, 0x00, 0xFE, 0xC7, 0xCE, 0x0E, 0x38, 0x77, 0xF8, 0x7F, 0xF8, 0x03, 0xFE, 0xFF, 0x41, 0x1C, 0x0E, 0x00, 0xFE, 0xC7, 0xEC, 0x0E, 0x38, 0x77, 0xF8, 0x7F, 0xF8, 0x03, 0xFE, 0x99, 0x01, 0x1C, 0x0E, 0x7F, 0xFE, 0xC7, 0x7C, 0x0E, 0x38, 0x7F, 0xF8, 0x7F, 0xF8, 0x07, 0xBE, 0x99, 0x41, 0x1C, 0x0E, 0x7F, 0x1E, 0xC0, 0x7C, 0x0E, 0x38, 0x7E, 0x38, 0x70, 0xF8, 0x07, 0x9F, 0xFF, 0xC1, 0x1D, 0x0E, 0x7F, 0x1E, 0xC0, 0x78, 0x0E, 0x38, 0x7E, 0x38, 0x70, 0x38, 0x0F, 0x9F, 0xFF, 0xC1, 0xFF, 0x3F, 0x7F, 0x1E, 0xC0, 0x78, 0x0E, 0x38, 0x7C, 0x38, 0x70, 0x38, 0x0F, 0x9F, 0x99, 0xE1, 0xFE, 0x3F, 0x00, 0x1E, 0xC0, 0x38, 0x0E, 0x38, 0x7C, 0x38, 0x70, 0x38, 0x1E, 0x9D, 0x99, 0xE1, 0xFE, 0x3F, 0x00, 0x1E, 0xC0, 0x30, 0x0E, 0x38, 0x7C, 0x38, 0x70, 0x38, 0x1E, 0x9D, 0xFF, 0xE1, 0x18, 0x03, 0x00, 0x1E, 0xC0, 0x00, 0x0E, 0x38, 0x78, 0x38, 0x70, 0x38, 0x3C, 0x9C, 0xFF, 0x61, 0x3C, 0x07, 0x00, 0x1E, 0xC0, 0x00, 0x0E, 0x38, 0x78, 0x38, 0x70, 0x38, 0x3C, 0x1C, 0xC3, 0x70, 0x1E, 0x0F, 0x00, 0x1E, 0xC0, 0x00, 0x0E, 0x38, 0x70, 0x38, 0x70, 0x38, 0x78, 0xDC, 0xE3, 0x73, 0x1F, 0x3E, 0x00, 0x1E, 0xC0, 0x00, 0x0E, 0x38, 0x70, 0x38, 0x70, 0x38, 0x78, 0xFC, 0xC3, 0xF7, 0x0F, 0x3C, 0x00, 0x1E, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x81, 0x33, 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
const unsigned char nhktokyofm[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x38, 0x1C, 0x78, 0x3C, 0x78, 0xFF, 0xFF, 0xE3, 0xFF, 0x7F, 0x00, 0xF8, 0x3F, 0x0F, 0x78, 0x3E, 0x38, 0x1C, 0x78, 0x3C, 0x38, 0xFF, 0xFF, 0xE3, 0xFF, 0x7F, 0x00, 0xF8, 0x3F, 0x0F, 0x7C, 0x3E, 0x38, 0x1C, 0x78, 0x3C, 0x3C, 0xFF, 0xFF, 0xE3, 0xFF, 0x7F, 0x00, 0xF8, 0x3F, 0x0F, 0x7C, 0x7E, 0x38, 0x1C, 0x78, 0x3C, 0x1C, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x1F, 0x7C, 0x7E, 0x38, 0x1C, 0x78, 0x3C, 0x1E, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x1F, 0x7C, 0x7E, 0x38, 0x1C, 0x78, 0x3C, 0x0E, 0xFC, 0xFF, 0xC1, 0xFF, 0x1F, 0x00, 0x38, 0x00, 0x1F, 0x7E, 0xFE, 0x38, 0x1C, 0x78, 0x3C, 0x0F, 0xFC, 0xFF, 0xC1, 0xFF, 0x1F, 0x00, 0x38, 0x00, 0x1F, 0x7E, 0xFE, 0x38, 0x1C, 0x78, 0x3C, 0x07, 0x9C, 0xC7, 0xC1, 0xFF, 0x1F, 0x00, 0x38, 0x00, 0x3F, 0x7E, 0xEE, 0x39, 0x1C, 0x78, 0xBC, 0x07, 0x0C, 0xC7, 0xC1, 0x01, 0x1C, 0x00, 0x38, 0x00, 0x3F, 0x7F, 0xCE, 0x39, 0x1C, 0x78, 0xBC, 0x03, 0xFC, 0xFF, 0xC1, 0x01, 0x1C, 0x00, 0xF8, 0x1F, 0x37, 0x7F, 0xCE, 0x39, 0xFC, 0x7F, 0xFC, 0x01, 0xFC, 0xFF, 0xC1, 0x01, 0x1C, 0x00, 0xF8, 0x1F, 0x77, 0x7B, 0xCE, 0x3B, 0xFC, 0x7F, 0xFC, 0x01, 0xFC, 0xFF, 0xC1, 0x01, 0x1C, 0x00, 0xF8, 0x1F, 0xF7, 0x7B, 0x8E, 0x3B, 0xFC, 0x7F, 0xFC, 0x03, 0x0C, 0xC7, 0xC1, 0xFF, 0x1F, 0xFE, 0xF8, 0x1F, 0xF7, 0x7B, 0x8E, 0x3B, 0xFC, 0x7F, 0xFC, 0x07, 0x1C, 0xC7, 0xC1, 0xFF, 0x1F, 0xFE, 0x38, 0x00, 0xE7, 0x79, 0x8E, 0x3F, 0x1C, 0x78, 0xFC, 0x07, 0xFC, 0xFF, 0xC1, 0xFF, 0x1F, 0xFE, 0x38, 0x00, 0xE7, 0x79, 0x0E, 0x3F, 0x1C, 0x78, 0xBC, 0x07, 0xFC, 0xFF, 0x01, 0xF2, 0x06, 0xFE, 0x38, 0x00, 0xE7, 0x79, 0x0E, 0x3F, 0x1C, 0x78, 0x3C, 0x0F, 0xE0, 0x1F, 0x00, 0x72, 0x06, 0x00, 0x38, 0x00, 0xC7, 0x79, 0x0E, 0x3E, 0x1C, 0x78, 0x3C, 0x0F, 0xE0, 0x1F, 0x00, 0x77, 0x0F, 0x00, 0x38, 0x00, 0xC7, 0x78, 0x0E, 0x3E, 0x1C, 0x78, 0x3C, 0x1E, 0xF0, 0x3F, 0x80, 0x77, 0x0E, 0x00, 0x38, 0x00, 0x07, 0x78, 0x0E, 0x3E, 0x1C, 0x78, 0x3C, 0x1E, 0xF8, 0x7F, 0x80, 0x73, 0x1E, 0x00, 0x38, 0x00, 0x07, 0x78, 0x0E, 0x3C, 0x1C, 0x78, 0x3C, 0x3C, 0x7E, 0xF7, 0xC1, 0x71, 0x3C, 0x00, 0x38, 0x00, 0x07, 0x78, 0x0E, 0x3C, 0x1C, 0x78, 0x3C, 0x3C, 0x3F, 0xE7, 0xE7, 0x71, 0x78, 0x00, 0x38, 0x00, 0x07, 0x78, 0x0E, 0x3C, 0x1C, 0x78, 0x3C, 0x78, 0x0F, 0xC7, 0xF7, 0x7C, 0x70, 0x00, 0x38, 0x00, 0x07, 0x78, 0x0E, 0x38, 0x1C, 0x78, 0x3C, 0xF8, 0x07, 0x87, 0x77, 0x7C, 0x70, 0x00, 0x38, 0x00, 0x07, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x22, 0x7C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
const unsigned char fmyokohama[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0xCF, 0x03, 0x1C, 0x0C, 0x0F, 0xC6, 0xE1, 0xC3, 0x3D, 0xFC, 0x70, 0xCF, 0xC3, 0x0F, 0x1C, 0xF0, 0xFF, 0x07, 0x1C, 0x8E, 0x1F, 0xC6, 0xF1, 0xC7, 0x7F, 0xFC, 0xF1, 0xFF, 0xC7, 0x1F, 0x1C, 0xF0, 0xFF, 0x07, 0x18, 0xCE, 0x3F, 0xC6, 0xF0, 0xC7, 0x7F, 0xFC, 0xF1, 0xFF, 0xC7, 0x1F, 0xFC, 0x73, 0x3C, 0x07, 0x18, 0xC6, 0x39, 0xE6, 0x38, 0xCE, 0x71, 0x84, 0xF3, 0x3C, 0x47, 0x38, 0xFC, 0x73, 0x1C, 0x07, 0x38, 0xE6, 0x30, 0xE6, 0x38, 0xCE, 0x71, 0x80, 0x73, 0x1C, 0x07, 0x38, 0xFC, 0x73, 0x1C, 0x07, 0x38, 0xE6, 0x70, 0x76, 0x18, 0xCC, 0x61, 0x80, 0x73, 0x1C, 0x06, 0x38, 0x1C, 0x70, 0x1C, 0x06, 0x38, 0xE7, 0x70, 0x76, 0x18, 0xCC, 0x61, 0xE0, 0x73, 0x1C, 0x06, 0x3E, 0x1C, 0x70, 0x1C, 0x06, 0x30, 0xE3, 0x70, 0x7E, 0x18, 0xCC, 0x61, 0xF8, 0x73, 0x1C, 0x86, 0x3F, 0x1C, 0x70, 0x1C, 0x06, 0x30, 0xE3, 0x70, 0x7E, 0x18, 0xCC, 0x61, 0xFC, 0x73, 0x1C, 0xC6, 0x3F, 0x1C, 0x70, 0x1C, 0x06, 0x70, 0xE3, 0x70, 0x7E, 0x18, 0xCC, 0x61, 0x8E, 0x73, 0x1C, 0xE6, 0x38, 0x1C, 0x70, 0x1C, 0x06, 0xF0, 0xE3, 0x70, 0xEE, 0x18, 0xCC, 0x61, 0x8E, 0x73, 0x1C, 0xE6, 0x38, 0x1C, 0x70, 0x1C, 0x06, 0xE0, 0xE3, 0x70, 0xE6, 0x38, 0xCE, 0x61, 0x8E, 0x73, 0x1C, 0xE6, 0x38, 0x1C, 0x70, 0x1C, 0x06, 0xE0, 0xC1, 0x39, 0xC6, 0x38, 0xCE, 0x61, 0x8E, 0x73, 0x1C, 0xE6, 0x38, 0x1C, 0x70, 0x1C, 0x06, 0xE0, 0xC1, 0x3F, 0xC6, 0xF1, 0xCF, 0x61, 0xFE, 0x73, 0x1C, 0xE6, 0x3F, 0x1C, 0x70, 0x1C, 0x06, 0xE0, 0xC1, 0x3F, 0xC6, 0xF1, 0xC7, 0x61, 0xFE, 0x73, 0x1C, 0xE6, 0x3F, 0x1C, 0x70, 0x1C, 0x06, 0xE0, 0x81, 0x1F, 0x86, 0xE3, 0xC3, 0x61, 0xBC, 0x73, 0x1C, 0xC6, 0x3B, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
const unsigned char interfm897[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xE7, 0x01, 0x0E, 0x78, 0x00, 0x1E, 0xF8, 0x3F, 0xFE, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFE, 0xE7, 0x01, 0x0F, 0xFC, 0x81, 0x3F, 0xF8, 0x3F, 0xFE, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFE, 0xE7, 0x03, 0x0F, 0xFE, 0x83, 0x7F, 0xF8, 0x3F, 0xFE, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFE, 0xE7, 0x03, 0x0F, 0xFF, 0xC3, 0x7F, 0xF8, 0x3F, 0x70, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x03, 0x0F, 0x8F, 0xC3, 0xF1, 0x00, 0x38, 0x70, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x83, 0x0F, 0x87, 0xE7, 0xE1, 0x00, 0x38, 0x70, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x87, 0x0F, 0x07, 0xE7, 0xE0, 0x00, 0x3C, 0x70, 0x70, 0x1C, 0xFE, 0xC1, 0x83, 0x63, 0x0E, 0xE0, 0x87, 0x0F, 0x07, 0xE7, 0xE0, 0x00, 0x3C, 0x70, 0x70, 0x3F, 0xFE, 0xF1, 0x87, 0x73, 0x0E, 0xE0, 0xC7, 0x0F, 0x07, 0xE7, 0xE0, 0x00, 0x1C, 0x70, 0xF0, 0x3F, 0xFE, 0xF1, 0x8F, 0x7B, 0x0E, 0xE0, 0xCF, 0x0F, 0x8F, 0xE3, 0xE0, 0x00, 0x1C, 0x70, 0xF0, 0x3F, 0xFE, 0x39, 0x8E, 0x7F, 0x0E, 0xE0, 0xCE, 0x0F, 0x9F, 0xE3, 0xE0, 0x00, 0x1E, 0x70, 0xF0, 0x38, 0x1C, 0x18, 0x8E, 0x7F, 0xFE, 0xE7, 0xCE, 0x0E, 0xFF, 0xE1, 0xE0, 0x01, 0x0E, 0x70, 0x70, 0x78, 0x1C, 0x1C, 0x9C, 0x07, 0xFE, 0xE7, 0xEC, 0x0E, 0xFE, 0xE1, 0xE1, 0x01, 0x0E, 0x70, 0x70, 0x70, 0x1C, 0x1C, 0x9C, 0x03, 0xFE, 0xE7, 0xFC, 0x0E, 0xFC, 0xE1, 0xE1, 0x01, 0x0F, 0x70, 0x70, 0x70, 0x1C, 0x1C, 0x9C, 0x03, 0xFE, 0xE7, 0xFC, 0x0E, 0xFE, 0xC3, 0xFF, 0x00, 0x0F, 0x70, 0x70, 0x70, 0x1C, 0xFC, 0x9F, 0x03, 0x0E, 0xE0, 0x7C, 0x0E, 0xE7, 0xC3, 0xFF, 0x00, 0x07, 0x70, 0x70, 0x70, 0x1C, 0xFC, 0x9F, 0x03, 0x0E, 0xE0, 0x78, 0x0E, 0xC7, 0x87, 0xFF, 0x80, 0x07, 0x70, 0x70, 0x70, 0x1C, 0xFC, 0x9F, 0x03, 0x0E, 0xE0, 0x78, 0x8E, 0x87, 0x07, 0xE7, 0x80, 0x07, 0x70, 0x70, 0x70, 0x1C, 0x1C, 0x80, 0x03, 0x0E, 0xE0, 0x78, 0x8E, 0x03, 0x07, 0xE0, 0x80, 0x03, 0x70, 0x70, 0x70, 0x1C, 0x1C, 0x80, 0x03, 0x0E, 0xE0, 0x38, 0x8E, 0x03, 0x07, 0xE0, 0x80, 0x03, 0x70, 0x70, 0x70, 0x1C, 0x1C, 0x80, 0x03, 0x0E, 0xE0, 0x30, 0x8E, 0x03, 0x07, 0xE0, 0xC0, 0x03, 0x70, 0x70, 0x70, 0x1C, 0x1C, 0x80, 0x03, 0x0E, 0xE0, 0x00, 0x8E, 0x07, 0x07, 0x70, 0xC0, 0x01, 0x70, 0x70, 0x70, 0x1C, 0x3C, 0x90, 0x03, 0x0E, 0xE0, 0x00, 0x8E, 0x87, 0x07, 0x70, 0xC0, 0x01, 0x70, 0x70, 0x70, 0x3C, 0x78, 0x9C, 0x03, 0x0E, 0xE0, 0x00, 0x0E, 0x8F, 0x47, 0x78, 0xE0, 0x01, 0xFE, 0x71, 0x70, 0xFC, 0xF9, 0x9F, 0x03, 0x0E, 0xE0, 0x00, 0x0E, 0xFF, 0xC3, 0x3F, 0xE0, 0x01, 0xFE, 0x71, 0x70, 0xF8, 0xF1, 0x9F, 0x03, 0x0E, 0xE0, 0x00, 0x0E, 0xFE, 0xC3, 0x3F, 0xE0, 0x00, 0xFE, 0x71, 0x70, 0xF8, 0xF1, 0x8F, 0x03, 0x0E, 0xE0, 0x00, 0x0E, 0xFE, 0xC1, 0x1F, 0xF0, 0x00, 0xFE, 0x71, 0x70, 0xF0, 0xC0, 0x83, 0x03, 0x0E, 0xE0, 0x00, 0x0E, 0x78, 0xC0, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
const unsigned char jwave[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x80, 0x1F, 0xE0, 0x03, 0x3C, 0x00, 0x1F, 0xC0, 0x07, 0x80, 0x8F, 0xFF, 0x3F, 0xF0, 0x3F, 0x00, 0x00, 0x1F, 0xF0, 0x03, 0x3E, 0x80, 0x3F, 0xC0, 0x07, 0x80, 0x87, 0xFF, 0x3F, 0xF0, 0x3F, 0x00, 0x00, 0x1F, 0xF0, 0x03, 0x3E, 0x80, 0x3F, 0xC0, 0x0F, 0xC0, 0x87, 0xFF, 0x3F, 0xF0, 0x3F, 0x00, 0x00, 0x1F, 0xF0, 0x03, 0x3E, 0x80, 0x3F, 0x80, 0x0F, 0xC0, 0x87, 0xFF, 0x3F, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0xF0, 0x07, 0x3E, 0xC0, 0x3F, 0x80, 0x0F, 0xC0, 0x83, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1E, 0xF8, 0x07, 0x1E, 0xC0, 0x7F, 0x80, 0x0F, 0xE0, 0x83, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0xF8, 0x07, 0x1F, 0xC0, 0x7F, 0x00, 0x1F, 0xE0, 0x83, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0xF8, 0x07, 0x1F, 0xE0, 0x7F, 0x00, 0x1F, 0xE0, 0x83, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0xF8, 0x07, 0x1F, 0xE0, 0xFB, 0x00, 0x1F, 0xF0, 0x81, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3C, 0xFC, 0x0F, 0x0F, 0xE0, 0xF9, 0x00, 0x3E, 0xF0, 0x81, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x3C, 0x8F, 0x0F, 0xE0, 0xF9, 0x00, 0x3E, 0xF0, 0x81, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x3C, 0x8F, 0x0F, 0xF0, 0xF1, 0x00, 0x3E, 0xF0, 0x80, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x3C, 0x8F, 0x0F, 0xF0, 0xF1, 0x01, 0x7C, 0xF8, 0x80, 0xFF, 0x3F, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x3E, 0x8F, 0x0F, 0xF0, 0xF0, 0x01, 0x7C, 0xF8, 0x80, 0xFF, 0x3F, 0x00, 0x3E, 0xFC, 0x1F, 0x78, 0x1E, 0x9F, 0x07, 0xF8, 0xF0, 0x01, 0x7C, 0x78, 0x80, 0xFF, 0x3F, 0x00, 0x3E, 0xFC, 0x1F, 0xF8, 0x1E, 0xDE, 0x07, 0xF8, 0xE0, 0x03, 0x78, 0x7C, 0x80, 0xFF, 0x3F, 0x00, 0x3E, 0xFC, 0x1F, 0xF8, 0x1E, 0xDE, 0x07, 0x78, 0xE0, 0x03, 0xF8, 0x7C, 0x80, 0x0F, 0x00, 0x00, 0x3E, 0xFC, 0x1F, 0xF8, 0x1F, 0xFE, 0x07, 0x7C, 0xE0, 0x03, 0xF8, 0x3C, 0x80, 0x0F, 0x00, 0x00, 0x3E, 0xFC, 0x1F, 0xF0, 0x0F, 0xFC, 0x03, 0xFC, 0xFF, 0x07, 0xF8, 0x3C, 0x80, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x0F, 0xFC, 0x03, 0xFC, 0xFF, 0x07, 0xF0, 0x3F, 0x80, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x0F, 0xFC, 0x03, 0xFC, 0xFF, 0x07, 0xF0, 0x3F, 0x80, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x0F, 0xFC, 0x03, 0xFE, 0xFF, 0x07, 0xF0, 0x1F, 0x80, 0x0F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xF0, 0x0F, 0xFC, 0x01, 0x3E, 0x80, 0x0F, 0xE0, 0x1F, 0x80, 0x0F, 0x00, 0x06, 0x3F, 0x00, 0x00, 0xE0, 0x07, 0xF8, 0x01, 0x3E, 0x80, 0x0F, 0xE0, 0x1F, 0x80, 0x0F, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0xE0, 0x07, 0xF8, 0x01, 0x1F, 0x80, 0x0F, 0xE0, 0x0F, 0x80, 0xFF, 0x3F, 0xFE, 0x0F, 0x00, 0x00, 0xE0, 0x07, 0xF8, 0x01, 0x1F, 0x00, 0x1F, 0xC0, 0x0F, 0x80, 0xFF, 0x3F, 0xFE, 0x07, 0x00, 0x00, 0xE0, 0x07, 0xF8, 0x00, 0x1F, 0x00, 0x1F, 0xC0, 0x0F, 0x80, 0xFF, 0x3F, 0xFC, 0x01, 0x00, 0x00, 0xC0, 0x03, 0xF0, 0x80, 0x0F, 0x00, 0x1F, 0xC0, 0x07, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
const unsigned char tokyofm[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xC0, 0x07, 0xF0, 0x80, 0xFF, 0x80, 0x07, 0x7C, 0x00, 0x00, 0xFF, 0xCF, 0x03, 0x78, 0xFE, 0xFF, 0xE0, 0x1F, 0xF0, 0xC0, 0xF7, 0x80, 0x07, 0xFE, 0x01, 0x00, 0xFF, 0xCF, 0x07, 0x78, 0xFE, 0xFF, 0xF0, 0x3F, 0xF0, 0xC0, 0xF3, 0x80, 0x07, 0xFF, 0x03, 0x00, 0xFF, 0xCF, 0x07, 0x7C, 0xFE, 0xFF, 0xF8, 0x7F, 0xF0, 0xE0, 0xF1, 0xC1, 0x83, 0xFF, 0x07, 0x00, 0xFF, 0xCF, 0x07, 0x7C, 0xC0, 0x03, 0x7C, 0x78, 0xF0, 0xE0, 0xE1, 0xC1, 0xC3, 0xC7, 0x07, 0x00, 0x07, 0xC0, 0x0F, 0x7C, 0xC0, 0x03, 0x3C, 0xF0, 0xF0, 0xF0, 0xE0, 0xC1, 0xC1, 0x83, 0x0F, 0x00, 0x07, 0xC0, 0x0F, 0x7E, 0xC0, 0x03, 0x3C, 0xF0, 0xF0, 0xF0, 0xC0, 0xE3, 0xE1, 0x03, 0x0F, 0x00, 0x07, 0xC0, 0x0F, 0x7E, 0xC0, 0x03, 0x1E, 0xE0, 0xF1, 0x78, 0xC0, 0xE3, 0xE1, 0x01, 0x0F, 0x00, 0x07, 0xC0, 0x1F, 0x7E, 0xC0, 0x03, 0x1E, 0xE0, 0xF1, 0x78, 0xC0, 0xE3, 0xE0, 0x01, 0x1E, 0x00, 0x07, 0xC0, 0x1F, 0x7F, 0xC0, 0x03, 0x1E, 0xE0, 0xF1, 0x3C, 0x80, 0xF7, 0xE0, 0x01, 0x1E, 0x00, 0x07, 0xC0, 0x1F, 0x7F, 0xC0, 0x03, 0x1E, 0xE0, 0xF1, 0x3C, 0x80, 0xF7, 0xE0, 0x01, 0x1E, 0x00, 0x07, 0xC0, 0x1F, 0x7F, 0xC0, 0x03, 0x1E, 0xE0, 0xF1, 0x1E, 0x80, 0x7F, 0xE0, 0x00, 0x1E, 0x00, 0xFF, 0xC7, 0x3D, 0x7B, 0xC0, 0x03, 0x0E, 0xC0, 0xF1, 0x1F, 0x00, 0x7F, 0xE0, 0x00, 0x1E, 0x00, 0xFF, 0xC7, 0xB9, 0x7B, 0xC0, 0x03, 0x0E, 0xC0, 0xF1, 0x1F, 0x00, 0x7F, 0xF0, 0x00, 0x1E, 0x00, 0xFF, 0xC7, 0xB9, 0x7B, 0xC0, 0x03, 0x0E, 0xC0, 0xF1, 0x1F, 0x00, 0x3F, 0xF0, 0x00, 0x1E, 0x00, 0xFF, 0xC7, 0xF9, 0x7B, 0xC0, 0x03, 0x0E, 0xC0, 0xF1, 0x3F, 0x00, 0x3E, 0xE0, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0xF1, 0x79, 0xC0, 0x03, 0x1E, 0xE0, 0xF1, 0x3F, 0x00, 0x1E, 0xE0, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0xF1, 0x79, 0xC0, 0x03, 0x1E, 0xE0, 0xF1, 0x7D, 0x00, 0x1E, 0xE0, 0x01, 0x1E, 0x00, 0x07, 0xC0, 0xF1, 0x79, 0xC0, 0x03, 0x1E, 0xE0, 0xF1, 0x7C, 0x00, 0x1C, 0xE0, 0x01, 0x1E, 0x00, 0x07, 0xC0, 0xE1, 0x78, 0xC0, 0x03, 0x1E, 0xE0, 0xF1, 0xF8, 0x00, 0x1C, 0xE0, 0x01, 0x1E, 0x00, 0x07, 0xC0, 0xE1, 0x78, 0xC0, 0x03, 0x1E, 0xE0, 0xF1, 0xF8, 0x00, 0x1C, 0xE0, 0x01, 0x0F, 0x00, 0x07, 0xC0, 0xE1, 0x78, 0xC0, 0x03, 0x3C, 0xF0, 0xF0, 0xF0, 0x01, 0x1C, 0xE0, 0x03, 0x0F, 0x00, 0x07, 0xC0, 0x01, 0x78, 0xC0, 0x03, 0x3C, 0xF0, 0xF0, 0xF0, 0x01, 0x1C, 0xC0, 0x83, 0x0F, 0x00, 0x07, 0xC0, 0x01, 0x78, 0xC0, 0x03, 0x7C, 0x78, 0xF0, 0xE0, 0x03, 0x1C, 0xC0, 0xC7, 0x07, 0x00, 0x07, 0xC0, 0x01, 0x78, 0xC0, 0x03, 0xF8, 0x7F, 0xF0, 0xE0, 0x03, 0x1C, 0x80, 0xFF, 0x07, 0x00, 0x07, 0xC0, 0x01, 0x78, 0xC0, 0x03, 0xF0, 0x3F, 0xF0, 0xC0, 0x07, 0x1C, 0x00, 0xFF, 0x03, 0x00, 0x07, 0xC0, 0x01, 0x78, 0xC0, 0x03, 0xE0, 0x1F, 0xF0, 0xC0, 0x07, 0x1C, 0x00, 0xFE, 0x01, 0x00, 0x07, 0xC0, 0x01, 0x78, 0xC0, 0x03, 0xC0, 0x07, 0xF0, 0x80, 0x0F, 0x1C, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x01, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
void setup(void) {
u8g.setColorIndex(1);
}
void loop(void) {
// アナログピンからデータ取得
int analog_value = analogRead(analog_pin);
// 電圧換算値:未使用
// vol_value = ((5.0 * analogdata) / 1024) * 100;
//OLED描画
u8g.firstPage();
do {
//analog_value描画(0~1023)
u8g.setFont(u8g_font_fub25);
u8g.setPrintPos(50, 27);
u8g.print(analog_value);
//チャンネル番号と局名の描画
if ((analog_value >= 80) && (analog_value <= 110)) {
u8g.setFont(u8g_font_fub25);
u8g.drawStr(0,27,"1");
u8g.drawStr(0,60,"bayfm"); //フォント表示
}else if ((analog_value >= 136) && (analog_value <= 150)) {
u8g.setFont(u8g_font_fub25);
u8g.drawStr(0,27,"2");
u8g.drawStr(0,60,"NACK5"); //フォント表示
}else if ((analog_value >= 190) && (analog_value <= 202)) {
u8g.setFont(u8g_font_fub25);
u8g.drawStr(0,27,"3");
u8g.drawXBMP( 0, 32, 128, 30, tokyofm); //128x30ビットマップ
}else if ((analog_value >= 226) && (analog_value <= 236)) {
u8g.setFont(u8g_font_fub25);
u8g.drawStr(0,27,"4");
u8g.drawXBMP( 0, 32, 128, 30, nhkyokohamafm); //128x30ビットマップ
}else if ((analog_value >= 366) && (analog_value <= 382)) {
u8g.setFont(u8g_font_fub25);
u8g.drawStr(0,27,"5");
u8g.drawXBMP( 0, 32, 128, 30, jwave); //128x30ビットマップ
}else if ((analog_value >= 512) && (analog_value <= 528)) {
u8g.setFont(u8g_font_fub25);
u8g.drawStr(0,27,"6");
u8g.drawXBMP( 0, 32, 128, 30, nhktokyofm); //128x30ビットマップ
}else if ((analog_value >= 582) && (analog_value <= 616)) {
u8g.setFont(u8g_font_fub25);
u8g.drawStr(0,27,"7");
u8g.drawXBMP( 0, 32, 128, 30, fmyokohama); //128x30ビットマップ
}else if ((analog_value >= 710) && (analog_value <= 728)) {
u8g.setFont(u8g_font_fub25);
u8g.drawStr(0,27,"8");
u8g.drawXBMP( 0, 32, 128, 30, interfm897); //128x30ビットマップ
}
} while ( u8g.nextPage() );
delay(500);
}
FM補完放送局(ワイドFM)のFM局名を表示(2022/06/26追加)
FM WIDE SELECTORのプッシュスイッチにも空き端子が一箇所ありました(このページをご覧いただいた方からご連絡いただきました)。
この空き端子から分圧抵抗2個で信号レベルを電圧調整してArduino Nanoのデジタルピンにジャンパーワイヤで結線。プッシュスイッチの状態(ON、OFF)をデジタルピンの(HIGH、LOW)から取得してIF文でワイドFMが選択されたことを判別して処理分岐します。