Понятно, что ESP32 в качестве управляющего контроллера для любого девайса, в том числе и светодиодного куба, — это гораздо интереснее, чем «простенькая» Arduino Nano, но AlexGyver в своём базовом проекте почему-то остановился именно на Arduino Nano.

Мы же пойдём дальше и оснастим наш LED Cube современным ESP32 со всеми присущими ему возможностями: Bluetooth, Wi-Fi, двумя 32-разрядными ядрами, большим объёмом памяти и прочим, что позволит в дальнейшем оснастить куб беспроводными интерфейсами и включить его в IoT систему.

Тем более, что сделать это будет не так сложно — оказывается стандартная распиновка колодки Arduino Nano — это ещё и универсальный переходник для подключения любых различных контроллеров.

Об этой сакральной магии и поговорим далее…

Немного теории


Всего (в нашем случае) возможны три варианта построения архитектуры светодиодного куба:
  1. Системой управляет Arduino Nano (базовый вариант)
  2. Гибридный вариант Arduino Nano (индикация) плюс ESP8266/ESP32 (интерфейсы)
  3. Системой управляет ESP32 (индикация и беспроводной интерфейс)

Базовый вариант

Базовый вариант на Arduino Nano ничем не плох — это вполне функциональное решение, единственным существенным недостатком которого является отсутствие беспроводных интерфейсов для управления кубом. Далеко не всегда это нужно и, в принципе, вполне можно обойтись и штатной Arduino Nano.



Гибридный вариант

Это более продвинутый вариант системы, где иллюминацией и управлением светодиодами занимается Arduino Nano, а в качестве партнёрского контроллера выступает ESP8266, который обеспечивает беспроводную связь и, в силу своей вычислительной мощности, прочие дополнительные функции.



Коммуникация между контроллерами осуществляется по UART интерфейсу, где ESP8266 выступает ведущим, а Arduino Nano — ведомым. Тут же появляется возможность оснастить систему веб-интерфейсом с различными настройками, что кардинально повышает удобство пользования кубом.

ESP32 в этом варианте использовать нет смысла — если уж использовать ESP32, то дополнительные «костыли» в виде Arduino Nano ему не нужны — у него есть два ядра и прочие соответствующие ресурсы.

Вариант ESP32

ESP32 — это самый «козырной» вариант: мы получаем всё и сразу. Просто меняем Arduino Nano на ESP32 и получаем в своё распоряжение на 2-3 порядка больше ресурсов и возможностей, чем в базовом варианте. В этом смысле нет никаких причин использовать другие варианты, кроме как для создания экспериментальных стендов для отработки навыков программирования Arduino Nano и ESP8266 (что тоже полезно и лишним не будет).



В результате

В результате можно сделать два переходника для ESP8266 и ESP32 и получить возможность мгновенно изменять управляющую архитектуру светодиодного куба «по настроению» или в соответствии с текущими потребностями изучения программирования для тех или иных платформ (ATmega328, ESP8266, ESP32).

Волшебный сокет


Как я же отметил в предыдущей статье, для того, чтобы превратить «унылый» вариант куба на Arduino Nano в нечто гораздо более интересное и продвинутое на ESP8266/ESP32 достаточно сделать одну простую вещь — не запаивать наглухо Nano в материнскую плату куба, а установить вместо неё разъёмы (колодки, сокет). Это позволит устанавливать в этот сокет другие контроллеры.



Но кто сказал, что распиновка Arduino Nano для этого подходит и всё не погорит при первой же попытке подобной интеграции? Тем более, что контроллеры у нас разные и рассчитаны на разное питание 3,3 и 5 вольт.

А вот не погорит, смотрим на схему подключения Arduino Nano в светодиодном кубе. Я привожу часть схемы, необходимую для понимания рассматриваемого вопроса (полная схема куба есть в предыдущей статье).



Из анализа этой схемы можно сделать следующие выводы.

Если не считать опциональных кнопок и светодиодов LED1 и LED2, то соединение контроллера с кубом осуществляется при помощи всего трёх линий интерфейса SPI, это:

D13/SCK/SRCLK — импульсы синхронизации;

D11/MOSI/SER/DATA — собственно данные о состоянии светодиодов;

D10/SS/RCLK — сигнал выбора устройства на шине.

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

Этим мы и займёмся далее.

Переходник ESP8266


Начнём с гибридного варианта на ESP8266. Как вы помните, в этом варианте ESP8266 управляет Arduino Nano, которая в свою очередь занимается обслуживанием непосредственно работы LED Cube.

Код управления светодиодами и эффектами хранится на Arduino Nano, а ESP8266 только отдаёт управляющие команды для Nano по UART интерфейсу. На ESP8266 хранится код веб-сервера и страницы веб-интерфейса куба. Плюс любой другой код для нужных вам функций на стороне ESP8266.

В качестве контроллера ESP8266 будем использовать хит всех времён и народов WeMos D1 mini. Наша цель — просто грамотно соединить D1 mini с Arduino Nano и сделать соответствующий модуль, который можно будет вставлять в сокет Arduino Nano на плате куба.

Распиновка подключения UART соединения между D1 mini и Nano. Со стороны D1 mini используется аппаратный TXD1 для передачи данных и GPIO4 (D2, в нотации D1 mini) для подачи сигнала прерывания.



А со стороны Nano используется пин с аппаратным прерыванием D3/INT1 и GPIO5 (D5) для входного сигнала RX, поддерживаемого библиотекой SoftSerial (на Nano только один и уже занятый аппаратный UART).

Само-собой, земля (GND) всех составляющих соединяется вместе, а также линии питания (5V) обоих контроллеров тоже соединяются. Вот более полная распиновка соединения контроллеров модуля.



Поскольку линии питания 5V контроллеров и куба соединены вместе, то запитывать куб можно как угодно: со стороны D2 mini и/или со стороны Nano (через USB разъёмы), или через колодки подачи питания на материнской плате куба.

По идее, между 3,3-вольтовой D1 mini и 5-вольтовой Arduino Nano должен быть конвертер уровней, и поначалу у меня так и было сделано, но потом оказалось, что и без него всё прекрасно работает и из финальной схемы переходника (модуля) я его убрал. Как говорится, зачем платить больше, если не видно разницы? Но вы можете сделать всё правильно и использовать конвертер уровней.



Переходник — простая плата с двумя разъёмами для Nano и D1 mini. Разъём для Nano с длинными пинами, которые «приподнимают» Nano и дают возможность подключить всю переходную плату.



Всего используется четыре перемычки: чёрная — земля (GND), красная — питание 5V, жёлтая — данные TX/RX и зелёная — линия прерывания. Остальные контакты обеспечиваются автоматически при установке модуля в материнскую плату.

Вот как это выглядит в готовом виде:



В моём варианте плата модуля несколько торчит назад, но меня это не смущает, поскольку при работе её практически не видно и куб у меня используется больше для экспериментов, чем для украшения интерьера (хотя и с этим он справляется на ура).

Переходник ESP32


С переходником для ESP32 всё ещё проще: тут фактически один разъём под типовой китайский ESP32 модуль и несколько проводков соединительных линий. Главное — грамотно подключить эти проводки (смайл).



Здесь просто линии SPI интерфейса Nano в колодке (самой Nano нет!) соединяются с соответствующими линиями дефолтного SPI интерфейса ESP32. Плюс линия 5V в колодке соединяется с линией VIN контроллера ESP32. Ну и земля (GND), естественно.

Проще — некуда. Переходник полностью пассивный и не содержит практически ничего, кроме разъёмов и нескольких перемычек, но эффект даёт фантастический — разница между Nano и ESP32 колоссальна.



Цвета перемычек те же самые, что и в варианте с ESP8266. Здесь длинные пины уже не нужны, поскольку тут не нужно подключать Nano — ESP32 сама справляется со всей работой и по обслуживанию иллюминации куба и по поддержке беспроводных соединений и веб-интерфейса.



При установке модуль на ESP32 выглядит более аккуратно и не слишком выпирает за габариты куба. А при работе куба его вообще не видно.



Программирование


Программированием всей этой чудо-техники мы займёмся в следующих статьях, а пока несколько слов о программном обеспечении работы светодиодного куба на разных платформах.

Положительным моментом тут является то, что код обслуживания светодиодного куба является практически идентичным и легко переносимым для различных платформ. Можно написать код эффектов на Arduino Nano и практически без изменений (с минимальными изменениями) скопировать его в проект на ESP32.

Если вы не являетесь фанатом программирования и вам неинтересно отлаживать межпроцессорное взаимодействие, то оптимальным вариантом видится платформа ESP32, как самая развитая и многообещающая. Можно постепенно развивать и модернизировать свой проект на ней: добавлять новые эффекты, функции и т. д.

А если вы изучаете программирование или просто любите программировать, то светодиодный куб — это отличный вариант тестового стенда для подобных экспериментов — тут все ваши действия наглядно отражаются на работе куба: он либо радует вас своей иллюминацией, либо не работает так, как надо и все ваши ошибки программирования буквально видны на самом кубе.

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

Заключение


Просто красота: вынул плату Arduino Nano, вставил любой модуль ESP8266/ESP32, в зависимости от текущих задач, и можешь оттачивать мастерство программирования на любой платформе. Хочешь — программируй светодиодные эффекты, хочешь — отлаживай работу веб-сервера и веб-интерфейса, хочешь — тренируйся в межпроцессорном взаимодействии разных MCU. Что ещё может пожелать любитель DIY электроники и программирования?



Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале

Комментарии (18)


  1. kuzzdra
    09.01.2025 12:24

    Если от контроллера достаточно только SPI - ESP8266 должно хватить.


    1. smart_alex Автор
      09.01.2025 12:24

      У меня на одном ядре не получается сделать и веб-сервер с полноценным интерфейсом и обеспечить плавную работу эффектов (там динамическая индикация с минимальными задержками) - при работе сервера иллюминация куба начинает мигать.


      1. kuzzdra
        09.01.2025 12:24

        Вывод в SPI по прерываниям таймера?


        1. smart_alex Автор
          09.01.2025 12:24

          Я пока экспериментирую с оригинальным кодом Алекса Гайвера (сам код можно посмотреть по ссылке в предыдущей статье).


      1. LAutour
        09.01.2025 12:24

        Я несколько лет назад чтобы уменьшить задержки на SPI выводе в ESP8266 в ардуино делал свой вывода через DMA с полным использванием аппаратного буфера на 512бит.


        1. smart_alex Автор
          09.01.2025 12:24

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


          1. LAutour
            09.01.2025 12:24

            Я делал по минимуму: готовую основную инициализацию от ардуино и только размер буфера и вывод свой, прерываний за ненадобностью не использовал - успевал в основном цикле дождаться конца вывода по SPI:

                void setDataBits(uint16_t bits) 
                {
                  const uint32_t mask = ~((SPIMMOSI << SPILMOSI) | (SPIMMISO << SPILMISO));
                  bits--;
                  SPI1U1 = ((SPI1U1 & mask) | ((bits << SPILMOSI) | (bits << SPILMISO)));
                }
            
                void writeData512(uint32_t* data_ptr)
                {
                  while(SPI1CMD & SPIBUSY) {}
                  //без цикла - так вроде быстрее
                  SPI1W0 = *data_ptr++;
                  SPI1W1 = *data_ptr++;
                  SPI1W2 = *data_ptr++;
                  SPI1W3 = *data_ptr++;
                  SPI1W4 = *data_ptr++;
                  SPI1W5 = *data_ptr++;
                  SPI1W6 = *data_ptr++;
                  SPI1W7 = *data_ptr++;
                  SPI1W8 = *data_ptr++;
                  SPI1W9 = *data_ptr++;
                  SPI1W10 = *data_ptr++;
                  SPI1W11 = *data_ptr++;
                  SPI1W12 = *data_ptr++;
                  SPI1W13 = *data_ptr++;
                  SPI1W14 = *data_ptr++;
                  SPI1W15 = *data_ptr++;      
                  SPI1CMD |= SPIBUSY;
                }
            
                uint8_t spi_busy(void)
                {
                  return (SPI1CMD & SPIBUSY);
                }
            
            


  1. AlexGyver
    09.01.2025 12:24

    почему-то остановился именно на Arduino Nano

    Потому что она полностью справляется с поставленной задачей? Имхо есп32 перебор, может сразу малинку на Линуксе поставить? ;)


    1. smart_alex Автор
      09.01.2025 12:24

      Так это если достаточно просто куба. Мне как-то больше нравится куб с веб-интерфейсом, возможностью в интерфейсе управлять настройками и с API для интеграции в домашнюю IoT систему для использования куба для индикации различных событий в умном доме.


    1. smart_alex Автор
      09.01.2025 12:24

      А от вас, с вашими способностями, ждём куб 16х16x16 на WS2812D :)


      1. sergyk2
        09.01.2025 12:24

        https://youtu.be/mNqzkDugvSw?si=3l3soZI1LzsWwp8S

        выглядит он проще в изготовлении, слои между собой только в 1 месте соединяюца


        1. smart_alex Автор
          09.01.2025 12:24

          На ютубе есть ролик с кубом 16х16x16 на умных светодиодах - это бомба и автор просто невероятный молодец.


    1. slonopotamus
      09.01.2025 12:24

      Имхо есп32 перебор, может сразу малинку на Линуксе поставить? ;)

      Малинка с линуксом подороже будет (и электричества жрёт поболее). А вот выбор между ардуиной/esp8266/esp32-c3 вообще неочевиден, особенно если у вас ещё ничего из этого нет.


      1. withkittens
        09.01.2025 12:24

        Если учесть, что esp32-c3 стоит полтора доллара, выбор нано действительно не очевиден :)


  1. TinK87
    09.01.2025 12:24

    Собрал куб. Дело в том что есть косяк. Возможно дело в китайских, некачественных компонентах. При заполнении 8 слоя куба, происходит небольшой засвет первого слоя. Схему уже пробовал модернизировать. Ставил фильтра на транзисторы. Резисторы на землю. Подтяжки. Что только не мудрил. В итоге внимательно посмотрел видео. У Гавера точно такое же явление с его кубом. А как исправить уже нет понятия. А насчёт esp32 это жирно. Web интерфейс думаю будет лишним. Так как куб на столе лежит. Кнопки под рукой. И nano в полное хватает. Но идея хорошая. +++++++


    1. smart_alex Автор
      09.01.2025 12:24

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


      1. zatim
        09.01.2025 12:24

        А какие там частоты? Транзистору, конечно, нужно время чтобы выйти из насыщения, особенно, если оно было глубоким. Но на частотах динамической индикации (100-400 гц) это обычно еще никак не проявляется.


        1. smart_alex Автор
          09.01.2025 12:24

          Дело в том, что диоды подсвечиваются без всякой системы - обычно это диод ниже горящего, либо диод на -7 этажей, но бывает совершенно хаотическая подсветка.

          У меня два предположения: либо это задержки импульсов (по идее это должно лечиться программно), либо это "блуждающая ёмкость", которая заваливает фронты импульсов.