Понятно, что 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-канале

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


  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. smart_alex Автор
              09.01.2025 12:24

              Пример кода - вообще отлично, спасибо.


  1. AlexGyver
    09.01.2025 12:24

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

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


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

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


      1. AlexGyver
        09.01.2025 12:24

        Ну так автору достаточно было просто куба, целое видео об этом. Зачем так удивляться, если вроде всё понимаешь


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

          Ха, то, что автору достаточно просто куба - это понятно, непонятно ПОЧЕМУ ему достаточно просто куба, когда можно простой заменой контроллера на порядок повысить возможности и полезность девайса.

          Но это я рассуждаю со своей колокольни - у меня свой взгляд и свои планы на этот девайс.


          1. AlexGyver
            09.01.2025 12:24

            Не нужно проецировать свои хотелки и навыки на чужие проекты и посвящать этому целые опусы и название статьи. Хотя может тут так принято, не знаю :)


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

              Алекс, на авторство вашего проекта никто не покушался - вы сделали проект открытым - я его повторил и модернизировал так, как мне нужно и поделился этой информацией с народом.


              1. AlexGyver
                09.01.2025 12:24

                Я про это ничего не говорил)


          1. voldemar_d
            09.01.2025 12:24

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

            У куба яркость хоть регулируется?


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

              Так в том то всё и дело, что когда вы добавляете беспроводную связь и API, куб перестаёт быть тупым светильником "раздражающим зрение" и получает неограниченные возможности по конфигурации и отработке сценариев.

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


              1. voldemar_d
                09.01.2025 12:24

                То, что все это технически можно сделать - понятно. Но все эти возможности и сценарии, кмк, упираются в непонятную практическую полезность.

                Понятно, что через скважность яркостью можно управлять, но чтобы оно не слепило и не раздражало в темноте ночью - не начнет ли это все безбожно мерцать на малой яркости?

                Если хочется какой-то индикатор для умного дома, просто ЖК-экран с понятными разноцветными пиктограммами, графиками и надписями не будет ли более информативным?


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

                  А "непонятная практическая полезность" упирается в такой трудноформализуемый фактор как... фантазия.

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

                  Для "непосвящёных" это просто красивые огоньки, а для вас куча информации. Кроме того, не нужно забывать, что куб - это не что иное, как 3D дисплей и на него можно, например, вывести информацию о состоянии десятка датчиков. Ну и т.д. и т.п., насколько хватит фантазии.

                  Ну и самое главное: это просто красиво (в отличие от обычного дисплея). :)

                  P.S. Нет, на малой яркости ничего не мерцает.


    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. voldemar_d
            09.01.2025 12:24

            Можно ссылку? И что значит "умность" в светодиодах?


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

              "Умность" это условное название, я так понимаю, речь идёт WS2812D.

              Ссылка:

              https://www.youtube.com/watch?v=ciaFar8nfHc


    1. slonopotamus
      09.01.2025 12:24

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

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


      1. withkittens
        09.01.2025 12:24

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


        1. alextrof94
          09.01.2025 12:24

          Гайвер, уверен, использовал не оригинальные нанки, которые были закуплены ещё по 100р/штука, когда есп32 и в помине не было.


          1. slonopotamus
            09.01.2025 12:24

            были закуплены ещё по 100р/штука, когда есп32 и в помине не было

            То есть ещё дороже чем полтора доллара?


      1. AlexGyver
        09.01.2025 12:24

        На Хабре не выкупают сарказм?... Выбор автора и правда не очевиден, видео то 2018 года. Это тоже сарказм если что


        1. slonopotamus
          09.01.2025 12:24

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


          1. AlexGyver
            09.01.2025 12:24

            На сегодняшний да, но мы обсуждаем "хммм почему же автор поставил ардуину в 2018 году??". Я кстати и сейчас бы наверное нанку воткнул, уж слишком понятно и приятно работают таймеры у неё для всякой динамики. Это если wifi не нужен


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

              Да ладно, в 18 году уже вовсю продавалась ESP32, а не то, что ESP8266. Вот моя статья от июня 2017 года, кстати, аж 200 тыс. просмотров:

              https://habr.com/ru/articles/404685/

              Алекс, вас же никто ни в чём не обвиняет - ну поставили Нано - и на здоровье. Я, кстати, в статье пишу, что это решение ничем не хуже, кроме отсутствия беспроводной связи.


              1. AlexGyver
                09.01.2025 12:24

                Я и не говорил что не продавалась)) много на чём можно сделать куб, зависит от целей и предпочтений разработчика. Вообще странная тема для обсуждения/осуждения/иронии


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

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

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


                  1. AlexGyver
                    09.01.2025 12:24

                    Так я и не автор, если видео смотреть внимательнее там понятно. Дискуссия ну хз, какая то публика тут душная, я наверное пойду


  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 этажей, но бывает совершенно хаотическая подсветка.

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


  1. voldemar_d
    09.01.2025 12:24

    Если вы не являетесь фанатом программирования и вам неинтересно отлаживать межпроцессорное взаимодействие

    К Ардуине можно BT-адаптер приделать, чем не беспроводное управление?

    Или нужно управлять с работы кубом, который лежит дома? :)

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

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


    1. LAutour
      09.01.2025 12:24

      К Ардуине можно BT-адаптер приделать, чем не беспроводное управление?

      Тут вопрос предпочтений: командной строкой через терминал BT-uart или через web страницу по WiFi.


      1. voldemar_d
        09.01.2025 12:24

        командной строкой через терминал BT-uart

        Зачем же так сурово? Есть, например, такое приложение в смартфоне, где можно наваять свой графический интерфейс с кнопками, индикаторами и даже графиками (не реклама, просто сильно этой темой не интересовался, может, и другие есть). Тут есть пример видео с демонстрацией работы этой программы.


        1. LAutour
          09.01.2025 12:24

          Зато web-server в ESP кроме браузера в смартфоне ничего не потребует.


          1. voldemar_d
            09.01.2025 12:24

            А почему тогда, собственно, ESP, а не какой-нибудь Rasbperry Pi Pico, который ещё мощнее? Под него даже на Питоне писать можно, кому-то так ещё проще.


            1. sirmax123
              09.01.2025 12:24

              под ESP32 тоже есть питон: https://docs.micropython.org/en/latest/esp32/tutorial/intro.html


  1. LAutour
    09.01.2025 12:24

    Если бы собирать такой куб на управлении от ESP32-S2, то можно переделать схему на параллельное (с посылкой через DMA) построчное управление без SPI. Скорость вывода тогда можно поднять в ~8 раз на той же частоте.


  1. REPLAY_5
    09.01.2025 12:24

    зачем тогда вообще там nano???
    одной esp более чем за глаза


    1. tormozedison
      09.01.2025 12:24

      Много старых наработок, библиотек, которые на нём стабильно работают, а на остальном - как получится.


  1. tormozedison
    09.01.2025 12:24

    Конвертер уровней, может, и не обязателен, но резистор в направлении от Nano к ESP нужен.