#376 Re: Апаратні питання » Зарядка двох акумуляторів 18650 послідовно від usb » 2025-02-22 17:27:21

Misha1737 пише:

Не можу знайти нормальний модуль для зарядки 2s і щоб з нього можна було брати 3-5А на живлення моторчиків ардуіно і антени.

Не дуже зрозуміло, ви хочете живити робота модулем зарядки?

Misha1737 пише:

Є захист bms 2s.

Який саме? Іх десятки різних видів.

Misha1737 пише:

З входами b+ b- bm p+ p-. P+p- -  дають максимум 3 вольти

При яких умовах? Що і як до нього під час вимірювання підключене?

Misha1737 пише:

b+ b- дають десь 8 вольт.

Те ж саме, що і як до нього в цей момент підключене?

#377 Re: Програмування Arduino » скетч для управління заданою кількістю оборотів крокового двигуна » 2025-02-22 16:50:31

ternop пише:

Прошу допомоги в написанні скетчу для управління заданою кількістю оборотів крокового двигуна.

Якого саме крокового двигуна? Крокові двигуни мають різні інтерфейси керування та різну кількість пар обмоток.

ternop пише:

Наприклад: кроковий двигун повинен зробити 100 обертів.

Для початку вирішіть простішу задачу: "кроковий двигун має зробити один крок". Після того як ця задача буде вирішена, переходьте до наступної: "кроковий двигун має зробити один оберт".

Відомий пошуковий сайт за запитом "arduino stepper motor control sketch" видає тисячі посилань на відео та статті з прикладами.

#378 Re: Апаратні питання » Підключення адресної ленти у АВТО » 2025-02-20 02:54:59

Vovik07 пише:

Мене цікавить чи не будуть створювати перешкод ардуіни одна одній , фактично з прямим підключенням пінів.

Вони ж у високоімпедансному стані з вимкненими pull-up. Не уявляю, які в такому разі можуть виникнути перешкоди. Зменшення вхідного опору та збільшення ємності при паралельному з'єднані у вашому випадку ніякої суттєвої ролі не грає. При розімкненій кнопці входи підтягнуті до землі, все ок.

Проблема виникне, якщо один або обидва контролера увімнуть на цих пінах внутрішні pull-up, тоді напруга на входах зміститься. Наскільки суттєво - залежить від номіналів резисторів дільника і фактичних опорів вбудованих підтяжок.

Проблема виникне, якщо один із входів перемкнеться в output, тоді він перетягне рівень з дільника. А якщо один перемкнеться в низький рівень, а інший у високий, то буде КЗ.

На вашій картинці вихід з DC-DC 12 вольт? А на плати живлення йде на піни +5В, це точно буде проблема smile
Якщо живитимете через Vin, зверніть увагу на мою відповідь вище щодо допустимої вхідної напруги для внутрішніх стабів. Всякі XC6204 та їх аналоги, буває, і при 14 В працюють роками, а буває, вилітають при 10 В.
В іншому при живленні через Vin проблеми бути не має.

Офтопік: звісно, це не моя справа, але цікаво, що за задача така, що один контролер не справляється. Нерідко і одна ардуіна - як із гармати по горобцях, а використовують її або для економії часу, або через незнання інших варіантів. А тут цілих дві плати.
Якщо ж це дублювання для підвищення надійності, то звісно, ніяких паралельних зʼєднань не може бути. І ніяких ардуін також smile

#379 Re: Апаратні питання » Підключення адресної ленти у АВТО » 2025-02-19 01:47:00

Vovik07 пише:

Але яка має бути правильна послідовність? +12 В -кнокпа - дільник напруги - на дві ардуіно.? ЧИ дільник напруги повинен бути на кожну ардуіну?

Ардуіни живляться з однієї шини? Якщо жодна з ардуін не перемикатиме пін в output, то достатньо одного дільника.

#380 Re: Апаратні питання » Підключення адресної ленти у АВТО » 2025-02-19 01:37:47

Vovik07 пише:

Для чого використовувати 7805. Чому не можна підключити Нано на Vin. В Ардуіно нано свій вбудований стаб напруги.

Практично на всіх платах Nano і Mini Pro, що мені попадались, стоїть стаб з максимально допустимою напругою 10 вольт.
Якщо у вас оригінальна плата з чесною LM1117, тоді, звісно, можна і на вбудований.

#381 Re: Програмування Arduino » Прблема в скетче ? » 2025-02-09 23:37:12

jokeR пише:

тут викликається якийсь метод з ліби енкодера, хз що він робитиме.

Rotary::process() лише читає стани пінів та перемикає стан внутрішнього конечного автомата. Викликати той Rotary::process() в ISR - норм. Хоча в програмі топікстартера взагалі немає особливого сенсу використовувати переривання.

jokeR пише:

Якщо всередині Serial.print, буде ой.

Якщо не змішувати з викликами до Serial поза контекстом цього ISR, то буде працювати. HardwareSerial::write() не робить нічого такого, чого не можна робити в ISR.

jokeR пише:

Приблизно так:

ISR()
..
cli();
do_some_sheet
sei();

Не робіть так. ISR() викликається з уже вимкненими перериваннями. sei() їх увімкне і дозволить переривати цей обробник.

#382 Re: Програмування Arduino » Прблема в скетче ? » 2025-02-09 22:52:08

Але помилки при роботі з глобальними змінними раджу все-таки виправити. Переривання може виникнути (і виникне) посередині читання глобальної змінної, і змінить її значення. Прочитане значення буде некоректним. Це призведе до неправильної роботи, а за законом Мерфі це станеться в самий критичний момент  hmm Крім того, компілятор взагалі може заоптимізувати звернення до них, вважаючи, що їх значення ніколи не змінюються. Тому потрібні atomic-блоки та volatile.
Краще винести всю ту логіку із ISR в основний цикл, а в ISR тільки репортувати події від енкодера у змінну з атомарним доступом (на AVR8 це 8-бітні типи). А у вашому випадку краще взагалі обійтись без переривань.

#383 Re: Програмування Arduino » Прблема в скетче ? » 2025-02-09 21:11:39

Доречі, перевірте сам енкодер. Мені зустрічались екземпляри, у яких загальний вивод (GND) не посередині як на цьому фото, а збоку. Тобто послідовно йдуть: GND, OutA, OutB. Якщо продзвонювати кожний пін окремо, то при обертанні виглядає наче все ок. Але в схемі, де їх стани читаються одночасно, звісно що зчитується фігня. Колись витратив мабуть із годину, поки не виявив таку невідповідність розпіновки.

#384 Re: Програмування Arduino » Прблема в скетче ? » 2025-02-09 20:13:35

vigor53 пише:

Думаю что проблема в строчке :Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.

У вас енкодер підключений до пінів D2 та D3? Зовнішні підтяжки на них є? Якщо немає, макрос ENABLE_PULLUPS був визначений на момент компіляції бібліотеки? У вас бібліотека в архіві в трьох екземплярах. Який із двох Rotary.h інклудився при компіляції Rotary.cpp, той що Rotary/Rotary.h чи Rotary-1.0.0/src/Rotary.h ?

Якщо ENABLE_PULLUPS не був визначений при компіляції бібліотеки, то піни без зовнішніх або внутрішніх підтяжок ловлять шуми космоса.

Якщо компілюєте в IDE, увімкніть "Show verbose output: compile" і показуйте вивод. Окрім вас ніхто не може знати, що там у вас як компілюється. Крім того, arduino IDE кешує артефакти компіляції.

Створіть окремий скетч, в якому просто читайте енкодер і пишіть в послідовний порт, що повертає Rotary::process(). Для початку без усяких переривань.

Доречі, у вас операції зі змінними, які апдейтяться в обробнику переривань, неатомарні. Це помилка. Навіть якщо енкодер працюватиме правильно, результат буде непередбачуваним. Якщо, як самі кажете, тільки починаєте, то не звʼязуйтесь із перериваннями. В Rotary є приклад циклічного опитування (polling). Впевніться в стабільній роботі цього приклада, потім інтегруйте його у свій скетч.

#385 Re: Проекти » найпростіша плата керування сервоприводом по крайнім положенням. » 2025-01-31 07:26:45

dimich пише:

Двома мосфетами підключати та відключати додаткові резистори

А, вам же незмінна частота не потрібна, керувати тільки тривалістю імпульса. Тоді й одного додаткового резистора достатньо.
Якщо керуючий сигнал +12В береться з живленя замиканням контакту (або іншим способом з низьким вихідним опором), тоді і мосфета не потрібно: подавати цей сигнал напряму на резистор.

#386 Re: Проекти » найпростіша плата керування сервоприводом по крайнім положенням. » 2025-01-30 18:54:25

Tcar пише:

Тут як я розумію при подачі живлення буде переміщення серви в позицію яку можна буде встановити за допомогою резисторів. А як забезпечити повернення до базового положення?

Двома мосфетами підключати та відключати додаткові резистори паралельно потенціометрам. Щоб при низькому рівні керуючого сигнала був підключений один резистор, при високому інший.

#387 Re: Апаратні питання » Підключення адресної ленти у АВТО » 2025-01-28 10:28:10

Maximumdp пише:

який тоді стаб треба брати?

Щоб струмовий шунт був у верхному плечі? Нажаль, конкретної моделі не порекомендую, бо виробники рідко коли надають схеми до своїх модулів. Шукайте "high side current sensing" або дивіться на плату, щоб вхідний і вихідний мінуси були зʼєднані напряму, без резистора між ними - він має бути в плюсовій шині живлення.

Але це якщо вам потрібне те обмеження струму. Щоби просто знижувати напругу підійде будь-який, що витягне необхідний струм, в тому числі і ваш на XL4015. Бажано з 100% duty cycle. А запобіжник уже окремо, за бажанням.

#388 Re: Апаратні питання » Підключення адресної ленти у АВТО » 2025-01-27 23:42:32

dimich пише:

XL4015 ... заодно ним і струм КЗ обмежите.

Ага, тільки згадав, що у них струмовий шунт у нижньому плечі. Якщо зʼєднаєте мінусовий вихід XL4015 з масою авто, то обмежувач струму не працюватиме. Щоб працював, минус після перетворювача має бути окремо, не зʼєднаний з мінусом на вході.

#389 Re: Апаратні питання » Підключення адресної ленти у АВТО » 2025-01-27 23:15:12

Тому налаштовуйте ваш XL4015 на 12 вольт, заодно ним і струм КЗ обмежите. Від нього живіть стрічку та параллельно LM7805, а від неї вже живіть ардуіну.

#390 Re: Апаратні питання » Підключення адресної ленти у АВТО » 2025-01-25 22:47:38

Maximumdp пише:

12в адреска 2812

Це WS2815 ?

Maximumdp пише:

понижувач напруги XL4015

Можна замінити на лінійний LM7805. Дешевше, надійніше, менше габарити та не шумить.
XL4015 при таких малих навантаженнях практично ніякого виграшу по ККД не дає, особливо на фоні споживання стрічки.

Maximumdp пише:

Артуіно нано

Навіщо Nano з його вбудованим USB-UART? Збираєтесь часто підключатись до нього в процесі експлуатації та перепрошивати?
Якщо так уже хочеться ардуіну, то візьміть Pro Mini. Хоча можна й голу Atmega: живлення 5В у вас зовнішнє, кварцова стабільність не потрібна, частоти вбудованого RC-генератора має вистачити.

Вмикання здійснюється подачею живлення? Майте на увазі, що буде певна затримка в бутлоадері. Після відлагодження бутлоадер можна вимкнути у фʼюзах.

jokeer пише:

0.5 А повинно вистачити

Навіть з WS2815 "нової" версії, де струм при всіх увімкнених становить не більше 15 мА, для метра стічки при "кількості діодів 160/м" струм буде 2.4А.

#391 Re: Програмування Arduino » Робота esp8266 з Micropython » 2025-01-22 23:21:45

goofy пише:

Тобто, коли запускаєш з компа все робить прекрасно, але коли включаєш в розетку,
через блок на 5В відповідно, нічого не відбувається.

Ви записали ваш main.py в саму esp8266?

#392 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-12 18:02:41

jokeR пише:

В уже спаяному кубі це не просто wink

Та звісно smile Я про початковий дизайн схеми, не про переробку існуючого девайса.
Якщо живлення матриці буде такої ж напруги як і контроллера, то P-мосфети теж норм.

#393 Re: Апаратні питання » Питання по USB звукових картах » 2025-01-12 17:36:58

dimich пише:

Хіба що додати штучне опорне джерело звука біля мікрофонів, щоб по ньому синхронізувати.

Хоча, навіщо джерело звука, якщо опорні імпульси можна інжектувати електронним шляхом безпосередньо на вхід аудіокарт, паралельно сигналу з мікрофонів.

#394 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-12 17:09:36

Filaka пише:

Колір фіолетовий - 3,1V.

В поточній схемі струм з піна (5-3.1)/100 = 19 мА - в межах допустимого. При одному увімкненому світлодіоді він весь тече через нього. При всіх 16 увімкнених світлодіодах він розподіляється між ними, так що через кожний світлодіод тече всього 1.1 мА.

dimich пише:

При 100 омах втікаючий в катодні піни струм перевищуватиме допустимий

Тут я мав на увазі витікаючий струм з анодних пінів. (Нескладно заплутатись, не маючи схеми перед очима hmm )

Filaka пише:

Я думаю спробувати поставити на анод по мосфету та окремо подавати живлення, що скажете?

Без переміщення резисторів з анодних пінів (4 шт) на катодні (16 шт)? Цим ви вирішите проблему перевищення допустимого струму, якщо вона є. На ефект падіння яскравості по мірі вмикання світлодіодів це ніяк не вплине, тому що програма перебирає шари (4 штуки), в кожен момент часу вмикаючи світлодіоди одного шару. Щоб яскравість не залежала від кількості увімкнених у шарі світлодіодів, кожен із них потрібно живити через окремий резистор.

Ще раз, є два варіанта.

Або: Прибираєте 4 резистора з анодних пінів. Ставите 16 резисторів в катодні піни.

Щоби при всіх увімкнених у шарі світлодіодах з анодного піна не витікало більше 40 мА, струм через кожний світлодіод не має перевищувати 2.5 мА. Якщо яскравість при такому струмі вас задовільняє, тоді мосфетів і окремого живлення не потрібно. Номінал катодних резисторів при цьому має бути не менше (5-3.1)/0.0025 = 760 Ом.
Але документація атмеги не зазначає, чи 40 mA absolute maximum rating - це для середнього струму, чи імпульсного. Враховуючи, що кожний шар активний лише 1/4 періоду, то можна ризикнути і зменшити резистори до 470 Ом. Тоді струм світлодіода збільшиться до 4 мА, а струм з піна при всіх увімкнених збільшиться до 64 мА.

Програма при цьому залишається як є.

Якщо хочете збільшити струм понад 2.5 мА, але не хочете ризикувати, тоді має сенс ставити мосфети. Тільки я би для зручності перевернув полярність діодів та інвертував сигнали, щоб використовувати N-мосфети, а не P. 

Або: схема залишається як є. В програмі міняєте місцями column і layer для динамічної індикації:

matrix<ARRAY_SIZE(layer), ARRAY_SIZE(column)> cube(layer, column);

а також міняєте HIGH на LOW і навпаки скрізь у digitalWrite() у функціях класу matrix.

Тільки це може призвести до небажаних ефектів, про які писав вище. Все ж таки при динамічній індикації намагаються зробити сегментів більше, а секцій менше. Щоб яскравість не залежала від кількості одночасно увімкнених сегментів, живлення кожного сегмента має бути через окремий резистор.

#395 Re: Апаратні питання » Питання по USB звукових картах » 2025-01-12 15:13:32

jokeR пише:

Є ідея записати звук з 4 мікрофонів, знайти схожі паттерни і порахувати різницю фаз. Теорія здається красивою wink
Але як воно пролізе через кілька шарів абстракцій заліза і софта..

Аудіокарти не ставлять на семпли таймстемпи, затримки все зіпсують. Хіба що додати штучне опорне джерело звука біля мікрофонів, щоб по ньому синхронізувати.

Алгоритми DSP вже працюють? Іх можна відкатати і без девайса, на тестових або синтезованих семплах.

jokeR пише:

Чи є вироби з аналогічною функціональністю на ринку?

Кажуть що ні.

https://gridbots.com/bat.html

#396 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-12 14:47:32

Filaka пише:

по одному резистору номіналом 100Ом.

Якого кольору ваші світлодіоди? При 100 омах втікаючий в катодні піни струм перевищуватиме допустимий, коли світитиметься весь шар. Також загальний струм через сам контроллер вже може бути завеликий. По-хорошому, таку кількість світлодіодів потрібно комутувати через буферні каскади. Або обмежити струм збільшенням резисторів, хоча б до 470 Ом.

#397 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-12 14:20:35

Filaka пише:

Так, після послідовного вмикання світлодіодів, яскравість поступово падає.

Що ж, не бачачи схеми можна й не вгадати.

Filaka пише:

Спробую окремо подавати живлення.

Це не допоможе.

Filaka пише:

Резистори стоіть на шари(4шт. анод), по одному резистору номіналом 100Ом. Катод на стовпчики(16шт. без резистора)

Поставте резистори на кожний стовпчик (16 штук, на кожний пін із column), а з пінів layers приберіть.

Звісно, можна залишити схему як є, а поміняти місцями column і layer в програмі. Але тоді коефіцієнт заповнення зміниться з 1/4 до 1/16 і загальна яскравість впаде ще в 4 рази. І час світіння кожного сегмента зменшиться з 4 мс до 1 мс, що вже може впертись в швидкодію ардуіни.

По-хорошому, динамічну індикацію треба вішати на переривання по таймеру. Тільки фреймворк ардуіно не надає для цього крос-платформенних функцій, і це зовсім інша тема.

#398 Re: Апаратні питання » Питання по USB звукових картах » 2025-01-12 13:54:53

jokeR пише:

Як вважаєте, взлетить?

Аудіо реєстратор для чого, для якого застосування? Взлетить чи ні - це швидше питання бізнез-аналізу, а не технічне. Чи є вироби з аналогічною функціональністю на ринку? Чи є на них попит? Чи матиме ваша розробка якісь переваги над аналогами? Чи буде менша собівартість?

jokeR пише:

Пропускної здатності USB вистачить?

Для 4 аудіопотоків стандартного формату вистачить. Але з дешевими аудіокартами можуть бути нюанси.

#399 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-11 17:27:48

Filaka пише:

Але поки що не зрозумів як це все реалізувати у своєму проєкт Куба. Куб повинен повністю заповнитись.

Якщо здогадки про вашу схему підключення вірні, то ось така наївна реалізація може запрацювати:

// Абстрактний клас періодичної задачі
template <unsigned int Period>
class task
{
protected:
    unsigned long last;
    virtual void process() = 0;
public:
    task() : last { -Period } // дозволимо перший виклик одразу, без очікування
    {}
 
    void loop(unsigned long now)
    {
        if (now - last >= Period) {
            last = now;
            process();
        }
    }
};

// Клас динамічної індикації
template <byte Segments, byte Layers, byte FPS = 60>
class matrix: public task<1000/FPS/Layers>
{
    const byte *segment_pins;
    const byte *layer_pins;

    static constexpr auto seg_size = (Segments+7)/8;

    // Кожний біт в масиві визначає стан окремого світлодіода 
    byte leds[Layers][seg_size];
    byte active_layer;

    void process() override
    {
        // Вимикаємо поточний шар
        digitalWrite(layer_pins[active_layer], LOW);

        // Беремо наступний шар за активний
        if (++active_layer == Layers) {
            active_layer = 0;
        }

        // Оновлюємо стан світлодіодів.
        // Перемикання світлодіодів по одному дуже повільне, але керування
        // декількома пінами одночасно ставить певні вимоги до схемотехніки
        // та не буде крос-платформенним.
        const byte *pin = segment_pins;
        const uint8_t *bits = leds[active_layer];
        byte mask = 1;
        for (byte i = Segments;;) {
            digitalWrite(*pin++, (*bits & mask) ? LOW : HIGH);
            if (!--i) {
                break;
            }
            if ((mask <<= 1) == 0) {
                mask = 1;
                bits++;
            }
        }

        // Вмикаємо поточний шар
        digitalWrite(layer_pins[active_layer], HIGH);
    }

public:
    matrix(const byte *segment_pins_, const byte *layer_pins_) 
        : segment_pins(segment_pins_), layer_pins(layer_pins_),
          active_layer( Layers-1 )
    {}

    void begin()
    {
        // початковий стан: все вимкнено
        for (const byte *pin = layer_pins; pin < layer_pins + Layers; pin++) {
            pinMode(*pin, OUTPUT);
            digitalWrite(*pin, LOW);
        }
        for (const byte *pin = segment_pins; pin < segment_pins + Segments; pin++) {
            pinMode(*pin, OUTPUT);
        }
    }

    void set(byte segment, byte layer, bool on)
    {
        byte mask = 1 << (segment % 8);
        byte *addr = &leds[layer][segment / 8];
        if (on) {
            *addr |= mask;
        } else {
            *addr &= ~mask;
        }
    }

    void clear()
    {
        memset(leds, 0, sizeof(leds));
    }

     void fill()
    {
        memset(leds, 0xff, sizeof(leds));
    }
};

// для номера піна достатньо байта
const byte column[16]= { 13,12,11,10,9,8,7,6,5,4,3,2,1,0,A5,A4 };
const byte layer[4]= { A3,A2,A1,A0 };

#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))

matrix<ARRAY_SIZE(column), ARRAY_SIZE(layer)> cube(column, layer);

/* Клас анімації */
template <byte Cols, byte Height>
class animation: public task<100> // квант 1/10 секунди
{
    byte cols[Cols];
    byte col_idx;
    byte col_state;
    unsigned int pause;
    bool wait;

    unsigned int update(void)
    {
        if (wait) {
            wait = false;
            cube.clear();
            return 20; // пауза після очищення куба
        }

        cube.set(cols[col_idx], col_state, true);

        if (++col_state < Height) { // ще не заповнили стовпчик?
            return 2; // пауза після проміжного світлодіода в стопчику
        }
        col_state = 0;

        // вибираєм наступний стовпчик
        if (++col_idx < Cols) {    // ще не заповнили всі ?
            return 6; // пауза після останнього світлодіода в стопчику
        }

        shuffle();
        col_idx = 0;
        wait = true;
        return 20;  // пауза після заповнення всього куба
    }

    void process() override
    {
        for (;;) {
            // дециматор
            if (pause) {
                 --pause;
                return;
            }
            pause = update();
        }
    }

    void shuffle()
    {
        for (size_t i = 0; i < Cols-1; i++) {
            size_t j = random(i, Cols);
            auto tmp = cols[i];
            cols[i] = cols[j];
            cols[j] = tmp;
        }
    }

public:
    void begin()
    {
        for (size_t i = 0; i < Cols; i++) {
            cols[i] = i;
        }
        shuffle();
        col_idx = 0;
        col_state = 0;
        pause = 0;
        wait = false;
    }
};

animation<ARRAY_SIZE(column), ARRAY_SIZE(layer)> anim;

void setup()
{
    // Набираєм ентропію для генерації випадкових чисел
    // до того як перемкнули пін 10 в output
    {
        const byte rnd_pin = 10;
        pinMode(rnd_pin, INPUT);
        unsigned long seed = 0;
        for (size_t i = 0; i < sizeof(seed)*8; i++) {
            seed <<= 1;
            seed |= analogRead(rnd_pin) & 1;
        }
        randomSeed(seed ? seed : 1);
    }

    cube.begin();
    anim.begin();
}

void loop()
{
    auto now = millis();
    cube.loop(now);
    anim.loop(now);
}

Не перевіряв, бо світлодіодного куба не маю. Так що на свій страх і ризик.

#400 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-10 03:26:13

Filaka пише:

Добрий вечір! Другий день намагаюсь написати повідомлення і не виходить. Пишу через "Цитувати", едине що то це додаю посилання на файл. Якщо зайти у "Цитувати" або "Відповісти", то там вже два моїх повідомлення, а у темі їх немає. Чому так?

А на головній сторінці та в темі відображається, що є нове повідомлення, а заходиш - немає. Хто зна, може через посилання спрацьовує якийсь антиспам захист. Через "Відповісти", дійсно, побачив.

Filaka пише:

Але поки що не зрозумів як це все реалізувати у своєму проєкт Куба.

Наскільки можна здогадатись по коду, куб реалізовано підключенням світлодіодів секціями зі спільним анодом. Якщо так, то для відображення довільного стану вам потрібна динамічна індикація. Це окрема задача, не повʼязана з випадковим заповненням, але необхідна для його для реалізації.

Потрібно перебирати секції по одній (прохід по вашому масиву layer) і вмикати світлодіоди в ній на певний час. Бажано з частотою більше 60 Гц, щоб не було помітне мерехтіння. При 4 секціях це десь на 4 мілісекунди.
Це можна реалізувати "в лоб": на перший погляд здається простіше, але чим складніше буде логіка заповнення, тим заплутанішим ставатиме код. Правильніше буде розділити: код індикації окремо, логіка заповнення окремо.

Звісно, середній струм через діоди, і як наслідок, яскравість, зменшаться в 4 рази. Щоб яскравість була така ж як зараз, без динамічної індикації, потрібно буде зменшити номінал резисторів в 4 рази. У вас же, сподіваюсь, по резистору на кожний стовпчик, а не на секцію?
Щоби порадити щось детальніше, потрібно хоча би побачити схему.

Як запрацює динамічна індикація, тоді можна думати і про різні варіанти ефектів.

Підвал форуму