VsemDobra - смотрю вы код поправили. EEPROM.get() теперь стоит в правильном месте. А вот EEPROM.put() так вызывать нельзя, вы его вызываете при каждом "обороте" loop() - вы так в памяти дырку протрете очень быстро, у нее же ограничение на количество записей всего 100 тыс. раз
Надо придумать так, что бы данные скидывались в ЕЕПРОМ только перед выключением. Это вообще-то, непростая задачка. Для начала попробуйте писать данные в ЕЕПРОМ при нажатии кнопки, эта задачка попроще.
VsemDobra - смотрю вы код поправили. EEPROM.get() теперь стоит в правильном месте. А вот EEPROM.put() так вызывать нельзя, вы его вызываете при каждом "обороте" loop() - вы так в памяти дырку протрете очень быстро, у нее же ограничение на количество записей всего 100 тыс. раз
Надо придумать так, что бы данные скидывались в ЕЕПРОМ только перед выключением. Это вообще-то, непростая задачка. Для начала попробуйте писать данные в ЕЕПРОМ при нажатии кнопки, эта задачка попроще.
Здравствуйте b707. Про ограниченном колличестве циклов запись-стирание в EEPROM знаю и по этому не стал долго гонять в таком режиме - сразу вернулся на предыдущюю версию скетча. В теории знаю, что запись в EEPROM по выключению можно организовать с помощью аналогового компаратора. На практике пока не по плечу. По нажатию на кнопку в данном случае хороший вариант. Пока отсчитаются 100 тыс. нажатий может разберусь. Подскажите пожалуйста правильно ли EEPROM.put() разместить таким образом , для каждой кнопки отдельно или все таки луше по событию - нажата одна из кнопок, записываем в EEPROM? Спасибо.
Делайте так: как только нажата любая кнопка - запоминайте время нажатия (миллис) и взводите флаг "есть изменения". Дальше условие: если есть изменения и с момента последнего нажатия кнопки/кнопок прошло 30сек - пишите в еепром и сбрасывайте флаг, сигнализируя что изменений более нет.
Ну, я не знаю, чего он там писать-то собрался - может дребезг. А вообще - операции с EEPROM относительно медленные, проверка байта "есть изменения" быстрее в разы.
Судя по всему, это самая живая тема про DMD (DMD2) в частности и про LED-модули вообще. Посему пожалуюсь тут на свое горе.
Вообще, достаточно давно занимаюсь изготовлением специализированных табло, не рекламных, а получающих данные из не стандартных источников - электронные очереди, весы, радиационные датчики и так далее. Ниша не большая, но интересная, к тому же чуть ли не каждый проект новый - что прибавляет интереса.
В свое время начинал с достаточно дорогого "илитного" железа, но чем дальше в кризис, тем дешевле комплектуха. Года два назад перешел на атмеги. Ну там в принципе ничего сложного, нашел DMD, разобрался, штампую во все поделки, использую в основном мини про, цена 100 рублей, мило дело! Тем более, что табло все были не большие (а зачем большое табло на весах или счетчике радиации?), мини тянет без проблем.
Но тут привалил заказ: монохромное табло 3*1 метр (288*96 пикселей, для конкретности). На табло выводятся данные с 6 датчиков в порядке очередности, датчики прилагаются (датчики цифровые, I2C - не проблема вообще). Процесс получения данных я освоил дня за три, еще два дня рисовал шрифт высотой 96 пикселей. Все это время гонял инфу на "карманном" табло в 3 модуля (96*16), но были вопросы насчет количества поддерживаемых модулей. Надо было тестировать. Как раз приволокли в разработку готовое табло 6*3 модуля, решил на нем погонять. Начал все на мини про (328 проц) - реально без тормозов и глюков поддерживает только 10 модулей. Без разницы, в каком они порядке стоят. Поставил Мегу2560. Те же самые 10 модулей! Однако, проблема! У меня то 54 модуля в цепи! Судя по внешнему виду табло, процам явно не хватает скорости обновления (я занимаюсь табло больше 10 лет, я в этом понимаю).
Ок, иду в закрома и начинаю смотреть, чего у меня есть мощного и быстрого... Нашел мощный и быстрый STM32... Попробовал поставить его, но ни одна известная мне библиотека для P10 не стала с ним работать... А писать свое я был не готов, да и сроки жмут! Иду в закрома дальше, выковыриваю оттуда ESP8622 на плате Wemos D1 pro. Несмотря заявленное отсутствие поддержки DMD2, через день ковыряния он начинает замечательно показывать на табло все, что я хочу...
Ну как все... Большого табло у меня не было, а на маленьком в 18 модулей он летает + если прописать 54 (а я прописывал и 80) модулей, то его это не напрягает вообще... Но дьявол кроется в деталях!
В один прекрасный момент мне привозят это готовое табло 288*96 пикселей, я ставлю на него контроллер и с удивлением вижу на экране какой то бред. Нет, показывает он изумительно: четко, быстро, никакой ряби... Но не то! Начинаю курить коды...
На второй день к вечеру я докапался до нужного момента.... Сволочной аппаратный SPI (СофтСПаЙ не поддерживается ESPшкой)! Этот гад DMD2 ОДНИМ байтом (который по умолчанию не может быть больше 255) шлет в хаб (hub12) координаты пикселя по Х. То есть, если экран 7 модулей (224 пикселя) все работает отлично. Если ставишь 8 - экран пуст (считает себя длиной 0), если ставишь 9 - считает себя длиной 32 пикселя.
SoftDMD этой проблемы не имеет.
Вопрос, собственно такой: люди добрые, помозите сиротинушке, подскажите в горе-горьком!
Или как запустить SoftDMD на ESPшке. Или как обойти ограничение в 8 модулей на SpiDMD. Или какую железку взять, что бы на ней запустить SoftDMD и при том быструю. Или подскажите какие библиотеки под STM...
Если в коде СофтСПИ библиотеки этой проблемы нет - почему бы не посмотреть, как там осуществляется адресация и не перенести эту часть кода в ДМД2 ? - но только для этого надо быть уверенным. что ХАБ12 поддерживает адресацию больше байта.
Так что вопрос упирается в то, действительно ли вы проверили, что этой проблемы в СофтСПи нет - или вы просто так думаете.
Что касается СТМ - для нее есть экспериментальная библиотека DMDSTM (или STMDMD)дума. ее можно допилить, если навыки программирования имеются.
Хаб12 100% поддерживает, потому что мне доводилось делать строки более 10 метров(не на дмд и вообще не на самодельных контроллерах).
На софтСПИ завтра посмотрю, но больно муторное занятие, откровенно говоря
ДмдСТМ я нашел, но!
"dont work stm32f103"
А у меня как раз такой
А что если для настолько большого табло использовать что-то мощнее, например распберри? https://youtu.be/oggOUJt_Ihc вот на амперке игрались с РГБ матрицами высокой плотности пикселей, думаю монохром она потянет элементарно. Там и частота позволяет, и библиотека может быть реализована иначе, что позволит подключить необходимое кол-во модулей
А что если для настолько большого табло использовать что-то мощнее, например распберри?
насколько я понял, проблема не в недостатке "мощности", а в неверной адресации. Поэтому правильнее будет все же поправить существующую библиотеку, нежели писать совсем новую :)
Да и не уверен, что Расбери будет быстрее в этой задаче. Частота у нее может и больше, но Расбери уже не система реального времени и Думаю. скорее всего сильно проиграет в скорости той же ЕСП
FoxJone - не дождался ответа, глянул текст DMD2 - не совсем понятно, с чего вы взяли, что в SOFTDMD нет этой проблемы? - это не так. Координаты пикселей и в DMD и в SOFTDMD закодированы одинаково - байтом, так что и софтовый и хардварный ДМД будет одинаково глючить на больших матрицах.
b707, согласен, сегодня тоже докопался до этого момента.
Просто у меня сложилось впечатление, что народ делал длинные строки на ДМД, поэтому я решил, что софтДМД позволяет это делать.
По итогам сегодняшних изысканий пришел к выводу, что табло длиннее 244 пикселей на ДМД не возможны в принципе. В принципе я проблему решил, но не самым красивым образом, прямо скажем понастроил костылей и подпорок со всех сторон проекта. Была бы еще неделя - разобрался бы и сделал красиво, но сроки горят, сдача была вчера...
На будущее себе наметил неспешно и с расстановкой выяснить возможность надстройки к ДМД, которая позволит давать вывод не на HUB12, а на HUB50. На стандартных китайческих контроллерах к этому хабу подключают вот такие разветвители HUB12, что позволяет подключать модули строками, не тянуть шлейфы змейкой туда-сюда. Цена такого хаба копейки (100 на Али, 300 в России), так что штука была бы очень полезная.
Но это в свободное время, коего в ближайший месяц точно не предвидится, да и дел там не на одну неделю.
По итогам сегодняшних изысканий пришел к выводу, что табло длиннее 244 пикселей на ДМД не возможны в принципе.
хм, почему именно 244-х? - странная цифра. Вроде должно быть 256 - ровно 8 матриц по горизонтали. Что касается "невозможно" - по-моему. всегда остается метод решения "в лоб": поменять тип параметров width и height с uint8_t на uint16_t по всей библиотеке. Если HUB12 это поддерживает - должно сработать.
Другой вопрос. что это именно "муторно", как вы писали выше :) Покопался в библиотеке - кривовато написано, размеры матрицы присутсвуют и в виде полей класса DMD и в виде локальных переменных... долго выискивать придется.
Цитата:
В принципе я проблему решил, но не самым красивым образом, прямо скажем понастроил костылей и подпорок со всех сторон проекта.
хм, почему именно 244-х? - странная цифра. Вроде должно быть 256 - ровно 8 матриц по горизонтали.
Опечатался, хотел сказать 224, то есть 7 модулей. 256 уже считает как 0 - проверил эксперементально. Видимо, отсчет идет от 0 до 255.
b707 пишет:
всегда остается метод решения "в лоб": поменять тип параметров width и height с uint8_t на uint16_t по всей библиотеке.
С этого начал, именно это меня и вывело на библиотеку SPI. Судя по всему, надо применять какие то другие методы, но настолько глубоко я не готов был лезть.
b707 пишет:
если не секрет - как решили?
Цифровую информацию вывожу на поле 224*96, а еще две колонки (64*96) подцепил к другому контроллеру (на мини про), который выводит туда обозначения. Синхронизация по 232.
вопрос FoxJone, преобразователь уровней ставил при подключении к wemos d1? или напрямую? трехцветная панель c HUB75 у меня заработала сразу. a одноцветная Р10 HUB12, чтото фигню какуюто показывает на esp8266, c pro mini все работает.
вопрос FoxJone, преобразователь уровней ставил при подключении к wemos d1? или напрямую? трехцветная панель c HUB75 у меня заработала сразу. a одноцветная Р10 HUB12, чтото фигню какуюто показывает на esp8266, c pro mini все работает.
У меня вемос д1 мини про, он прекрасно работает с 5в уровнями, так что подключаю на прямую. Пошла сразу, только инициируется через SPIDMD, а не через SoftDMD. СофтДМД не поддерживается. Единственно, надо прописывать пины, но это я везде делаю, стандартная распиновка мне не нравится, плохо на монтажку встает. Вот этот тест точно работает:
Вот с чем столкнулся, так это с тем, что вместе с ДМД не работает ВайФай-сервер. Было неприятным сюрпризом, потому что планировал сделать вебморду на управление, и даже уже сделал ее и оттестировал. А как начал собирать проект в кучу - всплыла несовместимость. Опять же времени разбираться уже не было, поэтому по быстрому накодил управляющую программку под винду, которая тупо шлет команды настройки на вемос. А жаль, потому что изначально планировал красиво управлять из под любого браузера (ПК, ноут, смарт).
То есть клиент+ДМД работает, а сервер+ДМД нет. Думаю, где то библиотеки пересекаются в таймерах, но это не точно.
Вот оно че! а я тут маюсь... Тогда ставим промини, как контроллер экрана и ему по uart-у esp-кой шлем чего выводить. По "деталькам" дешевле esp32, и портов дополнительных с избытком.
Вот с чем столкнулся, так это с тем, что вместе с ДМД не работает ВайФай-сервер. Было неприятным сюрпризом, потому что планировал сделать вебморду на управление, и даже уже сделал ее и оттестировал. А как начал собирать проект в кучу - всплыла несовместимость. Опять же времени разбираться уже не было
Это странно. Думаю причина в том, что "времени разбираться не было". Пересекаться там нечему, вообще-то - ДМД использует таймер по минимуму и ей все равно, на каком таймере висеть
Апдейт к предыдущему: все таки запустил вайфай и вебморду.
Фишка оказалось в чем: все это добро надо было инициализировать ДО инициализации ДМД. И использовать в самом простом варианте: всякие ДНСсервера уже начинают виснуть. А так работает, хоть и не очень стабильно.
Нестабильность заключается в частой перезагрузке вайфая и соответственно разрыве соединения. Для меня не критично, учитывая, что заходить на вебморду будут раз в полгода и то на минуту. Но для постоянного коннекта, конечно, не подойдет.
//**************************************************************************************
// stepSplitMarquee(int topRow, int bottomRow)
// This is a cut-down modification of stepMarquee(). It steps only the rows specified.
// Only horizontal, single step, left scroll is catered for.
// This function allows you to have only a part of the DMD array scrolling, while the
// remainder stays still and is not cleared during scrolling.
//**************************************************************************************
boolean DMD::stepSplitMarquee(int topRow, int bottomRow)
{
boolean ret=false;
marqueeOffsetX += -1; // only scroll horizontally, 1 place left
if (marqueeOffsetX < -marqueeWidth) { // if text has scrolled off the screen
marqueeOffsetX = DMD_PIXELS_ACROSS * DisplaysWide; // set up to scroll again from the far right
drawFilledBox(0, topRow, DisplaysWide*DMD_PIXELS_ACROSS-1, bottomRow, GRAPHICS_INVERSE); // clear the scroll rows
ret=true; // indicates that this scroll has completed
}
// This is the main change from the original function.
// It splits the left shift task into rows and bytes within a row to allow rows to be identified
// and treated separately.
for (int row=topRow ;row<=bottomRow; row++) { // loop for each row in the scroll area
for (int byteInRow=0; byteInRow<DisplaysWide*4; byteInRow++) { // loop for each byte within a row (4 per DMD across)
int thisIndex = (DisplaysTotal*4)*(row%16) + (4*DisplaysWide*(row/16)) + byteInRow; //calculate index into screen buffer
if ((byteInRow%(DisplaysWide*4)) == (DisplaysWide*4) -1) { // if it's the last byte in a row
bDMDScreenRAM[thisIndex]=(bDMDScreenRAM[thisIndex]<<1)+1;
// shift bits left, and puts a '1' in last position (a '1' = LED OFF)
} else { // if it's NOT the last byte in a row
bDMDScreenRAM[thisIndex]=(bDMDScreenRAM[thisIndex]<<1) +
((bDMDScreenRAM[thisIndex+1] & 0x80) >>7);
// shift bits left as well as the shifting the MSB of the next byte into the LSB
}
}
}
// Redraw last char on screen
// required because
int strWidth=marqueeOffsetX;
for (byte i=0; i < marqueeLength; i++) {
int wide = charWidth(marqueeText[i]);
if (strWidth+wide >= DisplaysWide*DMD_PIXELS_ACROSS) {
drawChar(strWidth, marqueeOffsetY,marqueeText[i],GRAPHICS_NORMAL);
return ret;
}
strWidth += wide+1;
}
return ret;
}
добавить в dmd.h
//Move the marquee left 1 place - special case of stepMarquee()
// which only scrolls a limited portion of the display
boolean stepSplitMarquee(int topRow, int bottomRow);
пример:
/*
Test sketch for split screen scrolling
NOTE that this sketch uses the Freetronics version of the DMD library available here:
https://github.com/freetronics/DMD/
but with the additional dmd.stepSplitMarquee() function.
I also suggest that you make sure this has been changed DMD.cpp
change the line:
SPI.setClockDivider(SPI_CLOCK_DIV128);
to:
SPI.setClockDivider(SPI_CLOCK_DIV2); // system clock / 2 = 8MHz SPI CLK to shift registers
This provides a marked improvement in the DMD update time within the interrupt routine.
*/
#include "SPI.h"
#include "DMD.h"
#include "TimerOne.h"
#include "SystemFont5x7.h"
#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1
DMD dmd( DISPLAYS_ACROSS , DISPLAYS_DOWN);
void ScanDMD()
{
dmd.scanDisplayBySPI();
}
void setup()
{
Timer1.initialize( 4000 ); // I find the default 5000 gives a visible flicker
Timer1.attachInterrupt( ScanDMD );
dmd.selectFont(SystemFont5x7);
dmd.clearScreen( true ); // start with a blank screen
}
void loop()
{
unsigned long time;
int n;
boolean ret = false;
// Show some stationary text on the bottom half, and scrolling text on the top half
// scrolls 3 times
dmd.drawString(0,8,"Stays still",11,GRAPHICS_NORMAL); // the stationary string
dmd.drawMarquee("Scrolling text",14,0,0); // set up the marquee
time = millis();
n=0;
while(n<3) {
while (!ret) {
if ((time+30) < millis()) {
ret = dmd.stepSplitMarquee(0,7); // parameters are the top & bottom rows to be scrolled
time = millis();
}
}
ret = false;
n++;
}
dmd.clearScreen( true );
// Now some stationary text on the top half, and scrolling text on the bottom half
// scrolls for 10 seconds
dmd.drawString(0,0,"Stays still",11,GRAPHICS_NORMAL); // stationary text
dmd.drawMarquee("Scrolling text",14,0,8); // set up the marquee
time = millis();
while ((millis() - time)<10000){ // loop for 10 seconds
dmd.stepSplitMarquee(8,15); // only scroll rows 8 to 15
delay(30);
} // a slightly different way to loop for stepping the marquee
// note that this does not test for completion of the scroll, but continues until
// the 10 second time has expired
dmd.clearScreen( true );
// Now a bit of fun
dmd.drawString(0,-4,"vvvvvvvvvvv",11,GRAPHICS_NORMAL); // note the position is above a single DMD so
// only part of the text will be visible
dmd.drawString(0,13,"^^^^^^^^^^^",11,GRAPHICS_NORMAL); // and this is too far down a single DMD so
// only part will be visible
// these 2 lines above use partial characters displayed on the screen by placing the text at non-standard positions
// to give a graphical highlight effect.
dmd.drawMarquee("Scrolling text",14,0,5);
time = millis();
while ((millis() - time)<10000){ // again we will scroll for 10 seconds
dmd.stepSplitMarquee(5,11);
delay(30);
}
dmd.clearScreen( true );
}
Библиотека в принципе рабочая, надо только примеры под СТМ32 переписать. Почему там в отзывах написано, что на STM32F103 не пашет - непонятно, видимо человек не разобрался.
Вот видео, хотя конечно на экране нифига не поймешь, что за плата там работает :)
Привет всем! Подскажите, пожалуйста, в какую сторону копнуть? Собрал я на основе ардуино уно и модулей р10 с использованием библиотеки dmd2 таймер, который реализовал через использование millis(), все работает, но обнаружил такой факт. При количестве светодиодных модулей больше пяти штук ход таймера замедляется примерно 1,5 раза
Привет всем! Подскажите, пожалуйста, в какую сторону лопнуть? Собрал я на основеработе ардуино уно и модулей р10 с использованием библиотеки dmd2 таймер, который реализовал через использование millis(), все работает, но обнаружил такой факт. При количестве светодиодных модулей больше пяти штук ход таймера замедляется примерно 1,5 раза
Родной таймер вообще не точный, а при больших нагрузках (а DMD сильно грузит МК) становится очень сильно не точный. Я с этим сталкивался неоднократно и теперь в таких случаях всегда добавляю в схему часы.
Привет всем! Подскажите, пожалуйста, в какую сторону лопнуть? Собрал я на основеработе ардуино уно и модулей р10 с использованием библиотеки dmd2 таймер, который реализовал через использование millis(), все работает, но обнаружил такой факт. При количестве светодиодных модулей больше пяти штук ход таймера замедляется примерно 1,5 раза
Родной таймер вообще не точный, а при больших нагрузках (а DMD сильно грузит МК) становится очень сильно не точный. Я с этим сталкивался неоднократно и теперь в таких случаях всегда добавляю в схему часы.
Меня та точность устраивала. Возможно ли как-то решить по другому проблему?
Забейте на десятые доли. Я тоже делал табло для спортзала, отказался от отображения десятых, потому, что все равно их мелькания не видно на табло. время я вообще считал на компьютере судьи (и там на интерфейсе судьи были и десятые и сотые - тоже гемора схватил, но сделал), а на табло тупо слал раз в секунду количество секунд.
Заказчику просто объяснил, что из за скорости обновления светодиодов физически невозможно отображать десятые на табло, а на компе все это есть. Заказчика устроило.
Очень интересный проект был, кстати. Большое полноцветное табло, где был счет, команды, фолы и все такое прочее... Все прорисовано сексуально и красочно. И два маленьких монохромных табло по углам зала - счетчики секунд (на мини про). И добротное такое ПО на комп судьи - там можно было переключать тип игры (футбол, в-бол, б-бол, еще что то), для каждого типа был свой интерфейс и на большом табло соответственно менялось отображение под каждый тип.
Да я как бы нашел выход, в коде методом подбора умножил millis() на коэффициент. Считает нормально, сверял на интервале 40 мин. Почти без погрешности. Только десятые не отображаются как нужно-проскакивают
оно самое
LedP10 : Arduino library for P10 LED Display Panels
VsemDobra - смотрю вы код поправили. EEPROM.get() теперь стоит в правильном месте. А вот EEPROM.put() так вызывать нельзя, вы его вызываете при каждом "обороте" loop() - вы так в памяти дырку протрете очень быстро, у нее же ограничение на количество записей всего 100 тыс. раз
Надо придумать так, что бы данные скидывались в ЕЕПРОМ только перед выключением. Это вообще-то, непростая задачка. Для начала попробуйте писать данные в ЕЕПРОМ при нажатии кнопки, эта задачка попроще.
VsemDobra - смотрю вы код поправили. EEPROM.get() теперь стоит в правильном месте. А вот EEPROM.put() так вызывать нельзя, вы его вызываете при каждом "обороте" loop() - вы так в памяти дырку протрете очень быстро, у нее же ограничение на количество записей всего 100 тыс. раз
Надо придумать так, что бы данные скидывались в ЕЕПРОМ только перед выключением. Это вообще-то, непростая задачка. Для начала попробуйте писать данные в ЕЕПРОМ при нажатии кнопки, эта задачка попроще.
Здравствуйте b707. Про ограниченном колличестве циклов запись-стирание в EEPROM знаю и по этому не стал долго гонять в таком режиме - сразу вернулся на предыдущюю версию скетча. В теории знаю, что запись в EEPROM по выключению можно организовать с помощью аналогового компаратора. На практике пока не по плечу. По нажатию на кнопку в данном случае хороший вариант. Пока отсчитаются 100 тыс. нажатий может разберусь. Подскажите пожалуйста правильно ли EEPROM.put() разместить таким образом , для каждой кнопки отдельно или все таки луше по событию - нажата одна из кнопок, записываем в EEPROM? Спасибо.
void loop(void) { if(digitalRead(1)==HIGH)//если кнопка нажата .. { ui = ui+1; // прибавляем 1 EEPROM.put(1,bigNum); ShowClockNumbers( ui, true ); delay(100); } if(digitalRead(2)==HIGH)//если кнопка нажата .. { ui = ui+10; // прибавляем 10
delay(100);
Делайте так: как только нажата любая кнопка - запоминайте время нажатия (миллис) и взводите флаг "есть изменения". Дальше условие: если есть изменения и с момента последнего нажатия кнопки/кнопок прошло 30сек - пишите в еепром и сбрасывайте флаг, сигнализируя что изменений более нет.
EEPROM.update ????? Вроде, наше все.
::put() унутре дёргает за ::update()
Тогда, с чего дыра возьмется? Или я что то путаю?
Ну, я не знаю, чего он там писать-то собрался - может дребезг. А вообще - операции с EEPROM относительно медленные, проверка байта "есть изменения" быстрее в разы.
А вообще - операции с EEPROM относительно медленные, проверка байта "есть изменения" быстрее в разы.
В этом случае, согласен. Если временных затыков нет, тогда зачем огород городить? ИМХО.
Добрый день, коллеги.
Судя по всему, это самая живая тема про DMD (DMD2) в частности и про LED-модули вообще. Посему пожалуюсь тут на свое горе.
Вообще, достаточно давно занимаюсь изготовлением специализированных табло, не рекламных, а получающих данные из не стандартных источников - электронные очереди, весы, радиационные датчики и так далее. Ниша не большая, но интересная, к тому же чуть ли не каждый проект новый - что прибавляет интереса.
В свое время начинал с достаточно дорогого "илитного" железа, но чем дальше в кризис, тем дешевле комплектуха. Года два назад перешел на атмеги. Ну там в принципе ничего сложного, нашел DMD, разобрался, штампую во все поделки, использую в основном мини про, цена 100 рублей, мило дело! Тем более, что табло все были не большие (а зачем большое табло на весах или счетчике радиации?), мини тянет без проблем.
Но тут привалил заказ: монохромное табло 3*1 метр (288*96 пикселей, для конкретности). На табло выводятся данные с 6 датчиков в порядке очередности, датчики прилагаются (датчики цифровые, I2C - не проблема вообще). Процесс получения данных я освоил дня за три, еще два дня рисовал шрифт высотой 96 пикселей. Все это время гонял инфу на "карманном" табло в 3 модуля (96*16), но были вопросы насчет количества поддерживаемых модулей. Надо было тестировать. Как раз приволокли в разработку готовое табло 6*3 модуля, решил на нем погонять. Начал все на мини про (328 проц) - реально без тормозов и глюков поддерживает только 10 модулей. Без разницы, в каком они порядке стоят. Поставил Мегу2560. Те же самые 10 модулей! Однако, проблема! У меня то 54 модуля в цепи! Судя по внешнему виду табло, процам явно не хватает скорости обновления (я занимаюсь табло больше 10 лет, я в этом понимаю).
Ок, иду в закрома и начинаю смотреть, чего у меня есть мощного и быстрого... Нашел мощный и быстрый STM32... Попробовал поставить его, но ни одна известная мне библиотека для P10 не стала с ним работать... А писать свое я был не готов, да и сроки жмут! Иду в закрома дальше, выковыриваю оттуда ESP8622 на плате Wemos D1 pro. Несмотря заявленное отсутствие поддержки DMD2, через день ковыряния он начинает замечательно показывать на табло все, что я хочу...
Ну как все... Большого табло у меня не было, а на маленьком в 18 модулей он летает + если прописать 54 (а я прописывал и 80) модулей, то его это не напрягает вообще... Но дьявол кроется в деталях!
В один прекрасный момент мне привозят это готовое табло 288*96 пикселей, я ставлю на него контроллер и с удивлением вижу на экране какой то бред. Нет, показывает он изумительно: четко, быстро, никакой ряби... Но не то! Начинаю курить коды...
На второй день к вечеру я докапался до нужного момента.... Сволочной аппаратный SPI (СофтСПаЙ не поддерживается ESPшкой)! Этот гад DMD2 ОДНИМ байтом (который по умолчанию не может быть больше 255) шлет в хаб (hub12) координаты пикселя по Х. То есть, если экран 7 модулей (224 пикселя) все работает отлично. Если ставишь 8 - экран пуст (считает себя длиной 0), если ставишь 9 - считает себя длиной 32 пикселя.
SoftDMD этой проблемы не имеет.
Вопрос, собственно такой: люди добрые, помозите сиротинушке, подскажите в горе-горьком!
Или как запустить SoftDMD на ESPшке. Или как обойти ограничение в 8 модулей на SpiDMD. Или какую железку взять, что бы на ней запустить SoftDMD и при том быструю. Или подскажите какие библиотеки под STM...
Возможно вам поможет эта ветка форума http://forum.freetronics.com/viewtopic.php?f=26&t=6352
Вообще советую там полазить, там много интересных вопросов задают, сам оттуда многое почерпнул
Если в коде СофтСПИ библиотеки этой проблемы нет - почему бы не посмотреть, как там осуществляется адресация и не перенести эту часть кода в ДМД2 ? - но только для этого надо быть уверенным. что ХАБ12 поддерживает адресацию больше байта.
Так что вопрос упирается в то, действительно ли вы проверили, что этой проблемы в СофтСПи нет - или вы просто так думаете.
Что касается СТМ - для нее есть экспериментальная библиотека DMDSTM (или STMDMD)дума. ее можно допилить, если навыки программирования имеются.
Хаб12 100% поддерживает, потому что мне доводилось делать строки более 10 метров(не на дмд и вообще не на самодельных контроллерах).
На софтСПИ завтра посмотрю, но больно муторное занятие, откровенно говоря
ДмдСТМ я нашел, но!
"dont work stm32f103"
А у меня как раз такой
а чего там муторного? Там же в нижний уровень лезть не надо. Да и сама библиотека не особо навороченная, кмк
А что если для настолько большого табло использовать что-то мощнее, например распберри? https://youtu.be/oggOUJt_Ihc вот на амперке игрались с РГБ матрицами высокой плотности пикселей, думаю монохром она потянет элементарно. Там и частота позволяет, и библиотека может быть реализована иначе, что позволит подключить необходимое кол-во модулей
насколько я понял, проблема не в недостатке "мощности", а в неверной адресации. Поэтому правильнее будет все же поправить существующую библиотеку, нежели писать совсем новую :)
Да и не уверен, что Расбери будет быстрее в этой задаче. Частота у нее может и больше, но Расбери уже не система реального времени и Думаю. скорее всего сильно проиграет в скорости той же ЕСП
FoxJone - не дождался ответа, глянул текст DMD2 - не совсем понятно, с чего вы взяли, что в SOFTDMD нет этой проблемы? - это не так. Координаты пикселей и в DMD и в SOFTDMD закодированы одинаково - байтом, так что и софтовый и хардварный ДМД будет одинаково глючить на больших матрицах.
b707, согласен, сегодня тоже докопался до этого момента.
Опечатался, хотел сказать 224, то есть 7 модулей. 256 уже считает как 0 - проверил эксперементально. Видимо, отсчет идет от 0 до 255.
С этого начал, именно это меня и вывело на библиотеку SPI. Судя по всему, надо применять какие то другие методы, но настолько глубоко я не готов был лезть.
Цифровую информацию вывожу на поле 224*96, а еще две колонки (64*96) подцепил к другому контроллеру (на мини про), который выводит туда обозначения. Синхронизация по 232.
Выглядит примерно так: поле1 >[ 2544 ] [кг]<поле2
вопрос FoxJone, преобразователь уровней ставил при подключении к wemos d1? или напрямую? трехцветная панель c HUB75 у меня заработала сразу. a одноцветная Р10 HUB12, чтото фигню какуюто показывает на esp8266, c pro mini все работает.
вопрос FoxJone, преобразователь уровней ставил при подключении к wemos d1? или напрямую? трехцветная панель c HUB75 у меня заработала сразу. a одноцветная Р10 HUB12, чтото фигню какуюто показывает на esp8266, c pro mini все работает.
У меня вемос д1 мини про, он прекрасно работает с 5в уровнями, так что подключаю на прямую. Пошла сразу, только инициируется через SPIDMD, а не через SoftDMD. СофтДМД не поддерживается. Единственно, надо прописывать пины, но это я везде делаю, стандартная распиновка мне не нравится, плохо на монтажку встает. Вот этот тест точно работает:
Вот с чем столкнулся, так это с тем, что вместе с ДМД не работает ВайФай-сервер. Было неприятным сюрпризом, потому что планировал сделать вебморду на управление, и даже уже сделал ее и оттестировал. А как начал собирать проект в кучу - всплыла несовместимость. Опять же времени разбираться уже не было, поэтому по быстрому накодил управляющую программку под винду, которая тупо шлет команды настройки на вемос. А жаль, потому что изначально планировал красиво управлять из под любого браузера (ПК, ноут, смарт).
То есть клиент+ДМД работает, а сервер+ДМД нет. Думаю, где то библиотеки пересекаются в таймерах, но это не точно.
То есть клиент+ДМД работает, а сервер+ДМД нет.
Вот оно че! а я тут маюсь... Тогда ставим промини, как контроллер экрана и ему по uart-у esp-кой шлем чего выводить. По "деталькам" дешевле esp32, и портов дополнительных с избытком.
Вот с чем столкнулся, так это с тем, что вместе с ДМД не работает ВайФай-сервер. Было неприятным сюрпризом, потому что планировал сделать вебморду на управление, и даже уже сделал ее и оттестировал. А как начал собирать проект в кучу - всплыла несовместимость. Опять же времени разбираться уже не было
Это странно. Думаю причина в том, что "времени разбираться не было". Пересекаться там нечему, вообще-то - ДМД использует таймер по минимуму и ей все равно, на каком таймере висеть
Апдейт к предыдущему: все таки запустил вайфай и вебморду.
Фишка оказалось в чем: все это добро надо было инициализировать ДО инициализации ДМД. И использовать в самом простом варианте: всякие ДНСсервера уже начинают виснуть. А так работает, хоть и не очень стабильно.
Нестабильность заключается в частой перезагрузке вайфая и соответственно разрыве соединения. Для меня не критично, учитывая, что заходить на вебморду будут раз в полгода и то на минуту. Но для постоянного коннекта, конечно, не подойдет.
кто спрашивал за скролинг двух независимых строк?
http://forum.freetronics.com/viewtopic.php?t=5900 тут решение для dmd
добавить в DMD.cpp
добавить в dmd.h
пример:
dneese, спасибо, как раз то, что искал.
Запустил DMD на STM32 (,блюпилл) в среде Ардуино. За основу взял библиотеку DMDSTM.h
https://github.com/mozok/DMDSTM
Библиотека в принципе рабочая, надо только примеры под СТМ32 переписать. Почему там в отзывах написано, что на STM32F103 не пашет - непонятно, видимо человек не разобрался.
Вот видео, хотя конечно на экране нифига не поймешь, что за плата там работает :)
https://youtu.be/AFy1Esi6yro
пишу сюда, потому что это единственная живая ветка на форуме, посвященная p10 DMD матрицам.
Допилил порт библиотеки DMD.h для плат на STM32 до относительно стабильного уровня, предлагаю желающим попробовать. Открыл ветку в Проектах: http://arduino.ru/forum/proekty/dmdstm32-versiya-biblioteki-dmd-dlya-stm32duino
Спасибо, буду тестировать. Если что интересное появится - сообщу.
1
Привет всем! Подскажите, пожалуйста, в какую сторону копнуть? Собрал я на основе ардуино уно и модулей р10 с использованием библиотеки dmd2 таймер, который реализовал через использование millis(), все работает, но обнаружил такой факт. При количестве светодиодных модулей больше пяти штук ход таймера замедляется примерно 1,5 раза
Родной таймер вообще не точный, а при больших нагрузках (а DMD сильно грузит МК) становится очень сильно не точный. Я с этим сталкивался неоднократно и теперь в таких случаях всегда добавляю в схему часы.
дублит что то
Имеете в виду такой
Да любые. DS1302, DS1307, DS3231... Смотрите, какие вам удобнее подключать.
Внешне они все почти одинаковые, как у вас на фото.
del
А там можно получить десятые доли секунды?
Нет, это все простенькие дешевые часы для отсчета именно часов, минут и секунд.
Для вас тогда STM-овские часы серии M41Txx
http://www.farnell.com/datasheets/1732966.pdf
Но я вообще не представляю, гды я бы их смог быстро купить, в отличие от далассовского ширпотреба, который продается в любом радиоларьке.
Родной таймер вообще не точный, а при больших нагрузках (а DMD сильно грузит МК) становится очень сильно не точный. Я с этим сталкивался неоднократно и теперь в таких случаях всегда добавляю в схему часы.
Меня та точность устраивала. Возможно ли как-то решить по другому проблему?
А разве нельзя брать секунду с DS1302 и делить её на десятые с помощью millis(),?
Попробуйте micros, но это не точно. Эксперементируйте.
Дак с этой функцией и тормозит
Попробуйте micros, но это не точно. Эксперементируйте.
Пробовал. Так же
Вообще, если не секрет, что это у вас за девайс и какая его цель?
Да я табло для спортзала нашего делал
А может отдельно ардуину нано, например, для таймера выделить
Забейте на десятые доли. Я тоже делал табло для спортзала, отказался от отображения десятых, потому, что все равно их мелькания не видно на табло. время я вообще считал на компьютере судьи (и там на интерфейсе судьи были и десятые и сотые - тоже гемора схватил, но сделал), а на табло тупо слал раз в секунду количество секунд.
Заказчику просто объяснил, что из за скорости обновления светодиодов физически невозможно отображать десятые на табло, а на компе все это есть. Заказчика устроило.
Очень интересный проект был, кстати. Большое полноцветное табло, где был счет, команды, фолы и все такое прочее... Все прорисовано сексуально и красочно. И два маленьких монохромных табло по углам зала - счетчики секунд (на мини про). И добротное такое ПО на комп судьи - там можно было переключать тип игры (футбол, в-бол, б-бол, еще что то), для каждого типа был свой интерфейс и на большом табло соответственно менялось отображение под каждый тип.
Да я как бы нашел выход, в коде методом подбора умножил millis() на коэффициент. Считает нормально, сверял на интервале 40 мин. Почти без погрешности. Только десятые не отображаются как нужно-проскакивают
С компьютером я тоже делал. Там проще было. Тут пульт