Ideal Reality

興味の赴くままに

M5 ATOM Lite, ATOM UをPlatformIOのespidfフレームワークで使う

M5 ATOM Liteとかって、高級なLCDやPMICが載っているわけではないのでM5Unifiedを使うほどではないんだけど、RGB LED制御とかボタンのイベント管理を自作するにはちょっと面倒なので、便利なライブラリに頼りたい。 そんなときに、PlatformIO Registry からespidf対応のライブラリを探してきてもいいのだが、LEDとボタンの制御くらいならEspressif公式のライブラリが IDF Component Registry にあるので、そっち使ったほうが軽くていいよって話。

Contents
スポンサーリンク

サンプル

PlatformIO-Examples/M5Atom-espidf at main · Hiroki-Kawakami/PlatformIO-Examples

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 タスクから呼ばれてるっぽいです。

スポンサーリンク

あとがき

有志のライブラリもいいけど、公式のライブラリがあるならそっち使いたいよね

スポンサーリンク

コメント

投稿されたコメントはありません

名前

メールアドレス(任意)

コメント

関連する投稿