【最後に追記があります】
ESP32-DevKitC(以下ESP32)を使って、インターネットラジオを作成する実験を行ってみて、結構使えることが分かったので、実用的なものを作成しようと思った。インターネットラジオ局のデータストリーム(MP3)を音声にデコードする部分はライブラリがそのまま利用できるので、インターネットラジオの操作機能を実現する部分(Arduinoのスケッチプログラム)を製作すれば良い。なお、ESP32とはWiFiで接続するために、WiFiのアクセスポイントが必要であり、そのSSDとパスワードは、Arduinoのスケッチ内に記述する必要がある。
目標機能は以下の通り。
・インターネットラジオ局を予め複数設定して置き、切り替えができる。
・音量の調整ができる。
・60分程度で省電力モード(スリープ)になるスリープ機能。
・表示機能を付ける。
さらに、これらを、ブラウザからも操作可能とする。また、新たなインターネットラジオ局を見つけた時に、それが実際に聴けるかどうか確認するため、一時的なURLを設定できる機能も実現することにした。
表示装置には、SD1306 128x64 OLED表示装置を利用した。ESP32にはI2C(アドレスは既定のまま)で接続する。AmazonやAliexpress(※1)で数百円で購入できる。表示される文字数の制限があるので、アーティスト名、曲名の表示は気休め程度である。日本語は表示できない(ブラウザには表示できた)。他に音量、インターネットラジオ局名も表示する。なお、ブラウザからアクセスした場合にも、同様な表示を行う。したがって、この表示装置自体は無くてもよいことになる(起動できたかどうか確認する時など少しだけ不便)。
※1Aliexpressには一般のクレジットカードではなく、プリペイドカード(記名式のもの。匿名のものは利用不可)を使うことを強く推奨。
上記の目標機能の操作は、タクトスイッチ(4個接続)を押して行う。ブラウザから操作する場合には、それぞれのボタンが表示されるので、クリックすればよい。したがって、タクトスイッチが無くても、パソコンやスマホから操作はできる(タクトスイッチは省略可)。結局、最小構成は、ESP32とI2SのDACがあればOKである。
インターネットラジオ局のURLは、shoutcast.com (”LISTEN”メニューをクリック)から、m3uファイルをダウンロード(※2)すると、その中に記述がある。ただし、キチンと再生されたらラッキーである。まず128Kbps、MP3のものを選択すること。データストリームに何かしら細工がしてあるものは残念ながら正しく再生できない(例えばradikoがそう)。また、chunk形式のものは音が途切れる。適切なインターネットラジオ局を見つけるのは、なかなか難しく、苦労が必要。折角、見つけたと思っても、URLが変わることがある。
※2ブラウザによってダウンロードアイコンをクリックしてもダウンロードできないことがある。例えばIEがそう。
実際に使ってみて、十分実用になると感じた。ただ、常時150Kbps程度の通信が必要なので、回線状況によっては、やはり音が途切れることがある。WiFi接続も不安定な場合(距離や競合、電子レンジの影響)は、音切れが生じる。
機能を拡張しながら、色々評価してみて、結局、ブレッドボードから、ユニバーサル基板に実装し直し、MAX4410のヘッドホンアンプを追加後、 写真のように、古いLANルータのケースに収めて実用にしている。電源は、スマホの充電アダプタ(5V)を流用し、古マウスのUSBケーブルで接続。音声出力はオーディオジャック経由でスピーカー(ステレオ)に接続している。さらに興味のある方、Arduinoのスケッチプログラムや操作方法などは、GitHubを参照頂きたく。
【追記】
・このインターネットラジオで2年以上楽しんできた、asia DREAM radioのURLがサーバーの更新で2023/5/5に変更されました。新しいURLは以下の通りです(スケッチプログラムの中に記述してあるURLの書き換えが必要)。
- J-Pop Sakura "http://cast1.torontocast.com:2170/stream"
- Japan Hits "http://cast1.torontocast.com:2120/stream"
- J-Pop Powerplay "http://kathy.torontocast.com:3560/stream"
新しいサーバーは音声が前より途切れがちな感じです。なお、asia DREAM radioサイトのWINAMPの設定ファイルをダウンロードすると拡張子plsのファイルの中にURLが記述されてます。
・Arduino IDEに追加するボードマネージャのesp 32 by Espressif SystemsにはVersionが、2.0.xと1.0.xがありますが、2.0.xでは音がでません。1.0.xを使ってください。1.0.6で動作を確認してます。
・MP3のデコードを行うライブラリは、更新され、かなり変わってます。最新のものを使うとコンパイルエラーになります。当時のライブラリはGitHubのスケッチプログラムの”src”フォルダに保管してあります。
探してみます
最終的に組み立て どんな箱に収めようかと
考え始めております
これで ラジコも聞けるといいなぁ~
とふと思いました
https://directory.shoutcast.com/
本体のピンが故障してようです
貴重なお時間を頂き申し訳ありませんでした
ブレッドボード上ですが 選局、音量ボタンを取り付けて 適当なアンプを使い
秋月でついでに購入した
広帯域用スピーカーユニット 7.7cm(77mm) 8Ω 10W
価格 300円でした
値段の割にとてもいい仕事です
そのスピーカーで聞きながら 今
お礼のメッセージを書き込んでいます
感動しております
jazzでおすすめの局などありますか?
本当にありがとうございました
感謝します
ESP32の故障も考えられるので
週末に 30ピンの esp32を購入して 再度挑戦してみます
併せて結果もご報告いたします
(多分あっさりと動作することを期待しつつ)
したがって、問題は clock= 4, data= 17の接続が上手くいっているかどうかです。
原因として、1.接続不良、2.ESP32本体の不良、3.接続間違い、が考えられます。
これを確認するには、上記のプログラムを
U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 4, /* data=*/ 17, /* reset=*/ U8X8_PIN_NONE);
のままにしておいて、線の接続を4と17にして、「Internet Radio」が表示されるかどうか確認する必要があります。
表示されれば、本体(github)のプログラムでも動くはずです。表示されなければ、どこかでの接続不良か、あるいはESP32の不良が考えられます。
clock= 4, data= 17で試してみて、どうしても動作しないのであれば、これらのピンを変更することで対応できます。
21のピンは「 I2C スキャナ」の動作からSDAとして使えているようなので、/* data=*/ 21とします。線の接続も21にしてください。/* clock=*/ は、4のままでも動くかもしれませんが、ダメであれば、18、19を試してみてください。なお、22のピンは、DAC(PCM5102)で使っているので不可です。また本体のプログラムの50行目は、接続したピンに合わせて変更が必要です。
よろしくお願いいたします。
本体のプログラムの50行目のピン設定を
変更
clock 22
data 21
に変更した所 internet radio を
表示したままになります
それ以外は、表示されません
感謝しかありません
SSD1306のアドレスは 0X3C でした
プログラムですが 3行目のピン番号を変更した所 表示されました
変更前 U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 4, /* data=*/ 17, /* reset=*/ U8X8_PIN_NONE);
変更後 U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 22, /* data=*/ 21, /* reset=*/ U8X8_PIN_NONE);
変更点
clock=*/ 4→22に変更
data=*/ 17→21に変更
多分ピンの設定違うので出力されていない?
とりあえずのご報告です
まず、切り分けのために幾つかご確認をお願いいたします。
接続(VDD=3V3、GND=GND、SCK=4、SDA=17)は大丈夫でしょうか。次にSSD1306のI2Cアドレスは、0X3Cですか?0X3Dのものがあります。
アドレスを調べる方法は以下のサイトをご参照ください。
https://qiita.com/nanbuwks/items/c235f7f867f6139b6c8b
「ESP32 を使って I2C スキャナ」
アドレスが0X3Cであった場合は以下のスケッチを実行して「Internet Radio」と表示されるかご確認ください。
#include "Wire.h"
#include "U8g2lib.h"
U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 4, /* data=*/ 17, /* reset=*/ U8X8_PIN_NONE);
void setup() {
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawStr(0,10,"Internet Radio");
u8g2.sendBuffer();
}
void loop() {
}
よろしくお願いいたします。
ありがとうございます
早速 昨日 つないでみましたが
表示されませんでした
SSD1306は、動作確認済みの部品を使用しております
再度 自分で考えてみます
分からないときは、こちらで質問しても
よろしいでしょうか?
ちなみに、ESP32には30ピンと38ピンがあって、38ピンは無駄に大きいので敬遠してます。
嬉しいです
一つ質問させてください
ESP-32と液晶SD1306の接続ですが
秋月電子にて購入しました
(ESP32-DevKitC-VE
通販コード M-15674)
D4,D17(TX2) PINが見つかりません
この場合どこに接続すればよろしいでしょうか?
お時間のある時にでもお答え頂くと
ありがたいです
コメントありがとうございます。
私も製作してから、ずっと使い続けています。
お楽しみください。
こちらにお邪魔しました
音が聞こえた瞬間 鳥肌が、、、
いい音です
自分は、DAC(PCM5102)で作りました
かっこいい箱に入れて完成させたいと思います
懇切、丁寧な解説ありがとうございます
また お邪魔させていただきます
まずは、簡単な例で試されてはいかがでしょうか。例えば、exampleフォルダのI2Saudio.inoや以下のサイトが参考になります。
https://qiita.com/Geek493/items/6c0f466590ffc7c92d6f
214 行で ""audio.connecttohost(stations[cur_station]);""
のエラーが出ます 検証 なさったのしょうか
よくわからないので 修正を お願いします
力作ですね。素晴らしいです。
お役に立てて、嬉しいです。
https://ameblo.jp/bay-3/entry-12702093806.html
今後も使っていけるインターネットラジオ専用機が出来上がりました。
本当にありがとうございました!!
私のやりたかった事がすべて網羅されていて、とても参考になります。まるごとパクらせていただきます。
このような情報を公開していただいて、本当に感謝しかありません。
まだ完成はしていませんが、こちらのサイトを参考にして精進します。
ありがとうございました!!