M5StampC3でLチカ(esp-idf)

M5Stamp C3(RISC-V)をあまり使ってなかったのもあって、ちょっと使ってみようかなと。搭載されているSK6812をArduino IDE経由、いわゆるAdafruit Neopixelライブラリを使って操作するのもだけど、esp-idf経由で動かしたくなった。

https://www.hirotakaster.com/wp-content/uploads/2022/05/movie.mp4

LEDの赤〜緑〜青でループさせている。動かす過程で、esp-idf用の何かライブラリ一発で出来ないかしら?と調べていたら、esp-idf-lib という素敵なものを見つけた。色々なcomponentが入っていて、led_stripというのを使えば何かいけそうな…何となくノリで書いてみたらいけた。

コードはまるっと置いといた。githubから持ってきて、idf.py build〜flashすればOK。CMakeLists.txt の EXTRA_COMPONENT_DIRS を自分の環境に合わせて修正してあげる必要あり。

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "led_strip.h"

void setcolor(led_strip_t *led, rgb_t *color) {
    led_strip_set_pixel(led, 0, *color);
    led_strip_flush(led);
    led_strip_wait(led, 5 * 1000);
    vTaskDelay(10 / portTICK_PERIOD_MS);
}

void app_main(void) {

    // setup led strip
    led_strip_t ledstrip;

    ledstrip.is_rgbw = true;
    ledstrip.length = 1;
    ledstrip.gpio = GPIO_NUM_2;
    ledstrip.channel = RMT_CHANNEL_0;
    ledstrip.type = LED_STRIP_SK6812;

    led_strip_install();
    led_strip_init(&ledstrip);

    // set color r->g-b
    rgb_t color;
    color.r = color.g = color.b = 0;
    int vec = 1;
    int val = 0;
    int stg = 0;
    while (1)  {
        val += vec;
        if (val >= 255 || val <= 0) vec *= -1;
        switch (stg)  {
        case 0:
            color.r = val;
            if (val == 0) stg = 1;
            break;
        case 1:
            color.g = val;
            if (val == 0) stg = 2;
            break;
        case 2:
            color.b = val;
            if (val == 0) stg = 0;
            break;
        default:
            break;
        }
        setcolor(&ledstrip, &color);
    }
    esp_restart();
}

初期化でLED個数、GPIO(SK6812につながっているのは2)とかをしてあげて、あとは色(color)を作って、led_strip_set_pixel, led_strip_flush するいつもの感じ。

ちな、VScode(PlatformIO)、esp32-c3-devkitm-1でも問題なくM5Stamp C3で動いた。esp-idf-lib の components 以下をPIOのlibにごそっと持ってくればOK

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください