WS2812b mittels ESP-IDF ansteuern

OP #7529692
Lesenswert?

Hallo, ich möchte mit einem ESP32 einen WS2812b LED-Streifen ansteuern. Dazu benutze ich die ESP32 LED Strip Library https://github.com/Lucas-Bruder/ESP32_LED_STRIP .

1
#define LED_STRIP_DATA_PIN      GPIO_NUM_16
2
#define LED_STRIP_LENGTH        17U
3
#define LED_STRIM_RMT_INTR_NUM  19U
4

5
static struct led_color_t led_strip_buf_1[LED_STRIP_LENGTH];
6
static struct led_color_t led_strip_buf_2[LED_STRIP_LENGTH];
7

8
static void ledTask(void* pvParameters);
9
static void ledTask(void* pvParameters)
10
{
11

12
    struct led_strip_t led_strip = {
13
        .rgb_led_type = RGB_LED_TYPE_WS2812,
14
        .led_strip_length = LED_STRIP_LENGTH
15
        .rmt_channel = RMT_CHANNEL_1,
16
        .rmt_interrupt_num = LED_STRIM_RMT_INTR_NUM,
17
        .gpio = LED_STRIP_DATA_PIN,
18
        .led_strip_buf_1 = led_strip_buf_1,
19
        .led_strip_buf_2 = led_strip_buf_2,
20
    };
21
    led_strip.access_semaphore = xSemaphoreCreateBinary();
22
    
23
    bool led_init_ok = led_strip_init(&led_strip);
24

25

26
    if (true == led_init_ok)
27
    {
28
        ESP_LOGI(TASK_TAG, "initialisation LED: OK");
29
    }
30
    else
31
    {
32
        ESP_LOGI(TASK_TAG, "initialisation LED: NOK");
33
    }
34

35
    TickType_t xLastWakeTime = xTaskGetTickCount();
36

37
    while (1) {
38

39
        vTaskDelayUntil(&xLastWakeTime, 100);
40
    }
41
}
42

43
void initLed(void)
44
{
45
    xTaskCreate(ledTask, "ledTask", 8000, (void*)1, tskIDLE_PRIORITY, NULL);
46
}

Die Initialisierung scheint auch erfolgreich zu sein. Doch wenn ich einen Logikanalyzer dran halte bekomme ich die Ausgabe wie im Anhang zu sehen.

Ich habe diese Lib an zwei stellen modifizieren müssen.

led_strip.h: hinzufügen der header semphr.h

1
#include freertos/semphr.h"

led_strip.c rmt_wait_tx_done erwartet ein zweites argument

1
rmt_wait_tx_done(led_strip->rmt_channel, portMAX_DELAY);

Warum kommen da zwischendrinn immer Signale? ich setze ja kein Signal, von daher sollte es eigentlich immer auf low bleiben.

Angehängte Dateien:
#7531507
Lesenswert?

Ich lese öfters mal 'task'. Deutet darauf hin, dass da was parallel läuft auch wenn keine Ausgabedaten geändert werden. Das ganze alle 30ms.

  • Sind die 30ms irgendwie nachvollziehbar?
  • Pinzuordnung korrekt?

Ich würde jetzt:

  • Das Programm auf das allernötigste zusammenstreichen
  • Nach und nach vor jeden Funktionsauf einen anderen Ausgabepin toggeln, mit dem Logicanalyzer aufzeichnen und schauen, wo die 'mystische' Ausgabe zeitgleich kommt und somit den Übeltäter eingrenzen.
OP #7533510
Lesenswert?

Ralf G. schrieb:

Ich lese öfters mal 'task'. Deutet darauf hin, dass da was parallel läuft auch wenn keine Ausgabedaten geändert werden. Das ganze alle 30ms.

  • Sind die 30ms irgendwie nachvollziehbar?
  • Pinzuordnung korrekt?

Ich habe die 30ms gefunden. in der Library wird ebenfalls ein task erstellt, welcher alle 30ms ausgelöst wird und die Daten über RMT rausschickt. Laut dem Datenblatt vom WS2812b ist das sogar beschrieben

1
When the refresh rate is 30fps, cascade number are not less than1024 points

Wobei um ehrlich zu sein ich den Satz nicht ganz verstehe.

1
Wenn die Bildwiederholfrequenz 30 fps beträgt, beträgt die Kaskadenzahl nicht weniger als 1024 Punkte

was ist mit Kaskadenzahl gemeint?

zumindest kommen von der Library die Signale.

OP #7533814
Lesenswert?

Steve van de Grens schrieb:

Chandler B. schrieb:

was ist mit Kaskadenzahl gemeint?

Klingt als sei damit die Anzahl der LEDs in der Kette gemeint.

Pro Bit brauchst du ungefähr 1 µs. Jede LED hat 24 Bit, also ungefähr 24 µs. Das mal 1024 ergibt ungefähr die 30 ms.

Klingt das schlüssig?

Aber benötigt wird das bei den LEDs doch eigentlich nicht, oder? Ich habe 110 LEDs. Eigentlich muss ich doch nur daten senden, wenn diese sich geändert haben? So habe ich es bisher zumindest in anderen Projekten gemacht. Es hat funktioniert. Sprich, ich dürfte nicht schneller als alle 2,6 ms senden?

24 µs * 110 = 2,64 ms

würde eigentlich eher im sekundenbereich/minutenbereich die daten schicken

Gast #7533842
Lesenswert?

Chandler B. schrieb:

Aber benötigt wird das bei den LEDs doch eigentlich nicht, oder? Ich habe 110 LEDs. Eigentlich muss ich doch nur daten senden, wenn diese sich geändert haben?

Wenn du meinst. Der Autor hatte dabei wohl eine flüssige Animation im Sinn gehabt. Dafür sind 30 fps durchaus sinnvoll.

würde eigentlich eher im sekundenbereich/minutenbereich die daten schicken

Wie du willst. Mache das so, wie es für deine Anwendung passt

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren