someweisguy / esp_dmx

Espressif ESP32 implementation of ANSI-ESTA E1.11 DMX-512A and E1.20 RDM
MIT License
307 stars 30 forks source link

Troubles with ETC Express #108

Closed kpelzel closed 7 months ago

kpelzel commented 8 months ago

First off, thank you so much for this library and the documentation, it's incredibly valuable.

I'm struggling to get this to work properly with an old ETC Express. I'm running the DMX Read example (with minor tweaks to timing) just trying to read a few channels within the dmx packet, but the packet size is never correct. I'm pretty sure the ETC Express will always send the full 513 bytes for every packet. I may have done something wrong, but it looks like the example just chunks up the dmx packet randomly. I swear there was a point where I was getting consistent packet sizes of 513, but I'm not seeing that anymore. Any help is greatly appreciated.

Setup:

Code:

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

#define TX_PIN 17 // The DMX transmit pin.
#define RX_PIN 16 // The DMX receive pin.
#define EN_PIN 15 // The DMX transmit enable pin.

static const char *TAG = "main"; // The log tagline.

static uint8_t data[DMX_PACKET_SIZE] = {}; // Buffer to store DMX data

void app_main()
{
  const dmx_port_t dmx_num = DMX_NUM_1;

  // Set communication pins and install the driver
  dmx_config_t config = DMX_CONFIG_DEFAULT;
  dmx_driver_install(dmx_num, &config, DMX_INTR_FLAGS_DEFAULT);
  dmx_set_pin(dmx_num, TX_PIN, RX_PIN, EN_PIN);
  dmx_set_baud_rate(dmx_num, DMX_BAUD_RATE); // Set DMX baud rate.
  dmx_set_break_len(dmx_num, 94);            // Set DMX break length.
  dmx_set_mab_len(dmx_num, 26);              // Set DMX MAB length.

  dmx_packet_t packet;
  bool is_connected = false;

  TickType_t last_update = xTaskGetTickCount();
  while (true)
  {
    // Block until a packet is received
    if (dmx_receive(dmx_num, &packet, DMX_TIMEOUT_TICK))
    {
      const TickType_t now = xTaskGetTickCount();

      if (!is_connected)
      {
        // Log when we first connect
        ESP_LOGI(TAG, "DMX is connected.");
        is_connected = true;
      }

      // if (now - last_update >= pdMS_TO_TICKS(1000))
      {
        // Only read data every 1000ms
        dmx_read(dmx_num, data, DMX_PACKET_SIZE);
        ESP_LOGI(TAG, "error: %i", packet.err);
        ESP_LOGI(TAG, "Start code: %02x, Size: %i", packet.sc, packet.size);
        ESP_LOG_BUFFER_HEX(TAG, data, 16); // Log first 16 bytes
        last_update = now;
      }
    }
    else if (is_connected)
    {
      // DMX timed out after having been previously connected
      ESP_LOGI(TAG, "DMX was disconnected.");
      // break;
    }
  }

  ESP_LOGI(TAG, "Uninstalling the DMX driver.");
  dmx_driver_delete(dmx_num);
}

Output Snippet (sorry for the added serial characters):

I (72455) main: Start code: 00, Size: 4
I (72455) main: 00 00 00 00 00 00 00 00 00 00 00 01 00 bd 69 1b 
I (72465) main: error: 0
I (72465) main: Start code: 01, Size: 220
I (72475) main: 01 00 00 00 ad 82 ae 57 2a d8 b3 bf bf 20 02 a1 
I (72475) main: error: 0
I (72485) main: Start code: 01, Size: 1
I (72485) main: 01 00 00 00 00 0a 00 00 01 00 00 00 00 00 01 00 
I (72495) main: error: 0
I (72495) main: Start code: 00, Size: 53
I (72495) main: 00 00 00 aa a9 ba aa a0 ee 66 66 d5 e8 b5 a5 3d 
I (72505) main: error: 0
I (72505) main: Start code: 00, Size: 2
I (72515) main: 00 00 00 07 00 00 00 00 00 66 66 d5 e8 b5 a5 3d 
I (72525) main: DMX was disconnected.
I (72525) main: error: 0
I (72525) main: Start code: 01, Size: 13
I (72535) main: 01 aa f5 b3 a1 56 aa ba ee 2c 85 8a 35 00 00 02 
I (72535) main: error: 0
I (72545) main: Start code: 00, Size: 6
I (72545) main: 00 00 45 bc ff 00 00 00 00 0a eb 2a 6a ff f5 f5 
I (72555) main: DMX was disconnected.
I (72555) main: error: 0
I (72565) main: Start code: 8b, Size: 8
I (72565) main: 8b eb b2 1a 00 00 02 00 00 00 00 00 00 00 00 00 
I (72575) main: error: 0
I (72575) main: Start code: 00, Size: 248
I (72585) main: 00 01 00 00 00 00 00 00 00 ae 8a ac 8b 22 ac 51 
I (72585) main: DMX was disconnected.
I (72595) main: error: 0
I (72595) main: Start code: 01, Size: 1
I (72595) main: 01 00 00 00 03 00 00 ff 00 01 00 00 00 00 00 00 
I (72605) main: error: 0
I (72605) main: Start code: 00, Size: 179
I (72615) main: 00 ab ba bc be b8 54 ab 9a 1a 6b e8 c9 a6 0b 2a 
I (72625) main: DMX was disconnected.
I (72625) main: DMX was disconnected.
I (72625) main: DMX was disconnected.
I (72635) main: DMX was disconnected.
I (72635) main: error: 0
I (72645) main: Start code: 00, Size: 82
I (72645) main: 00 00 02 6f ed a1 d6 22 82 60 5a c3 10 e3 6a 4a 
I (72655) main: error: 0
I (72655) main: Start code: 00, Size: 2
I (72655) main: 00 00 00 00 00 00 01 00 00 00 00 00 02 00 01 00 
I (72665) main: error: 0
I (72665) main: Start code: 00, Size: 10
I (72675) main: 00 00 00 00 00 00 00 00 01 01 af 00 00 00 ab 01 
I (72685) main: error: 0
I (72685) main: Start code: 01, Size: 223
I (72685) main: 01 00 00 00 01 00 00 00 00 00 00 00 8d d6 da f0 
I (72695) main: error: 0
I (72695) main: Start code: 01, Size: 11
I (72705) main: 01 00 00 ff ff 00 00 00 00 00 00 00 00 00 da f0 
I (72715) main: error: 0
I (72715) main: Start code: 00, Size: 71
I (72715) main: 00 00 00 ab aa 29 6a e2 f2 bb a8 9b df a8 85 a5 
I (72725) main: DMX was disconnected.
I (72725) main: error: 0
I (72735) main: Start code: 00, Size: 3
I (72735) main: 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 
I (72745) main: error: 0
I (72745) main: Start code: 00, Size: 9
I (72755) main: 00 00 00 01 00 2b fb fc fd 00 00 00 00 00 00 00 
I (72755) main: error: 0
I (72765) main: Start code: 00, Size: 5
I (72765) main: 00 01 00 00 00 00 00 fc fd ff f5 fb 3d ab aa 4e 
I (72775) main: error: 0
I (72775) main: Start code: 00, Size: 15
I (72785) main: 00 00 00 00 01 00 00 03 00 00 01 00 03 00 ff 4e 
I (72785) main: error: 0
I (72785) main: Start code: c1, Size: 23
I (72795) main: c1 00 d0 e7 9f e0 fd 9f 9f e7 8f 90 9c fe a2 bf 
I (72805) main: error: 0
I (72805) main: Start code: ff, Size: 1
I (72805) main: ff 00 00 00 00 11 be bc 00 00 00 00 00 fe a2 bf 
I (72815) main: error: 0
I (72815) main: Start code: 03, Size: 3
I (72825) main: 03 01 00 00 e0 03 01 01 01 01 00 01 00 00 dd 00 
I (72825) main: error: 0
I (72835) main: Start code: 00, Size: 3
I (72835) main: 00 ff 36 00 01 ff ff ff 00 00 00 01 00 aa f3 dd 
I (72845) main: error: 0
I (72845) main: Start code: a9, Size: 2
I (72855) main: a9 02 00 01 00 00 00 00 00 ff 00 01 00 aa f3 dd 
I (72855) main: error: 0
I (72865) main: Start code: ff, Size: 18
I (72865) main: ff e0 68 ba 71 ef ff b4 19 23 b2 71 a3 11 66 fc 
I (72875) main: DMX was disconnected.
I (72875) main: error: 0
I (72885) main: Start code: 00, Size: 2
I (72885) main: 00 01 00 00 00 00 02 00 00 03 00 00 00 03 00 d0 
I (72895) main: error: 0
I (72895) main: Start code: c0, Size: 22
I (72895) main: c0 ec ee a9 27 a7 83 ba 79 8b 73 9b 13 52 a1 a1 
I (72905) main: DMX was disconnected.
I (72915) main: error: 0
I (72915) main: Start code: 01, Size: 1
I (72915) main: 01 00 01 03 00 00 01 00 00 ff 6f dc ac 9d a9 83 
I (72925) main: error: 0
I (72925) main: Start code: 01, Size: 8
I (72935) main: 01 00 01 01 00 00 e1 ef 01 02 00 dc ac 9d a9 83 
I (72935) main: DMX was disconnected.
I (72945) main: error: 0
I (72945) main: Start code: 00, Size: 3
I (72955) main: 00 fc 05 0e 60 00 00 03 00 00 00 01 01 00 d4 fc 
I (72955) main: DMX was disconnected.
I (72965) main: error: 0
I (72965) main: Start code: 81, Size: 39
I (72975) main: 81 f6 23 ff a8 28 d4 bc 7d 50 b2 b3 59 bb 9e 0c 
I (72975) main: error: 0
I (72985) main: Start code: 00, Size: 4
I (72985) main: 00 00 00 01 02 00 00 01 00 50 b2 b3 59 bb 9e 0c 
I (72995) main: error: 0
I (72995) main: Start code: 00, Size: 1
I (72995) main: 00 01 00 00 00 00 03 01 00 00 00 01 00 bb 9e 0c 
I (73005) main: error: 0
I (73005) main: Start code: 00, Size: 224
I (73015) main: 00 00 00 f1 63 3b 31 6c 63 ca 94 b5 66 a8 2b cc 
I (73025) main: error: 0
I (73025) main: Start code: 65, Size: 2
I (73025) main: 65 0c 03 00 2b 00 00 00 00 02 00 b5 66 a8 2b cc 
I (73035) main: error: 0
I (73035) main: Start code: 01, Size: 47
I (73045) main: 01 f3 07 6e df 49 b6 c8 ff 57 ef e0 19 8a 5f e1 
I (73045) main: error: 0
I (73055) main: Start code: 01, Size: 2
I (73055) main: 01 00 00 00 01 00 5f 01 00 f3 61 c3 ff 9e 28 40 
I (73065) main: DMX was disconnected.
I (73065) main: error: 0
I (73075) main: Start code: 01, Size: 6
I (73075) main: 01 00 00 00 01 01 00 01 01 00 00 00 01 00 28 40 
I (73085) main: error: 0
I (73085) main: Start code: 01, Size: 1
I (73095) main: 01 00 28 28 29 73 71 eb 41 86 10 57 26 28 d5 9f 
I (73095) main: error: 0
I (73105) main: Start code: 00, Size: 2
I (73105) main: 00 00 00 00 00 00 00 01 00 00 00 01 00 28 d5 9f 
I (73115) main: error: 0
I (73115) main: Start code: c0, Size: 62
I (73115) main: c0 ff b4 b2 d5 49 71 98 75 ee f3 ac 51 d1 eb b4 
I (73125) main: error: 0
I (73125) main: Start code: fc, Size: 1
I (73135) main: fc 00 00 01 01 00 01 00 00 00 e5 ff ba 43 a8 bf 
I (73145) main: DMX was disconnected.
I (73145) main: error: 0
I (73145) main: Start code: 01, Size: 69
I (73155) main: 01 00 22 61 23 27 cc 02 c5 4f a1 71 06 c3 fc fb 
I (73155) main: DMX was disconnected.
I (73165) main: error: 0
I (73165) main: Start code: 01, Size: 1
I (73175) main: 01 00 ff 00 00 00 00 6c e1 b1 67 df 41 33 02 2c 
I (73175) main: error: 0
I (73185) main: Start code: 00, Size: 1
I (73185) main: 00 00 00 00 00 08 01 00 00 00 67 df 41 33 02 2c 
I (73195) main: DMX was disconnected.
I (73195) main: error: 0
I (73195) main: Start code: e2, Size: 4
I (73205) main: e2 13 ef c4 00 00 e0 00 00 01 01 01 00 fa 20 30 
kpelzel commented 8 months ago

Further Findings

I think I was wrong about the etc express sending all 513 bytes. It appears it may only be sending 96 bytes. I was also able to get some full packets so I know it's working to some extend, but there are a lot of smaller broken packets between the full packets. On the etc express I set channel 1 to 0x73 and channels 2-4 to 0xff. When I ignore all packets that aren't a length of 513 I repeated (but very slowly) get this output:

I (395376) main: Start code: 00, Error: 0, Size: 513
I (395376) main: 00 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 
I (395376) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395386) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395396) main: 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 
I (395396) main: 00 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 
I (395406) main: 00 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 
I (395416) main: 00 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 
I (395416) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395426) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395436) main: 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 
I (395446) main: 00 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 
I (395446) main: 00 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 
I (395456) main: 00 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 
I (395466) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395466) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395476) main: 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 
I (395486) main: 00 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 
I (395486) main: 00 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 
I (395496) main: 00 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 
I (395506) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395506) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395516) main: 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 
I (395526) main: 00 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 
I (395526) main: 00 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 
I (395536) main: 00 40 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 
I (395546) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395546) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395556) main: 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 
I (395566) main: 00 00 00 00 00 00 00 00 00 f9 ff 00 00 00 00 00 
I (395566) main: 00 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 
I (395576) main: 00 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 
I (395586) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (395586) main: 00 

I tried setting my packet size to 96 and also 97, but it didn't improve the performance and resulted in shifted bytes:

I (16726) main: Start code: 00, Error: 0, Size: 96
I (16726) main: 00 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 
I (16726) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (16736) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (16736) main: 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 
I (16746) main: 00 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 
I (16756) main: 00 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 
I (19066) main: Start code: 73, Error: 0, Size: 96
I (19066) main: 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 
I (19076) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (19076) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (19086) main: 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 00 
I (19096) main: 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 00 
I (19096) main: 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 
I (25366) main: Start code: 73, Error: 0, Size: 96
I (25366) main: 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 
I (25376) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (25376) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (25386) main: 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 00 
I (25396) main: 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 00 
I (25396) main: 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 
I (38366) main: Start code: 00, Error: 264, Size: 96
I (38366) main: 00 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 
I (38366) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (38376) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (38386) main: 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 
I (38386) main: 00 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 
I (38396) main: 00 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 03 
I (40976) main: Start code: 00, Error: 0, Size: 96
I (40976) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (40976) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (40976) main: 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 00 
I (40986) main: 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 00 
I (40996) main: 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 
I (40996) main: 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 
I (53316) main: Start code: 98, Error: 0, Size: 96
I (53316) main: 98 ef ff ff 00 00 00 00 00 00 00 00 00 00 00 00 
I (53316) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (53326) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (53336) main: 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 00 
I (53336) main: 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 00 
I (53346) main: 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 
I (54436) main: Start code: 00, Error: 0, Size: 96
I (54436) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (54436) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (54436) main: 00 00 00 00 00 00 00 00 00 ff 00 00 00 00 00 00 
I (54446) main: 00 00 00 00 00 00 ff ff 00 00 00 00 00 00 00 00 
I (54456) main: 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 73 ff 
I (54456) main: ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (54686) main: Start code: 73, Error: 0, Size: 96
I (54686) main: 73 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 
I (54686) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (54696) main: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
I (54696) main: 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 00 
I (54706) main: 00 00 00 00 00 00 00 00 ff ff 00 00 00 00 00 00 
I (54716) main: 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 
someweisguy commented 8 months ago

Thanks for the information and the kind words!

This is a peculiar issue - it appears that the ESP32 is having a hard time determining when the DMX packet starts and ends, which is why you are seeing shifted bytes. It's surprising because of how robust the ETC Express is.

I don't have access to an Express to test, but I have loaded up esp_dmx v3.1.0 on my ESP32 and connected to my Entec DMX dongle and it is able to read DMX properly using your code. I also attempted to emulate an Express by sending DMX from a spare ESP32 using the DMX timings that the Express uses.

Which version of ESP-IDF are you using? And are you able to receive DMX coming from a different console?

kpelzel commented 8 months ago

Unfortunately I don't have another console to test. I'm running ESP-IDF v5.1.1. I'll try out a different ESP32 and maybe a different power source. Currently I've been running off usb power from my laptop for testing, but I assumed that'd be enough for the esp32 and dmx shield.

My only other guess is incorrect wiring between the esp32 and dmx-shield, but I assume I wouldn't be seeing any packets if that was the case.

kpelzel commented 8 months ago

I checked the signal with an oscilloscope today to make sure I'm not going crazy. It looks like the timings are fine. Interpacket idle = ~11ms Break = 94μs MAB = 27μs

One question though. Is my signal inverted? Every diagram of dmx I've seen shows the idle low, break high, and MAB low. Mine seems to be the opposite. Are my D+ and D- getting crossed somewhere?

Idle Break MAB

someweisguy commented 8 months ago

If you've connected your scope to the A line of your DMX bus, then your idle should be high; break, low; and MAB, high.

If you haven't tried already, one thing that I always do when troubleshooting is to connect my scope directly to the UART pins on the ESP32 to ensure that the DMX signal is making it from the RS485 transceiver to the ESP32. It is possible (albeit I think unlikely) that the enable pin is misconfigured which would make it difficult for the ESP32 to read data.

kpelzel commented 7 months ago

Alright well, I'm not exactly sure what I did, but it's working perfectly now. I'm gonna assume it was bad wiring somewhere or theater ghosts. Thanks for all the help. Just some notes:

  1. That scope reading is from the rx output after the max485, not straight from the dmx.
  2. I was wrong about the etc express only sending 96 channels, turns out the patch on the board was wrapping around after 96 and causing the packet to have a pattern of repeated values.

Here's the code for the curious: https://github.com/kpelzel/LALT-dmx