Forum: Mikrocontroller und Digitale Elektronik WS2812b mittels ESP-IDF ansteuern


von Chandler B. (chandler)


Angehängte Dateien:

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.

von Steve van de Grens (roehrmond)


Lesenswert?

Was sagt denn der Autor dieses Codes dazu?

von Ralf G. (ralg)


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.

von Vincent H. (vinci)


Lesenswert?

Der Autor geht wohl davon aus dass die weißt wie man die RMT Peripherie 
des ESP32 benutzt:
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/rmt.html

WS2812 gibts übrigens sogar als offizielles Beispiel direkt von 
Espressif:
https://github.com/espressif/esp-idf/tree/b90dfe07592/examples/peripherals/rmt/led_strip

: Bearbeitet durch User
von Chandler B. (chandler)


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.

von Steve van de Grens (roehrmond)


Lesenswert?

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?

von Chandler B. (chandler)


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

von Steve van de Grens (roehrmond)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.