M5 ATOM Lite, ATOM UをPlatformIOのespidfフレームワークで使う
M5 ATOM Liteとかって、高級なLCDやPMICが載っているわけではないのでM5Unifiedを使うほどではないんだけど、RGB LED制御とかボタンのイベント管理を自作するにはちょっと面倒なので、便利なライブラリに頼りたい。 そんなときに、PlatformIO Registry からespidf対応のライブラリを探してきてもいいのだが、LEDとボタンの制御くらいならEspressif公式のライブラリが IDF Component Registry にあるので、そっち使ったほうが軽くていいよって話。
サンプル
Example Projects for PlatformIO. Contribute to Hiroki-Kawakami/PlatformIO-Examples development by creating an account on GitHub.
ボタンをクリックすると色が変わります。長押しすると点滅の周期が変わります。
PlatformIOでもIDF Component Registryが使える
src
ディレクトリ直下にidf_component.yml
を用意してやれば、PlatformIOでもIDF Component Registryにあるライブラリが使えます。ただ、PlatformIOの観測範囲外でプロジェクトの中身をいじっているので、idf_component.yml
を編集した後は「PlatformIO: Clean」で一度ビルドルールやキャッシュ等をリセットしたほうがいいです。
LED制御
LED Strip Driver | IDF Component Registry
これが使えます。あまり語ることもないのですが、ざっくりとした使い方はこんな感じ。上記ページに使い方が書いてあります。LED1個だけなので楽ですね。
#include "led_strip.h"
void app_main() {
// 初期化
led_strip_handle_t led_strip;
led_strip_config_t strip_cfg = {
.strip_gpio_num = LED_PIN,
.max_leds = 1,
.led_pixel_format = LED_PIXEL_FORMAT_GRB,
.led_model = LED_MODEL_WS2812,
.flags.invert_out = false,
};
led_strip_rmt_config_t rmt_cfg = {
.clk_src = RMT_CLK_SRC_DEFAULT,
.resolution_hz = 10 * 1000 * 1000,
.mem_block_symbols = 0,
.flags.with_dma = false,
};
led_strip_new_rmt_device(&strip_cfg, &rmt_cfg, &led_strip);
// 色/明るさの設定
led_strip_set_pixel(led_strip, 0, 30, 30, 30); // 後ろの3つがそれぞれRGBの値。50より大きい値は入れないほうがいいと思う
led_strip_refresh(led_strip); // 忘れないようにrefresh
}
注意点として、あまり大きな値を設定してしまうとLEDが明るくなりすぎて、目にもLED素子にも悪いので、設定する値は最大50くらいにしておいたほうがいいと思います。
ボタン制御
Component: Button | IDF Component Registry
これが使えます。Espressif公式ページにドキュメントもあります。 簡単な使い方はこんな感じ。初期化してコールバックを登録しておけば、ボタンイベントが発生したときにコールバックを呼んでくれます。
#include <stdio.h>
#include "iot_button.h"
void button_single_clock(void *arg, void *usr_data) {
printf("Hello!\n");
}
void app_main() {
// Setup Button
button_config_t gpio_btn_cfg = {
.type = BUTTON_TYPE_GPIO,
.long_press_time = 1000,
.short_press_time = 50,
.gpio_button_config = {
.gpio_num = BUTTON_PIN,
.active_level = 0,
},
};
button_handle_t gpio_btn = iot_button_create(&gpio_btn_cfg);
if (gpio_btn) {
iot_button_register_cb(gpio_btn, BUTTON_SINGLE_CLICK, button_single_clock, NULL);
}
}
長押しが反応する時間などは button_config_t
に入れる値で調整できます。
使えるイベントは Single Click 以外にも色々あって、これだけあれば大体の用途で十分だと思います。
Button — ESP-IoT-Solution # Button event
あと、試してないけど menuconfig から GPIO BUTTON SUPPORT POWER SAVE
を有効化して gpio_btn_cfg.gpio_button_config.enable_power_save
をいじれば ESP32 をスリープから復帰させるとかそういう用途の設定もしてくれそう。
ちなみに、あまり詳しく見てないので間違ってるかもだけど、コールバックは ESP Timer タスクから呼ばれてるっぽいです。
あとがき
有志のライブラリもいいけど、公式のライブラリがあるならそっち使いたいよね
コメント