見出し画像

✅ 操作できる自作ラジオを目指した物語

FMラジオ1号機DKN-X03開発記②


この記事でわかること
✅ Arduino Nanoを使ったFMラジオに、操作系(スイッチ)を追加する考え方
✅ 押しっぱなし・チャタリング問題を、ソフト側でどう扱ったか
✅ ラジオにとって「操作できること」がなぜ重要か
✅ OLEDディスプレイを使い、最小限の情報表示だけで「ラジオらしさ」を出す工夫
✅ 見た目だけでなく、実際に使って「気持ちいい」操作感を重視したUI設計
✅ オートシーク機能が、なぜ想像以上に難しかったのか
✅ シーク処理を「状態」として設計する発想
✅ プリセット機能 を追加し、よく聴く局にすぐアクセスできるようにした設計の考え方
✅ 試行錯誤の末、“それっぽい”から“使える”ラジオへ変わった瞬間
✅ ブレッドボード上でも、市販品に近い操作感を目指す過程


🔗この記事は 『TEMUで楽しむ電子工作と復活DIY』 マガジンの1本です
👉マガジンを見る



🟦 序章:前回までのあらすじ

前回の記事では、壊れてしまったTEMUのラジオキットをきっかけに、
Arduino Nanoを使ってFMラジオを一から作り直すところまでを書いた。

最低限の構成でラジオを受信し、ライブラリのトラブルを乗り越えて音を出し、さらにアンプ回路を追加し、数々の失敗の末、LM386によってスピーカーからラジオの音を鳴らすところまでたどり着いた。

ブレッドボードの上ではあるが、この時点で、ラジオ1号機DKN-X03は、「実験」から「道具」に変わり始めていた。


🟦 第6章:操作できるラジオへ

スピーカーから音が出た。
それだけで、ひとつの区切りではあった。

でも、実際に使ってみると、すぐに気づく。

——これ、操作できないと不便だ。

音量は固定。
周波数も変えられない。
今、どの局を聴いているのかも分からない。

「ラジオ」と呼ぶには、まだ足りないものが多かった。


◾️スイッチを付ける

まずは、操作系から手を付けることにした。

難しいことは考えない。

✴️ 周波数を上げる
✴️ 周波数を下げる
✴️ ボリュームを上げる
✴️ ボリュームを下げる

この4つができれば、とりあえず使える。

ブレッドボードに、壊れたラジオキットから回収したタクトスイッチを追加し、Arduino Nanoの入力ピンにつなぐ。

スイッチが押されたら、周波数やボリュームを変える。
ただ、それだけのはずだった。

スイッチはとりあえず空中に配置😅

◾️押しっぱなし問題

実際にやってみると、思ったより素直には動かない。

スイッチを一度押したつもりが、周波数やボリュームが何ステップも一気に変わってしまう。

いわゆる、チャタリングと押しっぱなし問題だ。

ここで、少しだけ考え方を変える。

✴️ 押された瞬間だけ反応する
✴️ 一定時間は無視する

ラジオらしい操作感を意識して、ソフト側で制御を入れていく。

このあたりから、「電子工作」というよりUIを作っている感覚に近くなってきた。


◾️ディスプレイを付ける理由

操作できるようになると、次に欲しくなるのは「情報」だった。

今、何MHzなのか。
ラジオは動いているのか。

音だけでは、分からない。

そこで、手持ちの部品ストックの中から0.96インチの小さな OLEDディスプレイを付けることにした。


◾️最小限の表示でいい

目標は、あくまで「最小限」。

✴️ 現在の周波数が表示される
✴️ 現在のボリュームが表示される
✴️ 電波の受信状態が表示される
✴️ 電源が入っていることが分かる

それだけでいい。

凝ったUIは、まだ先でいい。

Arduino Nanoにディスプレイをつなぎ、起動時に周波数、ボリューム、受信状態を表示させる。

数字が画面に出た瞬間、ラジオは一気に“それっぽく”なった。

とりあえず最小限の表示で。
それでも一気にそれっぽくなる。

🟦 第7章:オートシークという壁

スイッチで操作できるようになり、ディスプレイも付いた。

この時点で、ラジオとしての見た目も、使い勝手も、かなり良くなっていた。

でも、使っているうちに、どうしても気になることが出てくる。

——局を探すのが、地味に面倒だ。


◾️手動選局の限界

ボタンを押せば、周波数は1ステップずつ変えられる。

それ自体は問題ない。
でも、実際にラジオを使ってみると、

✴️ ノイズが多い周波数を飛ばしたい
✴️ 空いている局を一気に探したい
✴️ いちいち微調整したくない

という場面が、思った以上に多い。

市販のラジオなら、当たり前のように付いている機能。

オートシーク。

これがないと、どうしても「試作感」が残る。


◾️簡単そうで、全然簡単じゃない

最初は、
「シーク命令を投げれば終わりだろう」
くらいに考えていた。

でも、実際に手を付けてみると、まったく話が違った。

✴️ シーク中、どこまで進んでいるか分からない
✴️ 見つかった局が本当に“聴ける局”か分からない
✴️ シーク中にボタンを押されたらどうするか
✴️ 表示はどうするか

考えなければならないことが、一気に増える。

ここでようやく、ラジオは「回路」だけじゃなく、「振る舞い」まで含めて設計するものなんだと実感した。


◾️シーク中であることを「見せる」

まず決めたのは、シーク中であることを、ちゃんと分かるようにすることだった。

音が止まり、周波数だけが勝手に変わっていく。

それが何なのか分からないと、壊れたように感じてしまう。

そこで、

✴️ シーク中は表示を切り替える
✴️ 周波数が変化していることを見せる
✴️ 操作を一時的に無効にする

といった制御を入れていく。

このあたりから、完全に「ソフトウェア設計」の領域に入った。


◾️動かない。止まらない。分からない

いざ、実際に実装してみると、すぐに現実を突きつけられる。

✴️ シークが止まらない
✴️ ノイズのまま止まる
✴️ 局を通り過ぎる
✴️ そもそも何が起きているか分からない

スイッチを長押しするたびに、挙動が違う。

ディスプレイに表示される周波数と、
実際に鳴っている音が一致しないこともあった。

ここでようやく気づく。

これは「ラジオIC任せ」で解決する問題じゃない。


◾️シークを「状態」として考える

考え方を切り替えることにした。

✴️ 今は通常操作中なのか
✴️ シーク中なのか
✴️ シークが終わった直後なのか

ラジオの動作を、ひとつの流れ(状態)として扱う。

①シーク開始
②一定時間ごとに周波数を動かす
③電波強度を確認する
④条件を満たしたら止める


こうして、オートシークを「一連の処理」として書き直していく。


◾️動いた瞬間

何度か修正を繰り返し、ようやくシークが最後まで走るようになった。

周波数変更スイッチを長押しする。

表示が変わる。
周波数が自動で動き始める。

そして——
音が、戻る。

「……おお」

思わず、声が出た。


◾️ 「それっぽい」から「使える」へ

オートシークが入ったことで、ラジオの使い勝手は一気に変わった。

✴️ 局探しが楽
✴️ ノイズに悩まされない
✴️ 操作が直感的

見た目だけじゃなく、使っていて気持ちいい。

ブレッドボードの上でも、この時点で、市販品と比べても大きく劣らない操作感になっていた。


◾️一番難しかった理由

あとから振り返ると、オートシークが難しかった理由は、はっきりしている。

✴️ 音が正解かどうか、数値だけでは判断できない
✴️ タイミングと待ち時間が重要
✴️ ICの仕様と、実際の挙動が完全には一致しない

つまり、試しながら調整するしかない世界だった。

ラジオ作りで一番時間を使ったのも、一番悩んだのも、間違いなくここだ。


◾️それでも、やってよかった

オートシークが動くようになると、ラジオの使い勝手は一気に変わった。

✴️ ボタンひとつで局が変わる
✴️ ノイズ探しをしなくていい
✴️ 「聴く」ことに集中できる


🟦 第8章:記憶するラジオ

オートシークが動くようになり、DKN-X03は、ようやく「市販のラジオに一歩近づいたラジオ」になった。

スイッチを押せば局が変わる。
ノイズに悩まされることも少ない。

でも、しばらく使っていると、またひとつ、不満が出てくる。

——電源を入れ直すたびに、最初からになる。


◾️電源を切るたびに、全部忘れる

ラジオを使い終えて、電源を切る。
そして、次に電源を入れる。

周波数は初期値。
ボリュームも初期値。

また、合わせ直し。

一回一回は大した手間じゃない。
でも、毎回となると、確実にストレスになる。

市販のラジオなら、当たり前のように「前回の状態」を覚えている。

それをできるようにしよう。


◾️「電源OFF直前に保存」は簡単じゃない

最初に考えたのは、電源が切られる直前に、設定を保存する方法だった。

でも、すぐに問題に気づく。

Arduino Nanoには、「電源が切られる瞬間」を確実に検知する仕組みがない。

コンデンサーで電源が切れる時間を一時的に粘らせ、その間に保存処理を行う方法もあると思うが、構成も処理方法も一気に複雑になる。

今回は、そこまでやりたくなかった。


◾️発想を変える

そこで、考え方を変えた。

電源OFFの瞬間を狙うから難しい。
ならば——

「操作が終わったあと」に保存すればいい。

ラジオの使い方を考えると、これは意外と理にかなっている。

①周波数を何度か調整する
②ボリュームを少し触る
③そのあと、しばらく何もしない


つまり、操作が落ち着いた時点が、保存していいタイミングだ。


◾️一定時間、何もなかったら保存する

実装は、こうした。

✴️ 周波数やボリュームが変更されたらフラグを立てる
✴️ 一定時間、操作がなければ「確定」とみなす
✴️ そのタイミングでEEPROMに保存する

これなら、

✴️ 電源OFF検知は不要
✴️ 無駄な書き込みも減らせる
✴️ 操作感も自然

EEPROMの寿命も、気にしすぎなくていい。


◾️電源を入れ直した瞬間

保存処理を作り込み、電源を切る。

そして、もう一度、電源を入れる。

表示された周波数は——
さっきまで聴いていた局。

ボリュームも、そのまま。

「……あ、覚えてる」

地味だけど、この瞬間の満足感は、かなり大きかった。


◾️プリセット機能を作る

最後に聴いていた局やボリュームが保存できるようになり、ラジオとしての使い勝手は、さらに良くなった。

でも、しばらく使っているうちに、
またひとつ、不満が顔を出す。

——お気に入りの局に、すぐ戻れない。

オートシークで局は見つかる。
手動でも周波数は変えられる。

それでも、「いつも聴く局」に戻るには、毎回同じ操作を繰り返す必要があった。

市販のラジオなら、当たり前のように付いている機能。

プリセット。

この機能はどうしても実装したい。


◾️スイッチ操作に組み込む

登録チャンネル可能数は8個に決めた。
そして新しいスイッチは増やさない。

すでにある操作系の中で、どうやってプリセットを呼び出すかを考える。

使えるスイッチは4つ。

①周波数を下げる(F-)
②周波数を上げる(F+)
③ボリュームを下げる(V-)
④ボリュームを上げる(V+)


考えた挙句、以下の仕様とした。

✴️ 通常モードでは各スイッチ短押しは、通常の操作。
✴️ V-とV+同時長押しでプリセットモードへ切り替え。もう一度V-とV+同時長押しか、しばらく放置でプリセットモードを抜ける。
✴️ プリセットモード中はF-とF+でプリセット番号を切り替える。
✴️ プリセットモード中にV+長押しで、そのプリセット番号に現在の周波数を登録。V-長押しで、そのプリセット番号の周波数は削除。
✴️ F-もしくはF+長押しで、表示中のプリセット番号に登録済みの周波数に切り替え。
✴️ 画面には、「今どのプリセットなのか」が分かるように表示する。

操作はできるだけ少なく、でも迷わないように。

ここでも、「ラジオらしい操作感」を意識した。

これで、電源を切ってもプリセット済みの局を一発で呼び出せるようになった。


◾️使ってみて分かったこと

プリセットを付けたことで、ラジオの使い方が、はっきり変わった。

✴️ 起動してすぐ、聴きたい局に行ける
✴️ 周波数を探す時間が減る
✴️ 操作が直感的になる

オートシークと組み合わせることで、
「探す」と「戻る」が、きれいに分かれた。


◾️市販品との距離

ここまで来て、改めて思った。

操作できる
表示がある
自動で局を探せる
プリセット機能がある
最後の状態を覚えている

ブレッドボードの上だけど、やっていることは、もう完全に市販ラジオと同じだ。

違うのは、それを自分で決めて、自分で書いたということだけ。


◾️次に見えてきたもの

ここまで来ると、もう欲が出てくる。

今、どれくらい受信できているのか。
電波の強さが、目で分かったらどうだろう。

画面に数字だけ表示するのではなく、電波状態を“視覚的に”見せたい。


🟦 第9章:電波を“見える化”する

オートシークやプリセットまで実装できたことで、DKN-X03は、操作感も使い勝手も、市販ラジオにかなり近づいた。

ここで、普通ならこう思う。

——もう十分じゃないか。

でも、実際に使っていると、ふと、こんなことが頭をよぎる。

「今、この局って、どのくらいちゃんと掴めてるんだろう?」


◾️音だけでは分からないこと

音が出ていれば、ラジオとしては成立している。
でも、音だけだと分からないことも多い。

✴️ ギリギリ受信できているのか
✴️ 余裕を持って掴めているのか
✴️ アンテナの向きで、どれくらい変わるのか

これが“見えたら”ちょっと面白い。


◾️信号強度を表示したくなった

M5807MBには、受信レベルを取得できる仕組みがある。

数値としては取れる。

——だったら、見せたくなる。

ただし、数値をそのまま画面に出しても、あまり直感的じゃない。

そこで思いついたのが、
「8個のLEDでバー表示する」
という方法だった。


◾️LEDを増やすと、ピンが足りない

すぐに現実的な問題にぶつかる。
Arduino Nanoのピンは、無限じゃない。

すでに、

✴️ ラジオモジュール
✴️ スイッチ
✴️ OLEDディスプレイ

で、ピンをかなり使っている。

ここで LEDを8個も直結したら、ピンが足りなくなるのは目に見えていた。


◾️SN74HC595Nの出番

そこで使うことにしたのが、SN74HC595Nというシフトレジスタだ。

✴️ 少ないピンで
✴️ 複数の出力を制御できる

いわば、
「ピン数を節約するための定番部品」。

Arduino側は数本の信号線だけで、LEDを8個まとめて制御できる。


◾️LED8個を制御する

さっそく別のブレッドボード上で回路を組み、もう一機持っている別のArduino Nanoを使って8個のLEDの制御をテストしてみる。

SN74HC595Nを使うことで、
本来8本必要なピンが3本で良くなる。

このテストで、8個のLEDの制御は完璧にうまくいった。
とすれば、次はこの回路をラジオ回路に組み込む必要がある。


◾️LED制御回路のラジオ回路への移植

ラジオのブレッドボード上はすでにArduino Nano、ラジオモジュール、LM386アンプ、OLEDの実装でスペースがいっぱいだった。
仕方がないのでLED制御回路だけは小さいブレッドボード上に残して、既存のラジオ回路とジャンパー線で接続する形にした。

スペースが足らないので下に付け足す😅

そして、この辺りで画面もラジオっぽい表示に作り込んだ。

周波数表示を大きくし、見やすくした。

◾️電波を見える化せよ

配線を終え、信号の受信レベルを読み取り、その強さに応じて LEDの光るべき本数に変換する関数を実装する。

①弱い → 1〜2個
②普通 → 4〜5個
③強い → 全点灯

④ステレオ受信時はボーナス

アンテナを動かす。

——LEDが反応する。

向きを少し変えるだけで、
光り方が変わる。

「あ、今ちゃんと掴んでるな」

音だけでは分からなかったことが、
一瞬で伝わってくる。


◾️シーク中は、LEDを動かせ

ここで、もうひとつ遊びたくなった。

オートシーク中、LEDが何も変わらないのは、少し寂しい。

そこで、

✴️ シーク中は LEDをシーク方向に流れるように動かす
✴️ 受信局が見つかったら、全LEDを一斉点灯し2回フラッシュさせ、見つかった感を出し、その後強度表示に戻す

という表現を入れた。

必要な機能ではない。
完全に、自己満足だ。

でも——


◾️「作ってよかった」と思える

シークスイッチを長押しする。

周波数が動く。
LED が流れる。
局が見つかる。
音が戻る。
LED が2回フラッシュして受信状態を表示する。

この一連の動きが、驚くほど“ラジオらしい”。

ブレッドボードの上なのに、ちゃんとした製品を触っている感覚があった。


◾️遊び心は、無駄じゃない

信号レベル表示は、ラジオとして必須の機能じゃない。

なくても、困らない。

でも、

✴️ 状態が分かる
✴️ 操作が楽しくなる
✴️ 使っていて気持ちいい

そういう要素が積み重なって、
「道具としての完成度」が上がっていく。

この章を書きながら、ひとつはっきりしたことがある。

電子工作は、遊び心を入れた方が、完成度が上がる。


◾️オートシーク動作の実際の動画

ここでは実際のオートシークとLEDの動きを見てもらおうと思う。

※著作権の関係により、受信中の放送の音声は流せないため動画は無音ですがご了承ください。

この動きを見た時、自分の中でひとつ、はっきりした感覚があった。
「ああ、これはもう完全にラジオだ。」


🟦 第10章:基板にする理由

ここまでで、FMラジオDKN-X03はブレッドボード上では、ほぼ完成していた。

操作できる。
周波数が表示される。
自動で局を探す。
局の登録と呼び出しができる。
電波の状態が見える。

正直に言えば、このままでも使えなくはない。

でも、ここでひとつ、ずっと頭の片隅にあったことを思い出す。


◾️もともとの前提

このラジオは、ゼロから自由に作るためのものではなかった。

始まりは、壊れたラジオキットだった。

ケースは残っている。
サイズも決まっている。
ネジ位置も決まっている。

つまり最初から、
「このケースに収まること」
が、前提条件だった。


◾️基板にしたい、ではなく基板にする必要があった

基板化しようと思った理由は、「完成したから」でも「かっこよくしたいから」でもない。

ブレッドボードのままでは、あのケースに入らない。

それだけだ。

配線が増え、
ボタンが増え、
ディスプレイが付き、
LEDも追加された。

ブレッドボード上では問題なく動いていても、物理的なサイズは、もう限界だった。

壊れたラジオのケースに収めるには、
最初から同じ大きさの基板を作る必要がある。


◾️「次の工程」に進む理由

この時点での判断は、とてもシンプルだった。

✴️ この構成は、もう大きく変えない
✴️ 配線は、これ以上増やさない
✴️ 動作も安定している

ならば、この形を固定するべきだ。

それが、ブレッドボードから基板へ進む理由だった。


◾️まだ「完成」ではない

ここで誤解してほしくないのは、基板にすること=完成、ではないということ。

むしろこれは、

ちゃんとケースに収めるための準備

にすぎない。

DKN-X03は、まだ「製品」ではない。

でも、

✴️ どういう回路で
✴️ どういう構成で
✴️ どういう大きさで

作るかは、ここでようやく確定した。


◾️次は、図面の世界へ

ブレッドボードの上で動いているものを、そのまま基板に落とし込む。

言葉にすると簡単だが、実際には、まったく別の作業になる。

回路図。
部品配置。
配線。

そして、ケースという制約との戦い。

でも今回は、ここまで。

この続きでは、DKN-X03を本当に「形」にするために、KiCad を使って回路図を描き、基板設計へ進んでいくことになる。

▶︎ 続きはこちら
自作FMラジオをプリント基板化する物語〜ラジオ1号機DKN-X03開発記③

🐾🐾────────────🐾🐾

💡この記事が役立ったらスキ&フォロー歓迎です。  
他の電子工作記事もまとめて読みたい方はこちら👇

📚 電子工作はここから  
電子工作ネコ・マックスの実験ノート

🐾🐾────────────🐾🐾

🔍 次に読むならこれがおすすめ
➡️ TEMUラジオキット】表面実装から一気に完成まで!透明ケースが美しいFMラジオを作った日

➡️ 壊れたラジオから始まった物語〜FMラジオ1号機DKN-X03開発記①

➡️ 自作FMラジオをプリント基板化する物語〜FMラジオ1号機DKN-X03開発記③

➡️ 壊れたFMラジオが、ついに音を出した物語〜FMラジオ1号機DKN-X03開発記④

🐾🐾────────────🐾🐾

#電子工作
#TEMU
#Arduino
#ArduinoNano
#自作ラジオ
#FMラジオ
#ブレッドボード
#アンプ回路
#LM386
#SN74HC595
#LED
#ものづくり
#試行錯誤
#失敗談
#電子工作ネコ
##DKNシリーズ

いいなと思ったら応援しよう!