Как избежать "дребезга" и появления ненужных пикселей

fura
Offline
Зарегистрирован: 31.07.2014

Здравствуйте. С ардуино "общаюсь" совсем недавно,новичек. В просторах интернета нашел статью -"Бегущая строка"на примере светодиодной матрицы и ардуино мега http://habrahabr.ru/post/129569/.

Немного переделав код получил необходимое,однако появился "дребезг" в отображении.Что нужно подправить в коде,чтобы его убрать?Долно читаться слово "Hello" .Спасибо.

 

fura
Offline
Зарегистрирован: 31.07.2014
dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Один раз уже говорил о таком, но раз уместно, повторюсь. :)

Попробуй заменить digitalWrite на запись в порт. http://tronixstuff.com/2011/10/22/tutorial-arduino-port-manipulation/

Добавлю только, что если нужно писать не все 8 ног сразу, то нужно пользоваться битовыми операциями, чтобы не изменить атрибуты определенных пинов. http://www.arduino.cc/en/Reference/PortManipulation

То есть например, при конфигурации

1DDRD = B11111110;  // sets Arduino pins 1 to 7 as outputs, pin 0 as input
2DDRD = DDRD | B11111100;  // this is safer as it sets pins 2 to 7 as outputs
3                      // without changing the value of pins 0 & 1, which are RX & TX

При записи (PORTx) и чтении (PINx) то же самое.

fura
Offline
Зарегистрирован: 31.07.2014

Через порты пробывал,зажигаются строки полностью или ряды матрицы.При этом  возникает нагрев микроконтроллера ардуины.

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Посмотрел мельком, по ссылке на хабр один только код. Чего вы там насоединяли, номиналы и прочее - схему бы знать...  

И новый код, конечно.

fura
Offline
Зарегистрирован: 31.07.2014

Только у меня 7х6.Измененный код в первом сообщении в спойлере

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Схема это хорошо, а в коде что поменялось? Всё те же digitalWrite. Ну и комментировать код полезно, не только для окружающих, но и для себя.

Что касается функций paint и scroll: во-первых, двумерные массивы по уму передаются каким-то другим способом, во-вторых, переменные и массивы row, col, v, dms, A - типа как глобальные, передавать их как аргументы не надо - функции итак их видят.

Куда "+" на схеме цепляется, на 5v ардуины чтоли? Точно греется контроллер, а не стаб?

 

fura
Offline
Зарегистрирован: 31.07.2014

Вот к примеру  такой код

Как я понимаю можно включать только полностью строку и столбцы.Как например букву какую нибудь вывести?

 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Код ...

1void setup()
2{
3  DDRA = B01111111; // set PORTA (digital 7~0)
4                    //  to output
5  DDRB = B00111111; // PORTB (6~0)
6}

... немного напрягает. PORTB - это с 8 до 13, а с 0 до 7 это PORTD, про PORTA вообще не слышал. Какая именно ардуина?

И PORTB конфигурируется, но не используется у вас. :) Таким образом не ясно, какие ноги управляют 315-ми, а какие 361-ми.

Если хочется зажечь светодиод (0;3) например, тогда надо на 315-е надо дать 00000001, а на 361-е дать 11110111 (раз открываются нулём)

fura
Offline
Зарегистрирован: 31.07.2014

ардуина мега2560 - PORTА  0-7(22-29 гнезда), PORTB 0-7 (53,42,51,50,10,11,12,13) соответственно. Без инициализации PORTB нет 0 на 361-ых. Для анодов 22-28 выводы,для катодов 53-50,10 и 11.Как зажечь светодиод это понятно.Не понятно как зажечь несколько светодиодов.К примеру "+"

fura
Offline
Зарегистрирован: 31.07.2014

Так как если дать на 315-ые 0001000, а на 361-ые 00110111 рисунка "+" не получится,а будет светиться только 1 светодиод

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Зажечь несколько - поставить несколько единиц (нулей) в соответствующих разрядов регистров портов.

fura пишет:

Так как если дать на 315-ые 0001000, а на 361-ые 00110111 рисунка "+" не получится,а будет светиться только 1 светодиод

Аномалия какая-то. Чего мы еще не учли, интересно...

fura
Offline
Зарегистрирован: 31.07.2014

будут все светодиоды светиться прямоугольниками

 

fura
Offline
Зарегистрирован: 31.07.2014

на PIC16 в статье со схемы как-то реализуется вращение знака "+"

http://www.radiohlam.ru/program/images/diode_matrix_prg2.gif

fura
Offline
Зарегистрирован: 31.07.2014

Считаю необходимо всетаки использывать массивы вроде

 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Ну логично, символы/изображения по другому задавать не ахти развлечение. Надо просто придумывать, как на основе этого массива кидать команды на все ноги сразу.

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014
1byte pixelString(){ // "преобразование" строки массива в байт
2   byte res=0; //результат
3   int i;
4   for(i=0;i<8;i++){ //установка битов в соответствии с данными из массива, скажем так
5        if(array[i]) res=res|(1<<i); //если в ячейке глобального массива единица ...
6    }                                // побитовое ИЛИ позволяет сохранить без изменения уже установленные единицы
7  return res;
8 
9}

Пример. Просто демонстрация концепции, конкретно под это переделывать надо.

fura
Offline
Зарегистрирован: 31.07.2014

Нашел на вродебы что-то необходимое

fura
Offline
Зарегистрирован: 31.07.2014

Вот код 

Все с тем же применением digitalWrite()

1const int row[8] = {53,52,51,50,10,11,12,13};
2const int col[8] = {22,23,24,25,26,27,28,29};

Можно заменить

1DDRB  =  B11111111;
2DDRA = B11111111;

в остальной части не понимаю как на порты перевести

 

fura
Offline
Зарегистрирован: 31.07.2014

Что-то замена не прошла удачно. Изначальный код(в предидущем сообщении) работает. Чтобы не загромождать код массивами. Наверное надо библиотеку из массивов делать,при чередовании отображаемых символов

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Короче, разбейте задачу "перевода на порты" на задачи поменьше, а то я перестал понимать, что здесь происходит.

А с заменой row[8] = {53,52,51,50,10,11,12,13} на DDRB = B11111111... Использование DDRB заменяет восьмикратный вызов функции pinMode(X,OUTPUT). Причём тут массив с номерами ног? Спойлер: ни при чём.

fura
Offline
Зарегистрирован: 31.07.2014

Извиняюсь за "мысли вслух". Пытаюсь отобразить символ "+" во вращении с помощью кода из 18 поста(в спойлере) - путем добавления других массивов в коде.

fura
Offline
Зарегистрирован: 31.07.2014

Получился такой код

void paint не удалось изменить

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

http://www.instructables.com/id/Persistence-of-Vision-Wand/

родственная тема.....

 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

fura пишет:

Получился такой код

Вместо такого можно сделать просто трехмерный массив, кстати говоря.

Вообще, лучше додумать, как показывать один конкретный кадр. Скетч должен выводить кадр из некого буфера (специального массива) бесконечно долго - тут задача динамической индикации: показать одну строку (столбец) кадра, через какое-то малое время показать следующую и т.д. А формировать сигналы на транзисторы образом, крайне похожим на код из #16 (предчувствуя затык - для PNP "сдвиг нуля" можно сделать побитовой инверсией "~" того, что будет от двигания единицы).

Потом по ходу работы загонять в буфер кадра другую картинку. И пока вы не наворотили дофига вложенных циклов с delay, изучите пример BlinkWithoutDelay.

fura
Offline
Зарегистрирован: 31.07.2014

Честно говоря весь код  понимаю смутно. Точнее содержимое функций мне не понятно. Вот к примеру в #22 понятно только, что в setup обявлены порты.  В loop порядок вывода значений на табло. Функция paint - вывод на массивов на табло,а то что в этой функции происходит не ясно. 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

На схему свою в #5 гляньте, код понятнее станет. В #22 в двух циклах просматриваются все 64 ячейки "кадра" (8 столбцов, 8 строк). Если светодиод надо зажечь (в ячейке массива - единица), выставляется единица на базу NPN транзистора и ноль на базу PNP транзистора. Тогда транзисторы открываются, ток течёт, светодиод загорается. Потом контроллер ждёт сколько-то микросекунд и вырубает этот светодиод обратными операциями. А вот коде для случая, если светодиод гореть не должен, в коде светодиод тушится дважды зачем-то. Либо по невнимательности писавшего, либо чтобы времени одинакого тратилось.

Это если двумерный массив, переданный в функцию таким способом, хавается прогой.

fura
Offline
Зарегистрирован: 31.07.2014

Прикупил для полной картины светодиодную матрицу 8х8.Для начала решил запустить просто бегущий ряд - полоса бегает то вправо, то влево(в общем бегущие огни) вот код 

Возник вопрос как сделать чтобы полоса бегала только с права налево,а не туда сюда?

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Удалить операторы if(upDown==1) и else и ещё один из оставшихся после этого блоков операторов.

Останется либо только

1cylon++;
2if(cylon>=7) upDown=0;

либо 

1cylon--;
2if(cylon==0) upDown=1;

Кто код-то писал? Всего 22 строчки - уж можно как-то в уме его выполнить и прикинуть, что получится.

fura
Offline
Зарегистрирован: 31.07.2014

При выше упомянутом изминении строка действительно бежит в одну из сторон,однако лишь однократно. Наверное нужно добавлять цикл?Нашел вот такой код 

Строка бегает циклически в одном направлении,однако направление её движения слева направо, а хотелось бы справа налево(необходимо это для дальнейшего редактирования скетча и вместо полосы загонять символы).Редактировал код ,но ничего не вышлоДумаю направление(к чему двигаться в разработке бекущей строки из текста) взял правильно?

ПС. код из поста 27 вpят с сайта http://cxem.net

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Так сделать наоборот и всё :)

led=128 вместо единицы изначально, сдвигать  вправо >>. Потом if ( led < 1) led = 128. Даже как-то неудобно объяснять такие вещи.

fura пишет:
Думаю направление(к чему двигаться в разработке бекущей строки из текста) взял правильно?
Логично. Начинать надо с маленького.

fura
Offline
Зарегистрирован: 31.07.2014

Отредактировал код из

 #1 поста на