create 2010.07.10
update 2011.04.05

インターネットラジオを作る

    回路図
          メイン基板
          VS1053bサブ基板
          SDカード基板
          GLCD基板
          電源基板

プロジェクトファイル一式
2011.04.05

更新履歴

システムファイル
2010.07.10

起動手順


※インターネットラジオ上で流れているコンテンツには、著作権を侵害しているものが存在していますが、本製作物はそれを助長する
ものではありません。


2011.04.05追記

 Matureで行こうPG版(仮)を参考にステーションの検索を実装しておりましたが2011年3月の時点で、この方法ではリストを取得出来なくなってしまいました。
 SHOUTcastサーバーに仕様変更が有った様です。
 別な方法でリストを取得する方法に切り替えて上手く行ったのですが、数週間でまた仕様が変わってしまった様で、検索結果が10件しか取得出来なくなってしまいました。
 そこで、更にネットを調べて新しい方法に切り替えました。
 現在は正常に動作しておりますが、SHOUTcastのリスト取得方法は正式に公開されている訳では無さそうですので再び仕様変更が生じた場合、新しいファームを作成できるか不安です。
 検索アルゴリズムを公開するのはSHOUTcastサーバーの仕様変更を促進するのではないかと思い、敢えて方法は公開しません。
 気になる人はソースファイルを解析して下さい。(shoutcast.c)

2010.08.07追記(ぼやき)

 5月にAtMega1281をdigikeyに25個発注していたのが、ようやく8月7日に届きました。発注時の単価は875円だったのが、サイトを確認したら824円に値下がりしているではありませんか!。
 円高の影響と思われますが、悲しいです。差額で、もう一個買えたのですから。
 現在digikeyのAtMega1281の在庫数は0ですが、リードタイムが大幅に短縮されて、8月末には入荷する様です。
 国内で高価なmega1281を購入するくらいなら、やはりdigikeyで購入した方がお得です。(25個も購入する人はいないと思いますが・・・)


1年3カ月ぶりの復活

 「ストリーミング音声を再生してみる 」ということで、「Arduino Ethernet Shield」を使用してネットラジオの実験を行ったのが1年3カ月前です。その際に購入したイーサネットモジュール「WIZ811MJ」が放置状態にあったので、実験の再開と実用化を目指したいと思います。
 既に、WIZ811MJは入手困難かもしれません。現在は、後継である「WIZ812MJ」が入手できますが、コネクタ間のピッチが微妙に違うのと、ピンアサインが少し変更された事で互換性はありませんが、搭載チップは同じW5100なので、基板を少し細工すればそのまま使えそうです。


小物その1 VS1053b+FMラジオ基板

 前回の実験で作成したVS1053b+FMラジオ基板を更に小型化したサブ基板を製作しました。
 基本的には「ポータブルミュージックプレーヤーを作る その2」で作成した基板のパターンをそのまま流用しただけです。
 VS1053b制御線(SI/SO/SCK/DREQ/XCS/XDCS/RESET)とFMラジオ制御線(SDA/SCL)と電源(VCC/GND)の計11本のピンと、アナログ出力+アンテナ入力用の5本のピンで構成されます。
 VS1053bにはデジタル出力やMIDIシーケンス用のピンが用意されていますが、今後も使用する予定は無いので、基板の外には接続されていません。
 FMラジオモジュールは今回も、「SPK-FM-301」を使用しています。

部品面 ハンダ面 左が今回の基板(31mmx30mm)
右が前回の基板(31mmx50mm)
機能は同じです


小物その2 SDカード基板

 非常に簡単な回路なので、ユニバーサル基板でも良かった様な気がします。
 ノイズフィルタ用のインダクタと各種プルアップ/ダウン抵抗、電源ON/OFF用のFETで構成されます。
 構造上、AVRのポートに直結した場合に、SDカード基板の電源をOFFにしても、SDカードの各ポートにはAVRからの電圧がかかり、完全には電源をOFFできません。逆にOFF時間が長すぎるとSDカードを破損するかもしれません。
 しかし、この回路を電源ON/OFFに使用するのではなく、SDカードのハードウエアリセットに使用すると、システムの電源ON時に、確実にSDカードをリセットする事ができます。
 システム電源ON時、稀にSDカードの初期化が失敗することがありますが、この方法を使用することで、回避することができます。
 特にSDカードと同じSPIバス上に他のSPIデバイスが接続されている場合に有効です。
 ケースに組み込む際に、寸法の読み違いから、横向きで配置したい処を、急遽縦方向の実装(接着)となってしまいました。

部品面 ハンダ面


小物その3 GLCD基板

 これを、小物として片づけてしまうには規模が大きいのですが、今回の実験の脇役ですので・・・
 搭載している液晶は2.8インチパネルの「EGO028Q02」です。
 AVRのメモリバスに直接接続するので、FPC上のチップ抵抗の位置を移動して8bitバス化しておきます。(元は16bitバス用です)
 同じコントローラーを搭載している「WBX280V009」も、同様の方法で8bit化ができますが、11番端子をVCCに接続しないと8bitモードとして動作しません。
 これらのモジュールはロットにより、微妙に部品の配置やチップ数が違います。もしかしたら、8bit化できないモジュールも有るかもしれません。

 今回は、この液晶とAVRを組み合わせて、非同期シリアル通信(MAX1Mbps)を使い、コマンド型式で制御できる基板を作成しました。
 以前、4DsystemsのOLEDモジュールを使用してミュージックプレーヤーを作成したときに、今後も使用して行きたいと思ったのですが価格が高価な為、手軽には使えない状況でした。
 薄型を意識しなければ、マイコン+グラフィック液晶で似たような物が作れるのではないか?と思い製作してみました。

 この液晶には、4線式のタッチパネルが搭載されていますので、AVRのA/D変換を利用して座標を取得します。
 タッチパネルの精度を出すのに、かなり苦戦しましたが、それなりに精度を高める事ができました。
 詳しいことは別ページで説明します。

 マイクロSDカードソケットを搭載していますが、これは、一緒に搭載されているシリアルフラッシュメモリへフォントファイルや、画像ファイルを転送するだけの為にあります。

 描画エンジンには、「ポータブルミュージックプレーヤーを作る その2」で使用したソースをそのまま流用しています。
 この基板は、描画だけではなく、登録したボタンのタッチセンスと、文字列コード(UTF8/UTF16LE/UTF16BE)のS-JIS変換機能も有しています。
 また、ソースをビルドする時のパラーメータを変更することで、画面を90度回転させる事もできる様になっています。

 ケースに組み付ける際は、パネルをケースに接触させてはいけません。正常にタッチを検出出来なくなりますので、スペーサーを使用してケースとの間隔を調整します。
 ちなみに、ケースに取り付けの際、強引にビス穴へビスをねじ込んだら、LCDパネルが破損してしまいました。
 現在、搭載されているLCDモジュールは「WBX280V009」です。

部品面 ハンダ面


メイン基板

 イーサネットモジュールをダイレクトモードで接続する為のアドレスラッチ回路と、ストリーミングバッファ用のシリアルSRAMを搭載しています。
 AVRは今回もAtMega1281を3.3Vで16MHz駆動という、いつものオーバークロック動作です。
 AtMega1281はdigikeyで購入しているのですが、納期が数カ月先となっており、入手しにくい状況になってしまいました。

部品面 ハンダ面 合体した状態


電源基板

 押し入れの在庫一掃の為、有り合わせの部品で構成した手抜き基板です。
 タイマーによる自動シャットダウンに対応する為に、自己保持機能を持ったスイッチ構成になっています。

 使う当ても無く購入したパワーFETや、以前の工作で余計に買ったヒートシンク等を適当に配置して、ユニバーサル基板に乗せました。
 それにしても、在庫一掃とはいえ、リレーの駆動だけの為に5Vのレギュレータを使用するなど、非常に勿体ない部品の使い方です。
 470μFのコンデンサの在庫も、これで掃けました。

 部品面
デジタルアンプの制御用にトランジスタを使用し
ないで、敢えてリレーを使用しています。
ハンダ面
本当に適当な配線です
ヒートシンクの裏に電解コンデンサを実装した
のは間違いかも。


デジタルアンプ基板

 今回、最も勿体ない使い方をされた哀れな基板です。
 共立エレショップで、かなり前に購入した、TI社製D級アンプIC「TPA-3120D2」を使用した、20Wのデジタルアンプキット(DAMP-3120)です。
 実際に駆動するスピーカーは2W程度ですのでオーバースペックもいい処です。
 残念ながら、このキットは現在、販売されていない様です。
 そのうち、安価なアンプと交換して、DAMP-3120は別なケースに入れてあげたいです。

DAMP-3120


ケースへの組み込み

 ケースも押し入れに有ったものを使用します。タカチのYM-350を使用してみました。
 このケースは購入してみたものの大きすぎて、使い道を見出せなくて放置されていたケースです。
 私の愛機のVAIO(type c)と同じ位の面積があります。
 実際に非常に余裕のあるレイアウトになりました。卓上と呼ぶには少々キツイですが・・・
 電源は、DC12Vのスイッチング電源タイプのアダプタを使用します。

 これだけ大きなケースであれば、電源トランスを内蔵することもできそうです。
 または、ネットワークコンバータをケースの中に入れて、無線化という方法も考えられます。

中身がスカスカです
DAMP-3120さん、本当にごめんなさい。


W5100の制御に苦戦

 WIZnet社のサイトにAVR用のライブラリが公開されていますので、これを基に手を加えていきます。
 このライブラリをそのまま使用すると、UDPパケット受信時にハングアップする現象に悩まされました。
 原因はrecvfrom()関数で、引数「len」で指定したバッファサイズを無視して、UDPヘッダに含まれるデータ長分をそのままバッファに書き込んでしまいます。
 その結果、バッファオーバーを起こしてハングアップに至ります。
 メーカーが公開しているライブラリでも、この様な不具合があるという教訓でした。
 おかげさまで、ソケット用ライブラリは、殆ど1から作りました。その際、「Arduino Ethernet Shield」のソースが非常に参考になりました。
 特に、TCP接続でのソケットステータスの判定方法は自力では、うまく処理できなかったかもしれません。

 前回はSPI接続でW5100を制御しましたが、今回はダイレクトモードで制御します。転送速度の大幅な向上に期待しましたが、それ程転送速度の向上は確認できませんでした。
 ソケットバッファを8Kで使用した場合、192Kbps程度のストリーミングまでは受信できますが、ソケットバッファを4Kにした場合は、64Kbps程度までしか受信できません。(サーバーによっては128Kbpsでも受信可能です。)
 W5100に搭載されているメモリ容量は、送信・受信バッファ共に、8Kbytesです。
 今回は、4K/2K/1K/1Kという様にソケットバッファを割り当てました。
 4Kのソケットはストリーミング受信/HTTPクライアント/DNSクライアント用に、2KのソケットはHTTPサーバー用に、1KのソケットはNBNS/NTPC/DHCP用に割り当てます。
 よって、受信できるストリーミングビットレートは最大で、64Kbps程度です。
 ちなみに、前回のSPI接続でも、ソケットバッファを8Kにすることで、192Kbpsのストリーミングを受信できました。
 しかし、SPI接続よりはW5100のレスポンスは改善されますので、AVR側から見ればかなり処理が軽くなったと思います。

 W5100はリセット直後、正常に作動しない事が多々あります。リセット回路の組み方が悪いのか、リセットの方法が悪いのか、理由は判りませんが、LANコネクタのLEDが消灯したままになったり、高速点滅したりと色々な症状が出ます。
 この状態で、W5100のレジスタを参照してみると、普通に設定した値が取得できるのですが、ソケットがオープンできなかったり、出来てもデータの送受信が出来なかったりと動作が不安定です。この状態だと、PINGにも応答しません。
 そこで、今回はシステム起動時にDNSサーバーに特定のドメインのIPを問い合わせて、応答があるかどうかで、W5100の起動を確認します。
 DNSサーバーからの応答が無い場合は、W5100を再度リセットして初期化を行い、DNSサーバーへ問い合わせる動作を繰り返す様にしました。


シリアルS-RAM

 シリアルS-RAMは、コマンドが非常にシンプルだったので、簡単に制御できる様になりました。
 このチップは1個あたり32Kbytesの容量があります。これを4つ接続して128Kbytesを確保します。
 今回は、96Kbytesをストリーミングバッファに割り当て、残りの32Kbytesをステーションリスト等の一時バッファに割り当てました。


SHOUTcast専用ラジオ

 今回はインターネットラジオでも有名なSHOUTcastに特化したプログラムを作成します。
 このサイトにアクセスして、ステーションの検索とPLSファイルの自動取得を行います。
 プログラムの作成にあたり、Matureで行こうPG版(仮)を参考にさせて頂きました。
  残念な事に、2011年3月の時点ではこの方法で、一覧を取得する事が出来なくなってしまいました。


主な仕様

  ネットワーク機能
    ・DHCPサーバーよりネットワークパラメータを自動取得
    ・NTPサーバーより時刻を自動取得
    ・NetBios名前解決による、ホスト名でのアクセス対応

  ネットラジオ機能
    ・SHOUTcastのステーションを、キーワードで検索可能
    ・10件までのステーションをお気に入りとして登録
    ・SDカード内のPLSファイルに記述されているステーションの受信
    ・ストリーミングデータに含まれるメタデータをリアルタイムに表示更新
    ・標準で64Kbpsまでのビットレートに対応。
    ・DHCPを無効にして、192Kbpsの受信に対応(この場合はブラウザからの操作は出来なくなります)

  ミュージックプレーヤー機能
    ・SDカード内のMP3/WMA/MIDI/AAC/OGG/WAV(~44.1KHz)ファイルの再生機能。
    ・レジューム機能
    ・ディレクトリ内リピートモード/1曲リピートモード/通常再生モード
    ・再生ファイルの曲情報(TAG)を表示
       MP3 / WMA / MIDI / Ogg Vorbis形式のファイルに対応。
       WAV型式・AAC型式のファイルについては、再生中のファイル名を表示します。
       いずれも文字コードはUTF-16(LE/BE)・UTF-8・S-JISを自動判別します。

  その他の機能
    ・タッチパネルによる操作・設定
    ・ブラウザ(IE8)からの操作・設定
    ・シャットダウンタイマーによる自動電源OFF機能
    ・前面にヘッドホンジャックを装備


スクリーンショット

SHOUTcast受信メイン画面
受信中のステーション名とストリーミング名が下
にテロップ表示されます。
登録ステーションリスト
最大10個まで記憶可能。
検索結果リスト
最大100件まで表示。
検索キーワード入力画面
タッチパネルによるソフトキーボード。
ネットワークパラメータ設定画面 ファイラー画面
画面下にパス名がSFN型式で表示されます。
 指によるタッチ操作を確実に行える様に各アイコンは48x48のサイズを使用しています。
 一覧表示用のリストはアイテムの高さが20dot程度しかありませんが横幅でカバーしています。
 しかしソフトキーボードは実際の処、指での入力は少々厳しいです。
 モード切り替え画面
 FMラジオはノイズの影響により感度が悪いので今回は未対応です。
 ミュージックプレーヤー画面
 アーティスト名と曲名が下にテロップ表示されます。
 
screen001.png

 ブラウザ(IE8で確認)のアドレスにホスト名を入力するとメインページが表示される。  メインページでは、現在の再生しているステーション名とストリーミングタイトル等が表示される。
 また、登録ステーションに一覧に無いステーションを再生している場合は、ステーション登録する為のリンクが表示がされる。

  ホームページのURLをクリックすると、そのステーションのホームページを開くが、ウイルス感染したホームページだったりする事もあるので危険かも。

screen002.png  登録ステーション一覧画面
 最大で10個まで登録可能です。
 ステーション名をクリックすると、そのステーションに接続を開始します。
screen003.png  ステーション検索画面
 検索キーワードを入力して、検索ボタンをクリックすると、検索結果が最大で100件まで表示されます。
 ステーション名をクリックすると、そのステーションに接続を開始します。
screen004.png

 ネットワークパラメータ表示/設定画面
 MACアドレスの入手方法が障壁になります。
 取りあえずWIZnet社のサンプルコードのMACアドレスを使用して試験運用中です。

 秋月で販売されているMACアドレス書き込み済のEEP-ROMを購入すればMACアドレスの問題は解決しそうです。


最後に

 ネットラジオの製作にあたり、下記サイトのソフトウエア・データ・アルゴリズムを使用させて頂きました。
 作者の方々にお礼申し上げます。

  ・SHOUTcast関連
    Matureで行こうPG版(仮)・・・・ こちらで紹介されている方法では現時点(2010.03.19)では動作しません。
    SHOUTcastについて調べてみる

  ・ファイルシステム
    Electronic Lives Mfg.

  ・アイコンデータ
    3D+WEB MIX
    Human-O2 - Iconset

  ・フォントデータ
    Font Silo (フォント・サイロ)

  ・ネットワーク関連
    やまねこのマイコン実験室
    @IT(2.NBTパケットの構造)



【HOME】