Связка Mega2560 с p10 led module
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- …
- следующая ›
- последняя »
- Войдите на сайт для отправки комментариев
Сб, 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!!! Начал въезжать понемногу. Вот накидал код:
01
int
sclk = 8;
02
int
a = 11;
03
int
b = 12;
04
int
r = 10;
05
int
ckl = 9;
06
int
z = 0;
//задержка
07
char
matrix[8][4][4][4];
08
int
piksel;
09
10
void
setup
() {
11
pinMode(sclk, OUTPUT);
12
pinMode(a, OUTPUT);
13
pinMode(b, OUTPUT);
14
pinMode(r, OUTPUT);
15
pinMode(ckl, OUTPUT);
16
for
(
int
stolb=1; stolb <= 4; stolb++) {
17
for
(
int
strpix=1; strpix <= 4; strpix++) {
18
for
(
int
strlog=1; strlog <= 4; strlog++) {
19
for
(
int
pix=1; pix <= 8; pix++) {
20
matrix[pix][strlog][strpix][stolb]=0;
21
}
22
}
23
}
24
}
25
}
26
27
28
void
loop
() {
29
for
(
int
stolb=1; stolb <= 4; stolb++) {
30
for
(
int
strpix=1; strpix <= 4; strpix++) {
31
for
(
int
strlog=1; strlog <= 4; strlog++) {
32
for
(
int
pix=1; pix <= 8; pix++) {
33
piksel=matrix[pix][strlog][strpix][stolb];
34
digitalWrite(sclk, LOW);
35
if
(strlog == 1) {
36
digitalWrite(a, HIGH);
37
digitalWrite(b, HIGH);
38
}
39
if
(strlog == 2) {
40
digitalWrite(a, LOW);
41
digitalWrite(b, HIGH);
42
}
43
if
(strlog == 3) {
44
digitalWrite(a, HIGH);
45
digitalWrite(b, LOW);
46
}
47
if
(strlog == 4) {
48
digitalWrite(a, LOW);
49
digitalWrite(b, LOW);
50
}
51
digitalWrite(ckl, HIGH);
52
digitalWrite(ckl, LOW);
53
if
(piksel == 1){
54
digitalWrite(r, LOW);
55
}
56
else
{
57
digitalWrite(r, HIGH);
58
}
59
digitalWrite(sclk, HIGH);
60
61
62
}
63
}
64
}
65
}
66
67
delay(z);
68
}
Пока плохо работает (при заполнении массива 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); причем дергая
1
digitalWrite(ckl, HIGH);
2
digitalWrite(ckl, LOW);
Вопрос такого характера- правильно ли я посылаю данные R и дергаю CKL?
К сожалению, у меня нет в руках такой матрицы, я остановился на другой модели, да и та еще не доехала, так что все мои рассуждения могут быть тольк теоретическими.
Насколько я понимаю, отпускать latch надо после того, как мы отослали все необходимые данные (для одной псевдостроки (из четырех реальных)).
Чуть позже попробую накидать код, как он должен выглядеть по моему мнению и выложу.
Мне самому интересно, что из этого получится.
Кстати, посмотрите плз на панель, какая маркировака стоит на микросхемах сдвиговых регистров?
Может вообще идеально сфоторгафировать заднюю сторону в максимальном разрешении. (Чтобы не засорять форму, пришлите плз на tsostik@mail.ru)
Фото не получиться. У меня из фото только сотовый китайский, мегапикселов не хватит. Микросхемы 8 шт TM74HC595, 1шт SM74HC2450, и еще 6шт мелких плохо видно. На самой панели маркировка CAI LIANG P10(1R)-V901A и еще 100001/4 PCB05 XYTECH
Сейчас буду пробовать как Вы посоветовали на счет псевдострок. Результат выложу позднее.
Предлагаю начинать с простого.
01
int
sclk = 8;
02
int
r0 = 11;
03
int
r1 = 12;
04
int
data = 10;
05
int
ckl = 9;
06
07
void
pulseClock()
//передергиваем линию clock
08
{
09
digitalWrite(ckl, HIGH);
//включаем
10
__asm volatile (
//ждем один такт. Скорее всего, можно и без этого, но на всякий случай
11
"nop\n"
12
);
13
digitalWrite(ckl, LOW);
//выключаем
14
}
15
16
void
setup
()
17
{
18
pinMode(sclk, OUTPUT);
19
pinMode(r0, OUTPUT);
20
pinMode(r1, OUTPUT);
21
pinMode(data, OUTPUT);
22
pinMode(ckl, OUTPUT);
23
}
24
25
void
loop
()
26
{
27
unsigned
int
i;
28
digitalWrite(sclk, HIGH);
//закрываем защелку
29
digitalWrite(r0, LOW);
//первая строка
30
digitalWrite(r1, LOW);
31
for
(i=0; i<127; i++)
//127 нулей
32
{
33
digitalWrite(data, LOW);
34
pulseClock();
35
}
36
digitalWrite(data, HIGH);
//и одна единица
37
pulseClock();
38
digitalWrite(sclk, LOW);
39
}
Сейчас должен гореть один диод - верхний левый.
Работает?
Горят все в псевдостроке кроме выше указанного. Короче все наоборот.
for(i=0; i<127; i++) //127 нулей
{
digitalWrite(data, HIGH);
pulseClock();
}
digitalWrite(data, LOW); //и одна единица
pulseClock();
digitalWrite(sclk, LOW);
Вот так все норм.
Получилось. Косяк был у меня с массивом. Ну и советы помогли. Вот код:
01
int
sclk = 8;
02
int
a = 11;
03
int
b = 12;
04
int
r = 10;
05
int
ckl = 9;
06
char
matrix[8][4][4][4];
07
int
piksel;
08
09
void
setup
() {
10
pinMode(sclk, OUTPUT);
11
pinMode(a, OUTPUT);
12
pinMode(b, OUTPUT);
13
pinMode(r, OUTPUT);
14
pinMode(ckl, OUTPUT);
15
// Заполняем массив для матрицы 1- горит, 0-не горит
16
for
(unsigned
int
strlog = 0; strlog <= 3; strlog++) {
17
for
(unsigned
int
stolb = 0; stolb <= 3; stolb++) {
18
for
(unsigned
int
strpix = 0; strpix <= 3; strpix++) {
19
for
(unsigned
int
pix = 0; pix <= 7; pix++) {
20
matrix[pix][strlog][strpix][stolb]=1;
// 1- горит, 0-не горит
21
}
22
}
23
}
24
}
25
}
26
27
28
void
loop
() {
29
for
(unsigned
int
strlog = 0; strlog <= 3; strlog++) {
30
digitalWrite(sclk, HIGH);
31
if
(strlog == 0) {
32
digitalWrite(a, HIGH);
33
digitalWrite(b, HIGH);
34
}
35
if
(strlog == 1) {
36
digitalWrite(a, LOW);
37
digitalWrite(b, HIGH);
38
}
39
if
(strlog == 2) {
40
digitalWrite(a, HIGH);
41
digitalWrite(b, LOW);
42
}
43
if
(strlog == 3) {
44
digitalWrite(a, LOW);
45
digitalWrite(b, LOW);
46
}
47
for
(unsigned
int
stolb=0; stolb <= 3; stolb++) {
48
for
(unsigned
int
strpix=0; strpix <= 3; strpix++) {
49
for
(unsigned
int
pix=0; pix <= 7; pix++) {
50
piksel=matrix[pix][strlog][strpix][stolb];
51
if
(piksel == 1){
52
digitalWrite(r, LOW);
53
}
54
else
{
55
digitalWrite(r, HIGH);
56
}
57
digitalWrite(ckl, HIGH);
58
digitalWrite(ckl, LOW);
59
}
60
}
61
}
62
digitalWrite(sclk, LOW);
63
}
64
}
Теперь дело за малым, чистое программирование. Буду выносить все это в функцию и приводить к системе координат x,y. Типо видео дисплея.
Результаты буду выкладывать.
Не забывайте только, что индикация динамическая, то есть как только вы зажигаете одну строку, остальные должны погаснуть.
Хотя, я по размышлениям в этом уже не уверен. Попробуйте в конец скетча поставить что-то типа delay(10000) и посмотреть, что будет светиться во время этих десяти секунд?
Сначало код:
001
int
sclk = 8;
//пин 8
002
int
a = 11;
//пин 11
003
int
b = 12;
//пин 12
004
int
r = 10;
//пин 10
005
int
ckl = 9;
//пин 9
006
char
matrix[4][4][4][8];
// массив матрицы
007
int
piksel;
// состояние ячейки в массиве матрицы 0-1
008
int
x;
// координаты 0-31
009
int
y;
// координаты 0-15
010
int
strlog;
// псевдостроки 0-3
011
int
stolb;
// столбец 0-3
012
int
strpix;
// строка в столбце одной псевдостроки 0-3
013
int
pix;
// пиксель 1-8
014
015
// заполнение дисплея из массива матрицы
016
void
disp(){
017
for
(
int
strlog = 0; strlog <= 3; strlog++) {
018
digitalWrite(sclk, LOW);
019
if
(strlog == 0) {
020
digitalWrite(a, HIGH);
// 0 псевдострока
021
digitalWrite(b, HIGH);
022
}
023
if
(strlog == 1) {
024
digitalWrite(a, LOW);
// 1 псевдострока
025
digitalWrite(b, HIGH);
026
}
027
if
(strlog == 2) {
028
digitalWrite(a, HIGH);
// 2 псевдострока
029
digitalWrite(b, LOW);
030
}
031
if
(strlog == 3) {
032
digitalWrite(a, LOW);
// 3 псевдострока
033
digitalWrite(b, LOW);
034
}
035
for
(
int
stolb=0; stolb <= 3; stolb++) {
036
for
(
int
strpix=0; strpix <= 3; strpix++) {
037
for
(
int
pix=0; pix <= 7; pix++) {
038
piksel=matrix[strlog][stolb][strpix][pix];
039
if
(piksel == 1){
040
digitalWrite(r, LOW);
// рисует точку
041
}
042
else
{
043
digitalWrite(r, HIGH);
// не рисует точку
044
}
045
digitalWrite(ckl, HIGH);
046
digitalWrite(ckl, LOW);
047
}
048
}
049
}
050
digitalWrite(sclk, HIGH);
051
}
052
}
053
054
// очистка матрицы
055
void
cls(){
056
for
(
int
strlog = 0; strlog <= 3; strlog++) {
057
for
(
int
stolb = 0; stolb <= 3; stolb++) {
058
for
(
int
strpix = 0; strpix <= 3; strpix++) {
059
for
(
int
pix = 0; pix <= 7; pix++) {
060
matrix[strlog][stolb][strpix][pix]=0;
061
}
062
}
063
}
064
}
065
}
066
067
// запись в массив матрицы по x,y
068
void
zapis(
int
x1,
int
y1){
069
int
strlog1 = y1-(y1/4)*4;
070
int
stolb1 = x1/8;
071
int
strpix1 = y1/4;
072
int
pix1 = x1-(x1/8)*8;
073
matrix[strlog1][stolb1][strpix1][pix1] = 1;
074
}
075
076
void
setup
() {
077
pinMode(sclk, OUTPUT);
078
pinMode(a, OUTPUT);
079
pinMode(b, OUTPUT);
080
pinMode(r, OUTPUT);
081
pinMode(ckl, OUTPUT);
082
// Очистка матрицы
083
cls();
084
disp();
085
}
086
087
088
void
loop
() {
089
// рисуем квадрат 11х11
090
for
(
int
y = 0; y <= 10; y++) {
091
zapis(0,y);
092
zapis(10,y);
093
}
094
for
(
int
x = 0; x <= 10; x++) {
095
zapis(x,0);
096
zapis(x,10);
097
}
098
disp();
099
delay(0);
100
}
tsostik на твою почту скинул видео. Задержка стоит 0,5 сек.
Возникла проблема наверно с выводом четырех псевдострок. Я сделал квадрат 11х11. Результат на фото:
Прикол в том когда я вывожу псевдостроки по отдельности меняя в цикле strlog = 0,1,2,3 и соответственно strlog <= 0,1,2,3 то все замечательно.
1
// заполнение дисплея из массива матрицы
2
void
disp(){
3
for
(
int
strlog = 0; strlog <= 3; strlog++) {
Вот фото в хронологии с псевдостроками:
Интересно а для чего нужен пин 1 ОЕ на панели? Может с ним надо тоже манипуляции произвести.
Похоже, вы где-то намудрилис координатами.
Я не очень понял логики устройства четырехмерного массива, поэтому предлагаю такой вариант:
01
#define LATCH 8 //sclk на плате
02
#define R0 11 //low bit of row addres на плате
03
#define R1 12 //ршпр bit of row addres на плате
04
#define DATA 10 //red data на плате
05
#define CLOCK 9 //ckl на плате
06
07
unsigned
char
videoMem[128][4];
//Псевдовидеопамять, в боевом проекте можно будет использовать
08
//все биты, а не по одному в байте, но пока и так сойдет
09
10
void
pulseClock()
//Передернуть clock
11
{
12
digitalWrite(CLOCK, HIGH);
13
digitalWrite(CLOCK, LOW);
14
}
15
16
void
setPixel(unsigned
char
x, unsigned
char
y, unsigned
char
state)
17
//Устонавливаем пиксель по координатам x, y в состояние state
18
//входные координаты у нас будут в "физическом пространстве"
19
//(то есть для одной панели - x : 0..31, y : 0..15)
20
//Начало координат - левый верхний угол
21
//Для удобства state==0 будет обозначать "не горит", а state==1 - "горит"
22
//в функции физического отображения не забудем инвертировать биты
23
{
24
unsigned
char
px;
25
unsigned
char
py;
26
27
px = x >> 2;
28
py = x & 3 + y >> 2;
29
videoMem[px][py] = (state ? 1 : 0);
//чтобы принимать любое ненулевое значение
30
}
31
32
void
display()
33
//отображаем содержимое видеопамяти на экран
34
{
35
unsigned
char
x, y;
36
for
(y=0;y<4; y++)
37
{
38
digitalWrite(LATCH, HIGH);
//ставим защелку
39
digitalWrite(R0, ((y & 1) ? HIGH : LOW) );
//младший бит адреса
40
digitalWrite(R1, ((y & 2) ? HIGH : LOW) );
//старший бит адреса
41
for
(x=0;x<32; x++)
42
{
43
digitalWrite(DATA, ( (videoMem[x][y]) ? LOW : HIGH) );
//записали инвертированный сигнал
44
pulseClock();
45
}
46
digitalWrite(LATCH, HIGH);
//отпускаем защелку
47
}
48
}
49
50
void
setup
()
51
{
52
unsigned
char
i;
53
//Инициализация пинов
54
pinMode(LATCH, OUTPUT);
55
pinMode(R0, OUTPUT);
56
pinMode(R1, OUTPUT);
57
pinMode(DATA, OUTPUT);
58
pinMode(CLOCK, OUTPUT);
59
//Инициализация видеопамяти
60
for
(i=0; i < 32, i++)
61
{
62
videoMem[i][0] = videoMem[i][1] = videoMem[i][2] = videoMem[i][3] = 0;
63
};
64
//Рисуем квадрат
65
for
(i = 0; i < 11; i++)
66
{
67
setPixel(0, i, 1);
68
setPixel(i, 0, 1);
69
setPixel(10, i, 1);
70
setPixel(i, 10, 1);
71
}
72
}
73
74
void
loop
()
75
{
76
display();
77
}
Если что, заранее извиняюсь за возможные синтакические ошибки - я на работе и даже не могу проверить, что код компилируется.
Но вроде все должно быть ОК.
Опять же, нигде не вставлена проверка ошибок входных данных и жестко зашито, что все работает только для одной матрицы.
Если все будет ОК, можно будет чуть допилить код и сделать из него вполне работоспособное API.
Это output enableб нужен для того, чтобы несколько независимых панелей можно было управлять общими шинами данных (стандартный пин любого сдвиговово регистра)
Ваш код с координатами тоже хромает возможно что вы не знаете как идет псевдострока по панели. Вот нарисовал в поинте (не смейтесь сильно :) )
Я же говорю - пишу "на ощупь". Тут надо пробоваь от простого к сложному.
Сейчас сообразил, что не в том порядке посылаю биты для отдельных диодов.
Попробуйте поменять функцию display на вот такую:
01
void
display()
02
//отображаем содержимое видеопамяти на экран
03
{
04
unsigned
char
x, y;
05
for
(y=0;y<4; y++)
06
{
07
digitalWrite(LATCH, HIGH);
//ставим защелку
08
digitalWrite(R0, ((y & 1) ? HIGH : LOW) );
//младший бит адреса
09
digitalWrite(R1, ((y & 2) ? HIGH : LOW) );
//старший бит адреса
10
for
(x=31;x>=0; x--)
11
{
12
digitalWrite(DATA, ( (videoMem[x][y]) ? LOW : HIGH) );
//записали инвертированный сигнал
13
pulseClock();
14
}
15
digitalWrite(LATCH, HIGH);
//отпускаем защелку
16
}
17
}
То есть посылать данные "с конца", а не "с начала".
Ну и опять же, хочется видеть, что получается в результате (учтите только, что из-за динамической индикации на фотографии скорее всего будет гореть только одна логическая строчка).
Опять же, неплохо выяснить, какая все-таки индикация на панели - гаснет ли старая строчка, когда мы посылаем данные для новой (по идее, должна гаснуть).
с одной из каждой псевдострок у меня проблем нет, а вот в связке хотябы с двумя псевдостроками начинает съезжать пикселы и на том месте где должны стоять горят точки очень слабо.
Покажите, плз, картинку, что горит при работе моего скетча (с измененной функцией display)?
каждый раз по разному отоброжает но в одной псевдостроке
а можешь объяснить вычесление или ссылку где это понять можно
px = x >> 2;
py = x & 3 + y >> 2;
чет я не знаю таких операторов
Выявил следующее: после записи псевдостроки она не гаснет потом когда идет переключение псевдостроки на следующую она гаснет но почемуто отображается копия в новой псевдостроке
Сделал. Надо перед переключением псевдострок стирать информацию с псевдостроки с которой переходим. Вот рабочий код вывода квадрата 11х11
01
int
sclk = 8;
//пин 8
02
int
a = 11;
//пин 11
03
int
b = 12;
//пин 12
04
int
r = 10;
//пин 10
05
int
ckl = 9;
//пин 9
06
int
oe = 7;
//пин 7
07
char
matrix[4][4][4][8];
// массив матрицы
08
int
piksel;
// состояние ячейки в массиве матрицы 0-1
09
int
x;
// координаты 0-31
10
int
y;
// координаты 0-15
11
int
strlog;
// псевдостроки 0-3
12
int
stolb;
// столбец 0-3
13
int
strpix;
// строка в столбце одной псевдостроки 0-3
14
int
pix;
// пиксель 1-8
15
16
// заполнение дисплея из массива матрицы
17
void
disp(){
18
for
(
int
strlog = 0; strlog <= 3; strlog++) {
19
digitalWrite(sclk, HIGH);
20
digitalWrite(a, ((strlog & 1) ? LOW : HIGH) );
//младший бит адреса
21
digitalWrite(b, ((strlog & 2) ? LOW : HIGH) );
//старший бит адреса
22
for
(
int
stolb=0; stolb <= 3; stolb++) {
23
for
(
int
strpix=0; strpix <= 3; strpix++) {
24
for
(
int
pix=0; pix <= 7; pix++) {
25
piksel=matrix[strlog][stolb][strpix][pix];
26
if
(piksel == 1){
27
digitalWrite(r, LOW);
// рисует точку
28
}
29
else
{
30
digitalWrite(r, HIGH);
// не рисует точку
31
}
32
digitalWrite(ckl, LOW);
33
digitalWrite(ckl, HIGH);
34
}
35
}
36
}
37
digitalWrite(sclk, LOW);
38
digitalWrite(sclk, HIGH);
39
for
(
int
stolb=0; stolb <= 3; stolb++) {
40
for
(
int
strpix=0; strpix <= 3; strpix++) {
41
for
(
int
pix=0; pix <= 7; pix++) {
42
digitalWrite(r, HIGH);
// не рисует точку
43
digitalWrite(ckl, LOW);
44
digitalWrite(ckl, HIGH);
45
}
46
}
47
}
48
digitalWrite(sclk, LOW);
49
}
50
}
51
52
// очистка матрицы
53
void
cls(){
54
for
(
int
strlog = 0; strlog <= 3; strlog++) {
55
for
(
int
stolb = 0; stolb <= 3; stolb++) {
56
for
(
int
strpix = 0; strpix <= 3; strpix++) {
57
for
(
int
pix = 0; pix <= 7; pix++) {
58
matrix[strlog][stolb][strpix][pix]=0;
59
}
60
}
61
}
62
}
63
}
64
65
// запись в массив матрицы по x,y
66
void
zapis(
int
x1,
int
y1){
67
int
strlog1 = y1-(y1/4)*4;
68
int
stolb1 = x1/8;
69
int
strpix1 = y1/4;
70
int
pix1 = x1-(x1/8)*8;
71
matrix[strlog1][stolb1][strpix1][pix1] = 1;
72
}
73
74
void
setup
() {
75
pinMode(sclk, OUTPUT);
76
pinMode(a, OUTPUT);
77
pinMode(b, OUTPUT);
78
pinMode(r, OUTPUT);
79
pinMode(ckl, OUTPUT);
80
pinMode(oe, OUTPUT);
81
// Очистка матрицы
82
cls();
83
disp();
84
85
}
86
87
88
void
loop
() {
89
// рисуем квадрат 11х11
90
for
(
int
i = 0; i <= 10; i++) {
91
zapis(0,i);
92
zapis(10,i);
93
zapis(i,0);
94
zapis(i,10);
95
}
96
disp();
97
// delay(100);
98
}
x >> 2 - сдвинуть x на два бита вправо (эквивалентно тому, чтобы взять целую часть от деления на 4)
x & 3 - побитовое "И" - в данном случае взять два младших бита, оно же эквивалентно взятию остатка от деления на 4
Копия старой стоки отображается в новой потому что перед переключением строки надо ставить latch
В противном случае старое содержимое всех сдвиговых регистров сохраняется и отображается в новой строке
Защелку надо ставить ДО того, как устанавливаем адрес строки, а отключать ПОСЛЕ того, как отослали все данные. Как только защелка будет отпущена отосланные данные отобразятся в строке.
Вот две фигурки. Теперь надо заняться оптимизацией кода.
001
int
sclk = 8;
//пин 8
002
int
a = 11;
//пин 11
003
int
b = 12;
//пин 12
004
int
r = 10;
//пин 10
005
int
ckl = 9;
//пин 9
006
int
oe = 7;
//пин 7
007
char
matrix[4][4][4][8];
// массив матрицы
008
int
piksel;
// состояние ячейки в массиве матрицы 0-1
009
int
x;
// координаты 0-31
010
int
y;
// координаты 0-15
011
int
strlog;
// псевдостроки 0-3
012
int
stolb;
// столбец 0-3
013
int
strpix;
// строка в столбце одной псевдостроки 0-3
014
int
pix;
// пиксель 1-8
015
016
// заполнение дисплея из массива матрицы
017
void
disp(){
018
for
(
int
strlog = 0; strlog <= 3; strlog++) {
019
digitalWrite(sclk, HIGH);
020
digitalWrite(a, ((strlog & 1) ? LOW : HIGH) );
//младший бит адреса
021
digitalWrite(b, ((strlog & 2) ? LOW : HIGH) );
//старший бит адреса
022
for
(
int
stolb=0; stolb <= 3; stolb++) {
023
for
(
int
strpix=0; strpix <= 3; strpix++) {
024
for
(
int
pix=0; pix <= 7; pix++) {
025
piksel=matrix[strlog][stolb][strpix][pix];
026
if
(piksel == 1){
027
digitalWrite(r, LOW);
// рисует точку
028
}
029
else
{
030
digitalWrite(r, HIGH);
// не рисует точку
031
}
032
digitalWrite(ckl, LOW);
033
digitalWrite(ckl, HIGH);
034
}
035
}
036
}
037
digitalWrite(sclk, LOW);
038
digitalWrite(sclk, HIGH);
039
for
(
int
stolb=0; stolb <= 3; stolb++) {
040
for
(
int
strpix=0; strpix <= 3; strpix++) {
041
for
(
int
pix=0; pix <= 7; pix++) {
042
digitalWrite(r, HIGH);
// не рисует точку
043
digitalWrite(ckl, LOW);
044
digitalWrite(ckl, HIGH);
045
}
046
}
047
}
048
digitalWrite(sclk, LOW);
049
}
050
}
051
052
// очистка матрицы
053
void
cls(){
054
for
(
int
strlog = 0; strlog <= 3; strlog++) {
055
for
(
int
stolb = 0; stolb <= 3; stolb++) {
056
for
(
int
strpix = 0; strpix <= 3; strpix++) {
057
for
(
int
pix = 0; pix <= 7; pix++) {
058
matrix[strlog][stolb][strpix][pix]=0;
059
}
060
}
061
}
062
}
063
}
064
065
// запись в массив матрицы по x,y
066
void
zapis(
int
x1,
int
y1){
067
int
strlog1 = y1-(y1/4)*4;
068
int
stolb1 = x1/8;
069
int
strpix1 = y1/4;
070
int
pix1 = x1-(x1/8)*8;
071
matrix[strlog1][stolb1][strpix1][pix1] = 1;
072
}
073
074
void
setup
() {
075
pinMode(sclk, OUTPUT);
076
pinMode(a, OUTPUT);
077
pinMode(b, OUTPUT);
078
pinMode(r, OUTPUT);
079
pinMode(ckl, OUTPUT);
080
pinMode(oe, OUTPUT);
081
cls();
// Очистка матрицы
082
disp();
083
// Квадрат 11х11
084
for
(
int
i = 0; i <= 10; i++) {
085
zapis(0,i);
086
zapis(10,i);
087
zapis(i,0);
088
zapis(i,10);
089
}
090
// Круг
091
int
xc=19;
// центр х
092
int
yc=7;
// центр у
093
int
rk=5;
// радиус
094
for
(
int
i = 0; i <= 359; i++) {
095
x=xc+round(rk*cos(i));
096
y=yc-round(rk*sin(i));
097
zapis(x,y);
098
}
099
}
100
101
void
loop
() {
102
disp();
103
}
Посмотрел на код и что-то не понял, зачем в функции disp после отрисовки строки ее гасить?
без гашения строки она все равно появляется в новой строке. Я уже по всякому с защелкой наигрался, результата нет. Возможно особенность этих панелий такая. Я понимаю что лишний код на производительность влияет, но без этого никуда.
Сейчас сижу русские буквы кодирую размером 5х7 точек.
Вопрос: Как лучше организовать ввод данных на Ардуино для моего случая с панелью. Ну типа надо написать "ПРИВЕТ". Клаву ведь можно подцепить к ардуино?
Я подозреваю, что надо аккуратно с защелкой все таки разобраться. Может быть, она active low?
для этого нужно залить совсем короткий скетч типа
01
void
loop
()
02
{
03
digitalWrite(latch, HIGH);
04
digitalWrite(r0, LOW);
05
digitalWrite(r1, LOW);
06
for
(i=0; i < 128; i++)
07
{
08
digitalWrite(data, i&1?HIGH:LOW);
09
pulseClock();
10
}
11
}
То есть включаем пиксели "через один" в одной логической строке.
Обратите внимание, что latch обратно не восстанавливаем.
Отображается ли так что нибудь? Если да, то вместо
1
digitalWrite(latch, HIGH);
пишем
1
digitalWrite(latch, LOW);
Таким образом можно выяснить, при каком вообще уровне срабатывает защелка и срабатывает ли вообще?
Может она просто не к тому пину прицеплена?
Насчет клавиатуры - http://cxem.net/arduino/arduino22.php
За ссылку спасибо. Возьму на вооружение.
Еще раз убедился что сначало
digitalWrite(latch, HIGH)
в конце
digitalWrite(latch, LOW);
и когда делаем паузу строка остается гореть. Потом когда мы хотим перейти на следующую строку
но пока не записываем данные в нее, происходит копия предыдущей строки в новой.
В этом коде 2 строчки мигают поочередно с интервалом 1 сек.
01
void
loop
()
02
{
03
digitalWrite(sclk, HIGH);
04
digitalWrite(a, LOW);
05
digitalWrite(b, LOW);
06
for
(
int
i=0; i < 128; i++)
07
{
08
digitalWrite(r, i&1?HIGH:LOW);
09
digitalWrite(ckl, LOW);
10
digitalWrite(ckl, HIGH);
11
}
12
digitalWrite(sclk, LOW);
13
delay(1000);
14
digitalWrite(sclk, HIGH);
15
16
digitalWrite(a, HIGH);
17
digitalWrite(b, LOW);
18
19
digitalWrite(sclk, LOW);
20
delay(1000);
21
}
То-есть надо гасить первую строчку перед переключением. Защелкой она не гасится! Так что приходиться записывать нули для стирания.
А вам какая панель идет?
Черт, я сообразил, что был неправ насчет предназначения защелки и OE.
В надо кажется чуть чуть поменять алгоритм.
Все-таки контакт OE нужен - он переводит выводы строки в HI-Z состояние, гася светодиоды.
То есть алгоритм чуть меняется:
1)Пишем адрес строки
2)Подаем единицу на OE
3)Заполняем строку данными (по прежнему через тактовые импульсы)
4)Подаем ноль на OE В этот момент строка включается.
А защелка нужна только в ситуации, когда мы работаем с одной единственной строкой и не включаем OE.
Прошу прощения за невольную дезинформацию.
Панель мне едет вот такая: http://www.sureelectronics.net/goods.php?id=1122
Выбрал ее потому что она двухцветная и с подробным описанием, как с ней работать.
Не работает и так. ОЕ просто отключает и включает свет, на логику регистров он не влияет. Короче если сталкнетесь с такой проблемой на своих модулях то просто стирайте строки. Я уже все перепробовал. 3 дня подряд.
Сейчас столкнулся с проблемой. Переменные могут запоминать русские буквы?
1
char
kod[]=
"АБВГДЕ"
;
Подключил вторую панель, тоесть подключил следущую проблему на свою голову :)
Передаю в 2 раза больше, а вторая панель молчит. Подстыковал все последовательно со второго разъема, а-а в-в масса-масса ну и т.д.
01
int
sclk = 8;
02
int
a = 11;
03
int
b = 12;
04
int
r = 10;
05
int
ckl = 9;
06
07
void
setup
() {
08
pinMode(sclk, OUTPUT);
09
pinMode(a, OUTPUT);
10
pinMode(b, OUTPUT);
11
pinMode(r, OUTPUT);
12
pinMode(ckl, OUTPUT);
13
}
14
15
void
loop
() {
16
digitalWrite(sclk, HIGH);
17
digitalWrite(a, HIGH);
18
digitalWrite(b, HIGH);
19
for
(
int
i=0; i <= 255; i++) {
20
digitalWrite(r, LOW);
21
digitalWrite(ckl, LOW);
22
digitalWrite(ckl, HIGH);
23
}
24
digitalWrite(sclk, LOW);
25
26
}
По поводу русских букв. ArduinoIDE хранит русские буквы в кодировке utf8. Если для вывода нужна другая кодировка, придется перекодировать.
То есть данные по первой панели проходят, а по второй нет?
Для начала я бы посмотрел, есть ли нужный сигнал на пинах выхода первой панели. Напрмер, просто на все значимые пины повесить по светодиоду (через резистор) и посмотреть, что и как горит.
Тут пригодится тестовый скетч примерно следующего содержания:
01
int
sclk = 8;
02
int
a = 11;
03
int
b = 12;
04
int
r = 10;
05
int
ckl = 9;
06
int
toSend = HIGH;
07
08
void
setup
() {
09
pinMode(sclk, OUTPUT);
10
pinMode(a, OUTPUT);
11
pinMode(b, OUTPUT);
12
pinMode(r, OUTPUT);
13
pinMode(ckl, OUTPUT);
14
}
15
16
void
loop
() {
17
digitalWrite(sclk, HIGH);
18
digitalWrite(a, HIGH);
19
digitalWrite(b, HIGH);
20
digitalWrite(r, toSend);
21
toSend = (toSend==HIGH)?LOW:HIGH;
22
digitalWrite(ckl, LOW);
23
digitalWrite(ckl, HIGH);
24
digitalWrite(sclk, LOW);
25
//ждем нажатия кнопки (или команды из сериалпорта)
26
}
Который записывает биты по одному по команде извне.
Это позволит посмотреть, в какой момент какие значения на выходе.
Еще лучше эти пины запихать на вход свободных пинов ардуины, считывать их каждый шаг и писать в сериалпорт для отладки и анализа. Пин часов лучше CKL вообще на осциллограф повесить, чтобы проверить, проходят ли импульсы синхронизации.
Извени меня, моя ошибка. Я когда с одной панелью работал, питание на нее не подовал, ардуино ее запитывала сама. Для второй панели пришлось уже подовать питание. Но пока до меня дошло я с светодиодами поигрался так примерно 3-4 часа. Прикольно так, моргают в такты.
Надо что то дальше думать на счет псевдострок, так как мерцание появляется. Обработки стало больше в 2 раза, а если больше панелий подключить то вообще мигать начнет.
У меня есть задумка:
в void setup()
1. гасим панель ОЕ
2. записываем во все псевдостроки информуху
в void loop()
1. вкл панель ОЕ
2. Просто перебираем все псевдостроки
На скорую руку накидал код, пока не получается.
Нашел в инете схожее http://www.jonshouse.co.uk/ledsign.cgi
Надо в коде там разобраться и я думаю все получиться.
Попробуй на вход OE подцепить кнопку одной ногой на землю, второй ногой на вход и одновременно через подтяжку 10К на +5 ардуины.
После чего запустить скетч, который что-то рисует и посмотреть, что происходит при нажатии кнопки. Теоретически,табло должно гаснуть (точнее должна гаснуть активная строка,
но учитывая то, что в любой момент времени горит одна строка, гаснуть будет все табло). А практически?
Или при установке выходов a и b дописать что-то типа
1
digitalWrite(OE, ((a==1)&(b==(0))?HIGH:LOW);
В этом случае одна псевдострока (видимо, вторая сверху) должны быть постоянно выключена. Это так?
Вот что нарыл (перевод с китайского)
светодиодный дисплей над буквами объяснить
Светодиодный дисплей общее понимание сигнал
тактового сигнала 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
Буду тестить.
Все теперь работает отлично. Вот код:
001
#define pinData1 10
002
#define pinClk 9
003
#define pinStr 8
004
#define pinEn 7
005
#define pinA 11
006
#define pinB 12
007
int
vrem=0;
//Начало отсчета времени для переключения слов
008
int
pa=100;
// Интервал переключения
009
unsigned
char
screen [128];
//Видеопамять
010
011
char
sl1 [] = {
//Слово ВОЛГОГРАД тонкий шрифт
012
240,133,241,133,98,9,9,9,20,20,20,20,3,8,8,8,16,80,80,80,32,32,60,33,66,34,34,34,129,66,66,66,
013
136,133,137,133,145,9,9,9,20,20,20,20,4,8,8,8,144,80,80,80,32,32,34,33,34,34,34,34,255,66,66,66,
014
133,133,133,136,9,9,9,144,20,20,20,148,8,8,8,4,80,80,80,144,32,32,33,34,34,62,34,18,66,66,66,36,
015
133,137,133,240,9,9,9,96,20,20,20,119,8,8,8,227,80,80,80,31,32,32,33,188,34,34,34,14,66,66,66,24
016
};
017
char
sl2 [] = {
//Слово ВОЛГОГРАД жирный шрифт
018
240,205,241,205,99,153,153,153,54,182,182,182,3,12,12,12,24,216,216,216,48,48,60,51,102,54,54,54,195,102,102,102,
019
216,205,201,221,241,153,153,153,182,182,182,182,7,12,12,12,152,216,216,216,48,48,62,51,54,54,54,54,255,102,102,102,
020
205,205,205,248,153,153,153,240,182,182,182,247,12,12,12,231,216,216,216,159,48,48,51,190,54,62,54,30,126,102,102,60,
021
205,201,205,240,153,153,153,96,182,182,182,119,12,12,12,227,216,216,216,31,48,48,51,188,54,62,54,14,102,102,102,24
022
};
023
char
sl3 [] = {
//Слово ЗНАМЕНСК тонкий шрифт
024
56,2,4,2,130,130,254,130,130,66,66,66,130,130,146,170,254,128,248,128,130,130,254,130,56,128,128,128,129,136,192,136,
025
68,2,56,130,130,130,130,130,66,66,66,66,130,130,146,198,128,128,128,128,130,130,130,130,68,128,128,130,130,144,192,132,
026
130,2,4,68,130,130,130,130,66,126,66,34,130,130,170,198,128,128,128,128,130,130,130,130,130,128,128,68,132,144,160,130,
027
2,2,2,56,130,130,130,130,66,66,66,30,130,146,170,130,128,128,128,254,130,130,130,130,128,128,128,56,136,160,144,129
028
};
029
char
sl4 [] = {
//Слово ЗНАМЕНСК жирный шрифт
030
28,3,6,67,99,99,127,99,99,51,51,51,99,99,107,119,127,96,124,96,99,99,127,99,28,96,96,97,99,108,112,110,
031
62,3,28,103,99,99,127,99,51,51,51,59,99,99,107,99,127,96,124,96,99,99,127,99,62,96,96,115,99,108,112,103,
032
103,3,14,62,99,99,99,99,51,63,51,31,99,99,119,99,96,96,96,127,99,99,99,99,115,96,96,62,102,120,120,99,
033
67,7,3,28,99,99,99,99,51,63,51,15,99,107,119,99,96,96,96,127,99,99,99,99,97,96,96,28,102,120,124,97
034
};
035
036
void
setup
() {
037
038
pinMode(pinData1, OUTPUT);
039
pinMode(pinClk, OUTPUT);
040
pinMode(pinStr, OUTPUT);
041
pinMode(pinEn, OUTPUT);
042
pinMode(pinA, OUTPUT);
043
pinMode(pinB, OUTPUT);
044
045
for
(
int
i = 0; i < 128; i++)
//Очистка видеопамяти
046
{
047
screen[i] = 0;
048
};
049
}
050
051
void
loop
() {
052
for
(
byte
i=0; i<4 ; i++)
053
{
054
SelectStr(i);
// Выбор псевдостроки
055
SendBytes(screen + i*32);
// Рисуем псевдостроку
056
digitalWrite(pinEn, HIGH);
// Включаем матрицы
057
delayMicroseconds(200);
// Пауза
058
digitalWrite(pinEn, LOW);
// Отключаем матрицы
059
}
060
if
(vrem == pa) {
061
for
(
int
i = 0; i < 128; i++)
//Заносим в видеопамять первое слово
062
{
063
screen[i] = sl1[i];
064
};
065
};
066
if
(vrem == pa*2) {
067
for
(
int
i = 0; i < 128; i++)
//Заносим в видеопамять второе слово
068
{
069
screen[i] = sl2[i];
070
};
071
};
072
if
(vrem == pa*3) {
073
for
(
int
i = 0; i < 128; i++)
//Заносим в видеопамять третье слово
074
{
075
screen[i] = sl3[i];
076
};
077
};
078
if
(vrem == pa*4) {
079
for
(
int
i = 0; i < 128; i++)
//Заносим в видеопамять четвертое слово
080
{
081
screen[i] = sl4[i];
082
};
083
vrem=0;
// Сбрасываем счетчик
084
};
085
vrem=vrem+1;
// Увеличение отсчета времени
086
087
}
088
089
void
SelectStr(
byte
n)
// Выбор псевдостроки
090
{
091
if
(n & B00000001) digitalWrite(pinA, LOW);
else
digitalWrite(pinA, HIGH);
092
if
(n & B00000010) digitalWrite(pinB, LOW);
else
digitalWrite(pinB, HIGH);
093
}
094
095
void
SendBytes(unsigned
char
* b)
// Рисуем псевдостроку
096
{
097
byte
i;
098
byte
k;
099
for
(k = 0; k<32; k++)
100
for
(i = 0; i<8 ; i++)
101
{
102
digitalWrite(pinClk, LOW);
103
if
((b[k] & (1 << (7-i))) ) digitalWrite(pinData1, LOW);
else
digitalWrite(pinData1, HIGH);
104
digitalWrite(pinClk, HIGH);
105
}
106
digitalWrite(pinStr, HIGH);
107
digitalWrite(pinStr, LOW);
108
return
;
109
};
Результат кода:
Выводит на 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. Вот как это кажется в моей схеме:
правильно или нет?
Вот две фигурки. Теперь надо заняться оптимизацией кода.
001
int
sclk = 8;
//пин 8
002
int
a = 11;
//пин 11
003
int
b = 12;
//пин 12
004
int
r = 10;
//пин 10
005
int
ckl = 9;
//пин 9
006
int
oe = 7;
//пин 7
007
char
matrix[4][4][4][8];
// массив матрицы
008
int
piksel;
// состояние ячейки в массиве матрицы 0-1
009
int
x;
// координаты 0-31
010
int
y;
// координаты 0-15
011
int
strlog;
// псевдостроки 0-3
012
int
stolb;
// столбец 0-3
013
int
strpix;
// строка в столбце одной псевдостроки 0-3
014
int
pix;
// пиксель 1-8
015
016
// заполнение дисплея из массива матрицы
017
void
disp(){
018
for
(
int
strlog = 0; strlog <= 3; strlog++) {
019
digitalWrite(sclk, HIGH);
020
digitalWrite(a, ((strlog & 1) ? LOW : HIGH) );
//младший бит адреса
021
digitalWrite(b, ((strlog & 2) ? LOW : HIGH) );
//старший бит адреса
022
for
(
int
stolb=0; stolb <= 3; stolb++) {
023
for
(
int
strpix=0; strpix <= 3; strpix++) {
024
for
(
int
pix=0; pix <= 7; pix++) {
025
piksel=matrix[strlog][stolb][strpix][pix];
026
if
(piksel == 1){
027
digitalWrite(r, LOW);
// рисует точку
028
}
029
else
{
030
digitalWrite(r, HIGH);
// не рисует точку
031
}
032
digitalWrite(ckl, LOW);
033
digitalWrite(ckl, HIGH);
034
}
035
}
036
}
037
digitalWrite(sclk, LOW);
038
digitalWrite(sclk, HIGH);
039
for
(
int
stolb=0; stolb <= 3; stolb++) {
040
for
(
int
strpix=0; strpix <= 3; strpix++) {
041
for
(
int
pix=0; pix <= 7; pix++) {
042
digitalWrite(r, HIGH);
// не рисует точку
043
digitalWrite(ckl, LOW);
044
digitalWrite(ckl, HIGH);
045
}
046
}
047
}
048
digitalWrite(sclk, LOW);
049
}
050
}
051
052
// очистка матрицы
053
void
cls(){
054
for
(
int
strlog = 0; strlog <= 3; strlog++) {
055
for
(
int
stolb = 0; stolb <= 3; stolb++) {
056
for
(
int
strpix = 0; strpix <= 3; strpix++) {
057
for
(
int
pix = 0; pix <= 7; pix++) {
058
matrix[strlog][stolb][strpix][pix]=0;
059
}
060
}
061
}
062
}
063
}
064
065
// запись в массив матрицы по x,y
066
void
zapis(
int
x1,
int
y1){
067
int
strlog1 = y1-(y1/4)*4;
068
int
stolb1 = x1/8;
069
int
strpix1 = y1/4;
070
int
pix1 = x1-(x1/8)*8;
071
matrix[strlog1][stolb1][strpix1][pix1] = 1;
072
}
073
074
void
setup
() {
075
pinMode(sclk, OUTPUT);
076
pinMode(a, OUTPUT);
077
pinMode(b, OUTPUT);
078
pinMode(r, OUTPUT);
079
pinMode(ckl, OUTPUT);
080
pinMode(oe, OUTPUT);
081
cls();
// Очистка матрицы
082
disp();
083
// Квадрат 11х11
084
for
(
int
i = 0; i <= 10; i++) {
085
zapis(0,i);
086
zapis(10,i);
087
zapis(i,0);
088
zapis(i,10);
089
}
090
// Круг
091
int
xc=19;
// центр х
092
int
yc=7;
// центр у
093
int
rk=5;
// радиус
094
for
(
int
i = 0; i <= 359; i++) {
095
x=xc+round(rk*cos(i));
096
y=yc-round(rk*sin(i));
097
zapis(x,y);
098
}
099
}
100
101
void
loop
() {
102
disp();
103
}
Я попробовал этот код, но не было две фигурки как вам фотографии.
Может быть, я неправильно подключен Arduino c DMD. Вот как это кажется в моей схеме:
правильно или нет?
Я извиняюсь за спам. Я не знаю, как удалить сообщение.
Вроде все правильно. Я советую брать код из сообщения №40. Оно самое идеальное.
Есть готовая библиотека для работы с массивами этих панелей. https://github.com/freetronics/DMD
Подключил по этой схеме к ардуино UNO и у меня выводится хаос какой-то. Не работает пример. Что может быть не так? Обязательно надо на GROUND все ножки ставить?
Как организовать работу 4х модулей расположенных следующим образом:
1 2
3 4
1
#define DISPLAYS_ACROSS 2
2
#define DISPLAYS_DOWN 2
3
4
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
1
#define DISPLAYS_ACROSS 2
2
#define DISPLAYS_DOWN 2
3
4
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
Где почитать как работать с этой библиотекой? Чего-то я не могу разобраться.
А схема подключения там такая же как указаная в этой ветке? У меня пример из библиотеки работает как-то некорректно.