Как управлять светодиодами Neopixel параллельно?

Представьте себе набор светодиодов (Neopixel или других), промаркированных от 2 до 12. Светодиодов может быть больше 11, поэтому допускается повторная нумерация. Мне нужен простой способ управления ими с одного Arduino на основе их метки. Например, я должен иметь возможность реализовать функцию, аргументами которой являются значение метки и значение RGB, и которая переключает все светодиоды с этим значением метки на заданное значение RGB. Самое главное, решение должно быть независимым от порядка; то есть я должен иметь возможность переподключать светодиоды (или, что эквивалентно, перемещаться по меткам шестиугольников) любым способом, и все равно все будет работать без переписывания кода. (Для контекста, моя цель — создать собственное издание Settlers of Catan, в котором метки на каждом шестиугольнике загораются при броске их значения на кубике.)

Я знаю, что не могу просто использовать Neopixels из коробки, так как адресация зависит от порядка их подключения. Поэтому я предполагаю, что мне нужно придумать способ, чтобы каждый светодиод «узнал» свою метку, подключить их все параллельно, а затем написать пользовательскую библиотеку для . Но я понятия не имею, как заставить каждый светодиод узнать свою метку, не имея целого Arduino для каждого светодиода, что заняло бы слишком много места. (Я бы хотел уместить все примерно в объем типичной шестигранной метки Catan; представьте, 2-3 четвертаки, сложенные вместе.)

Я довольно хорошо разбираюсь в Arduino, но я новичок в электронике. Можно ли перепрограммировать контроллер Neopixel? Или есть маленькая логическая плата, которую я могу подключить к Neopixel или простому светодиоду, который справится с этой задачей? Что-то еще я упустил?

, 👍1


2 ответа


0

Провода данных индивидуально адресуемых светодиодов различных описаний обычно подключаются в виде последовательной цепи, при этом каждый драйвер светодиода имеет вход и выход для данных (и часов). Затем каждый драйвер светодиода будет манипулировать сигналом, который он посылает дальше, чтобы обмануть следующий светодиод, заставив его думать, что он первый в цепи.

Большинство библиотек для управления ими могут легко иметь несколько сотен светодиодов, которыми они могут управлять одновременно, в зависимости от доступной оперативной памяти.

,

1

Будет непросто «переподключить светодиоды [...] и при этом все сохранить работают без переписывания кода». Эти светодиоды не такие уж и умные, и единственный способ решения этих проблем — это порядок отправки данных о цвете. через линию передачи данных.

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

const uint16_t LED_COUNT = ...;

// Сопоставьте индексы светодиодов вдоль полосы с шестнадцатеричными метками.
const uint8_t ledLabels[LED_COUNT] = {
    2, 2, 2, 2,  // светодиоды от 0 до 3 обозначены как "2"
    8, 8, 8, 8,  // Светодиоды с 4 по 7 обозначены цифрой "8"
    // и т. д...
};

Затем предположим, что ваша светодиодная лента заявлена следующим образом:

const uint8_t LED_STRIP_PIN = ...;
Adafruit_NeoPixel ledStrip(LED_COUNT, LED_STRIP_PIN);

«функция, аргументами которой являются значение метки и значение RGB, и который преобразует все светодиоды с этим значением метки в заданное значение RGB» может быть довольно легко написано:

// Переключает все светодиоды, имеющие эту шестнадцатеричную метку, на заданный цвет.
void setHexColor(uint8_t label, uint32_t color)
{
    for (uint16_t n = 0; n < LED_COUNT; n++)
        if (ledLabels[n] == label)
            ledStrip.setPixelColor(n, color);
    ledStrip.show();
}

Теперь, если вы переподключите ленту, вам просто нужно обновить ledLabels массив и перекомпилируйте. Если вы можете отправить эту информацию на ваш Arduino во время работы (последовательное соединение, ИК-связь, SD-карта вставленный в соответствующий разъем, что угодно...), то вы могли бы даже есть процедура, где Arduino обновляет сам массив. Очевидно, тогда квалификатор const должен быть удален. Но теперь вам нужно придумать способ «рассказать» Arduino о вашей проводке.

,