月別アーカイブ: 2024年3月

MP3_with_ESP8266Audio.inoのメモ

M5UnifiedのExampleに音声再生があったのでそれで試す。

File->Example->M5Unified->Advanced->Speaker_SD_wav_fileを選択。

自宅用通知マシン作成(2)

と、行こうとしたけど色々初めてなのでメモ残しながら確認していく。描画関係はおいておいて音声出力周りのみ予定。

試しながら書いているので丸っと書き換わるかも

M5Unified

最近のM5Stackは機種間をまたいでソースをある程度共有できるM5Unifiedを使う。M5Unifidには

みたいに各階層(カテゴリ?)毎にそれぞれコンフィグがあって細かい設定を仕込めるみたい。

ダウンロードしたソースのM5Unified\src\utility\M5Unified.hppやM5Unified\src\utilityあたりに中身がいる。ドキュメントは探していないここにあった。ぱっとみ、cppのコメントパッと見た中だと日本語もある。

/// Increasing the sample_rate will improve the sound quality instead of increasing the CPU load.
    spk_cfg.sample_rate = 96000;

音質とCPU負荷は引き換えと。手持ちのM5Stack Basicのスピーカーの音質だとどうせ頑張るところじゃないと思うので下げてよいかも。

SDカード

M5Unifiedへの移植ポイントにSD.begin()の追加ってのがあるけど前はなかったのかな?よくわからん。

bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint=”/sd”, uint8_t max_files=5, bool format_if_empty=false);

+    while (false == SD.begin(GPIO_NUM_4, SPI, 25000000))
+    {
+      delay(500);
+    }

とりあえず上のイメージでよいらしい。最後のクロックレートはSDカードの一番遅い規格だと思うのでものによってはもっとあげられるのかな。GPIO_NUM_4はESP32のPIN指定からきていると思うけど追っていない。

音声

AudioOutput(本体)、AudioFileSourceHOGE(読み込み元)、AudioGeneratorHUGA(音声化)の3点セットが基本みたい。

AudioFileSourceID3は音声ファイルのプロパティ的な奴を扱える。

AudioOutputM5Speakerはトリプルバッファリングをよろしくやってくれながら(よくわかっていない)、M5Unifidのスピーカーに音声を渡してくれている。ChatGPT API搭載AIスタックチャンのレポジトリでは別ファイルに切り出されていた。(おおよそ一緒ぐらいのふんわりした確認)何か困ったらこっちにも情報あるかも。

AudioOutputM5Speakerが依存しているのはAudioOutput.hとM5Unified.hとみたい。

で開き

で継続

で終了。

おおよそ最小ぐらいの動作ソース

イタリックになっているところは別ファイルに切り出してすっきりさせたらよさそう。

こいつをベースにサンプル等をみたら何とかなりそう。

isRunningの周辺ここに大体まとまっていた。

ボリューム

ボリューム設定は以下。特定のバーチャルチャンネルに個別設定もできる(バーチャルチャンネルはわかっていない。文字から察するになにか仮想的な音声チャンネルを使う機能があるのだろう)

    M5.Speaker.setVolume(volume);
    M5.Speaker.setChannelVolume(m5spk_virtual_channel, volume);

コア指定?

ChatGPT API搭載AIスタックチャンのレポジトリでスピーカー再生タスクを割り当てるCPUコアを以下のように割り当てている。

こちらを見ると無線関係を使っているときにはCore0(PRO_CPU_NUM)を無線関連でかなり使うので、比較的空いているCore1(APP_CPU_NUM)を指定しているのかな?

AudioGeneratorMP3#close

cppの内部でoutputとfile閉じて、running(起動確認フラグ)をfalseにしている。こちら一つでまとめてクローズする思想な気がする。

この実装を信じるとisRunningとcloseで処理できる。

自宅用通知マシン作成(2)

自宅用通知マシン作成(1)で自宅用の予約通知端末がとりあえずできたので、次は家から店に呼び出しできる機能を作る。

今は携帯で呼び出しているけど、ゆるふわろぼっとに呼び出された方が雰囲気的にも店を一時抜け出しやすそうなのでスタックチャンぽいやつで作ることにする。

書いている途中でみつけた。こちらのイメージなやつ

ハードは息子がしばらく使っていないM5Stack Basicがあったのでそいつを使用。同じ時期に買ったやつの紙にCore1.0と書いてあるので1.0なのかな。いずれにせよだいぶ古いバージョン。

開発環境構築

Arduino IDE2.3.2を使用しているけどかど開発環境出来ていなかったのでインストール。

File->Prefarence->Additional boards manager urlsに公式のURLを追記

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

tools->boods:hogeを選びboards managerからm5stack by m5stack officialをインストール

tools->boods:hogeからM5stack->m5coreを選択

file->examples->m5stack->Basics->FactoryTestを選びUploadを実行。なんとなく動いて要るっぽいことを確認する。

とりあえず顔をだす(M5avatar準備)

顔がないと始まらないので準備。こちらを参考にライブラリインストール。(と思ったら古いのがすでにいたので新しいものに上書き)

最近は、M5Stack.hみたいに機種ごとのライブラリをインクルードするのではなく、大体の機種をカバーしているM5Unified.hをインクルードして作るらしい。今のM5Avatarもそれを使っているということだろう。

M5Unifiedはライブラリマネージャーから入れられるとのことなのでインストール。#include <M5Stack.h>#include <M5Unified.h>に変更しコンパイル&アップロードで動いた。

ずいぶんコンパイルが重い。と思ったら、二度目から軽くなった。IDE1系の時と違い設定しなくてもコンパイル結果キャッシュするようになったのかな?普段重いものコンパイルしないから気づかなかった。

とりあえず声を出す

M5UnifiedのExampleに音声再生があったのでそれで試す。

File->Example->M5Unified->Advanced->Speaker_SD_wav_fileを選択。

MP3_with_ESP8266Audio.inoというのが開いた。中身もmp3用っぽいけど細かいことは気にしない。

/// need ESP8266Audio library. ( URL : https://github.com/earlephilhower/ESP8266Audio/ )

サンプルソースに上のコメントがある。昔入れたと思われるのが入っていたのでそれを使う。はいっていたのは下のlibrary.propertiesで今日時点で最新ぽい。ただコミットに合わせてバージョン上げてはいなそう。

name=ESP8266Audio
version=1.9.7
/// set your mp3 filename
static constexpr const char* filename[] =
{
  "/mp3/file01.mp3",
  "/mp3/file02.mp3",
  "/mp3/file03.mp3",
  "/mp3/file04.mp3",
};

mp3ファイル4つ(手元にたまたまあったやつ)をサンプルソースに書いてある上記のファイル名にリネームしてをSDカードに放り込み実行。

とりあえず音は割れまくりだが動いたっぽい。試しに他のM5Stackに入れたら音は(比較すると)ほぼ割れなかった。その後、音が変なM5Stackのアンプに直接、代わりのスピーカーを繋げたらそっちはきちんと聞こえた。スピーカー自体がお亡くなりっぽい。

サンプルソースの中身を理解する作業メモはこちらに置いておいた。

この先はこちら

ESP Touchがつながらない時のチェックポイントメモ

なかなかつながらなくて調べたのでメモ。未検証も含む

接続先Wifiが分離モードになっていないか

分離モード(呼び名は色々ある)になっているとつながらなそう

WPAの世代が古くないか

古い親機でWPAが昔のタイプだとセキュリティが弱いのでそのままだとつながらない

してやるかそれでもダメな場合はESP8266のライブラリをver.2.0.0まで戻す。

esp-touchでブロードキャスト、マルチキャストを変更してみる

スマホアプリ側でブロードキャスト、マルチキャストを変更してみる。理由はわからないがこれで動いた。

「chan_shutdown_read: channel 1: shutdown() failed for fd 7 [i0 o0]: Not a socket」と怒られる

chan_shutdown_read: channel 1: shutdown() failed for fd 7 [i0 o0]: Not a socket

ubustsuのlinuxサーバ(VPS)からgithubにつなげようとしたら上記メッセージが出てうまくいかなかった。

※2024/3/15手順追記

環境

サーバ

  • Ubuntu 22.04.4 LTS \n \l
  • OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

操作端末

  • Windows11

原因

おそらくこちらにあるWindows側でのssh-agentが悪さしているよう。

事象的にはWindows側のssh-agentがForwardAgent yes設定にてカギをもってサーバに入っているけどそいつが見れなくなって要るっぽい

きちんと直すならばこちらの対応でいけたそう

対処

Windows側のssh-agentの問題らしいのでベータに変えたら解消したっぽい。(細かい原因追っていないのでちょっと怪しい)

手順としては管理者権限のPowerShellで以下を順次実施

インストール済みOPENSSHの削除

Microsoft.OpenSSH.Betaのインストール

※2024/3/15手順追記

1週間ほどしたらvscodeターミナルからsshが通らなくなっていた。パスを確認したところ昔のC:\Windows\system32\OpenSSHを指していて、今のC:\Program Files\OpenSSHを指していない。

個人用環境変数にC:\Program Files\OpenSSHを追加した。

細かいところで、1週間ぐらいたって通らなくなったのでWindowsアップデート等で書き換わった可能性もある。C:\Windows\system32\OpenSSHはシステム全体の環境変数に入っていたので、そちらがまた書き換わる可能性を考え個人用の環境変数の方に入れてみた。(どれだけ効果あるかや本当にWindowsUpdate絡みか確認していない。またおかしくなったらこれみて思い出す)

自宅用通知マシン作成(1)

店の予約が入ったときすぐ気づきたいとか、店から自宅に呼び出しかけたりとか細々としたとこ改善したいので自宅用通知マシンを作成開始する。

第一段階としては、店に予約が入ったときにすぐ気づけるように予約が入ったら通知としてLEDを光らせる機能をつくる。

予約が入ったらじゃらんとかアソビューから通知メールが飛んでくる。数分以内に気づけたら十分なので、自宅側の通知マシンから定期的に通知メールがあるか確認する方式にする。

ちなみにメールサーバは自前(VPS)でpostfix&dovecotなのでそっちで一部処理しておく。自宅側の端末はESP8266(ESP-WROOM-02)で作成する。秋月で現在420円するので今ならESP-WROOM-32とほとんど値段変わらないのでそっち使ってもよい。(200円台の時に買ったのが数10個余っているので消費もかねて)

全体構成

  1. VPS上メールサーバのdovecotに予約メールが入ったときに、表題をみてメールを指定フォルダに振り分け。使用ツールはseive
  2. メールサーバ上にpythonで立てた未読予約メールカウント返却APIを準備。(最前面はnginx)
  3. espからAPIを定期的に呼び出し、未読の予約メールがあったらLEDを光らせて通知する。(既読にするのはPC上のメーラーで)

メールサーバサイド

seiveの設定

seiveで予約メールが届いた際に指定フォルダ(今回はINBOX.ジム.予約)に振り分け。(seiveのインストールは手順まとめていない。)

予約メールはとりあえず件名で判断。設定ファイルは以下。件名がXXだったらYYフォルダに振り分ける。

APIの準備

以前書いていた。こちら

APIのサービス化

/etc/systemd/system/mailapi.service作成

※ ~/apiをベースパスにしていたけどgit cloneの時のパスがずれたので後ほど~/yobidashi/server/apiに変更

一応メールアカウントとパスワードは外部から読み出しに(/home/yoshitake/api/mailapi.conf)

サービスに登録