ESP8266 NodeMCU first WS2812 LED загорается зеленым цветом

Я пытаюсь включить несколько светодиодов WS2812 с моей платы ESP8266 ESP-12E NodeMCU (схема здесь). Я просто пытаюсь использовать NeoPixel Strandtest, который отлично работает на Arduino UNO с той же светодиодной лентой, но когда я меняю #define pin 6 на #define pin D4 (или 12 как GPIO), загорается только первый светодиод, и он зеленый. Я действительно вставил резистор 470 Ом между данными и DIN, но это ничего не изменило.

Когда я использую один из других контактов, кажется, что ничего не загорается, даже если я отсоединяю все контакты и нажимаю сброс. Вот моя проводка:

Не обращайте внимания на фактическое 3в -> 5в. Он отлично работает с 3v. Я также попытался отключить его извне. Я перепробовал все остальные контакты от D0 до D7 (я видел, как многие люди говорили: "ДЕРЖИСЬ ПОДАЛЬШЕ ОТ контакта D8"). Может ли мой ESP8266 быть мертв по прибытии?

, 👍2

Обсуждение

Как долго длится ваша полоса? А вы читали и понимали NeoPixel uberguide (https://learn.adafruit.com/adafruit-neopixel-uberguide/overview)?, @Paul

@Paul 3 пикселя длиной. NeoPixel не имеет к этому никакого отношения, за исключением того, что я использую их пример кода. Он отлично работает на моем Arduino UNO, так что он должен отлично работать и на этом., @MortenMoulder

Не могли бы вы подключить вход 5 В от светодиодной ленты к USB-разъему питания NodeMCU?, @Paul

@Paul Там нет 5v USB-POWER pin. VIN не обеспечивает 5 В. Даже если я подключу его внешне к 3,3 В или 5 В, светодиодная лента не будет работать., @MortenMoulder

Хм, у меня есть плата NodeMCU с выводом USB 5V, не понимаю, почему они не должны его ломать, так как это полезный вывод., @Paul

Но дело либо в том, что полоска не получает достаточной мощности (или напряжение падает после каждого светодиода), либо в том, что время ESP8266 испорчено (или что-то в этом роде)., @Paul

Чтобы отладить напряжение, вы можете попробовать включить питание от другого источника питания 5 В и подключить оба заземления. Вы также можете попробовать включить его с помощью Arduino и управлять им с помощью ESP8266 (и комбинировать основания)., @Paul

@Paul Как получилось, что все примеры, которые я нашел в Интернете (буквально 10+), не будут работать? Однако я могу зажечь обычный светодиод, просто установив его на ВЫСОКИЙ уровень., @MortenMoulder

Что делать, если вы запитаете полоску из-за первого светодиода?, @Paul

@Paul Из-за первого светодиода? Что это значит?, @MortenMoulder

Я напишу ответ с моими вариантами/мыслями, это будет проще, @Paul

@Paul Если это не ответ, не утруждайте себя написанием ответа. Если это предположения, не трудитесь их писать., @MortenMoulder

Детали WS2812 очень придирчивы к срокам. Любое дрожание вообще даст неожиданные результаты. Мы говорим о менее чем миллионной доле секунды. Вот почему у вас возникают трудности с управлением деталями WS2812 с компьютерами на базе ОС, такими как Raspberry Pi. Я предполагаю, что ESP8266 слишком занят управлением радио, чтобы иметь возможность соблюдать точное время, необходимое для управления деталями WS2812., @st2000

Вы также должны знать, что парадигма Arduino (я не хочу называть ее ОС) не была чисто портирована на каждый процессор / цель, которая утверждает, что совместима с Arduino. В прошлом месяце у меня возникли проблемы с управлением простыми вещами, такими как состояние GPIO на Arduino на базе ARM., @st2000

@st2000 Почему тогда у всех остальных нет проблем?, @MortenMoulder

Мое предложение, если здесь больше ничего не работает, состоит в том, чтобы использовать обычный / известный Arduino (например, ProMini) для управления частями WS2812 и управления им с ESP8266. Обе платы маленькие и не должны мешать размеру вашего проекта. Извините за так много комментариев вместо ответа. Но я догадываюсь о вашей проблеме. А на то, чтобы вложить догадку в ответ StackExchange, смотрят свысока., @st2000

@st2000 Я мог бы управлять своим другим Arduino с ESP8266, но этого, честно говоря, не произойдет., @MortenMoulder

@MortenMoulder, правда? Ну что ж, длинные провода и недостаточное питание-вот мои следующие ответы goto (догадки). После этого наступает вариация продукта. Включая детали (так что проверьте, как уже указывалось, работает ли другая плата), а также программное обеспечение (попробуйте получить более старые или новые версии платы). w.r.t. power, вы просите больше энергии от ESP8266, чем он может доставить на полосу? Если вы используете 5-вольтовый источник питания, попробуйте обойти ESP8266 и подать 5 вольт на полосу непосредственно от источника питания. В зависимости от длины полосы ваш источник питания должен быть хорошего размера (ампер)., @st2000

@st2000 Мощность - это не проблема. Оставьте это вне уравнения :) Мое предположение сводится к неисправной плате. Если ни один из примеров, которые я пробовал (10+ на данный момент), я предполагаю, что он неисправен. Другого объяснения я не вижу. Если люди с точно такой же платой могут заставить свою работать, моя тоже должна работать., @MortenMoulder

Я добавлю еще одно предложение. Поскольку это почти та же проблема, с которой я столкнулся при переходе от Uno к безделушке на основе ARM. Убедитесь, что ваш SDK обновлен. Я больше знаком с тем, как ARM складывается в Arduino SDK. Но я подозреваю, что ESP8266 также будет иметь пользовательские файлы, которые имеют свои собственные версии, независимые от SDK, чтобы поддерживать различия между ним и классическим Arduino., @st2000

@st2000 Итак, обновление моей Arduino IDE? Он настроен на автоматическое обновление, и он самый новый, согласно их веб-сайту. Может ли загрузчик иметь к этому какое-то отношение? Я к нему вообще не прикасался., @MortenMoulder

Давайте [продолжим это обсуждение в чате](http://chat.stackexchange.com/rooms/49718/discussion-between-st2000-and-mortenmoulder)., @st2000


4 ответа


Лучший ответ:

5

Итак, вот мое решение: я играл с NeoPixelBus от Makuna и примерами. Я заметил, что в одном из его примеров говорилось:

// Вы также можете использовать один из них для Esp8266,

// каждый из них имеет свои собственные ограничения

//

// Эти два метода такие же, как и выше, так как метод DMA используется по умолчанию

// ПРИМЕЧАНИЕ: они будут игнорировать контакт и использовать GPI03 контакт

//NeoPixelBus<NeoGrbFeature, NeoEsp8266Dma800KbpsMethod> strip(PixelCount, PixelPin);

Поэтому я попытался исключить эту строку и использовал ее вместо этого, и тогда это сработало! Я всегда использовал Neo800KbpsMethod всякий раз, когда видел, что используется NeoPixelBus, потому что это было то, что делали другие люди. Обратите внимание, что там также сказано:

Они будут игнорировать контакт и использовать GPI03 контакт

Этот штифт-это штифт RX на моей плате. Ни один другой пример, который я видел, не использовал вывод RX на плате.

После более чем 6 часов постоянного устранения неполадок я наконец могу включить свою полосу и управлять каждым светодиодом!

,

Библиотека Adafruit использует прямое манипулирование портами. Меня не удивляет, что попытка запустить это на другом чипе работает не так, как ожидалось. Я сделал [небольшую библиотеку](http://www.gammon.com.au/forum/?id=13357), который использует аппаратное обеспечение SPI для простой реализации (без ассемблера). Однако это также работает только на одном выводе - том, который поддерживает выход SPI на ATmega328P., @Nick Gammon

Я считаю, что библиотеки Adafruit имеют определения для конкретных реализаций на Arduino и ESP8266. Однако, поскольку сроки настолько строгие, это может быть просто немного не так на вашей конкретной плате (и в самый раз с включенными другими опциями). Также имейте в виду, что нумерация контактов ESP8266 не совпадает с нумерацией Arduino (и, возможно, даже специфична для вашей платы). Возможно, в будущем вы все же захотите использовать другой тип светодиодных полос (на основе spi), так как он проще, менее надежен/хлипок, более настраиваем и гораздо более кроссплатформенен., @Paul


0

Пожалуйста, прочтите и поймите руководство

Вы говорите, что он работает на Arduino, большая разница между Uno и ESP8266-это напряжение (и регуляторы напряжения).

Еще одним отличием является сам чип/архитектура.

Таким образом, это приводит к необходимости отладки этих двух факторов.

Отладка питания/цепи/напряжения

Пожалуйста, проверьте, может ли контакт 3V вашей конкретной платы dev подавать ток на 3 светодиода. В качестве альтернативы вы можете попробовать использовать другой источник питания 5 В или 5 В от вашего USB или (Arduino, так как это сработало), чтобы попытаться включить светодиоды.

Другая проблема может заключаться в том, что напряжение будет медленно снижаться по длине полосы. Ваша полоска маленькая, хотя вы также питаете ее от 3В, увеличивая эффект. Вы можете попробовать включить его в нескольких точках или с середины.

Попробуйте использовать логический переключатель уровня, чтобы увеличить логический выходной вывод с 3 В до 5 В, этого может быть недостаточно для передачи данных. Обычно это не проблема, но вы должны исключить эту возможность.

Руководство также показывает некоторые странные вещи, касающиеся проводки. Они говорят, что вы должны использовать конденсатор между линиями + и -. Я не понимаю, как это может провалиться, но вы можете попробовать.

Также дважды проверьте проводку, может быть, какой-то разъем немного болтается. У меня также были проблемы со светодиодными полосками, которые были согнуты, медь может оторваться от полосы, или полоса может немного порваться.

Вы также должны проверить это с помощью другого куска светодиодной ленты, просто чтобы быть уверенным.

Отладка контроллера

Он работает на Arduino, но не на ESP8266, и мы проверили, что это не из-за напряжения/мощности.

Неопиксели имеют довольно строгие сроки, и я бы никому не советовал их использовать. Поскольку вы не можете писать на полоску "пиксель за пикселем", вам придется поместить всю полоску в память, а затем отправить ее всю сразу.

Другие светодиодные ленты на основе SPI могут принимать пиксели один за другим, как потоковая передача. Таким образом, вы можете просто сделать цикл, который устанавливает цвет и отправляет его (медленно увеличивая цвет, чтобы создать практически бесконечный эффект радуги). Самое классное, что он даже не блокирует прерывания. (Neopixels отключает прерывания, требует 3 байта на пиксель и не может выполнять вычисления между отправками)

Если вы все еще хотите использовать NeoPixels, может возникнуть проблема со временем. Вы можете проверить, на какую тактовую частоту вы установили ESP8266.

Также вы используете ESP show с правильной опцией "is800KHz"? espShow(pin, пиксели, numBytes, is800KHz);

Вы также можете попробовать другой ESP8266 от другого производителя, чтобы убедиться, что это не плата. Возможно, они использовали кристалл, который не так точен, как следовало бы.

,

Я на 1000000% уверен, что напряжение-это не проблема. При питании полосы от ESP8266, но получении данных от моего Arduino, он работает отлично. Я указал 800 кГц при настройке NeoPixelBus (например, используя пример NeoPixelBus). Проблема в следующем: все, у кого есть руководства о том, как это настроить, ничего не делают, кроме как берут пример и переходят на правильный контакт. Я так и сделал. Я сделал именно то, что они сделали. У меня точно такая же распиновка, как и у них, поэтому я ожидаю, что платы будут несколько похожи (те же тактовые частоты МГц, тот же тип платы и т. Д.)., @MortenMoulder

Из практики, когда ваши ожидаемые результаты не проявляются .. изолируйте и вернитесь к основам, протестируйте на известной рабочей полосе/плате, протестируйте 3V/5V, прочитайте доступные варианты .. как упоминал @MortenMoulder, трюк заключался в NeoPixelBus lib и конкретном выводе RX, @farinspace


2

Хорошо, я получил его работу после того, как стучал головой в течение нескольких дней, я использовал плату MCU узла V3, контакт на плате был D1 D2 D3 D4 и т. Д. Все остальные библиотеки, когда данные были подключены к D4 в коде, где мы указываем контакт, который мы используем для записи D4.

Однако для FASTLED кодов код который вам нужно написать это всего лишь 4 без буквы D и когда я сделал то же самое он просто работал как по волшебству

,

0

Хорошо, я использую WS2812B с nodemcu и Fastled. Теперь всем людям, читающим это, не нужно беспокоиться о напряжениях,если ваш светодиод вообще не мигает. Он не работал в D0, он работал для меня, когда я перешел на D1, хотя я не знаю о проблеме. Нужно это проверить. Я не использовал никаких других компонентов и подключился непосредственно к nodemcu. Ниже приведен простой код для первого мигания светодиода.

#define FASTLED_ESP8266_RAW_PIN_ORDER
#include <FastLED.h>
// Сколько светодиодов в вашей полосе?
#define NUM_LEDS 3

// Для светодиодных чипов, таких как WS2812, которые имеют линию передачи данных, землю и питание, вы просто
// нужно определить DATA_PIN.  Для светодиодных чипсетов на основе SPI (четыре провода - data, clock,
// ground и power), таких как LPD8806, определяют как DATA_PIN, так и CLOCK_PIN
// Тактовый вывод необходим только для чипсетов на основе SPI, когда не используется аппаратный SPI#define DATA_PIN D1
#define CLOCK_PIN 13

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

void setup() { 
    Serial.begin(9600);
    // Раскомментируйте/отредактируйте одну из следующих строк для расположения светодиодов.
    // ## Безчасовые типы ##
    FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
    Serial.println("Setup");
}

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