Да это не рисовал, просто разъемов накидал на плату без дорог...
Но в принципе за час разведу - там ничего нету кроме разъемов и дорог.
сразу замечания про разводку дорог - имейте в виду, что пины DATA на всех параллельных каналах должны быть на одном порту, то есть либо все PA либо все PB
уря, пршлогодний код для RGB 64x32 запустил. Панель 80x40 имеет ровно такую же разводку, как 64х32, только линий сканирования больше. Поправил в коде 16 сканов на 20 - заработала и 80х40
Только, к сожалению, все сырое... под каждый типоразмер приходится отдельный класс писать, библиотека уже раздулась неимоверно...
b707 Добрый вечер. Повторяю ваш пример с UARTTransfer из 207 поста. Вывожу статичный текст- для теста две разные строки каждую секунду. Всё работает и выводится чуть больше минуты, потом зависает. После ресета Стм32 тоже минуту работает. Отправляет Уно, монитор порта показывает, что отправка произходит. В этом деле новичок, не могу найти причину.
Поменял на 2000 - 18 циклов, 5000 - 10 циклов. Немного дольше, но тоже самое. При перезагрузке Уно пару раз срабатывает . После зависания тоже редко несколько раз срабатывает
Собрал на Уно часы, посылаю каждую секунду. На СТМ в лооп добавил deley (100), теперь показывает и после минуты, но много пропусков. В библиотеку поставил принт.
Нашёл возможную причину, переменная rx_stage при пропуске отличается от нуля . Не понимаю причину, после приёма она же обнуляется.
это не причина, это следствие. Насколько я помню эту библиотеку, когда сообщение принимается частично, эта переменная остается отличной от нуля.
Судя по происходящему, у вас проблемы с приемом. Но не вполне понимаю, почему. 6 матриц такой нагрузки давать не должны, это совсем немного. Приведенный Вами код - это все? или в программе есть что-то еще?
На принимающеи стороне это всё. Ещё обнаружил,что переменная rx_time с каждым приёмом некапливается до примерно 60 000 , потом резко падает до 600 и опять растёт. Но это несовпадает с пропусками. Возможно так и должно быть.
Вывел на монитор переменную in_char, в принципе принятая строка с буфера. Вот что получилось, мои добавления st(rx_stage)и значение и С (clear message)
183 - header 1, 7- header 2, 51-header 3, 66- STRING, 10- ?, дальше время hh:mm:ss, cs
Спасибо, всё работает уже 3 часа, ни одного пропуска. Пустил даже через RS 485 и 30 метров кабеля - всё чётко. Работает даже Ваша регулировка яркости из часов, на приём и отображение не влияет.
Вопрос. Если я данные буду брать прямо из ПК через RS 485 флешку, как прицепить эту библиотеку, или как сформировать строку с подщетом cs?
Сейчас изпользую две платки TTL - RS485, хочу с ПК без Уно такой
Кабель USB-RS485-это usb-кабель RS485 с последовательным преобразователем UART, включающий FTDI FT232R USB в последовательный UART ИНТЕРФЕЙС IC, который обрабатывает все сигналы и протоколы USB.
Выложил на гитхаб новый релиз. По сути это на 70% новая библиотека, поэтому завел на гитхабе новую ветку (branch) и изменил название базового класса с DMD_STM32 на DMD_STM32a.
Основные изменения:
- Главное - добавлена поддержка многоцветных RGB панелей.
- графическая система библиотеки теперь наследуется от известной либы Adafruit GFX, что позволяет использовать большое число встроенных в эту либу функций.
- добавлена двойная буферизация, что уменьшает мерцание на быстроменяющихся картинках, а так же позволяет проворачивать кое-какие визуальные эффекты.
- для монохромных матриц введен новый "параллельный" тип подключения, когда каждый горизонтальный ряд матриц подключается к своему отдельному DATA пину, позволяя выводить изображение на все ряды одновременно. Имеет смысл на больших многорядных панелях.
- сильно переписан код, библиотека получила модульную структуру с одним базовым классом и кучей дочерних для разных типов матриц.
Пока поддерживаются следующие типы RGB матриц: 32x16 8scan, 64x32 16 scan, 80x40 20scan и 64x64 32scan. В ближайшее время добавятся еще два или три типа с 2s и 4s. Дальнейшее расширение парка поддерживаемых матриц зависит от спроса и наличия у меня таковых матриц для тестов.
Документация по новой версии пока полностью отсутствует. Пины для подключения описаны в примерах. По остальному спрашивайте.
Новая версия лежит на гитхабе в отдельной ветке. Чтобы скачать код, необходимо выбрать ветку dev-V2 в выпадающем списке выше слева над списком файлов или воспользоваться прямой ссылкой: https://github.com/board707/DMD_STM32/tree/dev-V2 Стабильная версия 0.4.2 остается доступна как основная ветвь "master".
Важное замечание - для работы требуется библиотека Adafruit-GFX версии 1.7.х или старше (то есть 1.6, 1.5 и тд). Более новые версии Adafruit-GFX пока не поддерживаются.
Поскольку базовые классы новой и старой версии называется немного по разному (DMD_STM32 и DMD_STM32a), обе ветки можно устанавливать в Ардуино ИДЕ одновременно, не опасаясь конфликтов.
Отдельное спасибо FoxJone за предоставленные для тестов матрицы.
.pio\libdeps\genericSTM32F103C8\Adafruit BusIO/Adafruit_I2CDevice.h:1:10: fatal error: Wire.h: No such file or directory
Явно указываю
#include <Wire.h>
и пошли ошибки несоответсвия типов
.pio\libdeps\genericSTM32F103C8\Adafruit BusIO\Adafruit_I2CDevice.cpp:88:47: error: invalid conversion from 'const uint8_t* {aka const unsigned char*}' to 'uint8* {aka unsigned char*}' [-fpermissive]
и
.pio\libdeps\genericSTM32F103C8\Adafruit BusIO\Adafruit_SPIDevice.cpp:133:31: error: no matching function for call to 'SPIClass::transfer(uint8_t*&, size_t&)'
Понимаю что можно поправить в библиотеках, но это как-то неправильно будет.
Знаю что Вы с PlatformIO не работаете, но может подскажите где правильно копать?
Попробовал - и правда с последними версиями Adafruit-GTX не собирается. Они там начиная с 1.8.х поменяли структуру библиотеки. Скачал версию 1.7.0 - с ней все нормально. Попробуйте пока с ней, а я может потом разберусь, как с новыми версиями запустить
Не хватает метода вывода картинки из байтового массива! То есть я в курсе, что в библиотеке все делается через дравпиксель и можно сделать самому... Но было бы круто иметь готовый метод drawimage, где на входе координаты и байтовый массив.
в библиотеке Adafruit есть готовый метод вывода битмапа из массива, а значит теперь можно использовать прямо из классов DMD_STM
- для монохромных матриц введен новый "параллельный" тип подключения, когда каждый горизонтальный ряд матриц подключается к своему отдельному DATA пину, позволяя выводить изображение на все ряды одновременно. Имеет смысл на больших многорядных панелях.
В соответствии с Вашим примером так будет выглядеть соединение?
В соответствии с Вашим примером так будет выглядеть соединение?
на картинке плохо видно номера пинов, но вроде так. Кстати. практичка не очень подтверждает необходимость резисторов R1 R2 - я в начале их ставил, а потом перестал - разницы не вижу. Если ставить, то 3к маловато, лучше 6.8 - 10К
При таком подключении резисторы включены параллельнj и мое замечание в предыдущем сообщении тем более актуально. Достаточно одного резистора на все каналы.
Кстати, вот этот шунтирующий резистор для меня новость. Он откуда взялся и вообще зачем нужен? То есть я примерно представляю (вот теперь, когда увидел его), но хотелось бы точную версию услышать.
Евгений, Вы как-то слишком мрачно настроены :) Я по Вашему заказы битмапы добавил :), видели?
Цитата:
Кстати, вот этот шунтирующий резистор для меня новость. Он откуда взялся и вообще зачем нужен? То есть я примерно представляю (вот теперь, когда увидел его), но хотелось бы точную версию услышать.
Я тоже представляю только примерно. Уже не помню, в каком из DMD проектов на гите есть такая рекомендация. Как я уже писал выше - в принципе отлично работает и без него. Я этот резистор не ставлю.
Подскажите плз по соединению с RGB.
У Вас в скетче
#define DMD_PIN_SCLK PB7
Это на других обозначениях LAT (STB) (14 пин)?
да, это то же самое что LAT, обозначение осталось от монохромных матриц.
Цитата:
#define DMD_PIN_A PB6
#define DMD_PIN_B PB5
#define DMD_PIN_C PB4
#define DMD_PIN_D PB3
#define DMD_PIN_E PB9
С A-D понятно, а E какой пин?
пин Е есть только на матрицах высотой более 32 пикселей (например 80х40 или 64х64). Вообще, в зависимости от типа матрицы у вас может быть от двух (А и В) до пяти (А - Е) микшерных пинов. Значения тех пинов. что у вас нет - можете ставить любые, они не используются, библиотека их не инициализирует и ничего в них не пишет.
В примере обозначены все пины вплоть до Е, чтобы один и тот же пример подходил на любые поддерживаемые матрицы.
Цитата:
R0, G0, B0, R1, G1, B1
это в некоторых обозначениях R1, G2, B1, R2, G2, B2?
шкала из соседней ветки :) 4 матрицы 64х32, один бит на цвет, подключение зигзагом с поворотом на 180 градусов (поворот, потому что положил на диван вверх ногами и вертеть 4 матрицы с проводами было сложно :)
Для монохрома при параллельном соединении панелей пины CLK и пины R-DATA всех рядов должны располагаться на одном порту МК в его младшем байте, то есть выбираться из диапазонов A0-A7 или B0-B7. А я сам в примере указал пины А5 А6 _А8_ - поэтому и не работало. Пример в библиотеке поправил.
Чтобы снять это ограничение и заработал весь порт целиком - надо поменять тип элементов массива буфера с uint8 на uint16 - что приведет к увеличению расхода памяти в два раза и будет неэффективно для матриц менее чем 7 строк по горизонтали.
Поэтому пока осталяю так, На сегодня максимальное число горизонтальных строк матриц при таком подключении составляет 7. Кому 7 строк мало - пишите отдельно.
- добавил поддержку однобитного цвета для RGB панелей. Режим предназначен для табло и вывесок, где не нужно сложных цветов и достаточно 2-3 основных цвета. Занимает меньше места в памяти и работает быстрее. Управление яркостью в этом режиме сделано аналогично монохромным панелям - ШИМ-ом на пин ОЕ. Соответственно к выбору пина применяются те же требования - то есть для ОЕ нужно использовать PWM пин Таймера3. Подробнее см. пример dmd_rgb
- серьезно переписан вывод текста и функции бегущей строки. Скорость вывода фонтов увеличилась в 6-10 раз по сравнению с версией 0.5.1. Относится ко всем типам матриц, но особенно должно быть заметно на RGB.
- добавлена поддержка соединения панелей зигзагом
- куча мелких исправлений
Номера версий перескочили через несколько ступенек, так как кучу промежуточных версий сливать на гитхаб не стал.
Огромное спасибо тем, кто тестирует код и отписывается о результатах.
Отличная библиотека! столько возможностей, подумываю попробовать стм32 ради неё.
Сейчас делаю проект на 8266 DMD2, всё получается, но вот потребовалось подключить СД карту и встал вопрос. SPI занят, а со вторым я так и не понял, в общем стал смотреть на esp32 а затем и сюда попал ))
если можно я тоже вопрос задам - смогу ли я на СТМ32 подключить при работающей DMD2 модуль GPS по уарту и SD карту для файла конфигурации (считывается при загрузке передавая значения в переменные)?
Я сделал на ESP8266 свой проект, он определяет координаты и по уарту передаёт в еоп и тот исходя из заложенной программы - воспроизводит, значения вводим через веб интерфейс (файловая система, редактор, есть урок на эту тему в сети на основе примеров библиотек 8266) в контроллер (но одновременной работы DMD2 бегин и вай фай я не смог добиться и сделал в сетапе по кнопке или то или это), но мне показалось что перспективнее ваша библиотека, она живая(развивается активнее. универсалььнее) думаю что смогу перестроится на стм 32 (даже платки есть в шкафу, на всякий брал, простые и дискавери) но мне хотелось бы обойтись одним МК и чтоб пригодилось не раз ))
sansanich ESP8266 не работает с ДМД и вайфаем одновременно - проверено уже неоднократно.
С другой стороны у меня СТМ (а до этого атмеги) прекрасно работает с ДМД + RS485 (который подключен как раз через уарт). Так что не вижу никаких проблем для работы любого оборудования через уарт.
уточните, что за вопрос? - а то там уже много понаписали. Если про русские фонты - то вроде ответил. Если про размер фонта - то был неправ, обсчитался.
Еще что-то?
Сегодня часа два пытался запустить две независимые марикуе (бегущие строки) на одном экране. В принципе дошел до того момента, где Дмитрий попиксельно сдвигает миррор экрана и понял что этот мирор надо делить на области и сдвигать независимо. Так стало лениво, что плюнул и сделал простым дравстрингом со смещением (да, знаю что низкий класс - но лень).
Если вдруг кто то сделал две бегучки на одном экране, поделитесь?
Да это не рисовал, просто разъемов накидал на плату без дорог...
Но в принципе за час разведу - там ничего нету кроме разъемов и дорог.
сразу замечания про разводку дорог - имейте в виду, что пины DATA на всех параллельных каналах должны быть на одном порту, то есть либо все PA либо все PB
уря, пршлогодний код для RGB 64x32 запустил. Панель 80x40 имеет ровно такую же разводку, как 64х32, только линий сканирования больше. Поправил в коде 16 сканов на 20 - заработала и 80х40
Только, к сожалению, все сырое... под каждый типоразмер приходится отдельный класс писать, библиотека уже раздулась неимоверно...
b707 Добрый вечер. Повторяю ваш пример с UARTTransfer из 207 поста. Вывожу статичный текст- для теста две разные строки каждую секунду. Всё работает и выводится чуть больше минуты, потом зависает. После ресета Стм32 тоже минуту работает. Отправляет Уно, монитор порта показывает, что отправка произходит. В этом деле новичок, не могу найти причину.
01
//*--------------------------------------------------------------------------------------
02
03
dmd_uart_dispkay
04
05
DMD_STM32 example code
for
STM32F103xxx board
06
------------------------------------------------------------------------------------- */
07
08
/*--------------------------------------------------------------------------------------
09
Includes
10
--------------------------------------------------------------------------------------*/
11
#include <DMD_STM32.h>
12
#include "FreeSansBold12pt7b.h"
13
#include "UARTTransfer.h"
14
15
//Fire up the DMD library as dmd
16
// Number of DMD matrices
17
#define DISPLAYS_ACROSS 3
18
#define DISPLAYS_DOWN 2
19
20
// ----- Select pins for P10 matrix connection ------------
21
// pins A, B, SCLK may be any digital I/O, pin nOE should be PWM pin as PB1,PA8
22
23
// SPI specific pins as CLK and R_DATA has predefined values:
24
// for SPI(1) CLK = PA5 R_DATA = PA7
25
// for SPI(2) CLK = PB13 R_DATA = PB15
26
// --------------------------------------------------------
27
28
// We'll use SPI 1
29
30
SPIClass dmd_spi(1);
31
32
#define DMD_PIN_A PB11
33
#define DMD_PIN_B PB10
34
#define DMD_PIN_nOE PB1
35
#define DMD_PIN_SCLK PB0
36
DMD dmd(DMD_PIN_A, DMD_PIN_B, DMD_PIN_nOE, DMD_PIN_SCLK, DISPLAYS_ACROSS, DISPLAYS_DOWN, dmd_spi );
37
38
39
// --- Define fonts ----
40
41
DMD_GFX_Font FreeSansBold12((uint8_t*)&FreeSansBold12pt7b, 24);
42
43
44
45
// library for Serial transfer
46
UARTTransfer UT;
47
48
// ID for serial messages
49
#define STRING 66
50
51
52
void
setup
(
void
)
53
{ Serial2.begin(19200);
54
UT.begin(&Serial2);
55
dmd.init(700);
56
dmd.clearScreen(
true
);
//true is normal (all pixels off), false is negative (all pixels on)
57
// set matrix brightness (0-255)
58
dmd.setBrightness(50);
59
dmd.selectFont(&FreeSansBold12);
60
}
61
void
loop
(
void
)
62
{
63
// if new string received
64
if
(UT.receiveData()) {
65
char
tt[25];
66
uint8_t m_id = UT.getMessageID();
67
if
((m_id == STRING) && (UT.getDataLength() > 3 )) {
68
UT.getData((uint8_t*)&tt, UT.getDataLength());
69
dmd.clearScreen(
true
);
70
dmd.drawString(0, 0, tt, strlen(tt), GRAPHICS_NORMAL );
71
}
72
UT.clearMessage();
73
}
74
}
01
// library for Serial transfer
02
#include "UARTTransfer.h"
03
UARTTransfer UT;
04
05
// ID for serial messages
06
#define STRING 66
07
void
setup
() {
08
// put your setup code here, to run once:
09
Serial
.begin(19200);
10
UT.begin(&
Serial
);
11
// const unsigned char msg[] = "Hello world!";
12
// UT.sendData(STRING, sizeof(msg), (uint8_t*) msg);
13
//delay(15000);
14
15
}
16
17
void
loop
() {
18
// put your main code here, to run repeatedly:
19
unsigned
char
msg1[] =
" 2 Laps"
;
20
UT.sendData(STRING,
sizeof
(msg1), (uint8_t*) msg1);
21
delay(1000);
22
unsigned
char
msg2[] =
"00:00:00"
;
23
UT.sendData(STRING,
sizeof
(msg2), (uint8_t*) msg2);
24
delay(1000);
25
}
пока не могу сказать, в коде вроде ошибок нет.
Попробуйте увеличить интервал посылки данных (просто для теста) - изменится время до зависания или нет?
Поменял на 2000 - 18 циклов, 5000 - 10 циклов. Немного дольше, но тоже самое. При перезагрузке Уно пару раз срабатывает . После зависания тоже редко несколько раз срабатывает
версия библиотеки - с гитхаба?
Какая версия аддона СТМ32?
Попробую на выходных воспроизвести вашу проблему.
DMD с гитхаба, если неошибаюсь, 0.4.2
ArduinoIDE - SMT32duino, прошиваю ST-link
Плата STM как у вас на часах с дополнительными гнездами
Собрал на Уно часы, посылаю каждую секунду. На СТМ в лооп добавил deley (100), теперь показывает и после минуты, но много пропусков. В библиотеку поставил принт.
1
boolean UARTTransfer::receiveData() {
2
uint8_t mess_len = 0;
3
uint8_t in_char;
4
5
if
(rx_stage > 5)
return
false
;
6
7
if
((rx_stage) && ((millis() - rx_time) > rx_timeout)) {
8
Serial1.println(rx_stage);
9
clearMessage();
Нашёл возможную причину, переменная rx_stage при пропуске отличается от нуля . Не понимаю причину, после приёма она же обнуляется.
Нашёл возможную причину, переменная rx_stage при пропуске отличается от нуля . Не понимаю причину, после приёма она же обнуляется.
это не причина, это следствие. Насколько я помню эту библиотеку, когда сообщение принимается частично, эта переменная остается отличной от нуля.
Судя по происходящему, у вас проблемы с приемом. Но не вполне понимаю, почему. 6 матриц такой нагрузки давать не должны, это совсем немного. Приведенный Вами код - это все? или в программе есть что-то еще?
На принимающеи стороне это всё. Ещё обнаружил,что переменная rx_time с каждым приёмом некапливается до примерно 60 000 , потом резко падает до 600 и опять растёт. Но это несовпадает с пропусками. Возможно так и должно быть.
Передаётся всё коректно, как мне посмотреть, что приходит, можно както переправить все с Serial2 на Serial1?
Передаётся всё коректно, как мне посмотреть, что приходит, можно както переправить все с Serial2 на Serial1?
Serila.print() ?
Собрал макет для проверки, сегодня постараюсь проверить ваш код, вчера вообще не удалось матрицу запустить.
Вывел на монитор переменную in_char, в принципе принятая строка с буфера. Вот что получилось, мои добавления st(rx_stage)и значение и С (clear message)
183 - header 1, 7- header 2, 51-header 3, 66- STRING, 10- ?, дальше время hh:mm:ss, cs
01
18375166104848584953585253012C
02
183751661048st5C
03
4818375166104848584953585255014C
04
1837st2C
05
511837516610484858495358525700C
06
1837516610484858495358534808C
07
183751st3C
08
6618375166104848584953585350010C
09
18375166104848584953585351011C
10
183751661048st5C
11
4818375166104848584953585353013C
12
1837st2C
13
5118375166104848584953585355015C
14
1837516610484858495358535600C
15
183751661048st5C
16
4818375166104848584954584848014C
17
1837st2C
18
5118375166104848584954584850012C
19
18375166104848584954584851013C
20
1837st2C
21
5118375166104848584954584853011C
22
1837516610484858495458485408C
23
183751661048st5C
24
481837516610484858495458485606C
25
1837st2C
26
5118375166104848584954584948015C
27
18375166104848584954584949014C
28
183751661048st5C
29
4818375166104848584954584951012C
30
18375166104848584954584952011C
31
18375166104848584954584953010C
32
1837516610484858495458495409C
Наконец запустил Ваш пример. Вроде нашел ошибку, в файле UARTTransfer.h тип переменной rx_time поменяйте на uint32_t.
После этого у меня уже 10 минут не виснет, а исходный вариант вис через минуту.
Все остальные изменения (задержки и прочее) - не нужны, можете убрать.
Добавка - мигало 35 минут, так и не зависло. Дальше выключил.
Если найдете еще косяки - пишите, я пока схему разбирать не буду.
Спасибо, всё работает уже 3 часа, ни одного пропуска. Пустил даже через RS 485 и 30 метров кабеля - всё чётко. Работает даже Ваша регулировка яркости из часов, на приём и отображение не влияет.
Вопрос. Если я данные буду брать прямо из ПК через RS 485 флешку, как прицепить эту библиотеку, или как сформировать строку с подщетом cs?
Вопрос. Если я данные буду брать прямо из ПК через RS 485 флешку, как прицепить эту библиотеку, или как сформировать строку с подщетом cs?
надо больше подробностей, какой протокол у вас бегает по 485
Сейчас изпользую две платки TTL - RS485, хочу с ПК без Уно такой
это вы мне железо показываете. А я вас спросил про протокол.
Какая программа и в каком виде будет данные по этому кабелю посылать?
Обновление - новый релиз v0.5.0 (для СТМ32)
Выложил на гитхаб новый релиз. По сути это на 70% новая библиотека, поэтому завел на гитхабе новую ветку (branch) и изменил название базового класса с DMD_STM32 на DMD_STM32a.
Основные изменения:
- Главное - добавлена поддержка многоцветных RGB панелей.
- графическая система библиотеки теперь наследуется от известной либы Adafruit GFX, что позволяет использовать большое число встроенных в эту либу функций.
- добавлена двойная буферизация, что уменьшает мерцание на быстроменяющихся картинках, а так же позволяет проворачивать кое-какие визуальные эффекты.
- для монохромных матриц введен новый "параллельный" тип подключения, когда каждый горизонтальный ряд матриц подключается к своему отдельному DATA пину, позволяя выводить изображение на все ряды одновременно. Имеет смысл на больших многорядных панелях.
- сильно переписан код, библиотека получила модульную структуру с одним базовым классом и кучей дочерних для разных типов матриц.
Пока поддерживаются следующие типы RGB матриц: 32x16 8scan, 64x32 16 scan, 80x40 20scan и 64x64 32scan. В ближайшее время добавятся еще два или три типа с 2s и 4s. Дальнейшее расширение парка поддерживаемых матриц зависит от спроса и наличия у меня таковых матриц для тестов.
Документация по новой версии пока полностью отсутствует. Пины для подключения описаны в примерах. По остальному спрашивайте.
Новая версия лежит на гитхабе в отдельной ветке. Чтобы скачать код, необходимо выбрать ветку dev-V2 в выпадающем списке выше слева над списком файлов или воспользоваться прямой ссылкой: https://github.com/board707/DMD_STM32/tree/dev-V2 Стабильная версия 0.4.2 остается доступна как основная ветвь "master".
Важное замечание - для работы требуется библиотека Adafruit-GFX версии 1.7.х или старше (то есть 1.6, 1.5 и тд). Более новые версии Adafruit-GFX пока не поддерживаются.
Поскольку базовые классы новой и старой версии называется немного по разному (DMD_STM32 и DMD_STM32a), обе ветки можно устанавливать в Ардуино ИДЕ одновременно, не опасаясь конфликтов.
Отдельное спасибо FoxJone за предоставленные для тестов матрицы.
Попробовал - и правда с последними версиями Adafruit-GTX не собирается. Они там начиная с 1.8.х поменяли структуру библиотеки. Скачал версию 1.7.0 - с ней все нормально. Попробуйте пока с ней, а я может потом разберусь, как с новыми версиями запустить
Версию 1.7.0 можно скачать с гитхаба Адафруита: https://github.com/adafruit/Adafruit-GFX-Library/releases/tag/1.7.0
Библиотека Adafruit BusIO тогда не нужна.
Спасибо, попробую.
(в PlatformIO удобно что можно версию в ini файле указать)
понял, чего не хватает в библиотеке!
Не хватает метода вывода картинки из байтового массива! То есть я в курсе, что в библиотеке все делается через дравпиксель и можно сделать самому... Но было бы круто иметь готовый метод drawimage, где на входе координаты и байтовый массив.
в библиотеке Adafruit есть готовый метод вывода битмапа из массива, а значит теперь можно использовать прямо из классов DMD_STM
можно монохром, можно цвет:
1
void
drawBitmap(int16_t x, int16_t y,
const
uint8_t bitmap[], int16_t w,
2
int16_t h, uint16_t color);
3
4
void
drawRGBBitmap(int16_t x, int16_t y,
const
uint16_t bitmap[], int16_t w,
5
int16_t h);
Результат вывода drawRGBBitmap в разрешении 32х32
В таком разрешении, конечно, зернисто, но картинка вполне узнаваема :)
Собирается с Adafruit-GTX 1.7.5, с 1.8 уже ошибки.
- для монохромных матриц введен новый "параллельный" тип подключения, когда каждый горизонтальный ряд матриц подключается к своему отдельному DATA пину, позволяя выводить изображение на все ряды одновременно. Имеет смысл на больших многорядных панелях.
В соответствии с Вашим примером так будет выглядеть соединение?
В соответствии с Вашим примером так будет выглядеть соединение?
на картинке плохо видно номера пинов, но вроде так. Кстати. практичка не очень подтверждает необходимость резисторов R1 R2 - я в начале их ставил, а потом перестал - разницы не вижу. Если ставить, то 3к маловато, лучше 6.8 - 10К
А так видно?
https://drive.google.com/file/d/1a_BDxMkaLe2_BgwKoCjVaGHGXTJSoLO2/view?usp=sharing
А так видно?
https://drive.google.com/file/d/1a_BDxMkaLe2_BgwKoCjVaGHGXTJSoLO2/view?usp=sharing
да, схема правильная.
При таком подключении резисторы включены параллельнj и мое замечание в предыдущем сообщении тем более актуально. Достаточно одного резистора на все каналы.
Вам то хорошо, есть время поиграться...
Кстати, вот этот шунтирующий резистор для меня новость. Он откуда взялся и вообще зачем нужен? То есть я примерно представляю (вот теперь, когда увидел его), но хотелось бы точную версию услышать.
Да, забыл убрать резисторы.
Вам то хорошо, есть время поиграться...
Евгений, Вы как-то слишком мрачно настроены :) Я по Вашему заказы битмапы добавил :), видели?
Я тоже представляю только примерно. Уже не помню, в каком из DMD проектов на гите есть такая рекомендация. Как я уже писал выше - в принципе отлично работает и без него. Я этот резистор не ставлю.
Подскажите плз по соединению с RGB.
У Вас в скетче
#define DMD_PIN_SCLK PB7
Это на других обозначениях LAT (STB) (14 пин)?
это в некоторых обозначениях R1, G2, B1, R2, G2, B2?
Подскажите плз по соединению с RGB.
У Вас в скетче
#define DMD_PIN_SCLK PB7
Это на других обозначениях LAT (STB) (14 пин)?
да, это то же самое что LAT, обозначение осталось от монохромных матриц.
#define DMD_PIN_A PB6
#define DMD_PIN_B PB5
#define DMD_PIN_C PB4
#define DMD_PIN_D PB3
#define DMD_PIN_E PB9
С A-D понятно, а E какой пин?
это в некоторых обозначениях R1, G2, B1, R2, G2, B2?
да, это цветовые каналы
шкала из соседней ветки :) 4 матрицы 64х32, один бит на цвет, подключение зигзагом с поворотом на 180 градусов (поворот, потому что положил на диван вверх ногами и вертеть 4 матрицы с проводами было сложно :)
Пытаюсь запустить параллельное соединение.
01
#define DMD_PARA
02
/*--------------------------------------------------------------------------------------
03
Includes
04
--------------------------------------------------------------------------------------*/
05
#if defined(DMD_PARA)
06
#include "DMD_Monochrome_Parallel.h"
07
#else
08
#include "DMD_MonoChrome_SPI.h"
09
#endif
10
11
// Fonts includes
12
#include "st_fonts/UkrRusArial14.h";
13
#pragma GCC diagnostic ignored "-Wnarrowing"
14
#pragma GCC diagnostic ignored "-Woverflow"
15
#include "gfx_fonts/GlametrixLight12pt7b.h"
16
#include "gfx_fonts/GlametrixBold12pt7b.h"
17
#pragma GCC diagnostic warning "-Wnarrowing"
18
#pragma GCC diagnostic warning "-Woverflow"
19
#include "my_fonts/FranklinGotMC18.h" //'°C' & (#38 symbol); ° ~ (#126 symbol) 'mm Hg' symbol '}' #125
20
21
//Number of panels in x and y axis
22
#define DISPLAYS_ACROSS 3
23
#define DISPLAYS_DOWN 2
24
25
// Enable of output buffering
26
// if true, changes only outputs to matrix after
27
// swapBuffers(true) command
28
// If dual buffer not enabled, all output draw at matrix directly
29
// and swapBuffers(true) cimmand do nothing
30
#define ENABLE_DUAL_BUFFER true
31
32
// ----- Select pins for P10 matrix connection ------------
33
// pins A, B, SCLK may be any digital I/O, pin nOE should be Timer3 PWM pin as PB0,PB1
34
// if connect as SPI, do not use corresponding MiSO pin - PA6 for SPI1 and PB14 for SPI2
35
#if defined(DMD_PARA)
36
#define DMD_PIN_A PA1
37
#define DMD_PIN_B PA4
38
#define DMD_PIN_nOE PB1
39
#define DMD_PIN_SCLK PA15
40
#else
41
#define DMD_PIN_A PB11
42
#define DMD_PIN_B PB12
43
#define DMD_PIN_nOE PB1
44
#define DMD_PIN_SCLK PB10
45
#endif
46
47
48
// pins for SPI connect
49
// SPI specific pins as CLK and R_DATA has predefined values:
50
// for SPI(1) CLK = PA5 R_DATA = PA7
51
// for SPI(2) CLK = PB13 R_DATA = PB15
52
// --------------------------------------------------------
53
54
//=== Config for Parallel connect ====
55
#if defined(DMD_PARA)
56
//pins for rows at x axis
57
// example for two rows
58
// all those pins must be selected from same port!
59
uint8_t pins[] = { PA5, PA7, PA8 };
// CLK , row1, row 2
60
61
//Fire up the DMD object as dmd
62
DMD_Monochrome_Parallel dmd(DMD_PIN_A, DMD_PIN_B, DMD_PIN_nOE, DMD_PIN_SCLK, pins, DISPLAYS_ACROSS, DISPLAYS_DOWN,ENABLE_DUAL_BUFFER);
63
#else
64
65
//=== Config for SPI connect ====
66
SPIClass dmd_spi(1);
67
DMD_MonoChrome_SPI dmd(DMD_PIN_A, DMD_PIN_B, DMD_PIN_nOE, DMD_PIN_SCLK, DISPLAYS_ACROSS, DISPLAYS_DOWN, dmd_spi, ENABLE_DUAL_BUFFER);
68
#endif
69
70
// --- Define fonts ----
71
// DMD.h old style font
72
DMD_Standard_Font UkrRusArial_F(UkrRusArial_14);
73
74
// GFX font with sepatate parts for Latin and Cyrillic chars
75
DMD_GFX_Font GlametrixL((uint8_t*)&GlametrixLight12pt7b,(uint8_t*)&GlametrixLight12pt8b_rus,0x80,13);
76
DMD_GFX_Font fontMiddle((uint8_t*)&FranklinGothicMediumCond18pt7b,(uint8_t*)&FranklinGothicMediumCond18pt8b_rus, 0x80, 22);
Antsanv, добрый день!
если вопрос еще актуален - пишите мне в почту
Здравствуйте.
Актуален. Напомните плиз первую строку адреса.
нашли причины бага, указанного в #335
Для монохрома при параллельном соединении панелей пины CLK и пины R-DATA всех рядов должны располагаться на одном порту МК в его младшем байте, то есть выбираться из диапазонов A0-A7 или B0-B7. А я сам в примере указал пины А5 А6 _А8_ - поэтому и не работало. Пример в библиотеке поправил.
Чтобы снять это ограничение и заработал весь порт целиком - надо поменять тип элементов массива буфера с uint8 на uint16 - что приведет к увеличению расхода памяти в два раза и будет неэффективно для матриц менее чем 7 строк по горизонтали.
Поэтому пока осталяю так, На сегодня максимальное число горизонтальных строк матриц при таком подключении составляет 7. Кому 7 строк мало - пишите отдельно.
Обновление - версия v0.6.3
https://github.com/board707/DMD_STM32/tree/v0.6.3
Изменния:
- добавил поддержку однобитного цвета для RGB панелей. Режим предназначен для табло и вывесок, где не нужно сложных цветов и достаточно 2-3 основных цвета. Занимает меньше места в памяти и работает быстрее. Управление яркостью в этом режиме сделано аналогично монохромным панелям - ШИМ-ом на пин ОЕ. Соответственно к выбору пина применяются те же требования - то есть для ОЕ нужно использовать PWM пин Таймера3. Подробнее см. пример dmd_rgb
- серьезно переписан вывод текста и функции бегущей строки. Скорость вывода фонтов увеличилась в 6-10 раз по сравнению с версией 0.5.1. Относится ко всем типам матриц, но особенно должно быть заметно на RGB.
- добавлена поддержка соединения панелей зигзагом
- куча мелких исправлений
Номера версий перескочили через несколько ступенек, так как кучу промежуточных версий сливать на гитхаб не стал.
Огромное спасибо тем, кто тестирует код и отписывается о результатах.
Стартовое табло для гоночных лодок. Три панели вертикально.
Стартовое табло для гоночных лодок.
круто :)
Обновление - версия v0.6.3
https://github.com/board707/DMD_STM32/tree/v0.6.3
Эта версия тоже работает только с
Adafruit GFX Library @ 1.7.5
?
На 10-й выдает ошибку
libdeps\genericSTM32F103C8\Adafruit GFX Library\Adafruit_GrayOLED.h:30:10: fatal error: Adafruit_I2CDevice.h: No such file or directory
Эта версия тоже работает только с
Adafruit GFX Library @ 1.7.5?
да
Отличная библиотека! столько возможностей, подумываю попробовать стм32 ради неё.
Сейчас делаю проект на 8266 DMD2, всё получается, но вот потребовалось подключить СД карту и встал вопрос. SPI занят, а со вторым я так и не понял, в общем стал смотреть на esp32 а затем и сюда попал ))
Спасибо автору за труд!
B707,я вам вопрос задавал здесь http://arduino.ru/forum/proekty/imitatsiya-razlichnykh-shkal-na-displee-12864?page=6#comment-615567
ответ будет?
если можно я тоже вопрос задам - смогу ли я на СТМ32 подключить при работающей DMD2 модуль GPS по уарту и SD карту для файла конфигурации (считывается при загрузке передавая значения в переменные)?
Я сделал на ESP8266 свой проект, он определяет координаты и по уарту передаёт в еоп и тот исходя из заложенной программы - воспроизводит, значения вводим через веб интерфейс (файловая система, редактор, есть урок на эту тему в сети на основе примеров библиотек 8266) в контроллер (но одновременной работы DMD2 бегин и вай фай я не смог добиться и сделал в сетапе по кнопке или то или это), но мне показалось что перспективнее ваша библиотека, она живая(развивается активнее. универсалььнее) думаю что смогу перестроится на стм 32 (даже платки есть в шкафу, на всякий брал, простые и дискавери) но мне хотелось бы обойтись одним МК и чтоб пригодилось не раз ))
sansanich ESP8266 не работает с ДМД и вайфаем одновременно - проверено уже неоднократно.
С другой стороны у меня СТМ (а до этого атмеги) прекрасно работает с ДМД + RS485 (который подключен как раз через уарт). Так что не вижу никаких проблем для работы любого оборудования через уарт.
B707,я вам вопрос задавал здесь http://arduino.ru/forum/proekty/imitatsiya-razlichnykh-shkal-na-displee-12864?page=6#comment-615567
ответ будет?
уточните, что за вопрос? - а то там уже много понаписали. Если про русские фонты - то вроде ответил. Если про размер фонта - то был неправ, обсчитался.
Еще что-то?
Сегодня часа два пытался запустить две независимые марикуе (бегущие строки) на одном экране. В принципе дошел до того момента, где Дмитрий попиксельно сдвигает миррор экрана и понял что этот мирор надо делить на области и сдвигать независимо. Так стало лениво, что плюнул и сделал простым дравстрингом со смещением (да, знаю что низкий класс - но лень).
Если вдруг кто то сделал две бегучки на одном экране, поделитесь?
Евгений, параметр
bool use_shift = true;
базового класса DMD отвечает за перемещение бегущей строки сдвигом всего экрана (true) или перерисовкой строки заново если false
Опишите его как public и тогда сможете прямо в коде вызывать dmd.use_shift = false;
и отключать этот режим.