Как избежать "дребезга" и появления ненужных пикселей
- Войдите на сайт для отправки комментариев
Вс, 10/08/2014 - 12:42
Здравствуйте. С ардуино "общаюсь" совсем недавно,новичек. В просторах интернета нашел статью -"Бегущая строка"на примере светодиодной матрицы и ардуино мега http://habrahabr.ru/post/129569/.
Немного переделав код получил необходимое,однако появился "дребезг" в отображении.Что нужно подправить в коде,чтобы его убрать?Долно читаться слово "Hello" .Спасибо.
const int row[8]={23,25,27,29,31,33,35,37}; const int col[8]={39,41,43,45,47,49,51,53}; int v=1; int dms=800; boolean A[8][23] = {0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0, 0,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0, 0,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0, 0,1,0,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0, 0,1,0,0,1,0,1,1,1,0,1,1,1,0,1,1,1,0,0,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; void setup() { for (int x=0; x<8; x++) { pinMode(row[x],OUTPUT); pinMode(col[x],OUTPUT); } for (int x=0; x<8; x++) { digitalWrite(row[x],HIGH); } } void loop() { paint(A, v); scroll(A); } void paint(boolean screen[8][23], int v) { int x, y; for (int c=0; c <v; c ++) { for (x=0; x<8; x++) for (y=0; y<23; y++) { if (screen[x][y]==1) { digitalWrite(row[x], LOW); digitalWrite(col[y], HIGH); delayMicroseconds(dms); digitalWrite(row[x], HIGH); digitalWrite(col[y], LOW); } else { digitalWrite(row[x], HIGH); digitalWrite(col[y], LOW); delayMicroseconds(dms); digitalWrite(row[x], HIGH); digitalWrite(col[y], LOW); } } } } void scroll(boolean screen[8][23]) { boolean buf[8][1]; for (int x=0; x<8; x++) { buf[x][0]=screen[x][0]; } for (int x=0; x<8; x++) for (int y=0; y<23; y++) { screen[x][y]=screen[x][y+1]; } for (int x=0; x<8; x++) { screen[x][23-1]=buf[x][0]; } }
http://youtu.be/b0Mj7p3GjHA
Один раз уже говорил о таком, но раз уместно, повторюсь. :)
Попробуй заменить digitalWrite на запись в порт. http://tronixstuff.com/2011/10/22/tutorial-arduino-port-manipulation/
Добавлю только, что если нужно писать не все 8 ног сразу, то нужно пользоваться битовыми операциями, чтобы не изменить атрибуты определенных пинов. http://www.arduino.cc/en/Reference/PortManipulation
То есть например, при конфигурации
При записи (PORTx) и чтении (PINx) то же самое.
Через порты пробывал,зажигаются строки полностью или ряды матрицы.При этом возникает нагрев микроконтроллера ардуины.
Посмотрел мельком, по ссылке на хабр один только код. Чего вы там насоединяли, номиналы и прочее - схему бы знать...
И новый код, конечно.
Только у меня 7х6.Измененный код в первом сообщении в спойлере
Схема это хорошо, а в коде что поменялось? Всё те же digitalWrite. Ну и комментировать код полезно, не только для окружающих, но и для себя.
Что касается функций paint и scroll: во-первых, двумерные массивы по уму передаются каким-то другим способом, во-вторых, переменные и массивы row, col, v, dms, A - типа как глобальные, передавать их как аргументы не надо - функции итак их видят.
Куда "+" на схеме цепляется, на 5v ардуины чтоли? Точно греется контроллер, а не стаб?
Вот к примеру такой код
Как я понимаю можно включать только полностью строку и столбцы.Как например букву какую нибудь вывести?
Код ...
... немного напрягает. PORTB - это с 8 до 13, а с 0 до 7 это PORTD, про PORTA вообще не слышал. Какая именно ардуина?
И PORTB конфигурируется, но не используется у вас. :) Таким образом не ясно, какие ноги управляют 315-ми, а какие 361-ми.
Если хочется зажечь светодиод (0;3) например, тогда надо на 315-е надо дать 00000001, а на 361-е дать 11110111 (раз открываются нулём)
ардуина мега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.Как зажечь светодиод это понятно.Не понятно как зажечь несколько светодиодов.К примеру "+"
Так как если дать на 315-ые 0001000, а на 361-ые 00110111 рисунка "+" не получится,а будет светиться только 1 светодиод
Зажечь несколько - поставить несколько единиц (нулей) в соответствующих разрядов регистров портов.
Так как если дать на 315-ые 0001000, а на 361-ые 00110111 рисунка "+" не получится,а будет светиться только 1 светодиод
будут все светодиоды светиться прямоугольниками
на PIC16 в статье со схемы как-то реализуется вращение знака "+"
http://www.radiohlam.ru/program/images/diode_matrix_prg2.gif
Считаю необходимо всетаки использывать массивы вроде
Ну логично, символы/изображения по другому задавать не ахти развлечение. Надо просто придумывать, как на основе этого массива кидать команды на все ноги сразу.
Пример. Просто демонстрация концепции, конкретно под это переделывать надо.
Нашел на вродебы что-то необходимое
Вот код
Все с тем же применением digitalWrite()
Можно заменить
в остальной части не понимаю как на порты перевести
Что-то замена не прошла удачно. Изначальный код(в предидущем сообщении) работает. Чтобы не загромождать код массивами. Наверное надо библиотеку из массивов делать,при чередовании отображаемых символов
Короче, разбейте задачу "перевода на порты" на задачи поменьше, а то я перестал понимать, что здесь происходит.
А с заменой row[8] = {53,52,51,50,10,11,12,13} на DDRB = B11111111... Использование DDRB заменяет восьмикратный вызов функции pinMode(X,OUTPUT). Причём тут массив с номерами ног? Спойлер: ни при чём.
Извиняюсь за "мысли вслух". Пытаюсь отобразить символ "+" во вращении с помощью кода из 18 поста(в спойлере) - путем добавления других массивов в коде.
Получился такой код
void
paint не удалось изменить
http://www.instructables.com/id/Persistence-of-Vision-Wand/
родственная тема.....
Получился такой код
Вместо такого можно сделать просто трехмерный массив, кстати говоря.
Вообще, лучше додумать, как показывать один конкретный кадр. Скетч должен выводить кадр из некого буфера (специального массива) бесконечно долго - тут задача динамической индикации: показать одну строку (столбец) кадра, через какое-то малое время показать следующую и т.д. А формировать сигналы на транзисторы образом, крайне похожим на код из #16 (предчувствуя затык - для PNP "сдвиг нуля" можно сделать побитовой инверсией "~" того, что будет от двигания единицы).
Потом по ходу работы загонять в буфер кадра другую картинку. И пока вы не наворотили дофига вложенных циклов с delay, изучите пример BlinkWithoutDelay.
Честно говоря весь код понимаю смутно. Точнее содержимое функций мне не понятно. Вот к примеру в #22 понятно только, что в setup обявлены порты. В loop порядок вывода значений на табло. Функция paint - вывод на массивов на табло,а то что в этой функции происходит не ясно.
На схему свою в #5 гляньте, код понятнее станет. В #22 в двух циклах просматриваются все 64 ячейки "кадра" (8 столбцов, 8 строк). Если светодиод надо зажечь (в ячейке массива - единица), выставляется единица на базу NPN транзистора и ноль на базу PNP транзистора. Тогда транзисторы открываются, ток течёт, светодиод загорается. Потом контроллер ждёт сколько-то микросекунд и вырубает этот светодиод обратными операциями. А вот коде для случая, если светодиод гореть не должен, в коде светодиод тушится дважды зачем-то. Либо по невнимательности писавшего, либо чтобы времени одинакого тратилось.
Это если двумерный массив, переданный в функцию таким способом, хавается прогой.
Прикупил для полной картины светодиодную матрицу 8х8.Для начала решил запустить просто бегущий ряд - полоса бегает то вправо, то влево(в общем бегущие огни) вот код
Возник вопрос как сделать чтобы полоса бегала только с права налево,а не туда сюда?
Удалить операторы if(upDown==1) и else и ещё один из оставшихся после этого блоков операторов.
Останется либо только
либо
Кто код-то писал? Всего 22 строчки - уж можно как-то в уме его выполнить и прикинуть, что получится.
При выше упомянутом изминении строка действительно бежит в одну из сторон,однако лишь однократно. Наверное нужно добавлять цикл?Нашел вот такой код
Строка бегает циклически в одном направлении,однако направление её движения слева направо, а хотелось бы справа налево(необходимо это для дальнейшего редактирования скетча и вместо полосы загонять символы).Редактировал код ,но ничего не вышлоДумаю направление(к чему двигаться в разработке бекущей строки из текста) взял правильно?
ПС. код из поста 27 вpят с сайта http://cxem.net
Так сделать наоборот и всё :)
led=128 вместо единицы изначально, сдвигать вправо >>. Потом if ( led < 1) led = 128. Даже как-то неудобно объяснять такие вещи.
Отредактировал код из
#1 поста на