以下の記事を参考にさせていただいています。
今回ご紹介する内容のキッカケとなった2つの製作物です。
1."TTGO LoRa32‐OLED"と"PCM5102"で構成したインターネットラジオ
2.ア〇ゾ〇で購入したMade In Chaina"Bluetooth SPEAKERS"を百均のケースに収め、同アクティブスピーカーを繋いだ私称「マイクロコンポ」
この格安"Bluetooth SPEAKERS"ですが、ブルートゥース接続・FM(日本の周波数帯ではないのが難点)・LINEIN・USBメモリ・SDカードの音楽(MP3,WAV)が再生できる中々の代物。ケースは以前"Raspberry Pi"のケースとして使用していた物を流用。このケースの後ろにLINEINとスピーカー用のステレオミニジャックを付けました。コンパクトで場所は取らないし、マニアではない私には十分良い音です。今、これでウェブラジオ(LINEIN)を聴きながら作業してます。色も緑、赤、紫、青と光って美しくとても気に入っています。
やっとここから本題です。聴きながら、やっぱり気分に合わせて選局したいなと思いました。さてどうするか?ユーチューブを眺めると、定石通りタッチパネルを付けたり、レトロなダイアルで裏側にはLEDを配して、とか工夫が凝らされてます。取り合えず、私は選局だけできればいいのです。赤外線リモコンはどうだろうか、"Bluetooth SPEAKERS"にはリモコンまで付属しているのです。でも、リモコンから出る信号を解析する?すぐにはできないしな。「赤外線」で閃きました。昔、障害物回避ロボットを作ってた時のシャープ製赤外線測距センサー「GP2Y0A21YK0F」が道具箱に一杯残ってる、これを使えないかと。これに手をかざせばチャンネルアップ。ではチャンネルダウンは?そして、次のコードが現段階の結論です。"ArduinoIDE2.0.4"の"TTGO LoRa32‐OLED"で検証しました。
#include "Arduino.h"
#include "WiFi.h"
#include "Audio.h"
#define I2S_DOUT 25 // DIN
#define I2S_BCLK 27 // BCK
#define I2S_LRC 22 // LCK Pin26 is dead. very sad.
Audio audio;
String ssid = "****";
String password = "*****";
String stations[] = {
"ice1.somafm.com/illstreet-128-mp3", // SomaFM / Illinois Street Lounge
"ais-sa2.cdnstream1.com/b22139_128mp3", // 101 SMOOTH JAZZ
"relax.stream.publicradio.org/relax.mp3", // Your Classical - Relax
"16963.live.streamtheworld.com/SAM03AAC226_SC", // #1980s Zoom
"ice1.somafm.com/secretagent-128-mp3", // SomaFM / Secret Agent
"ice1.somafm.com/seventies-128-mp3", // SomaFM / Left Coast 70s
"ice1.somafm.com/bootliquor-128-mp3", // SomaFM / Boot Liquor
"musicbird.leanstream.co/JCB032-MP3", // 84.3 FM Edogawa (FMえどがわ, JOZZ3AS-FM, Edogawa City,...
"musicbird.leanstream.co/JCB093-MP3", // Dreams FM (ドリームスエフエム, JOZZ0AI-FM, 76.5 MHz, Kurume...
"musicbird.leanstream.co/JCB104-MP3", // Kyoto Living FM (京都リビング FM/きょうと りびんぐ FM)
"musicbird.leanstream.co/JCB015-MP3", // FM Blue Shonan (FM・ブルー湘南 , JOZZ3AD-FM, 78.5 MHz, Y...
};
uint8_t cur_station; // current station No.
int intPin = 35;
void setup() {
cur_station = 0;
Serial.begin(115200);
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid.c_str(), password.c_str());
while (WiFi.status() != WL_CONNECTED) delay(1500);
Serial.println("WiFi start");
pinMode(intPin, INPUT);
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(12); // 0...21
audio.connecttohost(stations[cur_station].c_str());
}
void loop() {
audio.loop();
if ( analogRead(intPin) > 2500) {
audio.stopSong();
delay(500);
if ( analogRead(intPin) > 2500) {
cur_station--;
if (cur_station < 0) { cur_station = 10; }
}else{
cur_station++;
if (cur_station > 10) { cur_station = 0; }
}
delay(3000); // これを入れないと連続チャンネルアップになる
Serial.print("\n\rStation : ");
Serial.print(cur_station);
Serial.print(" > ");
Serial.println(stations[cur_station].c_str());
audio.connecttohost(stations[cur_station].c_str());
}
}
// optional
void audio_showstreamtitle(const char *info) {
Serial.print("streamtitle ");
Serial.println(info);
}
void audio_bitrate(const char *info) {
Serial.print("bitrate ");
Serial.println(info);
}
センサーの赤線 - 5V
センサーの黒線 - G
センサーの白線 - Pin35
センサー前方10cm~20cmで一瞬手をかざすなり横切らせれば、チャンネルがアップします。同じ距離ぐらいの所で1秒間ほど手をかざしていればチャンネルダウンします、こちらはうまく行かない時もありますが。今の時代にマッチしたタッチレス選局ですね。まあ、この方法ではボリューム調整とかはまず無理でしょうが(付属リモコンでできます)。面白いと思って頂ければ幸いです。もしできれば付属赤外線リモコンの信号解析をして、ESP側に赤外線受光器を繋ぎ、操作できないか考えてみましょうかね。