esp32s3驱动rgb灯

最近做项目要用到esp32s3,所以在网上找了和很多资料去学习,但发现好像都堆初学者不是很友好。因为我之前学习和用的都是stm32这类需要自己写驱动的单片机,用到esp32s3这种直接调用驱动一时间会有点不习惯,但反应过来后会发现用起来很方便。

然后我购买的是官方的开发板——ESP32-S3-DevKitC-1。官方给的资料很全,很详细,所以需要长时间去学习沉淀。官网链接https://mp.csdn.net/mp_blog/creation/editor?spm=1011.2124.3001.6217

如果有和我一样购买了官方的开发板 ESP32-S3-DevKitC-1,你会发现和我们之前学习的单片机不一样,像stm32、51这类单片机第一步一般都是配置gpio口去点亮一个led灯,而ESP32-S3-DevKitC-1,没有led!!!只有一个rgb led。

而这篇文章就是为了方便让和我一样有点灯困惑的小伙伴快速熟悉如何点灯。

1.SK68XX

首先,我们要先知道连接的这个rgbled是什么型号,如何驱动,驱动代码在哪里。我们先看原理图(下图为新版开发板,旧版开发版的驱动引脚是GPIO48) rgbled的型号是SK68XX,然后我们去找到对应的芯片数据手册。发现每一个rgbled灯可以看成是一个像素点,除了电源和地引脚外,就只用一个DIN引脚驱动,同时我们看手册会发现这个rgbled同一时间需要24bit数据才能实现红、绿、蓝等多种颜色的切换但是就一个驱动引脚如何传输24位数据呢,高低电平如何区分呢,这就是它的驱动原理了可以看出,它是需要先确定一个固定的周期,然后在这个固定的周期里高低电平不同的保持时间来区分“0”码和“1”码。相信到这里,学过单片机的都知道如何点亮这个rgbled了。但如我前文所说,esp32已经有写好的driver了,我们只需看懂和直接调用就好,省去了自己写驱动的时间。

2.红外遥控 (RMT)

作为一个初学者,我们并不熟悉esp32的驱动该如何调用,在哪里调用,所以最好的方法是从例程入手,我们在安装esp-idf时其实吧例程也下载好了,而rgb灯的例程在这里打开例程会发现,rgbled的·驱动并不是直接用GPIO进行驱动的,而是用到了红外遥控RMT,了解过红外遥控的都知道,红外遥控也是单线驱动的,和SK68XX异曲同工,所以在配置时注意周期和“0”码“1”码的高低电平占空比就可实现SK68XX的驱动,具体可看代码。

led_strip_t *led_strip_new_rmt_ws2812(const led_strip_config_t *config)
{
    led_strip_t *ret = NULL;
    STRIP_CHECK(config, "configuration can't be null", err, NULL);

    // 24 bits per led
    uint32_t ws2812_size = sizeof(ws2812_t) + config->max_leds * 3;
    ws2812_t *ws2812 = calloc(1, ws2812_size);
    STRIP_CHECK(ws2812, "request memory for ws2812 failed", err, NULL);

    uint32_t counter_clk_hz = 0;
    STRIP_CHECK(rmt_get_counter_clock((rmt_channel_t)config->dev, &counter_clk_hz) == ESP_OK,
                "get rmt counter clock failed", err, NULL);
    // ns -> ticks
    float ratio = (float)counter_clk_hz / 1e9;
    ws2812_t0h_ticks = (uint32_t)(ratio * WS2812_T0H_NS);
    ws2812_t0l_ticks = (uint32_t)(ratio * WS2812_T0L_NS);
    ws2812_t1h_ticks = (uint32_t)(ratio * WS2812_T1H_NS);
    ws2812_t1l_ticks = (uint32_t)(ratio * WS2812_T1L_NS);

    // set ws2812 to rmt adapter
    rmt_translator_init((rmt_channel_t)config->dev, ws2812_rmt_adapter);

    ws2812->rmt_channel = (rmt_channel_t)config->dev;
    ws2812->strip_len = config->max_leds;

    ws2812->parent.set_pixel = ws2812_set_pixel;
    ws2812->parent.refresh = ws2812_refresh;
    ws2812->parent.clear = ws2812_clear;
    ws2812->parent.del = ws2812_del;

    return &ws2812->parent;
err:
    return ret;
}

3.点亮

了解完驱动方式后,便可点亮rgbled了,调用代码esp32也已经包装好了,话不多说,直接上代码

struct led_strip_s {
    /**
    * @brief Set RGB for a specific pixel
    *
    * @param strip: LED strip
    * @param index: index of pixel to set
    * @param red: red part of color
    * @param green: green part of color
    * @param blue: blue part of color
    *
    * @return
    *      - ESP_OK: Set RGB for a specific pixel successfully
    *      - ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters
    *      - ESP_FAIL: Set RGB for a specific pixel failed because other error occurred
    */
    esp_err_t (*set_pixel)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue);

    /**
    * @brief Refresh memory colors to LEDs
    *
    * @param strip: LED strip
    * @param timeout_ms: timeout value for refreshing task
    *
    * @return
    *      - ESP_OK: Refresh successfully
    *      - ESP_ERR_TIMEOUT: Refresh failed because of timeout
    *      - ESP_FAIL: Refresh failed because some other error occurred
    *
    * @note:
    *      After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip.
    */
    esp_err_t (*refresh)(led_strip_t *strip, uint32_t timeout_ms);

    /**
    * @brief Clear LED strip (turn off all LEDs)
    *
    * @param strip: LED strip
    * @param timeout_ms: timeout value for clearing task
    *
    * @return
    *      - ESP_OK: Clear LEDs successfully
    *      - ESP_ERR_TIMEOUT: Clear LEDs failed because of timeout
    *      - ESP_FAIL: Clear LEDs failed because some other error occurred
    */
    esp_err_t (*clear)(led_strip_t *strip, uint32_t timeout_ms);

    /**
    * @brief Free LED strip resources
    *
    * @param strip: LED strip
    *
    * @return
    *      - ESP_OK: Free resources successfully
    *      - ESP_FAIL: Free resources failed because error occurred
    */
    esp_err_t (*del)(led_strip_t *strip);
};

调用

static led_strip_t *pStrip_a;

static void blink_led(void)
{
    /* If the addressable LED is enabled */
    if (s_led_state) {
        /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */
        pStrip_a->set_pixel(pStrip_a, 0, 0, 51, 51);
        /* Refresh the strip to send data */
        pStrip_a->refresh(pStrip_a, 100);
    } else {
        /* Set all LED off to clear all pixels */
        pStrip_a->clear(pStrip_a, 50);
    }
}

我也是初次接触esp32s3,如有不对的地方欢迎大家指正。

ESP32-S3是一款由Espressif Systems公司生产的基于RISC-V架构的低功耗微控制器,而WS2812是一种串行LED控制芯片,常用于RGB LED带。要在ESP32 S3驱动WS2812条,你需要做以下步骤: 1. **库支持**:首先,确保安装了适用于ESP32-S3的WS2812驱动库,例如Espressif官方的esp-idf框架内建的`driver_ws281x`库。 2. **硬件连接**:将WS2812条连接到ESP32-S3的GPIO引脚,通常数据线(DIN)接到数字输入输出口,时钟线(CLK)连接到高速脉冲信号,以及电源线连接到相应的电源电压。 3. **初始化配置**:在你的应用程序中,通过`ESP32_Series::ledc_set_freq()`设置LED频率,并使用`ledc_write_reg()`函数配置条的通道、亮度等。 4. **发送颜色数据**:使用`ledc_send_data()`函数,根据需要发送RGB值到WS2812的寄存器,控制每个像素的颜色。 5. **主循环更新**:在你的主循环里,定期调用上述函数刷新LED的状态。 ```cpp #include "driver_ws2812.h" // ...其他代码... ledc_channel_config_t ledcfg = { .speed_mode = LEDC_HIGH_SPEED_MODE, .duty_num = 0, // 设置初始亮度 .timer_num = 0, // 使用第0个定时器 .gpio_num = WS2812_DATA_PIN // GPIO引脚对应WS2812的数据线 }; ledc_timer_config_t tmrconfig = { .clk_src = LEDC_APB, // LEDC使用APB时钟源 .freq_hz = WS2812_FREQ_HZ, // 频率 .timer_num = 0 // 使用第0个定时器 }; // 初始化LEDC模块和LEDledc_init(); ledc_timer_config(&tmrconfig); ledc_channel_config(&ledcfg); while (true) { // 更新LED颜色 for (int i = 0; i < WS2812_NUM_PIXELS; i++) { uint32_t color = get_pixel_color(i); // 获取当前像素颜色 ledc_write_reg(ledcfg.channel, i * WS2812_PIXES_PER_BYTE, color); } ledc_sync(); // 发送数据并同步 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值