ATOM Echo を初期堪能
ATOM Echoを購入させていただきました。
コンパクトなのにマイクやスピーカもついているというハンパなく高機能な製品で
スイッチサイエンスでは”スマートスピーカー開発キット”と銘打たれて販売されています。
凄いね。
味見程度ですが動作確認させていただきましたので報告させていただきます。
かなりスリリングでエキサイティングな体験をさせていただいております。
以下、マネして故障してもHomeMadeGarbageは保証できませんのであしからず。
目次
工場出荷状態
ATOM Echoは最初からBluetoothスピーカーとして動作するファームウェアが書き込まれています。
早速 我が家のAmazon Echo Dotとペアリングしてスピーカとして接続してみました。
ATOM Echo 届きました。
ほんとに電源いれたらBluetoothスピーカとして振る舞いました。Amazon Echo Dotに繋げてみた pic.twitter.com/dD7aYBtgnO
— HomeMadeGarbage (@H0meMadeGarbage) June 10, 2020
なかなかいいサウンドで驚きました。
参考
ATOM Echoでやりたいこと
ATOM Echoで以前ラズパイゼロで作ったおしゃべりティラノくんのようなコンシェルジュを制作したいと思っています。
我が家のティラノくんのお友達をコレで作りたいな
ATOM Echo – スマートスピーカー開発キット – スイッチサイエンス https://t.co/GPnuRzPkhE pic.twitter.com/u4vOT3NcFg
— HomeMadeGarbage (@H0meMadeGarbage) June 5, 2020
やりたいこと
- 定時発話
- センサ値発話
- サーボ、モータ駆動
上記を目標に今後 ATOM Echoをいじくっていきたい所存です。
ストリーミング再生
サーバ上のmp3を再生するサンプルコード StreamHttpClient_ECHO を試してみました。
しかし。。。
なんか音もよく聴こえないし、筐体は熱くなり香ばしいニオイも漂ってきました。。。
スピーカショート故障した!!!
どうもスピーカに過電流が流れて壊れてしまったようです。
We test, we found dc signal will make the speaker heat, so should be careful to use other code to drive the i2s amp
— M5Stack (@M5Stack) June 11, 2020
原因と解決方法は公式の発表を待ちたいと思います。
参考
いや待てない!
開封して手持ちのスピーカに取り替えましたww
勇者は くそダサくなった pic.twitter.com/VJe4cUewal
— HomeMadeGarbage (@H0meMadeGarbage) June 10, 2020
上の動画ではサンプルコード Factory_Test を使用しました。
特にスピーカや筐体の発熱はありませんでした。
試しにまたサンプルコード StreamHttpClient_ECHO を書き込んでみましたが
やはりスピーカが熱くなったのですぐに停止いたしました。。。
WAV再生テスト
いったんストリーミング再生はあきらめて、WAV再生のテストを実施いたしました。
サンプルコード Factory_Test を参考にコーディングしました。
Arduinoコード
ボタンを押したらWAVファイルを再生するコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#include "M5Atom.h" #include <driver/i2s.h> #define CONFIG_I2S_BCK_PIN 19 #define CONFIG_I2S_LRCK_PIN 33 #define CONFIG_I2S_DATA_PIN 22 #define CONFIG_I2S_DATA_IN_PIN 23 #define SPAKER_I2S_NUMBER I2S_NUM_0 #define MODE_MIC 0 #define MODE_SPK 1 extern const unsigned char audio[364808]; extern const unsigned char tooth[270990]; bool InitI2SSpakerOrMic(int mode) { esp_err_t err = ESP_OK; i2s_driver_uninstall(SPAKER_I2S_NUMBER); i2s_config_t i2s_config = { .mode = (i2s_mode_t)(I2S_MODE_MASTER), .sample_rate = 16000, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, // is fixed at 12bit, stereo, MSB .channel_format = I2S_CHANNEL_FMT_ALL_RIGHT, .communication_format = I2S_COMM_FORMAT_I2S, .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, .dma_buf_count = 6, .dma_buf_len = 60, }; if (mode == MODE_MIC) { i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_PDM); } else { i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX); i2s_config.use_apll = false; i2s_config.tx_desc_auto_clear = true; } //Serial.println("Init i2s_driver_install"); err += i2s_driver_install(SPAKER_I2S_NUMBER, &i2s_config, 0, NULL); i2s_pin_config_t tx_pin_config; tx_pin_config.bck_io_num = CONFIG_I2S_BCK_PIN; tx_pin_config.ws_io_num = CONFIG_I2S_LRCK_PIN; tx_pin_config.data_out_num = CONFIG_I2S_DATA_PIN; //Serial.println("Init i2s_set_pin"); err += i2s_set_pin(SPAKER_I2S_NUMBER, &tx_pin_config); //Serial.println("Init i2s_set_clk"); err += i2s_set_clk(SPAKER_I2S_NUMBER, 44100, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_MONO); return true; } size_t bytes_written; void setup() { M5.begin(true, false, true); InitI2SSpakerOrMic(MODE_SPK); } void loop(){ if (M5.Btn.isPressed()){ M5.dis.drawpix(0, CRGB(0, 0, 128)); i2s_write(SPAKER_I2S_NUMBER, tooth, 270990, &bytes_written, portMAX_DELAY); } M5.dis.drawpix(0, CRGB(0, 0, 0)); M5.update(); } |
WAVファイルはtooth.cとしてバイナリでメモリに保存します。
1 2 3 |
const unsigned char tooth[270990] = { 0x52,0x49,0x46, … ,0x2D,0x00 }; |
音源はesp8266-google-ttsで取得したgoogle翻訳のmp3音源を
44.1kHz, 16bitのwavに変換して、バイナリの配列にしました。
動作
ATOM EchoでWAV再生
本当はストリーミング再生がしたい。 pic.twitter.com/a7OQOxvv8i
— HomeMadeGarbage (@H0meMadeGarbage) June 11, 2020
WAVファイルの再生ができるようになりました♪
終わりに
やはり折角のESP32ですのでwebに繋いでストリーミング再生したいですね。
まだまだ勉強が必要です。楽しみながら行こうと思います!!