ESP32 + Фастлед + WS2801

esp32 led-strip

Я использую плату ESP32 DevkitC с Fastlib и светодиодную ленту WS2801. Светодиодная лента работает нормально, подключил правильно (иногда горят все светодиоды, не мерцают).

Я подключил кабель данных световой полосы (синий) к GPIO16, а кабель часов (красный) — к GPIO17. Компиляция работает, но сначала показывает эту ошибку:

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

При запуске скрипта только первые 3 светодиода светятся голубым (а не мигают) — вот мой код:

#include <FastLED.h>

// Сколько светодиодов в вашей полосе?
#define NUM_LEDS 42

// Для светодиодных чипов, таких как Neopixels, у которых есть линия передачи данных, заземление и питание, вы просто
// необходимо определить DATA_PIN. Для светодиодных чипсетов, основанных на SPI (четыре провода — данные, часы,
// земля и питание), как и LPD8806 определяют как DATA_PIN, так и CLOCK_PIN
#define DATA_PIN 16
#define CLOCK_PIN 17

// Определяем массив светодиодов
CRGB leds[NUM_LEDS];

void setup() { 
      // Раскомментируйте/отредактируйте одну из следующих строк для вашего расположения светодиодов.
      // FastLED.addLeds<TM1803, DATA_PIN, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<TM1804, DATA_PIN, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<TM1809, DATA_PIN, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<WS2811, DATA_PIN, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<WS2812, DATA_PIN, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<WS2812B, DATA_PIN, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
      // FastLED.addLeds<APA104, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS);

      // FastLED.addLeds<WS2801, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<SM16716, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<LPD8806, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<P9813, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<APA102, RGB>(светодиоды, NUM_LEDS);
      // FastLED.addLeds<DOTSTAR, RGB>(светодиоды, NUM_LEDS);

       FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<P9813, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<DOTSTAR, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
}

void loop() { 
  // Включите светодиод, затем сделайте паузу
  leds[0] = CRGB::Red;
  FastLED.show();
  delay(500);
  // Теперь выключите светодиод, затем сделайте паузу
  leds[0] = CRGB::Black;
  FastLED.show();
  delay(500);
}

Есть идеи, что не так?

, 👍0


1 ответ


1

Это трудно отладить издалека...

Ваш набросок выглядит правильно (что неудивительно, поскольку это всего лишь пример Blink). Но я бы попытался использовать IO18/SPI_CLK для часов и IO23/SPI_MOSI для данных, так как это аппаратные контакты SPI ESP32. Очень может быть, что использование этих контактов удаляет предупреждение об аппаратном SPI.

Поскольку я не знаю всех вариантов ленты WS2801... может быть, это одна из тех полос, которые работают от 12 В и могут быть разрезаны только через каждые три светодиода? Это объясняет, почему горят три светодиода вместо одного (потому что тогда будет один чип для трех светодиодов — другими словами, каждый «пиксель» в массиве светодиодов соответствует трем физическим светодиодам)

Тогда может быть проблема с выходным напряжением вашей платы ESP32. ESP работает при Vcc=3,3В. Микросхемы полосы работают при Vcc=5В и ожидают 5В на своих входах. Логическая 1 предполагается, когда рассматриваемый вход равен 0,7 * Vcc, т. е. входной сигнал не может быть меньше 3,3 В. Теперь представьте, что регулятор мощности на вашей плате ESP управляет ESP на чуть-чуть меньше (например, 3,25 В), а источник питания для полосы выдает чуть-чуть больше (например, 5,1 В) - внезапно логическая 1 из ESP в 0,637 раза превышает Vcc полосы и, следовательно, находится в неопределенном подвешенном состоянии между 0,3*Vcc (самое высокое разрешение для логического 0) и 0,7*Vcc (самое низкое определение для логической 1). Модуль сдвига уровня поможет здесь увеличить напряжение выходного сигнала ESP (стоит несколько центов при заказе напрямую из Китая).

Тогда, наконец, вы уверены, что порядок цветов на полосе — RGB (как указано в строке настройки)? Я видел больше полосок, использующих GRB или BGR... что объясняет, почему вы видите синий цвет вместо красного.

,