Переводим скетч с FastLED на microLED
- Войдите на сайт для отправки комментариев
Пт, 01/05/2020 - 16:07
Доброго дня. Купил 300 светодиодов, АрдуиноНАНО, картридер для микроSD под ардуинку. Спаял матрицу 17х17, собрал все в кучу загружаю скетч и что вижу. Не работает, пишет не хватает памяти. Решил попробовать перевести скетч с FastLED на microLED под такую матрицу, АрдуиноНАНО + SD. Но где то накосячил? Эффекты, записанные в матрице. Что-то, что можно найти на время, чтобы посмотреть.
#include <FastLED.h> #include <SPI.h> #include <SD.h> #define NUM_LEDS 170 // Номер светодиода #define DATA_PIN 6 // Ваш вывод данных Arduino #define CHIPSET WS2811 // тип вашего светодиодного чипа #define CMD_NEW_DATA 1 #define BAUD_RATE 500000 // если используется Glediator через последовательный порт символ без знака x = 10; // матрица х размер символ без знака y = 17; // размер матрицы y #define COLOR_ORDER GRB #define BRIGHTNESS 5 int count_files = 15; // Количество файлов Файл fxdata; Светодиоды CRGB [NUM_LEDS]; int val; настройка void () { FastLED.addLeds <CHIPSET, DATA_PIN, COLOR_ORDER> (светодиоды, NUM_LEDS) .setCorrection (TypicalLEDStrip); FastLED.setBrightness (ЯРКОСТЬ); Serial.begin (BAUD_RATE); // при использовании Glediator через usb Serial.begin (115200); для (int y = 0; y <NUM_LEDS; y ++) { светодиоды [y] = CRGB :: Black; // установить все светодиоды } FastLED.show (); pinMode (10, ВЫХОД); // Вывод CS / SS как выход для работы библиотеки SD. digitalWrite (10, HIGH); // Обходной путь для ошибки SDCard ... if (! SD.begin (4)) { Serial.println («Сбой инициализации SDCARD!»); возвращение; } Serial.println («инициализация SDCard выполнена.»); // тестовый файл открыт fxdata = SD.open ("1.out"); // только для чтения if (fxdata) { Serial.println ("файл открыт в порядке"); fxdata.close (); } } int serialGlediator () { while (! Serial.available ()) {} return Serial.read (); } void loop () { for (val = 1; val <= count_files; val ++) { fxdata = SD.open (String (val) + ". out"); // только для чтения if (fxdata) { Serial.println ("файл открыт в порядке"); } while (fxdata.available ()) { fxdata.readBytes ((char *) светодиоды, NUM_LEDS * 3); ledSort (4); // 1-4 возможно, разместить позицию вашего первого светодиода. Измените число: 1 = TL (вверху слева), 2 = TR (вверху справа), 3 = BL (внизу слева), 4 = BR (внизу справа) FastLED.show (); задержка (50); // установить скорость анимации. 20 - около 500 кбод } // закрываем файл fxdata.close (); } } int ledSort (int modus) {// 1 = TL, 2 = TR, 3 = BL, 4 = BR, эта функция переставит массив светодиодов ;-) CRGB tmp [x]; if (modus == 3 || modus == 4) { для (int i = 0; i <(y / 2); i ++) { для (int j = 0; j <x; j ++) { tmp [j] = leds [i * x + j]; leds [i * x] = leds [(y - i - 1) * x]; светодиоды [(y - i - 1) * x] = tmp [j]; } } } // if (modus == 1 || modus == 3) { // for (int i = 1; i <y; i = i + 2) { // for (int j = x; j> 0; j--) { // tmp [(x - j)] = leds [i * x + j - 1]; //} // for (int j = 0; j <x; j ++) { // leds [i * x + j] = tmp [j]; //} //} // //} if (modus == 2 | modus == 4) { для (int i = 0; i <y; i = i + 2) { для (int j = x; j> 0; j--) { tmp [(x - j)] = светодиоды [i * x + j - 1]; } для (int j = 0; j <x; j ++) { светодиоды [i * x + j] = tmp [j]; } } } возврат 1; }
КОД№ 2
#define REPLACE_FASTLED // пункт 0 #define COLOR_DEBTH 2 // пункт 1 #include <microLED.h> // пункт 3 // # include <FastLED.h> #include <SPI.h> #include <SD.h> #define NUM_LEDS 100 // Номер светодиода #define DATA_PIN 6 // Ваш вывод данных Arduino #define CHIPSET WS2811 // тип вашего светодиодного чипа #define CMD_NEW_DATA 1 #define BAUD_RATE 500000 // если используется Glediator через последовательный порт unsigned char x = 10; // matrix x size unsigned char y = 10; // matrix y size #define COLOR_ORDER GRB #define BRIGHTNESS 5 int count_files = 15; // Количество файлов File fxdata; //CRGB leds[NUM_LEDS]; LEDdata leds[NUM_LEDS];// пункт 4 microLED strip(leds, NUM_LEDS, DATA_PIN); // пункт 5 #define FastLED strip // пункт 6 int val; void setup() { //FastLED.addLeds<CHIPSET, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness(BRIGHTNESS); Serial.begin(BAUD_RATE); // when using Glediator via usb Serial.begin(115200); for(int y = 0 ; y < NUM_LEDS ; y++) { leds[y] = BLACK; // set all leds to black during setup } FastLED.show(); pinMode(10, OUTPUT); // CS/SS pin as output for SD library to work. digitalWrite(10, HIGH); // workaround for sdcard failed error... if (!SD.begin(4)) { Serial.println("sdcard initialization failed!"); return; } Serial.println("sdcard initialization done."); // test file open fxdata = SD.open("1.out"); // read only if (fxdata) { Serial.println("file open ok"); fxdata.close(); } } int serialGlediator () { while (!Serial.available()) {} return Serial.read(); } void loop() { for(val = 1; val <= count_files; val++) { fxdata = SD.open(String(val)+".out"); // read only if (fxdata) { Serial.println("file open ok"); } while (fxdata.available()) { fxdata.readBytes((char*)leds, NUM_LEDS*3); ledSort(4); //1-4 possible, set your first LED's position. Change the number: 1=TL(top left),2=TR(top right),3=BL(bottom left),4=BR(bottom right) FastLED.show(); delay(50); // set the speed of the animation. 20 is appx ~ 500k bauds } // close the file in order to prevent hanging IO or similar throughout time fxdata.close(); } } int ledSort (int modus) { //1=TL,2=TR,3=BL,4=BR, this function will rearrange the led array ;-) LEDdata tmp[x]; if(modus == 3 || modus == 4) { for(int i = 0; i < (y / 2);i++) { for(int j = 0; j < x;j++) { tmp[j] = leds[i * x + j]; leds[i * x] = leds[(y - i - 1) * x]; leds[(y - i - 1) * x] = tmp[j]; } } } // if(modus == 1 || modus == 3) { // for(int i = 1; i < y; i = i + 2) { // for(int j = x; j > 0;j--) { // tmp [(x - j)] = leds [i * x + j - 1]; //} // for (int j = 0; j <x; j ++) { // leds [i * x + j] = tmp [j]; //} //} // //} if (modus == 2 | modus == 4) { для (int i = 0; i <y; i = i + 2) { для (int j = x; j> 0; j--) { tmp [(x - j)] = светодиоды [i * x + j - 1]; } для (int j = 0; j <x; j ++) { светодиоды [i * x + j] = tmp [j]; } } } возврат 1; }
Что-то, что можно найти на время, чтобы посмотреть.
У Вас не времени посмотреть собственный код? И Вы искренне считаете. что у кого-то оно есть? Вы - оптимист!
дело не в диодах, а в СД-карте. Библиотека SD.h занимает столько памяти, что на Нано вместе сней в память практически ничего не входит. Либо откажитесь от СД-карточки, либо берите ардуину побольше
170 диодов еще тянет, а мне нужно под 280, по этому и хочется попробовать microLED ,можнт получится?
170 диодов еще тянет, а мне нужно под 280, по этому и хочется попробовать microLED ,можнт получится?
ну пробуйте... От форума-то что хотите? - чтобы кто-то попробовал за вас? Как вы себе это представляете - кто-то возьмет 300 диодов, СД-карту, соберет вместе (кстати как - схемы нет) и будет пробовать запустить ваш код? :))) - наверно этому "кому-то" больше заняться нечем в праздник...
Соберите схему, запустите на ней код - и потом пишите, что получилось. Если хорошо, вдумчиво и подробно опишете проблемы - мож кто что и посоветует...
мне нужно под 280
Фастлед заводит буфер в три байта на каждый диод. Не знаю, кто заведет меньше. 3*280 = 840. Вот и смотрите хватает у Вас памяти или нет.
Если весь буфер сразу не нужен, а диоды можно считать на лету (там допустимо до 50 микросекунд между диодами, вот за это время и считать) то проще взять свою программу и выводить на ленту то, что нужно и когда нужно вовсе без буфера.
Схема и матрица собраны, и я надеялся, что может кто посмотрит мой второй код, кто понимает в программировании и ткнет мне где я на косячил, но оказалось не туда попал, извинить, что потревожил ...
я надеялся, что может кто посмотрит мой второй код, кто понимает в программировании и ткнет мне где я на косячил
Вы что, всерьёз полагали, что кто-то будет смотреть вот эту гугло-переведённую бредятину?
Вы оптимист!
Как минимум - там операторы по-русски написаны.
Извиняюсь не досмотрел. А так пойдет?
Извиняюсь не досмотрел. А так пойдет?
алексей, вы совсем непонятливый? Я вам уже сказал. что таким образом никто этот код всерьез смотреть не станет. Это так не делается. Такие вещи проверяются работой на макете. И это должны сделать вы сами.
Так что собираете схему. заливаете код и смотрите - работает или нет.
Компелируется без ошибок, загружается тоже без ошибок, а матрица не светится ни один диод.?
А на кой там делается FastLED.show(), если библиотека отключена?
И, да, с Гайверотворчеством тут, обычно, разбираются те,кто его притащил. Самостоятельно.
Компелируется без ошибок
вранье
Так как его убрать?
5 минут назад компелировал.
Так как его убрать?
ручками. Алексей. ручками... Берете и стираете все строчки. начинающиеся с FastLed.
Убрать и подумать, как выводит данные на страйп этот ваш микролед.
Спасибо Вам ребята, что не отказали...
На вопрос, заданный в первопосте, ответы даны, дуть губы бессмысленно.
Спасибо Вам ребята, что не отказали...
а чего вы ожидали? Для того, чтобы заменить одну библиотеку на другую, одной замены имен ...
недостаточно
подправил по подсказке, результат тот же. Компелируется и грузится без ошибок но матрица не светится?
Примеры к микроледу смотрите, там все достаточно прозрачно - так как, видать, гайвер сдувал код с фастледа.
А это где, ткните меня пожалуйста носом, постараюсь понять
подправил по подсказке, результат тот же.
Мужик, ты совсем тупой? Или отметил первомай? - так пойди проспись сначала
FastLED ты удалил, молодец. А команды библиотеки microLED кто за тебя в скетч добавлять будет? - ты думаешь диоды сами светится начнут, без команды? :)
Мне сейчас 61 год и про ардуино я услыхал в январе 2020г...
Зачем тогда сразу пытаться построить космический корабль?
да нет в этом никакого "космического корабля". Гриш. Открыть гугль и сделать поиск по названию библиотеки... найти примеры... попытаться переделать под свой код.
Тут проблема совсем в другом - человек должен понять, что единственный путь - это разбираться в новом деле самостоятельно. И поэтому искать примеры и переделать скетч он должен сам. А иначе и начинать нет смысла.
Месяц уже гуглю, да все натыкаюсь на таких вот как... Злые вы все, сделай людям добро и народ к тебе потянется.
Месяц? "arduino microled" ведёт сразу на страницу с примерами (внизу).
Месяц уже гуглю, да все натыкаюсь на таких вот как...
прямо в гугле на таких как мы натыкаетесь? :) - это что-то новенькое.
Вам надо изучать теорию и примеры кода, а не в форумах глупые вопросы задавать - тогда и не будете натыкаться на "таких как мы".
Месяц уже гуглю, да все натыкаюсь на таких вот как... Злые вы все, сделай людям добро и народ к тебе потянется.
Угу. Лопатой потом не отмашешься...
Месяц уже гуглю, да все натыкаюсь на таких вот как... Злые вы все,
Так и должно быть. Это давно исследовано и описано. Вот здесь почитайте, начиная со слов "А вот если подходящих примеров нет". Это то, что Вы наблюдаете? То! Так вот, нравится нам с Вами это или нет, а жизнь устроена именно так, а не иначе. Как говорил поэт: "Жизнь такова, какова она есть, и больше - никакова".
Так что, примите жизнь такой, какая она есть, и либо изучайте вопрос сами, либо заказывайте работу специалисту. Но форуме Вам могут дать совет, но делать за Вас никто не будет.
Совет же могу повторить (уже говорил об этом в посте #5)? замена фастлед на микролед не даст Вам сколько-нибудь существенного выигрыша по памяти. Они обе хранят по три байта на пиксел. Как можно выкрутиться я писал в том же посте #5, ну или взять ардуину побольше (Мегу, например)
сделай людям добро и народ к тебе потянется.
ЕвгенийП в микролед есть варианты 2 и 1 байт на диод.
в микролед есть варианты 2 и 1 байт на диод.
Я видел. В полном цвете - три, а уменьшать разрешение цветности ... считаю это глупостью, которая убивает возможности не самой дешёвой аппаратуры.
ну тут как обычно - либо шашечки, либо доехать
либо шашечки, либо доехать
Никогда не понимал этого выражения, а всякий раз когда мне его говорили, им прикрывали то, что меня в чём-то и как-то обкрадывали. Мне нужно и то, и другое.
Алексей, я тоже пробую microLED. Вы пытаетесь скетчи FastLed использовать на microLED по совету автора этой библиотеки. Ваши скетчи переведите сразу на microLED, это просто сделать, примеры смотрите.
Вот этот скетч попробуйте, аналогично свой переделайте.
Вы используете программу Glediator (Jinx) там работает COLOR_DEBTH 3,
а COLOR_DEBTH 2 не работает, я менял строку fxdata.readBytes((char*)leds, NUM_LEDS *3); на fxdata.readBytes((char*)leds, NUM_LEDS *2);, тогда работает, но цвета как попало. Я думаю, что программа Glediator (Jinx) выдает цвета 24 бит, а Вы на ленту подаете 16 бит.
Нужно преобразовать 24 на 16 бит. Автор пишет "Сначала сжали цвет до 2-х байт (16 бит), цвет хранится вот таким образом: RRRRRGGG GGGBBBBB. “Запаковка” трёх байт r, g и b в два выглядит вот так:((r & 0b11111000) << 8) | ((g & 0b11111100) << 3) | ((b & 0b11111000) >> 3)".
Может гуру подскажут как преобразовать или засунуть это в скетч.
В библиотеке есть преобразование
Aidar, на ленту вы в любом случае подаете 24 бита, от библиотеки это не зависит, эти диоды настроны на 24бита и другого не понимают.
Решение только в том, чтобы не хранить в программе полный цвет, а создавать на лету - но об этом в ветке сказано не раз
Спасибо за разъяснение.