ESP32 тормозит

Контроллеры на основе ESP32
Ответить
alex778
Рядовой
Сообщения: 1
Зарегистрирован: 22.08.2020{, 10:54}
Репутация: 0
Имя: Алексей

ESP32 тормозит

#1

Сообщение alex778 » 22.08.2020{, 11:34}

Добрый день. Тормозит ЕСП32 при управлении адресной лентой WS2812. Задача состоит в том что надо включать конкретные светодиоды определенным цветом при нажатии на определенную кнопку. Но работает это все как то странно, включается кусками, эти куски то включаются то гаснут. И кнопка реагирует с запозданием.


Отправлено спустя 3 минуты 33 секунды:
Пробывал с мегой и esp32. Буду очень признателен за помощь.

Отправлено спустя 9 минут 55 секунд:
Еще есть проблемы с заливкой скетча в esp32. Получилось только когда я кодер припаял. И только один раз смог залить скетч. Потом ни в какую не хочет заливаться.

Отправлено спустя 1 минуту 11 секунд:
Плата у меня https://amperkot.ru/msk/catalog/mhet_li ... 10063.html

Отправлено спустя 57 секунд:
In file included from C:\Temp\flprog\pr7\pr7.ino:2:0:

c:\Users\�������������\Desktop\������\ideV5\portable\sketchbook\libraries\FastLED-3.3.3/FastLED.h:14:21: note: #pragma message: FastLED version 3.003.003

# pragma message "FastLED version 3.003.003"

^

In file included from c:\Users\�������������\Desktop\������\ideV5\portable\sketchbook\libraries\FastLED-3.3.3/FastLED.h:65:0,

from C:\Temp\flprog\pr7\pr7.ino:2:

c:\Users\�������������\Desktop\������\ideV5\portable\sketchbook\libraries\FastLED-3.3.3/fastspi.h:130:23: note: #pragma message: No hardware SPI pins defined. All SPI access will default to bitbanged output

# pragma message "No hardware SPI pins defined. All SPI access will default to bitbanged output"

^

Скетч использует 253853 байт (19%) памяти устройства. Всего доступно 1310720 байт.
Глобальные переменные используют 25276 байт (7%) динамической памяти, оставляя 302404 байт для локальных переменных. Максимум: 327680 байт.
esptool.py v2.6
Serial port COM9
Connecting........_____....._____....._____....._____....._____....._____.....____Произошла ошибка при загрузке скетча
_

A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header
Вложения
1550803746_esp_1.jpg

RootShell
Рядовой
Сообщения: 77
Зарегистрирован: 27.06.2020{, 04:22}
Репутация: 18
Откуда: World
Имя: Agat
Контактная информация:

ESP32 тормозит

#2

Сообщение RootShell » 23.08.2020{, 23:28}

ESP32 плохо работает с ws2812. я не уверен в существовании готового блока, но следует использовать RMT driver для 2х ядерного микроконтроллера.

ESP32_RMT_Driver.h

Код: Выделить всё

#include "driver/rmt.h"

#define APB_CLK_MHZ 80 // default RMT CLK source (80MHz)
#define RMT_CLK_DIV  2 // RMT CLK divider
#define RMT_TICK (RMT_CLK_DIV * 1000 / APB_CLK_MHZ) // 25ns

// timing parameters for WS2812B LEDs. you may need to
// tweek these if you're using a different kind of LED
#define T1_TICKS      250 / RMT_TICK // 250ns
#define T2_TICKS      625 / RMT_TICK // 625ns
#define T3_TICKS      375 / RMT_TICK // 375ns
#define RESET_TICKS 50000 / RMT_TICK // 50us

/*
 * Convert uint8_t type of data to rmt format data.
 */
static void IRAM_ATTR u8_to_rmt(const void* src, rmt_item32_t* dest, size_t src_size,
                         size_t wanted_num, size_t* translated_size, size_t* item_num) {
    if(src == NULL || dest == NULL) {
        *translated_size = 0;
        *item_num = 0;
        return;
    }
    const rmt_item32_t bit0  = {{{ T1_TICKS,            1, T2_TICKS + T3_TICKS, 0 }}}; //Logical 0
    const rmt_item32_t bit1  = {{{ T1_TICKS + T2_TICKS, 1, T3_TICKS           , 0 }}}; //Logical 1
    const rmt_item32_t reset = {{{ RESET_TICKS/2      , 0, RESET_TICKS/2      , 0 }}}; //Reset
    size_t size = 0;
    size_t num = 0;
    uint8_t *psrc = (uint8_t *)src;
    rmt_item32_t* pdest = dest;
    while (size < src_size && num < wanted_num) {
      if(size < src_size - 1) { // have more pixel data, so translate into RMT items
        (pdest++)->val =  (*psrc & B10000000) ? bit1.val : bit0.val;
        (pdest++)->val =  (*psrc & B01000000) ? bit1.val : bit0.val;
        (pdest++)->val =  (*psrc & B00100000) ? bit1.val : bit0.val;
        (pdest++)->val =  (*psrc & B00010000) ? bit1.val : bit0.val;
        (pdest++)->val =  (*psrc & B00001000) ? bit1.val : bit0.val;
        (pdest++)->val =  (*psrc & B00000100) ? bit1.val : bit0.val;
        (pdest++)->val =  (*psrc & B00000010) ? bit1.val : bit0.val;
        (pdest++)->val =  (*psrc & B00000001) ? bit1.val : bit0.val;
        num += 8;
      } else { // no more pixel data, last RMT item is the reset pulse
        (pdest++)->val =  reset.val;
        num++;
      }
      size++;
      psrc++;
    }
    *translated_size = size;
    *item_num = num;
}

/*
 * Initialize the RMT Tx channel
 */
static void rmt_tx_int(rmt_channel_t channel, uint8_t gpio) {
    rmt_config_t config;
    config.rmt_mode = RMT_MODE_TX;
    config.channel = channel;
    config.gpio_num = gpio_num_t(gpio);
    config.clk_div = RMT_CLK_DIV;
    config.mem_block_num = 1; // 64 pulse "items" per block
    config.tx_config.loop_en = 0;
    config.tx_config.carrier_en = 0;
    config.tx_config.idle_output_en = 1;
    config.tx_config.idle_level = RMT_IDLE_LEVEL_LOW;

    rmt_config(&config);
    rmt_driver_install(config.channel, 0, 0);
    rmt_translator_init(config.channel, u8_to_rmt);
}
использовать примерно так

Код: Выделить всё

rmt_write_sample(RMT_CHANNEL_0, pixels, numBytes, false);
Вся проблема в том, что 2 ядра пытаются выполнить микропрограмму одновременно без учета временных задержек.Из-за этого сбивается последовательность передачи байт на светодиоды. Данные отправляются каждую миллисекунду (можете проверить осцилографом) но из-за того, что временные задержки не попадают в требуемые для ws2812 загораться может как и что угодно. Выхода из сложившейся ситуации 2 либо использовать RMT драйвер, либо жестко забиндить процесс передачи байт для светодиодной ленты на одно ядро с жесткими таймаутами, что не есть хорошо.

Если есть другие варианты пожалуйста расскажите мне.

Отправлено спустя 6 минут 43 секунды:
ESP8266 отлично работает без всяких драйверов. Возможно для вашей цели легче использовать этот микроконтроллер.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

ESP32 тормозит

#3

Сообщение Ingwar » 23.08.2020{, 23:42}

RootShell писал(а):
23.08.2020{, 23:28}
Если есть другие варианты пожалуйста расскажите мне.
Пробовал примеры отсюда. Лента по кнопкам и по MQTT прекрасно работает.
Жаль, что к Flprog никакого отношения не имеет... :smile44:
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

RootShell
Рядовой
Сообщения: 77
Зарегистрирован: 27.06.2020{, 04:22}
Репутация: 18
Откуда: World
Имя: Agat
Контактная информация:

ESP32 тормозит

#4

Сообщение RootShell » 23.08.2020{, 23:46}

RMT специфичен для ESP32 и позволяет генерировать точные цифровые импульсы с разрешением 12,5 нс. См. Esp32.RMT для подробностей
Именно про это я и говорил. Видимо в библиотеку NeoPixel driver уже заложен RMT.

Отправлено спустя 11 минут 22 секунды:
Простите, не заметил, что это microPython. Но для c++ или ArduinoC++ все это также будет верно.

Тормозит не микроконтроллер, тормозит ПО которое в него заливают.

rogerwaters
Рядовой
Сообщения: 42
Зарегистрирован: 17.05.2019{, 18:38}
Репутация: 2
Имя: Александр

ESP32 тормозит

#5

Сообщение rogerwaters » 24.08.2020{, 15:36}

Попробовал несколько проектов на ESP32 и заметил что в отличии от своего младшего брата ESP8266 он очень чувствителен к недостатку питания и перепадам напряжения.
Если запитываете подобные модули только через USB-кабель то могут быть проблемы с проседанием 3,3v напряжения в момент запуска. Симптомы: задумчивость контроллера,ошибки при загрузке скетча, циклическая перезагрузка WiFi-модуля. Поэтому рекомендую через USB-кабель только загружать скетч а питать модуль через отдельный импульсный блок питания 5V минимум 700ма короткими 1мм проводами на входы Uin и GND.

stigmat
Рядовой
Сообщения: 18
Зарегистрирован: 14.05.2020{, 18:10}
Репутация: 0
Имя: Yurii

ESP32 тормозит

#6

Сообщение stigmat » 21.10.2020{, 16:21}

Нажмите кнопку BOOT при заливке скетча.

Аватара пользователя
DrMario
Лейтенант
Сообщения: 371
Зарегистрирован: 07.11.2016{, 13:11}
Репутация: 58
Откуда: Камень-на-Оби
Имя: Евгений
Контактная информация:

ESP32 тормозит

#7

Сообщение DrMario » 21.10.2020{, 16:49}

Попробуйте залить с такими настройками.
Вложения
Безымянный.png
Не будет блютуза

Ответить

Вернуться в «ESP32»