Подружить DMD экран и SoftwareSerial

Solvek
Offline
Зарегистрирован: 29.09.2014

К моей Arduino Uno подключено ESp8622, через SoftwareSerial я с ним коммуницирую. Пока все хорошо.

Дальше, хочу подключить пиксельный екран. Либа DMD2.

Сам экран еще физически не подключил, только библиотеку и инициировал его програмно.

Так вот, заметил, если запускаєтся комманда dmd.begin() то сериальный порт перестает работать. Некоторые приходящие символы искажаются или не приходят. Если закомментировать dmd.begin(), то все ок.

Solvek
Offline
Зарегистрирован: 29.09.2014

Вот такой простой скетч у меня на Arduino Uno

#define PIN_WIFI_RX 4
#define PIN_WIFI_TX 3

#include <SPI.h>
#include <DMD2.h>

#define panel_width 1
#define panel_heigh 1

SoftDMD dmd(panel_width,panel_heigh);

#include <SoftwareSerial.h>
SoftwareSerial wifi(PIN_WIFI_RX, PIN_WIFI_TX);

void setup() {
  Serial.begin(9600);
  Serial.println(F("I am Uno"));  

  // DMD init
  dmd.setBrightness(50);
//  dmd.begin();

  wifi.begin(9600);
}

void loop() {
   if (Serial.available()){
    wifi.write(Serial.read());
   }
   if (wifi.available()){
    Serial.write(wifi.read());
   }
}

 

 

Solvek
Offline
Зарегистрирован: 29.09.2014

Вот такой ровный вывод, если закомментирована dmd.begin()

 

Blink
Blink
Blink
Blink
Blink
Blink
Blink
Blink
Blink
Blink
Blink
Blink
 
И вот такая фигня, если раскомментировать
 
I am Uno
B+⸮k⸮Bl⸮k⸮Bl⸮k⸮Bl⸮k⸮Bl⸮k⸮H⸮Bl⸮k⸮H⸮Bl⸮k⸮H⸮Blik⸮H⸮Blik⸮H⸮Blik⸮H⸮Blik⸮H⸮Blik⸮H⸮Blik⸮H⸮BlinVH⸮BlinVH⸮BlinVH⸮⸮+⸮k
(+⸮k
B+⸮k
B+⸮k
B+⸮k
B+⸮k
B+⸮k⸮B+⸮k⸮Bl⸮k⸮Bl⸮k⸮Bl⸮k⸮Bl⸮k⸮Bl⸮k⸮H⸮Bl⸮k⸮H⸮Bl⸮k⸮H⸮Blik⸮H⸮Blik⸮H⸮Blik⸮H⸮Blik⸮H⸮Blik⸮H⸮BlinVH⸮BlinVH⸮BlinVH⸮BlinVH⸮P+⸮k
+⸮k
B+⸮k
B+⸮k
B+⸮k
B+⸮k⸮B+⸮k⸮B+⸮k⸮

 

FoxJone
Offline
Зарегистрирован: 19.04.2019

Вайвай не работает нормально вместе с ДМД. Почему - не знаю.

Просто с сериалом (а я работал и с 232 и с 485) ДМД работает нормально. Как только появляется намек на вайвай - идут глюки. Точно такая же фигня происходит с ИК портом - тоже не работает вместе.

На будущее для себя решил - отдельный проц для ДМД, отдельный для всего остального и связь между ними по 232.

Solvek
Offline
Зарегистрирован: 29.09.2014

Да, DMD и ESP плохо работают в связке. Намучился с ними.

Но в данном случае думаю что проблемма не в этом. У меня DMD, а wifi просто внешняя вещь, которая для Arduino видится как SoftwareSerial (может быть подключено другое устройство, не обязательно wifi).

Так вот, создается впечатление, что если я активизирую WiFi, то по софтварному серийному порту начинаю получать мусор. Здесь подобная проблемма описана. Но решения так и не нашел.

FoxJone
Offline
Зарегистрирован: 19.04.2019

Проблема в том, что ДМД очень сильно грузит проц. Все таки одновременное управление кучей пикселей (а я на вемосе раскрутил 42 модуля > 21к пикселей), которые надо не просто зажечь и забыть, а регулярно им напоминать их состояние - работа, требующая самоотречения!

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

Потому что совместно работать я их с горем пополам заставил, но а) постоянно отваливается вайвай б) иногда при обращении к вебморде вемос просто перезагружался в) визуально обновление экрана шло раз в 5 медленнее, чем при отключенном вайвае.

Solvek
Offline
Зарегистрирован: 29.09.2014

Хм... похоже вы правы.

Но такое решение мне не подходит...

Нужно что-то думать

b707
Offline
Зарегистрирован: 26.05.2017

много раз обсуждалось - кроме того что DMD грузит проц и затрудняет работу прерываний - еще max72xx очень сильно "срет" в питание, что может сводить с ума другие модули.

вообще идея вешать DMD на отдельный МК вполне здравая

Solvek
Offline
Зарегистрирован: 29.09.2014

b707 пишет:

много раз обсуждалось - кроме того что DMD грузит проц и затрудняет работу прерываний - еще max72xx очень сильно "срет" в питание, что может сводить с ума другие модули.

вообще идея вешать DMD на отдельный МК вполне здравая

Допустим я DMD повешу на отдельный контроллер... но как с ним общаться, если проблема именно в том, что не могу нормално общаться, если активный DMD.

FoxJone
Offline
Зарегистрирован: 19.04.2019

Solvek пишет:

я DMD повешу на отдельный контроллер... но как с ним общаться, если проблема именно в том, что не могу нормално общаться, если активный DMD.

По 232, по стандартному аппаратному 232...

b707
Offline
Зарегистрирован: 26.05.2017

Solvek пишет:

Допустим я DMD повешу на отдельный контроллер... но как с ним общаться, если проблема именно в том, что не могу нормално общаться, если активный DMD.

вопрос хороший :) Но вообще, чем меньше одновременных задач занимает МК - тем оегче добиться совместимости между ними.

СофтСериал в любом случае выкиньте -он и без ДМД глючит

Solvek
Offline
Зарегистрирован: 29.09.2014

Здесь подобная проблема. Пишуть, что DMD2 i SoftwareSerial конкурируют за timer0. Я отключил таймер, тепрь вывод работает при включенном DMD, но теперь нужно как-то самому реализовать Timer. ("define NO_TIMERS and write your own routine to manage updating the display, see DMD_Timer.cpp for more info")