Amazonやアリエクプレスで安く売ってるXY-C50Lアンプモジュールはそこそこ音も良くなかなか使える。
単体で使うのも良いが、組み込みで使うなら赤外線リモコンで操作すればさらに便利になりそうです。
私の場合、TEF6686チューナーに組み込んでますがESP32のGPIOにまだ余裕があり、とりあえず試してみました。
コントロールしたいのはBluetoothとAUXの切り替えと音量の調整です。
ミニジャックの丸で囲ったところをGNDに落とすと、Bluetooth⇔AUXの切り替えができます。
arduinoIDEでこんな感じに設定(任意のPIN,任意のネーミングで)
#define AUDIO_INPUT 12
pinMode(AUDIO_INPUT, OUTPUT_OPEN_DRAIN);
IR受信をしたら
if (Bluetooth == true) {
digitalWrite(AUDIO_INPUT, HIGH);
} else {
digitalWrite(AUDIO_INPUT, LOW);
}
pinMode()をOUTPUT_OPEN_DRAINにするのがアンプに負担がなくていいと思います。
ここまでは割と簡単にできましたが、音量の調整はどうしよう?
TEF6686.hには便利なボリュームコントロールのコマンドがあってそれを利用していたが、市販のTEF6686ラジオはたぶんポテンショメータでコントロールしてるのではないかな?
XY-C50Lはロータリーエンコーダーなんで、ここに疑似的なパルスを送れば動くのでは?と考えChappyに尋ねてみる。
黄色の↓をESP32のGPIOに接続し、教えてもらったコード試してみたら一発で動きました。
ちなみにロータリーエンコーダーのセンターはGNDなので、pinMode()をOUTPUT_OPEN_DRAINの設定です。
const unsigned int PULSE_US = 1500; // 1ステップのタイミング(マイナス調整可)
const unsigned int BETWEEN_US = 250;
void sendEncoderPulse(bool clockwise) {
if (clockwise) {
digitalWrite(ENC_A_GPIO, LOW);
delayMicroseconds(PULSE_US);
digitalWrite(ENC_B_GPIO, LOW);
delayMicroseconds(PULSE_US);
digitalWrite(ENC_A_GPIO, HIGH);
delayMicroseconds(PULSE_US);
digitalWrite(ENC_B_GPIO, HIGH);
delayMicroseconds(PULSE_US);
} else {
digitalWrite(ENC_B_GPIO, LOW);
delayMicroseconds(PULSE_US);
digitalWrite(ENC_A_GPIO, LOW);
delayMicroseconds(PULSE_US);
digitalWrite(ENC_B_GPIO, HIGH);
delayMicroseconds(PULSE_US);
digitalWrite(ENC_A_GPIO, HIGH);
delayMicroseconds(PULSE_US);
}
delayMicroseconds(BETWEEN_US);
}
こんな感じです。
パルス信号の位相(波形のタイミング)を1/4ピッチずらし、どちらかの信号が先に立ち上がるかによって、回転方向を判別させるって事を再現してますね。
もしXY-C50LをIRリモコンでコントロールしてみたいなら、Chappyに尋ねてみてください。
完璧なコードを書いてくれますよ。
こんなの追加すれば入力の数も増やせるし、アンプの改造はこのタイプなら別な機種でもいけると思います。

