GithubHelp home page GithubHelp logo

someweisguy / esp_dmx Goto Github PK

View Code? Open in Web Editor NEW
297.0 16.0 28.0 2.85 MB

Espressif ESP32 implementation of ANSI-ESTA E1.11 DMX-512A and E1.20 RDM

License: MIT License

CMake 0.28% C 99.72%
esp-dmx dmx-devices dmx dmx512 dmx-512 dmx-512a dmx512a theatre theater lighting

esp_dmx's Issues

missing dependencies?

Good Morning somewiseguy,
I tried too use yore library on an Espresso 32, using the Arduino IDE on a Mac and included your library via the library manager of Arduino IDE, but I get an error for a missing file:

Arduino: 1.8.19 (Mac OS X), Board: "ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"

In file included from /Users/Coden/Documents/Arduino/test/test.ino:4:0:
/Users/Coden/Documents/Arduino/libraries/esp_dmx/src/esp_dmx.h:12:28: fatal error: hal/gpio_types.h: No such file or directory
compilation terminated.
exit status 1
Fehler beim Kompilieren für das Board ESP32 Dev Module.

any idea where I can get this file from?

dmx_port when not using SparkFun shield

I am trying to figure out what to do with the dmx_port_t dmxPort = 2; section when I am not using a Sparkfun Shield but a RS-485 MODULE.
If I remove it I get errors.

Crash when WIFI enabled but not connected and DMX messages coming in

Issue

Random but consistent crash when processing DMX messages when not connected to WIFI.

When there are no incoming DMX messages then no crash occurs and the ESP continues to attempt to connect in the background.

Similarly, if WIFI is connected and DMX messages do or do not arrive then no crash occurs.

Likewise if WIFI is connected and DMX message are being received, and then WIFI disconnects then the crash does occur.

I've tried multiple hardware (various ESP boards) along with different incoming DMX message framerates, I can get this to occur in as low as 2 fps. Although it occurs more frequently at high frame rates - I suspect this is a function of the ISR being called.

Steps to reproduce:

  1. Using esp_dmx v1.1.3
  2. Configure WIFI to connect to an AP (i.e. ESP has credentials stored)
  3. AP is offline or not in range
  4. Stream incoming DMX messages (UART 1 in my case)
  5. After between 0 - 40 seconds CPU will crash

Example code

As of writing the current master is the same as this tagged release (which replicates the issue) https://github.com/chaosloth/Connotron_DMX_Gateway/releases/tag/v0.0.2-beta

Notes

I've seen discussion on the intewebs regarding Cache disabled but cached memory region accessed exceptions with the proposed fix as marking ISR functions with IRAM_ATTR. I see that the ISR functions are indeed annotated and that the function called out in the exception below is an inline function which should also inherit this.

Exception - Example 1

Decoded

ESP exception decoder points to dmx_hal_write_txinfo function, however I have also seen the exception point to dmx_hal_get_rxfifo_len too. The above decodes as follows:

PC: 0x400d9836: dmx_hal_write_txfifo at /Users/cc/Documents/Arduino/libraries/esp_dmx-1.1.3/src/dmx/hal.h line 369
EXCVADDR: 0x00000000

Decoding stack results
0x400d9833: dmx_hal_write_txfifo at /Users/cc/Documents/Arduino/libraries/esp_dmx-1.1.3/src/dmx/hal.h line 367

Dump

23:40:39.489 -> 
23:40:39.489 -> Core  1 register dump:
23:40:39.489 -> PC      : 0x400d9836  PS      : 0x00060035  A0      : 0x80081322  A1      : 0x3ffbf16c  
23:40:39.575 -> A2      : 0x00000000  A3      : 0x3ffb2938  A4      : 0x3ff50000  A5      : 0x3ffbf1b4  
23:40:39.575 -> A6      : 0x3ffc4e68  A7      : 0x84000254  A8      : 0x0000001c  A9      : 0x00000078  
23:40:39.575 -> A10     : 0x6002e000  A11     : 0x00000000  A12     : 0x8008ed14  A13     : 0x3ffbaad0  
23:40:39.575 -> A14     : 0x00000003  A15     : 0x00060023  SAR     : 0x00000000  EXCCAUSE: 0x00000007  
23:40:39.575 -> EXCVADDR: 0x00000000  LBEG    : 0x40084749  LEND    : 0x40084751  LCOUNT  : 0x00000026  
23:40:39.575 -> 
23:40:39.575 -> 
23:40:39.575 -> Backtrace:0x400d9833:0x3ffbf16c |<-CORRUPTED
23:40:39.575 -> 
23:40:39.575 -> 
23:40:39.575 -> 
23:40:39.575 -> 
23:40:39.575 -> ELF file SHA256: 0000000000000000
23:40:39.575 -> 
23:40:39.575 -> Rebooting...
23:40:39.575 -> ets Jun  8 2016 00:22:57
23:40:39.575 -> 
23:40:39.575 -> rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
23:40:39.575 -> configsip: 0, SPIWP:0xee
23:40:39.575 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
23:40:39.575 -> mode:DIO, clock div:1
23:40:39.575 -> load:0x3fff0030,len:1324
23:40:39.575 -> ho 0 tail 12 room 4
23:40:39.575 -> load:0x40078000,len:13508
23:40:39.575 -> load:0x40080400,len:3604
23:40:39.575 -> entry 0x400805f0
23:40:39.822 -> [     3][E][WiFiGeneric.cpp:586] wifiLow⸮f⸮⸮⸮%⸮⸮ѡ): esp_wifi_init 4353
23:40:39.861 -> [     5][D][esp32-hal-cpu.c:211] setCpuFrequencyMhz(): PLL: 480 / 2 = 240 Mhz, APB: 80000000 Hz

Exception - Example 2

Decoded

This exception occured after reboot, pointing to a slightly different part of the code but similar in that it occures in the HAL code.

PC: 0x4014ffe4: dmx_hal_get_rxfifo_len at /Users/cc/Documents/Arduino/libraries/esp_dmx-1.1.3/src/dmx/hal.h line 64
EXCVADDR: 0x00000000

Decoding stack results
0x4014ffe1: WiFiUDP::remotePort() at /Users/cc/Library/Arduino15/packages/esp32/hardware/esp32/2.0.2/libraries/WiFi/src/WiFiUdp.cpp line 280

Dump

00:22:24.988 -> rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
00:22:24.988 -> configsip: 0, SPIWP:0xee
00:22:24.988 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
00:22:24.988 -> mode:DIO, clock div:1
00:22:24.988 -> load:0x3fff0030,len:1324
00:22:24.988 -> ho 0 tail 12 room 4
00:22:24.988 -> load:0x40078000,len:13508
00:22:24.988 -> load:0x40080400,len:3604
00:22:24.988 -> entry 0x400805f0
00:22:25.204 -> [     3][E][WiFiGeneric.cpp:586] wifiLow⸮ff⸮⸮%⸮⸮ѡ): esp_wifi_init 4353
00:22:25.242 -> [     5][D][esp32-hal-cpu.c:211] setCpuFrequencyMhz(): PLL: 480 / 2 = 240 Mhz, APB: 80000000 Hz
00:22:25.427 -> 
00:22:25.427 -> Starting ConnoDMX Gateway on ESP32_DEV WIFI Manager: ESPAsync_WiFiManager v1.12.0
00:22:25.469 -> Normal mode. Entering WIFI_STA mode
00:22:25.469 -> [   247][D][WiFiGeneric.cpp:831] _eventCallback(): Arduino Event: 0 - WIFI_READY
00:22:25.537 -> [   338][D][WiFiGeneric.cpp:831] _eventCallback(): Arduino Event: 2 - STA_START
00:22:25.540 -> Guru Meditation Error: Core  1 panic'ed (Cache disabled but cached memory region accessed). 
00:22:25.586 -> 
00:22:25.586 -> Core  1 register dump:
00:22:25.586 -> PC      : 0x4014ffe4  PS      : 0x00060035  A0      : 0x40084c5c  A1      : 0x3ffbf18c  
00:22:25.586 -> A2      : 0x3ffb90bc  A3      : 0x3ffbdcc8  A4      : 0x00000000  A5      : 0x3ffbdcc4  
00:22:25.586 -> A6      : 0x00000001  A7      : 0x3ffbdcc4  A8      : 0x800813c8  A9      : 0x3ffbf16c  
00:22:25.586 -> A10     : 0x3ff50000  A11     : 0x0001819d  A12     : 0x800840d0  A13     : 0x3ffbaae0  
00:22:25.586 -> A14     : 0x3ffc4e68  A15     : 0x84000254  SAR     : 0x00000000  EXCCAUSE: 0x00000007  
00:22:25.659 -> EXCVADDR: 0x00000000  LBEG    : 0x40084749  LEND    : 0x40084751  LCOUNT  : 0x00000027  
00:22:25.659 -> 
00:22:25.659 -> 
00:22:25.659 -> Backtrace:0x4014ffe1:0x3ffbf18c |<-CORRUPTED

Exception - Example 3

Decoded

PC: 0x4015004c: dmx_hal_get_rxfifo_len at /Users/cc/Documents/Arduino/libraries/esp_dmx-1.1.3/src/dmx/hal.h line 74
EXCVADDR: 0x00000000

Decoding stack results
0x40150049: dmx_hal_get_rxfifo_len at /Users/cc/Documents/Arduino/libraries/esp_dmx-1.1.3/src/dmx/hal.h line 74

Dump

00:23:05.840 -> Guru Meditation Error: Core  1 panic'ed (Cache disabled but cached memory region accessed). 
00:23:05.840 -> 
00:23:05.840 -> Core  1 register dump:
00:23:05.840 -> PC      : 0x4015004c  PS      : 0x00060035  A0      : 0x800813f5  A1      : 0x3ffbf15c  
00:23:05.840 -> A2      : 0x000002bb  A3      : 0x00000078  A4      : 0x00000078  A5      : 0x00000201  
00:23:05.840 -> A6      : 0x3ffb91a0  A7      : 0x84000254  A8      : 0x00000243  A9      : 0x00000080  
00:23:05.878 -> A10     : 0x01002b8f  A11     : 0x00000000  A12     : 0x8008ed14  A13     : 0x3ffbaad0  
00:23:05.878 -> A14     : 0x00000003  A15     : 0x00060223  SAR     : 0x00000000  EXCCAUSE: 0x00000007  
00:23:05.878 -> EXCVADDR: 0x00000000  LBEG    : 0x40084749  LEND    : 0x40084751  LCOUNT  : 0x00000027  
00:23:05.878 -> 
00:23:05.878 -> 
00:23:05.878 -> Backtrace:0x40150049:0x3ffbf15c |<-CORRUPTED
00:23:05.878 -> 
00:23:05.878 -> 
00:23:05.878 -> 
00:23:05.878 -> 
00:23:05.878 -> ELF file SHA256: 0000000000000000
00:23:05.912 -> 
00:23:05.912 -> Rebooting...
00:23:05.912 -> ets Jun  8 2016 00:22:57
00:23:05.912 -> 
00:23:05.912 -> rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
00:23:05.912 -> configsip: 0, SPIWP:0xee
00:23:05.912 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
00:23:05.912 -> mode:DIO, clock div:1
00:23:05.912 -> load:0x3fff0030,len:1324
00:23:05.912 -> ho 0 tail 12 room 4
00:23:05.912 -> load:0x40078000,len:13508
00:23:05.912 -> load:0x40080400,len:3604
00:23:05.912 -> entry 0x400805f0

does not (seem to) recieve data

I can't seem t recieve DMX data. I'm using a DOIT EPS32 DEVKIT V1 and a RS485 to TTL module (https://www.elecrow.com/uart-ttl-to-rs485-twoway-converter-p-1545.html)
The module RX pin is connected to GPIO 16 and the RX LED is flickering when a DMX signal is applied.
The DMX signal is provided by a simple DMX controller (Elation SDC-16).
What I've tried:

  • both the 3.0 and 2.0.2 release of the library with the standard DMXread sketch. Both don't get any data. Only get an error when disconnecting and connecting the DMX signal.
  • both uart port 1 and 2, without succes.
  • connecting two RS485 modules A and B together with one module on the RX pin and the other on the TX pin and using the arduino multiserial example to send and recieve data. This worked fine even with the baudrate set to 2500000.
  • swapping RS485 modules, without succes

haven't tried:

  • looking at the DMX signal on a scope
  • using other GPIO pins for the RX TX pins
  • diving deeper into the library to see what is going on

any ideas?

Send basic data

Hi, the library is amazing, great job! How can I send the value 255 through channel 2? Thank you!

Error on compiling

I get the following error:
invalid conversion from 'int' to 'gpio_num_t' [-fpermissive]
on the line of:
dmx_set_pin(dmxPort, transmitPin, receivePin, enablePin);:

when I try to compile the DMXWrite example.

Single Core Issues?

Hey!

For context:
The board I am using: ES32-C3-WROOM-02 (Single core rather than dual-core)
IDE: Arduino

After loading the DMXWrite Example, and adapting the pins to TX=20, RX=21, Enable=0 (I believe this those are the ports for UART port 1 on this board?) -- and uploading, the ESP32 is consistently reboots, and gives this serial message:

ESP-ROM:esp32c3-api1-20210207 Build:Feb 7 2021 rst:0x3 (RTC_SW_SYS_RST),boot:0xc (SPI_FAST_FLASH_BOOT) Saved PC:0x40381a00 SPIWP:0xee mode:DIO, clock div:1 load:0x3fcd5810,len:0x438 load:0x403cc710,len:0x91c load:0x403ce710,len:0x25b0 entry 0x403cc710

Other code/different library examples upload and run fine

Does the library (in the default configuration) require timers/interrupts that aren't within this board/only in 2 core varieties? Or am I missing something obvious?

Any ideas/info would be great!
Thanks!

dmx_receive returns too early and data size is wrong

I am experimenting with the v3.0 release branch and am seeing some strange behavior.

  • The dmx_receive method returns too early. In my experiment it is returning at ~150hz (Max hz of dmx is ~44hz).
  • The size that is reported by dmx_receive is random. I.e. after a re-boot it will return a different size. The size never changes.

From my understanding of the documentation dmx_receive should block until a new dmx frame is returned but somehow this is not the case.

Am I missing something? This feels like I am not initializing something correctly.
The received data is correct, i.e. when I move the fader on the dmx sender I can see the correct value in the buffer.

The code below produces the following output:

...
E (15660) main: 15.675053: hz: 154.513034, ret: 255, data: 7
...
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_dmx.h"
#include "esp_log.h"
#include "esp_system.h"

#define TX_PIN 17 // the pin we are using to TX with
#define RX_PIN 16 // the pin we are using to RX with
#define EN_PIN 21 // the pin we are using to enable TX on the DMX transceiver

static const char *TAG = "main";
static uint8_t data[DMX_MAX_PACKET_SIZE] = {};

void dmxTask(void *unused)
{
    ESP_ERROR_CHECK(dmx_set_pin(DMX_NUM_2, TX_PIN, RX_PIN, EN_PIN));
    ESP_ERROR_CHECK(dmx_driver_install(DMX_NUM_2, DMX_DEFAULT_INTR_FLAGS));
    int count = 0;

    while (true)
    {
        dmx_event_t event;
        size_t ret = 0;
        ret = dmx_receive(DMX_NUM_2, &event, DMX_TIMEOUT_TICK);
        if (ret)
        {
            // Check that no errors occurred.
            if (event.err == ESP_OK)
            {
                count++;

                const double currentTimS = esp_timer_get_time() / 1000000.0;
                ESP_LOGE(TAG, "%f: hz: %f, ret: %d", currentTimS, (count / currentTimS), ret);
                dmx_read(DMX_NUM_2, data, event.size);
            }
            else
            {
                ESP_LOGE(TAG, "dmx error: %s", esp_err_to_name(event.err));
            }
        }
    }
}

void app_main()
{
    TaskHandle_t dmxTaskHandle = NULL;
    // TODO determine real stack usage and reduce later
    xTaskCreatePinnedToCore(dmxTask, "DMX_TASK", 10240, NULL, 2, &dmxTaskHandle, 1);
    if (!dmxTaskHandle)
    {
        ESP_LOGE(TAG, "Failed to create dmx task");
    }
}

ESP32 core 2.0.1-RC1, UART0 does not work

I have tested your DMX library on a ESP32 with core version 2.0.1-RC1 and it seems to work sending DMX packets on UART2 using your example code, expect UART0 stops working. Below is the simplest code that fails. If you comment out the #include ,esp_dmx.h> the below example will send "hello", if the library esp_dmx.h is included the serial port stops working. I do get the initial ESP32 core bootup info and then nothing after that.

#include <esp_dmx.h>
void setup() {
Serial.begin(115200);
Serial.println("setup serial");
}

void loop() {
Serial.println("hello");
delay(1000);
}

DMX RDM

Hi has anyone managed to implement RDM with this great library

Using esp_dmx for reading and writing at the same time

I tried to set up a device that patches DMX data.
So i tried receiving and sending at the same time (with two different RS485 converters, one for rx and one for tx).
But it does not work very well in parallel. DMX read errors come up frequently.
I combined the read and write examples in some way.
But what is the recommended method to receive data on one DMX input and send it (with changes) to another DMX output?

ESP32-WROOM-32 together with MAX485 module

Hi, first of all, this seems to be an up to date libary which is very good, I couldn't another one.
The Problem is that I don't know how to wire and program it, because I am very new in that scene, so I would ask politely if someone could help me with that.
Thanks!

two driver

Thanks for this library.

It works well with two drivers also (for TRANSMITTING and RECIEVING).
I just made below adjustment for initialization.
byte data[DMX_PACKET_SIZE] = {}; (add "= {}"; from reference code.)

By the way, is this two driver "unusual case" ? and better not to do as suggested on README ?
It is pretty nice if two driver or more can be used.

I read through README, I found below wording.

If transmitting and receiving data simultaneously is desired, the user can install two drivers on two UART ports.
It should be noted that this is an unusual use case. This library is not meant to act as a DMX optoisolator or splitter.

[question] Not Receiving data, wrong pinout, or incompatible module?

Hi,

I seem to be having a similar issue as #40.

I have an M5Stick-C with a M5 RS485 Hat. The M5 Arduino example show me data, and I can see the DMX channel values, but with your library, it doesn’t seem to receive anything.

I suspect it is because this module doesn’t have a RTS pin, and manages that automatically, so I was hoping your equivalent modules arrived, and you could help me out with this.

I am trying to receive only, and the data is being sent from an ENTTEC usb DMX sender, and QLCPlus.

Diagram

Thanks!

"unknown type name 'uart_sclk_t' " using EPS32 develop branch

Hallo using the development branch of ESP32

platform = https://github.com/platformio/platform-espressif32.git#develop

I get these errors:

[{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "cpp",
	"severity": 8,
	"message": "unknown type name 'uart_sclk_t'",
	"startLineNumber": 224,
	"startColumn": 58,
	"endLineNumber": 224,
	"endColumn": 58
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "C/C++",
	"code": "20",
	"severity": 8,
	"message": "identifier \"uart_sclk_t\" is undefined",
	"source": "C/C++",
	"startLineNumber": 224,
	"startColumn": 58,
	"endLineNumber": 224,
	"endColumn": 69
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "C/C++",
	"code": "20",
	"severity": 8,
	"message": "identifier \"UART_SCLK_APB\" is undefined",
	"source": "C/C++",
	"startLineNumber": 225,
	"startColumn": 39,
	"endLineNumber": 225,
	"endColumn": 52
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "cpp",
	"severity": 8,
	"message": "unknown type name 'uart_sclk_t'",
	"startLineNumber": 268,
	"startColumn": 15,
	"endLineNumber": 268,
	"endColumn": 15
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "C/C++",
	"code": "20",
	"severity": 8,
	"message": "identifier \"uart_sclk_t\" is undefined",
	"source": "C/C++",
	"startLineNumber": 268,
	"startColumn": 15,
	"endLineNumber": 268,
	"endColumn": 26
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "cpp",
	"severity": 8,
	"message": "'UART_SCLK_APB' undeclared (first use in this function)",
	"startLineNumber": 269,
	"startColumn": 42,
	"endLineNumber": 269,
	"endColumn": 42
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "C/C++",
	"code": "20",
	"severity": 8,
	"message": "identifier \"UART_SCLK_APB\" is undefined",
	"source": "C/C++",
	"startLineNumber": 269,
	"startColumn": 42,
	"endLineNumber": 269,
	"endColumn": 55
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "cpp",
	"severity": 8,
	"message": "'UART_SCLK_REF_TICK' undeclared (first use in this function)",
	"startLineNumber": 269,
	"startColumn": 58,
	"endLineNumber": 269,
	"endColumn": 58
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "C/C++",
	"code": "20",
	"severity": 8,
	"message": "identifier \"UART_SCLK_REF_TICK\" is undefined",
	"source": "C/C++",
	"startLineNumber": 269,
	"startColumn": 58,
	"endLineNumber": 269,
	"endColumn": 76
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "cpp",
	"severity": 4,
	"message": "\"REG_UART_BASE\" redefined",
	"startLineNumber": 11,
	"startColumn": 1,
	"endLineNumber": 11,
	"endColumn": 1
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "cpp",
	"severity": 4,
	"message": "\"REG_UART_AHB_BASE\" redefined",
	"startLineNumber": 12,
	"startColumn": 1,
	"endLineNumber": 12,
	"endColumn": 1
},{
	"resource": "/c:/Pcloud/Projects/DMX2Visca/DMX2Visca/.pio/libdeps/esp32-poe-iso/esp_dmx/src/dmx/hal.h",
	"owner": "cpp",
	"severity": 4,
	"message": "control reaches end of non-void function [-Wreturn-type]",
	"startLineNumber": 270,
	"startColumn": 1,
	"endLineNumber": 270,
	"endColumn": 1
}]

VSCode and Platformio

Great work Mitch, thank you.
This is not an issue with the current code and IDE, but related to another IDE. I tried to run this project from VSCode with Platformio and I get some errors for missing datatypes (like uart_sclk_t). In your instructions you are clear about using the latest framework. Because I am using the arduino framework I cannot use the latest espidf framework which is certainly causing the missing datatype errors. Have you used VSCode with Platformio successfully with your project?

Won't compile for esp32-C3

Attempted to build for the esp32-C3 and it fails with a compiler error as was suspected in the FIXME: comment on line 17 in the driver.h file. The eps32-C3 only has two UARTS which is why it fails. I adjusted the #define but it still won't compile due to a different uart_struct.h file (in the esp-idf/components/esp32c3/include/soc dir) being used.

I attempted to make appropriate changes to the data structure members and was able to get it to compile. However, I have not yet succeeded in getting it to work. It does run and install the driver, but no activity on the io pins (yet). Most of the data structure member differences had similar equivalent member names between the two different uart_struct.h files. However, there did not seem to be an equivalent member for tick_ref_always_on. I made a wild guess on this one and I plan to revisit my changes in the areas where I changed tick_ref_always_on to another member (mem_clk_en).

esp dump flash message showing on serial monitor output

when I upload DMXRead example of esp_dmx library on my esp32 module and open serial monitor for getting the status of DMX. I am getting this output on serial monitor

ets Jun 8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:13132
load:0x40080400,len:3036
entry 0x400805e4
E (131) esp_core_dump_flas����J����ɕ�сsize of core dump image: 151653755

what does it means??.

Sending broken - single frame only

If I try and send data, I'm seeing only the first frame sent then stops. Confirmed the behavior with your example DMXRwite

10:52:08.131 -> Sending DMX 0x01

Then no further output, unless I comment out dmx_send, but then I'm not sending any frames ;)

arduino compiler error - type uart_sclk_t not found

Using latest ardunio 1.8.15 and esp1.0.6 code
compiler error, type uart_sclk_t not found

readded your prevoius verson code to dmx_types.h file.

Now compiles, hopefully will be testing DMX output to uart2 soon.


// TODO: is this code defined somewhere in Arduino?
#ifdef ARDUINO
typedef enum {
UART_SCLK_APB = 0x0, // UART source clock from APB
UART_SCLK_RTC = 0x1, // UART source clock from RTC
UART_SCLK_XTAL = 0x2, // UART source clock from XTAL
UART_SCLK_REF_TICK = 0x3, // UART source clock from REF_TICK
} uart_sclk_t;
#endif

Random read input

Hello,

first of all thank you for that nice library :) and i hope you can maybe help me with my problem.

I am trying to read the dmx packets from a dmxcontroller (eurolight LED Color Chief)

My current setup is shown below

dmx_input_bb

I am using the DMXRead example and modified it a little bit. The good thing is that there is some input coming to the esp32 :) the bad thing is that it is random.

My setup function looks like this

void setup()
{
  /* Start the serial connection back to the computer so that we can log
    messages to the Serial Monitor. Lets set the baud rate to 115200. */
  Serial.begin(115200);
  Serial.println("Start Setup");

  readDMXTimer.setInterval(1000); // every second
  readDMXTimer.setCallback(checkDMXInput);

  /* Configure the DMX hardware to the default DMX settings and tell the DMX
    driver which hardware pins we are using. */
  dmx_config_t dmxConfig = DMX_DEFAULT_CONFIG;
  // const dmx_config_t dmxConfig = {
  //     .baud_rate = 250000, // 250000 typical baud rate
  //     .break_num = 45,     // 90, //45,     // 180us
  //     .idle_num = 5        // 5 //10         // 20us
  // };

  dmx_param_config(dmxPort, &dmxConfig);
  dmx_set_pin(dmxPort, transmitPin, receivePin, enablePin);

  /* Now we can install the DMX driver! We'll tell it which DMX port to use and
    how big our DMX packet is expected to be. We'll also pass to it our queue
    handle, some information about how many events we should store in our queue,
    and some interrupt priority information. Both the queue size and interrupt
    priority can be set to 1. */
  int queueSize = 10;        // 1;
  int interruptPriority = 1;
  dmx_driver_install(dmxPort, DMX_MAX_PACKET_SIZE, queueSize, &queue,
                     interruptPriority);

  Serial.println("End Setup");
}

I changed the queue size to 10 and i tried to use a custom dmx_config but switched it back to the default one. Also i use a timer to call the read function every second.

The implementation of the read function is

void checkDMXInput()
{
  /* We need a place to store information about the DMX packet we receive. We
    will use a dmx_event_t to store that packet information.  */
  dmx_event_t event;

  /* And now we wait! The DMX standard defines the amount of time until DMX
    officially times out. That amount of time is converted into ESP32 clock ticks
    using the constant `DMX_RX_PACKET_TOUT_TICK`. If it takes longer than that
    amount of time to receive data, this if statement will evaluate to false. */
  if (xQueueReceive(queue, &packet, DMX_RX_PACKET_TOUT_TICK))
  {

    /* If this code gets called, it means we've recieved DMX data! */
    /* We should check to make sure that there weren't any DMX errors. */
    switch (event.status)
    {
    case DMX_OK:
         printf("Received packet with start code: %02X and size: %i\n",
                event.start_code, event.size);
         dmx_read_packet(DMX_NUM_2, data, event.size);
      break;
    case DMX_ERR_IMPROPER_SLOT:
      printf("Received malformed byte at slot %i\n", event.size);
      // a slot in the packet is malformed - possibly a glitch due to the
      //  XLR connector? will need some more investigation
      // data can be recovered up until event.size
      break;

    case DMX_ERR_PACKET_SIZE:
      printf("Packet size %i is invalid\n", event.size);
      // the host DMX device is sending a bigger packet than it should
      // data may be recoverable but something went very wrong to get here
      break;

    case DMX_ERR_BUFFER_SIZE:
      printf("User DMX buffer is too small - received %i slots\n",
             event.size);
      // whoops - our buffer isn't big enough
      // this code will not run if buffer size is set to DMX_MAX_PACKET_SIZE
      break;
    case DMX_ERR_DATA_OVERFLOW:
      printf("Data could not be processed in time\n");
      // the UART FIFO overflowed
      // this could occur if the interrupt mask is misconfigured or if the
      //  DMX ISR is constantly preempted
      break;
    }
  }
  else if (dmxIsConnected)
  {
    Serial.println("DMX timed out !!!");
    Serial.println(event.status);
  }
  
  yield();
}

My output is

Start Setup
End Setup
Received packet with start code: FC and size: 513
Received packet with start code: C0 and size: 2
Received packet with start code: FC and size: 513
Received packet with start code: 00 and size: 2
Received packet with start code: FC and size: 513
Received packet with start code: 00 and size: 2
Received packet with start code: FC and size: 513
Received packet with start code: 00 and size: 1
Packet size 0 is invalid
Received packet with start code: FC and size: 513
Received packet with start code: 00 and size: 1
Received packet with start code: FC and size: 513
Received packet with start code: FE and size: 513
Packet size 4658 is invalid
Packet size 4652 is invalid
Packet size 1033 is invalid
Packet size 1033 is invalid
Packet size 1033 is invalid
Packet size 1033 is invalid
Received packet with start code: FC and size: 513
Received packet with start code: FE and size: 513
Received packet with start code: 00 and size: 513
Received packet with start code: 00 and size: 8
Packet size 1032 is invalid
Received packet with start code: FC and size: 513
Received packet with start code: FC and size: 513
Received packet with start code: FC and size: 513
Received packet with start code: FC and size: 513
Received packet with start code: FC and size: 513

Do you have maybe an idea what I am doing wrong?

Thank you in advance

Serial Monitor output is only the character "null"

Hi.

First of all many thanks for this great library you provided. It looks really awesome!

I tried to run your "DMXWrite" example on my machine but unfortuantely the serial monitor output is just garbage. I use VSCodium and PlatformIO and your instructions in the README were very helpful.
I checked that I use the right monitor speed (115200) but still I only get the "null" character (U+2400) back.
I traced it back to line 43 "dmx_param_config(dmxPort, &dmxConfig);" as if I remove it (and all of the depending code) the problem does not appear anymore. Not sure if this is helpful as I'm also overwhelmed with the internal clockworks of your library.

Any help would be very appreciated.

Thanks, quirsh

Compilation problem in platformIO

Hi, your library look fine !
I am curently testing it, no problem in the arduino IDE but in platformIO I have this error messages :
.pio/libdeps/esp32doit-devkit-v1/esp_dmx/src/esp_dmx.h:12:28: fatal error: hal/gpio_types.h: No such file or directory
.pio/libdeps/esp32doit-devkit-v1/esp_dmx/src/dmx_types.h:19:3: error: unknown type name 'uart_sclk_t'

dmx_receive blocking

If you are trying to write code that optionally expects DMX data, how can you prevent the code from being blocked while waiting for DMX timeout?

Most DMX libraries I've worked with before allow you simple

void loop() {
Dmx.loop();
if (Dmx.newFrame()) {
}
}

Receiving malformed bytes after the first 1/5 of a fader

I am using this libary with an esp32 and a custom board to recieve dmx from an analog light desk and have stumbeled over some strange behavior.
In the first 1/5 of a dmx channel I am recieving data but if the fader is at ~1/5 the esp already detects around 0 and if I try to receive dmx values higher then this I get "Received malformed byte at slot 2" (In this case I am sending of channel 1). If I go higher with the fader between 5/10 and 7/10 the esp is receiving dmx again and above that again the same errors.
I have the same behavior on different dmx channels.

I fiddled with the dmx config (baudrate, break_num, idle_num...) but that didn't seem to change anything.
Its definitly possible I made errors in building my dmx -> uart board (I am new to board design) but the fact that I can recieve data makes it feels like something is wrong in the software.

I used the "DMXRead" example in ArduinoIDE.
Any soft of help or hint into the right direction would be appreciated.

very slow execution of the rest of the code

Hi, sorry to disturb you again !
is it possible to bypass this verification :
if (xQueueReceive(queue, &packet, DMX_PACKET_TIMEOUT_TICK)
"The macro DMX_PACKET_TIMEOUT_TICK can be used to block the task until a packet is received or a DMX timeout occurs." So I don't want to block the execution of the rest of my code !

Does not recieve data with less than 512 channels

Hello again. I've managed to upload the library but stumbed upon a new complication. It seems that my esp32 can't see dmx data with less than 512 channels. I tried 54Ch and 16Ch DMX Controllers, esp32 read nothing on both. But my DIY 512Ch controller works fine and esp32 properly reads 513 bytes. I checked the 54Ch serial on a oscilloscope, it has 44us frame, about 60us break, 20us MAB and almost 8ms between packets.

The code:

#include "esp_dmx.h"
#include "esp_log.h"
#include "esp_system.h"
#include "freertos/task.h"

#define RX_PIN 18
#define TX_PIN 17
#define EN_PIN 38

uint8_t dmx_data[DMX_PACKET_SIZE] = {};

void app_main() { 
	const dmx_port_t dmx_num = DMX_NUM_2;
	ESP_ERROR_CHECK(dmx_set_pin(dmx_num, TX_PIN, RX_PIN, EN_PIN));
	ESP_ERROR_CHECK(dmx_driver_install(dmx_num, DMX_DEFAULT_INTR_FLAGS));
	dmx_packet_t packet;
	TickType_t last_update = xTaskGetTickCount();
	while(true) {
		if(dmx_receive(dmx_num, &packet, DMX_TIMEOUT_TICK)) {
			const TickType_t now = xTaskGetTickCount();	
			if (now - last_update >= pdMS_TO_TICKS(1000)) {
				dmx_read(dmx_num, dmx_data, DMX_PACKET_SIZE);
				ESP_LOGI("DMX", "Start code: %02x, Size: %i", packet.sc, packet.size);
				ESP_LOG_BUFFER_HEX("DMX", dmx_data, 16);  // Log first 16 bytes
				last_update = now;
			}
		}
	}
}

I'm using:
ESP32-S3
PlatformIO 3.0.0
ESP-IDF 5.0.0
esp_dmx 3.0.2-beta

adding ESP8266 support

Hi quick question what would it take to add ESP8266 support?
Would love to use this on a project to use an ESP8266 as DMX reciever

FORCE_INLINE_ATTR does not name a type

Getting this error when trying to use use with WLED as I'm trying to revamp the DMX support to use your more advanced library rather than sparkfun/SparkFunDMX

AVR Port?

Hello,

First off, thanks for this amazing library. This is the only library on the entire internet that I can find that appears to have implemented RDM for an Arduino ecosystem. I've been searching for one for a long time, and trying to write my own, but with minimal success.

I have some DMX strip tape (similar to the WS2812B strip tape that's super popular) but the only way to address each segment of the strip is via RDM. Additionally, I've also been testing with some other larger fixtures that come from china which are also RDM addressable. I'm trying to figure out a way to implement an RDM controller on Arduino so I can address these fixtures.

That said, as I write this I am attempting to test this library on an ESP8266 that I have lying around, but I would prefer to use an Atmega processor instead, such as the Atmega2560. (I'm working on eventually implementing this on custom hardware, and the Atemga chips are what I had planned on using for a variety of reasons.) So my question is, will there ever be an AVR port of this library? If so, I would be happy to help (as best I could -- I'm not super experienced with writing custom Arduino libraries, but I have been working with the Arduino ecosystem for years, so I'm pretty experienced with the ecosystem in general.)

Thanks,
Drew

Wont Work

im trying to compile even the example proyects, CONFIG_DMX_MAX_PERSONALITIES It's not declared anywhere so it wont compile

Using Arduino IDE on Fedora Linux.

Very weird issue not always sending to max

hello and thank you for your library

i am struggling 3 days now to make dmx work with esp32

i succeded with esp32 1.0.6 - but not with 2.0

my problem is that it send dmx for 1 second and then stops
if i send another packet on the same bus - then it is correct and all channels work for a secod

i do not know where to search from - i tried almost every ibrary on dmx on the web

very frustrating

DMX512

How can I set which DMX port (0 to 512) should be listened to. the DMX port in line 32 of the example script is probably not the right one which I assumed and therefore got an error. to make it short I can only read port 1 all other ports don't work.

Yours sincerely,

Johannes Fürst

How to use with Platform.IO / Arduino Framework

Hi, I am trying for hours to get this to work with Platform.IO and the Arduino Framework.
Do you know how I could mix this esp-idf component withing my existing Arduino project or do you know if there is a platform.io lib for this repo?

compile example DMXwrite.ino failed

compiling the DMXwrite example failed.
Win10 / arduino IDE 2.10

....
C:\Users\Hagen\AppData\Local\Arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\esp-2021r2-patch5-8.4.0/bin/xtensa-
C:\Users\Hagen\Documents\Arduino\esp_dmx-release-v3.0\examples\DMXWrite\DMXWrite.ino: In function 'void setup()':
C:\Users\Hagen\Documents\Arduino\esp_dmx-release-v3.0\examples\DMXWrite\DMXWrite.ino:57:3: error: 'dmx_config_t' was not declared in this scope
dmx_config_t config = DMX_CONFIG_DEFAULT;
^~~~~~~~~~~~
C:\Users\Hagen\Documents\Arduino\esp_dmx-release-v3.0\examples\DMXWrite\DMXWrite.ino:57:3: note: suggested alternative: 'gpio_config_t'
dmx_config_t config = DMX_CONFIG_DEFAULT;
^~~~~~~~~~~~
gpio_config_t
C:\Users\Hagen\Documents\Arduino\esp_dmx-release-v3.0\examples\DMXWrite\DMXWrite.ino:58:32: error: 'config' was not declared in this scope
dmx_driver_install(dmxPort, &config, DMX_INTR_FLAGS_DEFAULT);
^~~~~~
C:\Users\Hagen\Documents\Arduino\esp_dmx-release-v3.0\examples\DMXWrite\DMXWrite.ino:58:32: note: suggested alternative: 'confstr'
dmx_driver_install(dmxPort, &config, DMX_INTR_FLAGS_DEFAULT);
^~~~~~
confstr
C:\Users\Hagen\Documents\Arduino\esp_dmx-release-v3.0\examples\DMXWrite\DMXWrite.ino:58:40: error: 'DMX_INTR_FLAGS_DEFAULT' was not declared in this scope
dmx_driver_install(dmxPort, &config, DMX_INTR_FLAGS_DEFAULT);
^~~~~~~~~~~~~~~~~~~~~~
C:\Users\Hagen\Documents\Arduino\esp_dmx-release-v3.0\examples\DMXWrite\DMXWrite.ino:58:40: note: suggested alternative: 'ESP_INTR_FLAG_LEVEL4'
dmx_driver_install(dmxPort, &config, DMX_INTR_FLAGS_DEFAULT);
^~~~~~~~~~~~~~~~~~~~~~
ESP_INTR_FLAG_LEVEL4

Using library esp_dmx at version 3.0.3-beta in folder: C:\Users\Hagen\Documents\Arduino\libraries\esp_dmx
exit status 1

Compilation error: 'dmx_config_t' was not declared in this scope

pin assignment for ESP32 & 485

Thanks for nice library.
I tried using example as it is DMXRead

using Arduino ide & compile is OK.

but cannot detect DMX signal and found cannot go through both following if statement ...

  • if (xQueueReceive(queue, &packet, DMX_RX_PACKET_TOUT_TICK)) {
  • } else if (dmxIsConnected) {

pin diagram is followed by here
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/uart.html#circuit-a-collision-detection-circuit

but, is my wire connection wrong ?
esp32 - max485 dmx wiring

or is there something I should amend on example code ?

Questions about Mark Before Break (MBB)

Thank you for the wonderful library.
Is it possible to control the Mark Before Break (MBB) 0S-1S High level (between frames) time in DMX transmission mode of this library?
I want to add Mark Before Break of 〇〇〇usec.

Cant receive DMX : timer is not running (esp-idf v5.0.2)

I have upgraded my project from esp-idf v4.4.4 upgraded to v5.0.2 so that I could use some new networking featrues I require. IN doing so I have changed from esp_dmx V2.0.2 to V3.0.3-beta as I needed compatability with esp-idf V5 and above.

However when I run a loop to recieve DMX I get repeated errors about the timer not running:

They look to be running about DMX_TIMEOUT_TICK interval. If I actually connect a DMX source then I get the same error message repeated for what looks like every byte received. This is quickly followed by the watch dog timer error and the ESP halts.

I'm building with PlatformIO under VSCode, its my own custom PCB with an ESP-32-WROVER

[env:esp-wrover-kit]
platform = espressif32
board = esp-wrover-kit
framework = espidf

build_type = debug
board_upload.flash_size = 16MB
board_upload.maximum_ram_size = 532480
board_upload.maximum_size = 16777216

board_build.partitions = partitions.csv

monitor_filters = esp32_exception_decoder
monitor_speed = 115200
monitor_rts = 0
monitor_dtr = 0
PACKAGES: 
 - framework-espidf @ 3.50002.230601 (5.0.2) 
 - tool-cmake @ 3.16.4 
 - tool-esptoolpy @ 1.40501.0 (4.5.1) 
 - tool-mkfatfs @ 2.0.1 
 - tool-mklittlefs @ 1.203.210628 (2.3) 
 - tool-mkspiffs @ 2.230.0 (2.30) 
 - tool-ninja @ 1.9.0 
 - toolchain-esp32ulp @ 1.23500.220830 (2.35.0) 
 - toolchain-xtensa-esp32 @ 11.2.0+2022r1

I have built a small test project to make sure there is nothing else in my main project code thats causing an issue. Pretty much a direct copy of the sample code from the documentation.

#include "esp_dmx.h"
#include "stddef.h"
#include "log.h"

#define DMX_RX_UART DMX_NUM_1
#define DMX_IN_TX 5
#define DMX_IN_RX 19
#define DMX_IN_RTS 18


extern "C" void app_main()
{
 LOG_I("Starting Main");
 
 uint8_t rx_buffer[DMX_PACKET_SIZE];

 dmx_set_pin(DMX_RX_UART, DMX_IN_TX, DMX_IN_RX, DMX_IN_RTS);
 dmx_driver_install(DMX_RX_UART, DMX_DEFAULT_INTR_FLAGS);

 dmx_packet_t packet;

 LOG_I("Installed Driver");

 while(1) {
  if (dmx_receive(DMX_RX_UART, &packet, DMX_TIMEOUT_TICK)) {

   // Check that no errors occurred.
   if (packet.err == ESP_OK) {
    dmx_read(DMX_RX_UART, rx_buffer, packet.size);
   } else {
    LOG_I("An error occurred receiving DMX!");
   }

  } else {
   LOG_I("Timed out waiting for DMX.");
  }

 }
}
I (29) boot: ESP-IDF 5.0.2 2nd stage bootloader
I (29) boot: compile time 07:55:20
I (29) boot: chip revision: v3.0
I (32) boot.esp32: SPI Speed      : 40MHz
I (37) boot.esp32: SPI Mode       : DIO
I (41) boot.esp32: SPI Flash Size : 16MB
I (46) boot: Enabling RNG early entropy source...
I (51) boot: Partition Table:
I (55) boot: ## Label            Usage          Type ST Offset   Length
I (62) boot:  0 nvs              WiFi data        01 02 00009000 00015000
I (70) boot:  1 otadata          OTA data         01 00 0001e000 00002000
I (77) boot:  2 ota_0            OTA app          00 10 00020000 005f0000
I (85) boot:  3 ota_1            OTA app          00 11 00610000 005f0000
I (92) boot:  4 spiffs           Unknown data     01 82 00c00000 00400000
I (100) boot: End of partition table
I (104) esp_image: segment 0: paddr=00020020 vaddr=3f400020 size=0a244h ( 41540) map
I (127) esp_image: segment 1: paddr=0002a26c vaddr=3ffb0000 size=01efch (  7932) load
I (131) esp_image: segment 2: paddr=0002c170 vaddr=40080000 size=03ea8h ( 16040) load
I (140) esp_image: segment 3: paddr=00030020 vaddr=400d0020 size=18eb4h (102068) map
I (179) esp_image: segment 4: paddr=00048edc vaddr=40083ea8 size=08ac8h ( 35528) load
I (200) boot: Loaded app from partition at offset 0x20000
I (200) boot: Disabling RNG early entropy source...
I (211) cpu_start: Pro cpu up.
I (211) cpu_start: Starting app cpu, entry point is 0x40081c60
I (0) cpu_start: App cpu up.
I (226) cpu_start: Pro cpu start user code
I (226) cpu_start: cpu freq: 160000000 Hz
I (226) cpu_start: Application information:
I (230) cpu_start: Project name:     test
I (235) cpu_start: App version:      1
I (240) cpu_start: Compile time:     Jun 16 2023 07:54:49
I (246) cpu_start: ELF file SHA256:  299e75ec48a7c4c6...
I (252) cpu_start: ESP-IDF:          5.0.2
I (256) cpu_start: Min chip rev:     v0.0
I (261) cpu_start: Max chip rev:     v3.99 
I (266) cpu_start: Chip rev:         v3.0
I (271) heap_init: Initializing. RAM available for dynamic allocation:
I (278) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (284) heap_init: At 3FFB2808 len 0002D7F8 (181 KiB): DRAM
I (290) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (297) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (303) heap_init: At 4008C970 len 00013690 (77 KiB): IRAM
I (311) spi_flash: detected chip: generic
I (314) spi_flash: flash io: dio
I (319) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (329) main.cpp: Line 13: app_main(): Starting Main
I (339) main.cpp: Line 22: app_main(): Installed Driver
E (1589) gptimer: gptimer_stop(389): timer is not running
I (1589) main.cpp: Line 35: app_main(): Timed out waiting for DMX.
E (2839) gptimer: gptimer_stop(389): timer is not running
I (2839) main.cpp: Line 35: app_main(): Timed out waiting for DMX.
E (4089) gptimer: gptimer_stop(389): timer is not running
I (4089) main.cpp: Line 35: app_main(): Timed out waiting for DMX.
E (5339) gptimer: gptimer_stop(389): timer is not running
I (5339) main.cpp: Line 35: app_main(): Timed out waiting for DMX.
E (6589) gptimer: gptimer_stop(389): timer is not running
I (6589) main.cpp: Line 35: app_main(): Timed out waiting for DMX.
E (7839) gptimer: gptimer_stop(389): timer is not running

Problem with library installation for PlatformIO

Hello. I'm trying to install this library for PlatformIO ESP-IDF project. Sorry if my problem is not exactly related to this library, but I don't know what to do now. I did a clean reinstall of VSCode, PlatformIO and started a new ESP-IDF project to ensure there are no legacy code conflicts.

  1. Installation by PlatformIO Library Register gives me this error:

Error: Could not find the package with 'someweisguy/esp_dmx @ ^3.0.0-beta' requirements for your system 'windows_amd64'

Deleting "lib_deps = someweisguy/esp_dmx@^3.0.0-beta" from platformio.ini allows me to build the project, but I get several errors in dmx_hal.h:

too few arguments to function 'uart_ll_set_baudrate'
too few arguments to function 'uart_ll_get_baudrate'
control reaches end of non-void function [-Werror=return-type]
too few arguments to function 'uart_ll_set_baudrate'
'uart_dev_t' has no member named 'uart_conf0_reg_t'
'uart_dev_t' has no member named 'uart_conf0_reg_t'
control reaches end of non-void function [-Werror=return-type]
'uart_dev_t' has no member named 'uart_status_reg_t'
control reaches end of non-void function [-Werror=return-type]

And one in esp_dmx.h:

implicit declaration of function 'esp_timer_get_time' [-Werror=implicit-function-declaration]

  1. Cloning "esp_dmx-release-v3.0" folder into /components folder of my project causes #include "esp_dmx.h" error.

  2. Cloning "esp_dmx-release-v3.0" folder into /lib folder causes last five dmx_hal.h errors from 1. but no other errors.

Are there any other ways to install a library to PlatformIO ESP-IDF project?

Incompatibility with LittleFS (Cache disabled but cached memory region accessed)

I find that if I try to write a file with LitteFS whilst received DMX I get a Guru Meditation Error.

The backtrace is corrupted so I can't fully see exactly where this is happening :

Guru Meditation Error: Core  1 panic'ed (Cache disabled but cached memory region accessed). 

Core  1 register dump:
PC      : 0x400e692c  PS      : 0x00060035  A0      : 0x40086abc  A1      : 0x3ffbf22c  
A2      : 0x00000078  A3      : 0x3ffbdcc0  A4      : 0x00000020  A5      : 0x3ffbdcbc  
A6      : 0x3ffbc2f8  A7      : 0x00000001  A8      : 0x8008165c  A9      : 0x00000078  
A10     : 0x3ffbdcbc  A11     : 0x3ffbc45c  A12     : 0x3ffbf244  A13     : 0x3ffbdcbc  
A14     : 0x3ffc4608  A15     : 0x84022044  SAR     : 0x00000017  EXCCAUSE: 0x00000007  
EXCVADDR: 0x00000000  LBEG    : 0x400865a9  LEND    : 0x400865b1  LCOUNT  : 0x00000027  


Backtrace:0x400e6929:0x3ffbf22c |<-CORRUPTED
  #0  0x400e6929:0x3ffbf22c in uart_ll_write_txfifo at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/hal/esp32/include/hal/uart_ll.h:235
      (inlined by) uart_hal_write_txfifo at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/hal/uart_hal_iram.c:40




ELF file SHA256: 0000000000000000

Rebooting...

I am using a ESP WROVER-E and have the DMX being received on UART1 (But I have also tried it on UART2 and there is no difference).

I'm using the Arduino Framework which reports to be using ESP-IDF v4.4.1-1-gb8050b365e

dmx_write_slot does not work

In function dmx_write_slot, the value is not written to the buffer. Instead, the index is written to the buffer.

dmx recieve buffer shifts after saving data to FAT

Hello. I found another issue. I remember reading an issue about data shifting in dmx recieve buffer but I couldn't find a closed issue so I decided to start a new one.
I'm making a dmx recorder, using two RS-485 chips, one for recieve and one for transmit. It reads dmx input from the rx line and instantly sends it unchanged to the tx line. If a user wants to record, he or she presses a button and the device copies dmx recieve buffer each 60ms to a large buffer which allocated in a PSRAM. When a user finished recording, the device saves the large buffer to spi flash through FAT filesystem with ESP wear leveling library. The process is long, it takes several seconds to save data to FAT and it blocks the code.

The problem is, after that save the dmx recieve buffer is shifted. The first channel could be on 4th or 35th channel now. The program works as intended before the save and when the device is playing recorded data (opening FAT file doesn't shift data). The size of saved data doesn't matter, the buffer shifts anyway.
I'm also using NVS to save some meta information variables along with FAT save, so it can be the issue too.

To clarify, this is my dmx code:

uint8_t dmx_data[DMX_PACKET_SIZE] = {};
uint8_t dmx_data_out[DMX_PACKET_SIZE] = {};
if(dmx_receive(RX_DMX, &packet, 0)) {
	dmx_read(RX_DMX, dmx_data, DMX_PACKET_SIZE);
}
dmx_write(TX_DMX, dmx_data_out, DMX_PACKET_SIZE);
dmx_send(TX_DMX, DMX_PACKET_SIZE);
dmx_wait_sent(TX_DMX, DMX_TIMEOUT_TICK);

dmx_data is my recieve buffer and dmx_data_out is my transmit buffer.

I'll do some tests tomorrow to find whether FAT or NVS is the issue, provide more information and a full shortened program code if it helps.

Unable to build

I cloned this into the components folder of my project and attempted to build. I am getting an error
../components/esp_dmx/include/dmx_caps.h:7:10: fatal error: soc/uart_caps.h: No such file or directory

I am unable to find a file soc/uart_caps.h either on my local install of ESP-IDF or on Espressifs Github. Does this library require a specific version of ESP-IDF? Am I missing a setup step? Do I need to create this file?

For context:
I am attempting to get DMX up and running on an existing project with other functionalities. I was able to build and flash before attempting to add this library. I am using ESP-IDF version v4.4-dev-1404-gc13afea63 on Linux.

e1.11 devices compatibility with e1.31 data source

As you mention that your library allows for receiving of e1.11 DMX 512 , will it will be able to also receive and decode the e1.31 DMX data because some software transmit e1.31 or SACN data.
or e1.311 is protocol of with e1.11 standard . please help me as I don't have too much knowledge about it.

Supporting esp-idf 5.x+

The current version does not build on esp-idf v5.0 (and 5.1). Release v5.0 is out of beta and is currently the most recent supported version for all chips.

I've made some small changes to release/2.0 to get it successfully building over at stonegray@e340115 and assume many of these changes can be ported forward to the master version. This isn't PR-ready as I don't think it will build on IDF v4.4, which is currently the default.

I'm not sure I've implemented sclk_freq correctly, and if this can properly use the reference clock instead of the default. Some abstraction to ensure its not possible to read or write the baud etc. with the wrong frequency might be a good idea.

Espressif has a migration guide for moving from v4.4 to v5 (possibly incomplete, I didn't see the changes to uart_hal_set_baudrate and friends there)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.