Связка Mega2560 с p10 led module
- Войдите на сайт для отправки комментариев
Сб, 23/03/2013 - 04:02
Только начинаю юзать Ардуино.
Вот приобрел кит набор ARDUINO http://www.dhgate.com/arduino-experimentation-kits2-with-arduino/p-ff808...
и 3 ЛЕД панели http://www.dhgate.com/wholesale-10mm-pixel-led-screen-display-semi/p-ff8...
Направте плиз на путь истинный как скрестить два девайса и получить типа бегущей строки или просто вывода информации по заданной программе. Про контроллеры к этим панелям я знаю и у меня их нет.
Вы бы дали ссылку на описание/схему/распиновку этой панели, ибо по фото нельзя определить как их подключать.
Ну кроме двух клем - к ним нужно подключить питание 5 вольт.
http://www.ebay.com/itm/Red-LED-Display-Module-Window-Sign-P10-16X32-Mat...
Очень похоже, что это одно и то же.
В таком случае, порядок работы примерно такой (я когда-то пытался разбираться с теми, которые на моей ссылке):
0)Подключаем панель на свои пять вольт, соединяем земли модуля (3,5,7,9,11,13,15 пины) и ардуины.
1)Устанавливаем row latch (пин 10)
2)на пины A и B посылаем нули (первая логическая строка, видим это соответствует первыч четырем физическим строкам)
3)Посылаем128 бит данных, каждый раз дергая CKД (данные - пин 12, CKL - пин 8)
4)Отпускаем latch.
Если эксперимент с одной строкой прошел успешно - в цикле по очереди ставим все 4 строки.
Вместо ручной отсылки 128 бит данных можно попробовать писать их через библиотеку для SPI
Как только одиночное табло будт освоено - соединяем последовательно два (три) табло и действуем так же, но куски данных получаются по 256 (384) бита.
Спасибо tsostik!!! Начал въезжать понемногу. Вот накидал код:
Пока плохо работает (при заполнении массива 0 панель блымкает некоторыми строками, при 1 горит тускло вся панель). Я только смог добиться вывода одного пикселя по координатм (в другом коде). Сейчас я хочу заполнить матрицу из массива (1 горит 0 не горит пиксел). Возможно я не понимаю ну например:
1)Устанавливаем row latch (пин 10) - я делаю digitalWrite(sclk, LOW);
4)Отпускаем latch. - я делаю digitalWrite(sclk, HIGH);
3)Посылаем128 бит данных, каждый раз дергая CKД - тут я в своем замудренном цикле (он соответствует расположению 4 столбца по 8 светодиодов и 4 логических А и В) 128 раз обрабатываю digitalWrite(r, LOW); или digitalWrite(r, HIGH); причем дергая
Вопрос такого характера- правильно ли я посылаю данные R и дергаю CKL?
К сожалению, у меня нет в руках такой матрицы, я остановился на другой модели, да и та еще не доехала, так что все мои рассуждения могут быть тольк теоретическими.
Насколько я понимаю, отпускать latch надо после того, как мы отослали все необходимые данные (для одной псевдостроки (из четырех реальных)).
Чуть позже попробую накидать код, как он должен выглядеть по моему мнению и выложу.
Мне самому интересно, что из этого получится.
Кстати, посмотрите плз на панель, какая маркировака стоит на микросхемах сдвиговых регистров?
Может вообще идеально сфоторгафировать заднюю сторону в максимальном разрешении. (Чтобы не засорять форму, пришлите плз на tsostik@mail.ru)
Фото не получиться. У меня из фото только сотовый китайский, мегапикселов не хватит. Микросхемы 8 шт TM74HC595, 1шт SM74HC2450, и еще 6шт мелких плохо видно. На самой панели маркировка CAI LIANG P10(1R)-V901A и еще 100001/4 PCB05 XYTECH
Сейчас буду пробовать как Вы посоветовали на счет псевдострок. Результат выложу позднее.
Предлагаю начинать с простого.
Сейчас должен гореть один диод - верхний левый.
Работает?
Горят все в псевдостроке кроме выше указанного. Короче все наоборот.
for(i=0; i<127; i++) //127 нулей
{
digitalWrite(data, HIGH);
pulseClock();
}
digitalWrite(data, LOW); //и одна единица
pulseClock();
digitalWrite(sclk, LOW);
Вот так все норм.
Получилось. Косяк был у меня с массивом. Ну и советы помогли. Вот код:
Теперь дело за малым, чистое программирование. Буду выносить все это в функцию и приводить к системе координат x,y. Типо видео дисплея.
Результаты буду выкладывать.
Не забывайте только, что индикация динамическая, то есть как только вы зажигаете одну строку, остальные должны погаснуть.
Хотя, я по размышлениям в этом уже не уверен. Попробуйте в конец скетча поставить что-то типа delay(10000) и посмотреть, что будет светиться во время этих десяти секунд?
Сначало код:
tsostik на твою почту скинул видео. Задержка стоит 0,5 сек.
Возникла проблема наверно с выводом четырех псевдострок. Я сделал квадрат 11х11. Результат на фото:
Как-то не получается квадрат. Идет смещение по у.
Прикол в том когда я вывожу псевдостроки по отдельности меняя в цикле strlog = 0,1,2,3 и соответственно strlog <= 0,1,2,3 то все замечательно.
Вот фото в хронологии с псевдостроками:
Интересно а для чего нужен пин 1 ОЕ на панели? Может с ним надо тоже манипуляции произвести.
Похоже, вы где-то намудрилис координатами.
Я не очень понял логики устройства четырехмерного массива, поэтому предлагаю такой вариант:
Если что, заранее извиняюсь за возможные синтакические ошибки - я на работе и даже не могу проверить, что код компилируется.
Но вроде все должно быть ОК.
Опять же, нигде не вставлена проверка ошибок входных данных и жестко зашито, что все работает только для одной матрицы.
Если все будет ОК, можно будет чуть допилить код и сделать из него вполне работоспособное API.
Это output enableб нужен для того, чтобы несколько независимых панелей можно было управлять общими шинами данных (стандартный пин любого сдвиговово регистра)
Ваш код с координатами тоже хромает возможно что вы не знаете как идет псевдострока по панели. Вот нарисовал в поинте (не смейтесь сильно :) )
Я же говорю - пишу "на ощупь". Тут надо пробоваь от простого к сложному.
Сейчас сообразил, что не в том порядке посылаю биты для отдельных диодов.
Попробуйте поменять функцию display на вот такую:
То есть посылать данные "с конца", а не "с начала".
Ну и опять же, хочется видеть, что получается в результате (учтите только, что из-за динамической индикации на фотографии скорее всего будет гореть только одна логическая строчка).
Опять же, неплохо выяснить, какая все-таки индикация на панели - гаснет ли старая строчка, когда мы посылаем данные для новой (по идее, должна гаснуть).
с одной из каждой псевдострок у меня проблем нет, а вот в связке хотябы с двумя псевдостроками начинает съезжать пикселы и на том месте где должны стоять горят точки очень слабо.
Покажите, плз, картинку, что горит при работе моего скетча (с измененной функцией display)?
каждый раз по разному отоброжает но в одной псевдостроке
а можешь объяснить вычесление или ссылку где это понять можно
px = x >> 2;
py = x & 3 + y >> 2;
чет я не знаю таких операторов
Выявил следующее: после записи псевдостроки она не гаснет потом когда идет переключение псевдостроки на следующую она гаснет но почемуто отображается копия в новой псевдостроке
Сделал. Надо перед переключением псевдострок стирать информацию с псевдостроки с которой переходим. Вот рабочий код вывода квадрата 11х11
x >> 2 - сдвинуть x на два бита вправо (эквивалентно тому, чтобы взять целую часть от деления на 4)
x & 3 - побитовое "И" - в данном случае взять два младших бита, оно же эквивалентно взятию остатка от деления на 4
Копия старой стоки отображается в новой потому что перед переключением строки надо ставить latch
В противном случае старое содержимое всех сдвиговых регистров сохраняется и отображается в новой строке
Защелку надо ставить ДО того, как устанавливаем адрес строки, а отключать ПОСЛЕ того, как отослали все данные. Как только защелка будет отпущена отосланные данные отобразятся в строке.
Вот две фигурки. Теперь надо заняться оптимизацией кода.
Посмотрел на код и что-то не понял, зачем в функции disp после отрисовки строки ее гасить?
без гашения строки она все равно появляется в новой строке. Я уже по всякому с защелкой наигрался, результата нет. Возможно особенность этих панелий такая. Я понимаю что лишний код на производительность влияет, но без этого никуда.
Сейчас сижу русские буквы кодирую размером 5х7 точек.
Вопрос: Как лучше организовать ввод данных на Ардуино для моего случая с панелью. Ну типа надо написать "ПРИВЕТ". Клаву ведь можно подцепить к ардуино?
Я подозреваю, что надо аккуратно с защелкой все таки разобраться. Может быть, она active low?
для этого нужно залить совсем короткий скетч типа
То есть включаем пиксели "через один" в одной логической строке.
Обратите внимание, что latch обратно не восстанавливаем.
Отображается ли так что нибудь? Если да, то вместо
пишем
Таким образом можно выяснить, при каком вообще уровне срабатывает защелка и срабатывает ли вообще?
Может она просто не к тому пину прицеплена?
Насчет клавиатуры - http://cxem.net/arduino/arduino22.php
За ссылку спасибо. Возьму на вооружение.
Еще раз убедился что сначало
digitalWrite(latch, HIGH)
в конце
digitalWrite(latch, LOW);
и когда делаем паузу строка остается гореть. Потом когда мы хотим перейти на следующую строку
но пока не записываем данные в нее, происходит копия предыдущей строки в новой.
В этом коде 2 строчки мигают поочередно с интервалом 1 сек.
То-есть надо гасить первую строчку перед переключением. Защелкой она не гасится! Так что приходиться записывать нули для стирания.
А вам какая панель идет?
Черт, я сообразил, что был неправ насчет предназначения защелки и OE.
В надо кажется чуть чуть поменять алгоритм.
Все-таки контакт OE нужен - он переводит выводы строки в HI-Z состояние, гася светодиоды.
То есть алгоритм чуть меняется:
1)Пишем адрес строки
2)Подаем единицу на OE
3)Заполняем строку данными (по прежнему через тактовые импульсы)
4)Подаем ноль на OE В этот момент строка включается.
А защелка нужна только в ситуации, когда мы работаем с одной единственной строкой и не включаем OE.
Прошу прощения за невольную дезинформацию.
Панель мне едет вот такая: http://www.sureelectronics.net/goods.php?id=1122
Выбрал ее потому что она двухцветная и с подробным описанием, как с ней работать.
Не работает и так. ОЕ просто отключает и включает свет, на логику регистров он не влияет. Короче если сталкнетесь с такой проблемой на своих модулях то просто стирайте строки. Я уже все перепробовал. 3 дня подряд.
Сейчас столкнулся с проблемой. Переменные могут запоминать русские буквы?
Подключил вторую панель, тоесть подключил следущую проблему на свою голову :)
Передаю в 2 раза больше, а вторая панель молчит. Подстыковал все последовательно со второго разъема, а-а в-в масса-масса ну и т.д.
По поводу русских букв. ArduinoIDE хранит русские буквы в кодировке utf8. Если для вывода нужна другая кодировка, придется перекодировать.
То есть данные по первой панели проходят, а по второй нет?
Для начала я бы посмотрел, есть ли нужный сигнал на пинах выхода первой панели. Напрмер, просто на все значимые пины повесить по светодиоду (через резистор) и посмотреть, что и как горит.
Тут пригодится тестовый скетч примерно следующего содержания:
Который записывает биты по одному по команде извне.
Это позволит посмотреть, в какой момент какие значения на выходе.
Еще лучше эти пины запихать на вход свободных пинов ардуины, считывать их каждый шаг и писать в сериалпорт для отладки и анализа. Пин часов лучше CKL вообще на осциллограф повесить, чтобы проверить, проходят ли импульсы синхронизации.
Извени меня, моя ошибка. Я когда с одной панелью работал, питание на нее не подовал, ардуино ее запитывала сама. Для второй панели пришлось уже подовать питание. Но пока до меня дошло я с светодиодами поигрался так примерно 3-4 часа. Прикольно так, моргают в такты.
Надо что то дальше думать на счет псевдострок, так как мерцание появляется. Обработки стало больше в 2 раза, а если больше панелий подключить то вообще мигать начнет.
У меня есть задумка:
в void setup()
1. гасим панель ОЕ
2. записываем во все псевдостроки информуху
в void loop()
1. вкл панель ОЕ
2. Просто перебираем все псевдостроки
На скорую руку накидал код, пока не получается.
Нашел в инете схожее http://www.jonshouse.co.uk/ledsign.cgi
Надо в коде там разобраться и я думаю все получиться.
Попробуй на вход OE подцепить кнопку одной ногой на землю, второй ногой на вход и одновременно через подтяжку 10К на +5 ардуины.
После чего запустить скетч, который что-то рисует и посмотреть, что происходит при нажатии кнопки. Теоретически,табло должно гаснуть (точнее должна гаснуть активная строка,
но учитывая то, что в любой момент времени горит одна строка, гаснуть будет все табло). А практически?
Или при установке выходов a и b дописать что-то типа
В этом случае одна псевдострока (видимо, вторая сверху) должны быть постоянно выключена. Это так?
Вот что нарыл (перевод с китайского)
светодиодный дисплей над буквами объяснить
Светодиодный дисплей общее понимание сигнал
тактового сигнала CLK: подается в регистр сдвига сдвига импульсов, каждый импульс будет вызывать данные в или из. Порт на данных должны быть согласованы с тактового сигнала для нормальной передачи данных, частота сигнала данных должна быть 1/2 раза частоту тактового сигнала. В любом случае, когда тактового сигнала является ненормальным, сделать весь табло дезорганизованы.
STB сигнала защелки: данные в регистр сдвига на защелку, и его содержание данных через приводной цепи горит светодиодный дисплей. Тем не менее, схема привода по сигналу управления EN включить, освещение ее посылка должна быть включена в открытом состоянии. Защелка сигнал также нуждаются в координации тактового сигнала для того, чтобы увидеть полное изображение. В любом случае, когда защелка сигнал аномалии сделает весь борт дезорганизованы.
EN разрешающий сигнал: весь экран регулировки яркости сигнал также используется для отображения гашения.Пока вы можете управлять яркостью изменения настройки рабочего цикла. Когда разрешающий сигнал при возникновении исключения, весь экран будет появляться яркие, темные, яркие или задней.
Данные сигнала: обеспечение визуального отображения необходимых данных. Должны быть согласованы с тактового сигнала для того, чтобы передать данные в любой части дисплея пунктов. Вообще отделена от красного, зеленого и синего данных на дисплее сигнала к сигналу данных замкнут на положительный или отрицательный, соответствующий цвет появится полная ярких или не яркий цвет, соответствующий когда данные сигнала вакантные Ситуация переменной.
ABCD сигналы линии: дисплей только существует только в динамическом сканировании, ABCD является двоичные числа, это младший бит, и если двоичное представление ABCD сигнал для управления максимальный диапазон линии 16 (1111), 1/4 тех пор, как сканирование AB сигнал может , потому что диапазон сигнала AB на четыре линии (11). Линия сигнала управления ненормальное явление покажет дислокации, подсветка или изображение перекрытия.
R красный G зеленая B синяя
Кстати, я тут подумал, что мерцание экрана может быть связано с тем, что дуина не успевает обновлять строки с нужной частотой.
Для того, чтобы глаз не видел мерцания, диоды должны загораться с частотой не менее 50 ГЦ, что дает 20мс на цикл обновления экрана.
За один цикл нужно сделать (для двух табло, соединенных последовательно) минимум 3072 digitalWrite'ов. (Это записать данные для всех диодов и передернуть clock). В Вашем варианте с записью нулей между переходами - уже 6144 записи.
Судя по всему, один цикл в получется гораздо дольше.
Попробуйте добавить Serial.println(misros()) первым вызовом в loop и посмотреть на время?
Будем ускорять digitalWrite'ы прямой записью в регистры. По грубым прикидкам должно остаться не более 10мс на цикл, чего с лихвой хватит для отрисовки и даже оставится время для работы контроллера по собственно генерации отображения.
Вот нашел на просторах инета то что надо.
http://we.easyelectronics.ru/woddy/kontroller-svetodiodnogo-tablo.html
Буду тестить.
Все теперь работает отлично. Вот код:
Результат кода:
Выводит на 2 матрицы поочередно 4 слова.
Фото:
PS
Кодировал слова в EXCELE http://yadi.sk/d/5fKwB0Xx4GkG1
Приехал такой дисплей с taobao.com с матрицей RGB 16x32
В комплекте свой контроллер с часами, датчиком DHT11 и инфракрасным диодом. С ним все работает.
Как бы это чудо пдключить к Arduino?
Дисплей явно вручную паяли
Разъем 20pin, из них 10 - земля.
Остальные промаркированы:
G, CLK, STR, R, BD, C, B, A, E, BD
Контролер сделан поаккуратнее
Тот же разъем промаркирован немного подругому:
G1, SCR, STR, R1, R2, C, B, A, EN, G2
Вот думаю, куда копать, чтобы приспособить эту железку.
И нужно ли по уровням согласовывать? Дисплей питается от своего блока 5В, но когда к дискретным разъемам Arduino подключаю вместе с землей - загорается светодиод питания, хоья контролер отключен от питания и USB.
Я попробовал этот код, но не было две фигурки как вам фотографии.
Может быть, я неправильно подключен Arduino c DMD. Вот как это кажется в моей схеме:
правильно или нет?
Вот две фигурки. Теперь надо заняться оптимизацией кода.
Я попробовал этот код, но не было две фигурки как вам фотографии.
Может быть, я неправильно подключен Arduino c DMD. Вот как это кажется в моей схеме:
правильно или нет?
Я извиняюсь за спам. Я не знаю, как удалить сообщение.
Вроде все правильно. Я советую брать код из сообщения №40. Оно самое идеальное.
Есть готовая библиотека для работы с массивами этих панелей. https://github.com/freetronics/DMD
Подключил по этой схеме к ардуино UNO и у меня выводится хаос какой-то. Не работает пример. Что может быть не так? Обязательно надо на GROUND все ножки ставить?
Как организовать работу 4х модулей расположенных следующим образом:
1 2
3 4
Где почитать как работать с этой библиотекой? Чего-то я не могу разобраться.
А схема подключения там такая же как указаная в этой ветке? У меня пример из библиотеки работает как-то некорректно.