前回はADFをインストールしサンプルプログラムを変更してMP3ファイルを再生することが出来ました。今回は、回路にボタンを追加してボタンを押したら曲を再生するように変更して行きます。
ボタンをどう配線するの
Espressif社の製品カードにはボタンが付いていて、選曲やスタートストップをそのボタンで操作するよになっている様です。製品カードを持っていないので配線の仕方が分かりません。Webで探して、”LYRAT_V4.3” の回路を見つけました。

左が”LYRAT_V4.3”ボタン周りの回路。ボタンを押す前はHigh、押してLowになる回路です。これを参考に前回の回路のGPIO36に上図右の様にボタンを追加しました。
プロジェクトの構成
ボタンを追加する為に前回削除した2つのファイル、board.c, board_def.h を復活させます。これらにボタンの情報を追加して行くのですが、それ以外のファイルも変更しているので順を追って説明して行きます。
先ずは、components/my_board/my_board_v1_0/フォルダー
このフォルダーの、board_def.h でボタン用GPIOの登録を行っています。サンプルプロジェクトに有ったファイルを元に必要な部分のみを書きました。
board_def.h- 4行:define BUTTON_PLAY_ID GPIO_NUM_36
- ここで、プログラム内で使用するIDとGPIOポートを宣言します。
- IDを BUTTON_PLAY_ID 。 GPIOポートを 36としています。
- 6行:define INPUT_KEY_NUM 1
- 使用するGPIOポートの数を指定。
- 今回はPLAY用ボタン1つなので、”1”を設定
- 8行から:ここから登録するボタンのコンフィグの設定になります。
- 9行: .type = PERIPH_ID_BUTTON, デジタルIOと指定。この他にADC等の指定も有ります。
- 10行: .user_id = INPUT_KEY_USER_ID_PLAY, ユーザーID。今回は使いませんでした。
- 11行: .act_id = BUTTON_PLAY_ID, 上記の宣言を使用するようです。
このボタンに機能を持たせているのが、board.c ファイルです。
board.c- 9行以降:esp_err_t audio_board_key_init(esp_periph_set_handle_t set)
- ボタンの初期設定を行っています。
- 12行:ボタンコンフィグとして使用するボタン(GPIO36)ビットを持って
- 14行:ボタン用ハンドルを製作します。
- 15行:製作の確認
- 17行:ペリフェラルハンドルのset にボタンを登録し、動作を開始。
board.c で使用している関数、get_input_play_id()は board_pins_config.c で定義しています。
board_pins_config.c74行目以降に関数(int8_t get_input_play_id(void))の定義が有ります。BUTTON_PLAY_ID を返すのみの関数です。ちなみに BUTTON_PLAY_ID は GPIO_NUM_36(36) です。
board.h には新しく追加した関数を登録 21行に登録しています。
board.h次は、components/my_board/フォルダー
ここでは、CMakeLists.txt を変更します。COMPONENT_SRCS に ./my_board_v1_0/board.c を追加(9行)しています。
CMakeLists.txt最後に、main/フォルダー
ここでは、play_mp3_control_example.c を変更します。前回のプログラムに70行目以降を追加しています。
play_mp3_control_example.c- 71行:デフォルトの値を使って
- 72行:ペリフェラルハンドル set を作成
- 75行:set を持ってボードの初期設定。ここでボタンハンドルが setに追加されました。
- 78行:デフォルトのlistener値を使って
- 79行:ハンドル evt を作成
- 82行:evt を setのlistenerに設定。
- 86行:audio_event_iface_listen(evt, &msg, portMAX_DELAY);
- これで対象エレメントからのメッセージを受け取る事が出来ます。
- 第一引数:audio_event_iface_handle_tのevt。
- evtはボタンのリスナーなのでボタンイベントを受けれます
- 第2引数:audio_event_iface_msg_t の&msg。
- ここにメッセージが入ります。メーッセージには
PERIPH_BUTTON_UNCHANGE
= 0 No eventPERIPH_BUTTON_PRESSED
When button is pressedPERIPH_BUTTON_RELEASE
When button is releasedPERIPH_BUTTON_LONG_PRESSED
When button is pressed and kept for more thanlong_press_time_ms
PERIPH_BUTTON_LONG_RELEASE
When button is released and event PERIPH_BUTTON_LONG_PRESSED happened
- 第3引数:TickType_t wait_time
- メッセージモニター時間。指定した時間の間イベントをモニターします
- portMAX_DELAYですが、正確な時間は分かりませんがかなり長い時間モニターしています。
- 今回はメッセージの判断はしていません。portMAX_DELAYでイベントが起こるまでウエイトを掛けた状態になります。
- よってボタンを押したら次に進みます。
- 以降は前回と同じ。
これでプログラムの変更が済みました。コンパイルして実行しましょう。
実行まで
前回からの引き続きなら下記の操作は必要有りません
- モニターを開いて、~/esp/play_mp3_controlフォルダーに移動。
- 先ずはターゲットの設定を行います。今回はESP32なので、idf.py set-target esp32 を実行。
- 続いて menuconfig を実行して音源ボードを設定します。モニターで、
- idf.py menuconfig を実行し、Audio HAL —> Audio board (ESP32-Lyrat V4.3) —> と進む
- その画面で ( ) Custom audio board を選択して 保存(s)して下さい。
- 設定はここだけです。
次はESP32をPCにつないでモニターから、idf.py -p [USB port] flash monitor と入力して下さい。コンパイルが終了するプログラムが起動します。ボタンを押すと曲が再生されます。
ここに今回のプログラムを保管します。実行は、モニターを開いてターゲット指定から行って下さい。