N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
<< ESP32のPDMでサウンド出力+ノイズ対策 | main |
M5Stackの音量を抵抗1つで調節する

keywords: M5Stack, Volume, 音量、スピーカー


 

■概要



M5Stackは、内蔵のオーディオアンプへの入力信号のレベルが大きすぎるため音が割れます。
一方、内蔵DACは量子化精度が8bitしかないので、ソフト的に音量を下げることは厳しいです。
今回は、1つの抵抗でM5Stackの音量を調整してみます。

 

 

■しくみ


 

DACの出力をGPIO26から出力し、抵抗を経て、GPIO25につながっているアンプに送る。

 

ESP32には2つのDACがあり、GPIO25とGPIO26にそれぞれつながっています。
M5Stackでは、DAC1(GPIO25)がアンプに接続されています。


ここで、DAC1を止めて、DAC2の出力をGPIO26から出し、抵抗で減衰させてGPIO25に戻せば、音量が調整できます。このときESP32のGPIO25はフローティング状態(電気的に絶縁)しておく必要があります。

 

上の動画では、10kΩと22KΩで切り替えています。10KΩの場合は、そのまま出力した場合とほとんど音量が変わらず、22KΩの場合は、約16dB(1/6)小さくなりました。

 

■プログラム



ベースはM5Stackのspeakerサンプルプログラムです。関数playMusicVolume()は、M5StackのライブラリのSpeaker.cから起動音の再生ルーチンを抜き出し、以下を修正したものです。


・最初にGPIO25を入力に設定する関数を呼び出す
・DACへの出力はDAC1からDAC2(GPIO26)に変更

 

// M5_volume.ino - M5Stack volume control
#include <M5Stack.h>
void setup() {
// Initialize the M5Stack object
M5.begin();
M5.Lcd.printf("M5Stack Speaker test:¥r¥n");
M5.Speaker.setVolume(8);
M5.Speaker.playMusic(m5stack_startup_music, 25000);
}
void loop() {
if(M5.BtnA.wasPressed()) {
M5.Lcd.printf("wasPressed A ¥r¥n");
playMusicVolume(m5stack_startup_music, 25000); //play the M5Stack startup sound
}
if(M5.BtnB.wasPressed())
{
M5.Lcd.printf("wasPressed B ¥r¥n");
M5.Speaker.tone(3000, 200); //frequency 3000, with a duration of 200ms
}
if(M5.BtnC.wasPressed())
{
M5.Lcd.printf("wasPressed C ¥r¥n");
M5.Speaker.setVolume(10);	// max
M5.Speaker.playMusic(m5stack_startup_music, 25000); //play the M5Stack startup sound
}
M5.update();
}
void playMusicVolume(const uint8_t* music_data, uint16_t sample_rate) 
{
// disconnect PWM & input on GPIO25
ledcDetachPin(SPEAKER_PIN);
pinMode(SPEAKER_PIN, INPUT);
uint32_t length = strlen((char*)music_data);
uint16_t delay_interval = ((uint32_t)1000000/sample_rate);
for(int i=0; i<length; i++) {
dacWrite(GPIO_NUM_26, music_data[i]);
delayMicroseconds(delay_interval);
}
for(int t=music_data[length-1]; t>=0; t--) {
dacWrite(GPIO_NUM_26, t);
delay(2);
}
ledcAttachPin(SPEAKER_PIN, TONE_PIN_CHANNEL);
}

 

■GPIO25がOFFにならない!?



アンプの入力インピーダンスが28KΩ(typ)なので、ESP32側のGPIO25が完全に切り離されているなら、22KΩでも半分程度の減衰になるはずです。しかし、実際は1/6。


ESP32側のGPIO25のGND間の内部抵抗が、なぜか10KΩ程度とかなり低くなっていました。オープンドレイン出力なども試したのですが、フローティング状態にできませんでした。なにか方法をご存知でしたらコメントください。

 


M5Stackはアンプとスピーカーを内蔵していますが、今のままではあまりにもったいない。
音が歪まないように改良して欲しいところです。
 

| 電子工作 | 18:05 | comments(0) | - |
コメント
コメントする









PROFILE
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND