工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

SparkFun & Arduinoパーツで信頼性の高いFMラジオを自作する

必要なパーツと用品

SparkFun FMチューナーベーシックブレークアウト - Si4703×1
SparkFun スピーカー - 0.5W (8Ω)×1
Adafruit モノクロ 0.96インチ 128x64 OLEDグラフィックディスプレイ×1
Texas Instruments LM386 - オーディオアンプ - DIP-8×1
Arduino Nano R3×1
Adafruit メンブレン 1x4 キーパッド×2
Adafruit 4チャネル I2C 双方向ロジックレベルコンバーター×1
伸縮式FMアンテナ (F型コネクタ用)×1
パネルマウント F型ネジコネクタ×1

このプロジェクトについて

子供の頃、AMラジオは自作したものの、FMラジオは複雑すぎて手が出せませんでした。現在では、FMラジオチューナーが1チップで手に入りますが、これらは表面実装部品であり、ホビイストには扱いにくいものです。幸い、SparkFunがSilicon Laboratories Si4703 FMラジオチューナーチップのブレークアウトボードを提供しており、全ピンが引き出されています。このブレークアウトを中心に、Arduinoで内蔵の2線式制御インターフェース経由でチューナー機能を制御する完全なFMラジオを構築する方法を紹介します。SparkFunが提供するライブラリを使えば、プログラミングも容易です。

同時に、コントラストが高く消費電力の少ない小型OLEDディスプレイも追加しました。さらに、最小限のパーツで高音質なモノラルオーディオアンプを自作する方法も解説します。完成したラジオは単3電池3本で長時間動作します。

SparkFun FMチューナーベーシックブレークアウトとI2Cシリアルバス

ベーシックブレークアウトは扱いやすいです。まず、ピンヘッダをハンダ付けしてブレッドボードで使用できるようにします。ピン配置は以下の通りです。ANT端子に細いワイヤー1メートルをハンダ付けすれば、とりあえずアンテナとして機能します。

Si4703は2線式インターフェースを備え、Arduinoからシリアル通信でチューナーを制御できます。このバスはI2C(Inter-integrated circuit、「アイ・スクエアド・シー」または「アイ・ツー・シー」と発音)と呼ばれ、以下の2本の双方向ラインのみを使用します。

さらにリセット線 (RST) があります。Si4703ではSDAをSDIO、SCLをSCLKと呼びます。すべてのArduinoにI2Cが内蔵されています。I2Cバスについて詳しくは、Tom IgoeとJeff Feddersenの動画が参考になります。このI2Cバス上では、Arduinoがマスター、Si4703とOLEDディスプレイがスレーブとして動作します。

I2Cバスの電圧レベルとArduinoの選択

Si4703とOLEDディスプレイのI2Cバス電圧は3.3Vです。そのため、SparkFunのフックアップガイドでは3.3V動作のArduino(Arduino Pro Mini)の使用を推奨しています。しかし、Pro MiniはUSBコネクタを持たず、FTDIブレークアウトで書き込む必要があり、また8MHz動作(Uno/Nanoの半分の速度)です。テストの結果、この速度ではOLEDディスプレイの駆動が遅すぎることが判明しました。ディスプレイを諦めたくなかったため、16MHz動作のArduino Nano(5V信号レベル)を使用し、双方向I2Cロジックレベルコンバーター(I2Cシフター)で3.3Vバス信号(ディスプレイとラジオチップ)に接続することにしました。レベルシフトが必要なのはSDA、SCL、RSTの3信号です。手元に2チャネルのI2Cシフターがあったため、2個使用しました(4チャネル品を使えば配線を減らせます)。

NanoはUnoとほぼ同等ですが、はるかに小型です。Unoを使っても構いません。最初のテストではUnoを使用しました。両方ともUSBコネクタを備え、Arduino IDEで簡単に扱えます。

回路図:Arduino、ラジオ、ディスプレイの接続

Nano周辺の配線とI2Cバス接続の詳細を見てみましょう(ドットがない交差は単なる配線のクロスです)。

このプロジェクトは単3電池3本(4.5V)で駆動します。電池はArduino Nanoの5Vピンに直接接続し、オンボードレギュレータをバイパスします。この方法でNanoは単3電池3本で問題なく動作します。警告! USBでPCと接続する前には必ず電池を外してください! そうしないと、PCからの5Vと電池が短絡します。最初のテスト段階では、電池なしでUSB給電のみで動作させてください。安全を期すなら、単3電池6本(9V)を用意し、プラス極をNanoの5VピンではなくVINピンに接続してください。そうすれば、Nanoの電源管理がUSB接続時に自動的に電池を切り離します(9V角型電池でも代用可能ですが、数時間しか持ちません)。

ArduinoのSDA(A4)とSCL(A5)をI2Cシフターの5V側に接続し、さらにD2をRST信号として使います。I2Cシフターの3.3V側から、Si4703のSDIO、SCLK、RSTに接続します。OLEDディスプレイにはSDAとSCLのみ接続すれば十分です(筆者のは2色表示でRSTピンがなかったためbanggood.comで購入)。

すべてのコンポーネントをNanoの3.3V出力とGNDに接続します。I2Cシフターのハイボルテージ側には5Vを供給します。IOピンD5〜D12は2つのキーパッドに接続します。ボタンを押すと入力がGNDに落ちます。

低電圧オーディオアンプ LM386

モノラルアンプにはLM386チップを使用しました。LM386は1970年代からある定番のパワーアンプで、低電圧コンシューマー向けアプリケーション向けに設計されています(データシート参照)。ゲインは内部で20倍に固定されており、外付け部品を最小限に抑えられますが、ピン1と8の間に外付け抵抗とコンデンサを追加すれば、ゲインを20〜200倍の範囲で調整可能です。ここでは最小ゲインの20倍で動作させますが、8Ωスピーカーならこれで十分な音量が得られます。

オーディオアンプ部分の回路図は以下の通りです。

まずSi4703側を見てみましょう。左側にArduinoへのI2C信号接続が示されています。オーディオ出力チャンネルは以下のように接続します:抵抗R4をLOUTに、R5をROUTに接続し、2つの信号をモノラル信号に合成します。ブレークアウトボード上に出力コンデンサがあるため、追加は不要です。R2とR3は分圧抵抗で、アンプへの入力レベルを下げます。もちろんポテンショメータに置き換えて音量調節に使うこともできますが、ここではデジタル制御を目指します。Si4703の出力レベルはI2C経由で1〜15段階で上げられます。R2/R3でこれをアンプにマッチングさせます(例えばR3を大きくすれば音量が上がります)。

この回路はデータシートの典型的な応用例そのままです。C2は最低220μF必要です。より小さい容量だと低音が損なわれます。低音を強調したい場合はデータシートを参照してください。ブレッドボード上で組み立て、コンポーネントの追加/削除で実験してみてください。C3はチップの近くに配置します。C3とC1は省略可能です。

YouTubeにはLM386プロジェクトの動画が多数あり、音質が悪いという不満もよく見かけます。その多くは適切なグランドレイアウトができていないことが原因でしょう。回路図を見ると、入力側グランドと出力側グランドを分け、ピン4(チップのグランドピン)でのみ合流させているのがわかります。これが非常に重要です。詳しくはJohnAudioTechの動画(および完全なLM386プロジェクトの動画)を参照してください。

LM386N-1は最低4Vで動作し、数百mWの出力が得られます。単3電池3本(4.5V)で駆動し、音量を1〜10の範囲で変えると非常に良い音が出ます。ただし、このような低電圧では8Ωスピーカー(4Ωではない)を使うのが重要です。音量を15にすると歪み始めます。大音量で鳴らしたい場合は電源電圧を9Vに上げてください。

プロトタイピング

まずはブレッドボード2枚で全体を組み立てることを強くお勧めします。Arduino、I2Cシフター、OLEDディスプレイを1枚のブレッドボードに、Si4703ブレークアウトとオーディオアンプをもう1枚に配置し、音響的な歪みを最小限に抑えます。最初のプロトタイプではSi4703をArduinoの近くに置き、オーディオ部分へ長い信号線を引いたところ、歪みが発生しました。

ArduinoはUSBから給電し、Nanoのレギュレートされた3.3V出力でディスプレイとラジオチップを駆動します。LM386は電池(4.5〜9V)で駆動します。

プログラムコード

以下のライブラリをインクルードする必要があります:

#include <SparkFunSi4703.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

ライブラリのインストール方法がわからない場合は、こちらのガイドを参照してください。SparkFunライブラリはこちらにあり、Si4703の細かな詳細を意識せずハイレベルな関数で制御できます。Adafruitディスプレイライブラリとチュートリアルはこちらです。

次に定義を行います:

// 入力ボタン
#define volDown 9
#define volUp 10
#define channelDown 11
#define channelUp 12
// Si4703ラジオチップ
#define resetPin 2
#define SDIO A4
#define SCLK A5
Si4703_Breakout radio(resetPin, SDIO, SCLK);
#define SI4703Address 0x10 // Si4703 I2Cアドレス

#defineを使うことでコードの可読性が向上します。一度volDownをピン9と定義すれば、以降D9を指すときにvolDownと書くだけで済みます。

setupセクションを見てみましょう:

// 変数定義
int channel;
int volume;
void setup() {
  // 入力ピンに内部プルアップ抵抗を設定
  pinMode(volDown, INPUT_PULLUP);
  pinMode(volUp, INPUT_PULLUP);
  pinMode(channelUp, INPUT_PULLUP);
  pinMode(channelDown, INPUT_PULLUP);
  // ラジオ初期化
  radio.powerOn();
  channel = 882; // 88.2 MHz
  radio.setChannel(channel);
  volume = 4;
  radio.setVolume(volume);
}

ピン9〜12を入力ピンとして定義します。INPUT_PULLUPパラメータにより、ATmegaチップ内部のプルアップ抵抗(+5Vから入力ピンへ)が接続されます。その結果、ボタンを押さない限りピンの信号レベルはHIGHになります(押すとLOW)。

SparkFunライブラリのおかげで、powerOn()、setChannel()、setVolume()といった主要関数でI2C経由のラジオ制御が簡単になります。

メインループではボタン押下を監視し、それに応じたアクションを実行します:

void loop() {
  // 音量ダウン
  if (digitalRead(volDown) == LOW) {
    if (volume > 0) volume--;
    radio.setVolume(volume);
    UpdateDisplay();
    delay(100);
  }
  // 音量アップ
  if (digitalRead(volUp) == LOW) {
    if (volume < 15) volume++;
    radio.setVolume(volume);
    UpdateDisplay();
    delay(100);
  }
  // チャンネルダウン(シークダウン)
  if (digitalRead(channelDown) == LOW) {
    channel = radio.seekDown();
    UpdateDisplay();
    delay(100);
  }
  // チャンネルアップ(シークアップ)
  if (digitalRead(channelUp) == LOW) {
    channel = radio.seekUp();
    UpdateDisplay();
    delay(100);
  }
}

完全なソースコードは後述します。プリセット局用の4ボタンと、OLEDディスプレイ更新用のコード(利用可能なRAMのほとんどを消費します)が含まれます。SSD1306ライブラリについてはAdafruitの優れたチュートリアルを参照してください。ライブラリはソフトウェアでディスプレイサイズを自動検出できないため、Adafruit_SSD1306.hをインストール後、ライブラリファイルを開き、コメント内の指示に従って手動で設定する必要があります。

ソースコードにはAVRチップ内部の1.1V基準電圧と比較して電池電圧を測定する「高度な」機能も含まれています。電池駆動なので、一定の5V基準電圧がないためです。詳しくは「Secret Arduino Voltmeter」とGammon Forumの記事を参照してください。

ブレッドボード試作から完成品ラジオへ

ここまで来れば、2枚のブレッドボード上で完全に動作する試作機ができています。これをユニバーサル基板(パーフボード)2枚に移植し、プロジェクトボックスに収めて完成品にしましょう。初めてでも恐れることはありません。失敗しても学びになりますし、進めながら必要なスキルが身につきます。AdafruitのCollinがブレッドボード&パーフボードとパーフボード試作の入門動画を公開していますので参考にしてください。

筆者はNanoとI2Cシフター(2個必要、前述)を1枚のパーフボードにまとめました。

このプロトタイプ用パーフボードを作るにあたり、以下のチュートリアルを詳しく学ぶことをお勧めします:プリント基板を使わないプロトタイピング。特にステップ3「配線計画を立てる!」が最も重要で、成功と失敗を分けます。いくつかのヒント:筆者は黒の22AWGワイヤーを使いましたが、太すぎて扱いにくかったです(写真参照)。代わりに細い「ワイヤーラッピングワイヤー」(30AWG)を何色か用意してください。また、もっと大きなパーフボードを使いましょう。ピンヘッダを作り、デュポジャンパーワイヤーで各部を接続しました。

Si4703とオーディオアンプは2枚目のパーフボードに一緒に配置します。LM386アンプの小さなチュートリアルが参考になります:回路図からベロボードへ。ただし、LM386にはICソケットを使うことを強くお勧めします! あるいは、JohnAudioTechの完全なLM386アンププロジェクト動画(電源グランドと信号グランドを分離した良いレイアウトを含む)も参考になります。

次に、ラジオ用のプロジェクトエンクロージャが必要です。Collinの動画で作り方が紹介されています。特にマスキングテープでドリル位置をマークするアイデアが気に入りました。筆者は粘着力の弱いペインターテープを使用しました。マスキングテープとドリルのほか、ホットグルーガンを用意してください。スピーカー、パーフボード、電池ボックスなどをエンクロージャに接着し、デュポジャンパーワイヤーで接続すれば完成です。最終的な外観は以下の通りです。

少し小さめのプロジェクトボックスを買ってしまったのがわかります。フロントパネルのディスプレイ用四角い開口部は、外側に傷をつけないよう内側からカッターナイフで切り抜きました。あまりエレガントではありませんが、機能的には問題ありません。ホットグルーでディスプレイを開口部に固定しました。スピーカーのサイズをフロントパネルにマークし、音が出るよう3mm穴を多数開け、背面からスピーカーを接着しました。

写真ではまだアンテナワイヤーが見えています。その後、パネルマウントF型コネクタと伸縮式FMアンテナを購入しました。アンテナはわずか50cmですが、受信感度は非常に良好で、小さなスピーカーから驚くほど良い音が出ます。最も驚いたのは、数日間ラジオを聴き続けてもまだ一度も電池を交換していないことです。

その他のラジオプロジェクト

このプロジェクトの着想を得たのは、Great Scottの動画を見たときでした(彼も後で木製のプロジェクトボックスを作っています)。しかし、詳細において筆者のラジオに最も近いのは、John OwenによるSi4703ポケットFMラジオです。彼もSparkFunブレークアウトを使用しており、プロジェクト説明をよく読む価値があります。筆者は彼のソースコードからモノラル機能と電池電圧測定の部分を参考にさせていただきました。

製造プロセス

  1. ラジオ技術の進化と工学
  2. UnifiedWater v1 - 完全なArduino水質センサーキット
  3. Raspberry PiとArduinoで作るWi-Fiインターネットラジオ:世界中の局をストリーミング
  4. Arduino Nanoで作る防水シャワーFMラジオ:RDA5807、Nokia LCD、PAM8403搭載
  5. GSM接続対応ポータブル投票システム「Mobile Vote Box」
  6. TL082オペアンプによる高性能クラスBプッシュプルオーディオアンプの構築
  7. 555ヒステレシス発振器:クラシックRCマルチバイブレータの構築
  8. クリスタルラジオとトランジスタラジオ回路:基本検波器からIC AM/FM受信機まで
  9. ラジオの基礎:電磁波の生成と伝送
  10. 原子ベース無線センサー、信号到来方向を特定し通信品質向上
  11. 地表付近の電波伝搬:ワイヤレスリンクへの影響を理解する