Arduino DUE и 1 LED module P10
- Войдите на сайт для отправки комментариев
Доброго времени суток!
Есть отичная тема Связка Mega2560 с p10 led module. Так вот она решила примерно 80% моих проблем и вопросов.
У меня только Arduino DUE, и все библиотеки предлагаемые в теме выше да и вообще все что я смог найти в нете не подходят для DUE, так как там архитектура ARM а не AVR, а библиотеки под последнюю как раз и заточены.
С темы что написал выше взял код, и не могу разобраться в нем до конца, что бы мог сам кодировать свои изображения, собственно вот код, вопросы потом:
// названия пинов такие же, как и на модуле P10
int nOE = 13;
int A = 12;
int B = 11;
int CKL = 10;
int SCLK = 9;
int R = 8;
int vrem=0; //Начало отсчета времени для переключения слов
int pa=60; // Интервал переключения
unsigned char screen [128]; //Видеопамять
// тут зашифрованно изображение, алгоритм данного изображения я не могу понять
char sl1 [] = {
255,128,128,128,255,4,96,4,255,0,192,0,255,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,128,128,128,0,14,49,0,0,0,128,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,128,128,128,0,31,31,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,128,128,255,0,49,14,255,0,128,0,255,1,1,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
char sl2 [] = {
255,128,128,128,255,68,100,132,255,64,192,64,255,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
130,128,128,129,0,46,49,0,8,128,128,32,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
129,128,128,130,0,31,63,0,16,0,0,16,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,128,128,255,128,49,78,255,32,128,128,255,1,1,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
void setup() {
pinMode(R, OUTPUT);
pinMode(CKL, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(nOE, OUTPUT);
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
}
void loop() {
for(byte i=0; i<4 ; i++)
{
SelectStr(i); // Выбор псевдостроки
SendBytes(screen + i*32); // Рисуем псевдостроку /+ i*32
digitalWrite(nOE, HIGH); // Включаем матрицы
delayMicroseconds(300); // Пауза 200
digitalWrite(nOE, LOW); // Отключаем матрицы
}
if (vrem == pa) {
for(int i = 0; i < 128; i++) //Заносим в видеопамять первое слово
{
screen[i] = sl1[i];
};
};
if (vrem == pa*2) {
for(int i = 0; i < 128; i++) //Заносим в видеопамять второе слово
{
screen[i] = sl2[i];
};
vrem=0;
};
vrem=vrem+1; // Увеличение отсчета времени
}
void SelectStr(byte n) // Выбор псевдостроки
{
if (n & B00000001) digitalWrite(A, LOW); else digitalWrite(A, HIGH);
if (n & B00000010) digitalWrite(B, LOW); else digitalWrite(B, HIGH);
}
// ниже никаких комментариев не было, и тут я ничего не понял
void SendBytes(unsigned char* b) // Рисуем псевдостроку
{
byte i;
byte k;
for(k = 0; k<16; k++)
for(i = 0; i<8; i++)
{
digitalWrite(CKL, LOW);
if((b[k] & (1 << (7-i))) ) {
digitalWrite(R, LOW);
} else {
digitalWrite(R, HIGH);
}
digitalWrite(CKL, HIGH);
}
digitalWrite(SCLK, HIGH);
digitalWrite(SCLK, LOW);
return;
};
Вопрос № 1. Можете на пальцах объяснить как примерно понимать что здесь будет отображено, я бы понял если бы там были 1 - горит, 0 не горит. Но эти два массива выводят два кадра по очереди, вот 1 из них. Но как заполнять массив если я хочу придумать свои изображения.

char sl1 [] = {
255,128,128,128,255,4,96,4,255,0,192,0,255,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,128,128,128,0,14,49,0,0,0,128,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,128,128,128,0,31,31,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,128,128,255,0,49,14,255,0,128,0,255,1,1,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
char sl2 [] = {
255,128,128,128,255,68,100,132,255,64,192,64,255,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
130,128,128,129,0,46,49,0,8,128,128,32,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
129,128,128,130,0,31,63,0,16,0,0,16,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,128,128,255,128,49,78,255,32,128,128,255,1,1,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
Вопрос № 2. В функцию SendBytes передается (screen + i * 32), но screen это же массив символов, что значит (screen + i * 32). Я пытался вывести Serial.begin(String(screen + i * 32)), думал посмотреть что выведет в строку, но вылезает ошибка.
unsigned char screen [128]; //Видеопамять
...
void loop() {
for(byte i=0; i<4 ; i++)
{
SelectStr(i); // Выбор псевдостроки
SendBytes(screen + i*32); // Рисуем псевдостроку /+ i*32
digitalWrite(nOE, HIGH); // Включаем матрицы
delayMicroseconds(300); // Пауза 200
digitalWrite(nOE, LOW); // Отключаем матрицы
}
...
Вопрос № 3. Самый главный. Не могу никак понять алгоритм данной функции. И как понять это условие if((b[k] & (1 << (7-i))) ) ?
Там ## между решеток ## в кде вопрос еще один :)
void SendBytes(unsigned char* b) // Рисуем псевдостроку
{
byte i;
byte k;
for(k = 0; k<16; k++)
for(i = 0; i<8; i++)
{
digitalWrite(CKL, LOW);
if((b[k] & (1 << (7-i))) ) {
digitalWrite(R, LOW);
#### данное условия никогда не истина и не выполняется,
но если убрать то выйдет бардак, ставил туда Serial.begin() и он ниразу не вылез, а ниже отображается ####
} else {
digitalWrite(R, HIGH);
}
digitalWrite(CKL, HIGH);
}
digitalWrite(SCLK, HIGH);
digitalWrite(SCLK, LOW);
return;
};
Массив screen состоит из 128 элементов, который передается в эту функцию, но в цикле проходит всего for(k = 0; k<16; k++) 16 итераций, что я понял не так?
А 128 / 16 сколько получается? Все остальные ваши вопросы отсель же.
Забыл уточнить, этот код был расчитан на 2 таких панели, т.е. screen как я понял хранит информацию для двух панелей, а мне бы с одной разобраться :)
Собственно как формировать картинку то? Как она преобразуется из моей головы например в массив значений, а потом из этого массива на панель?
http://st.lartmaster.ru/1/759/621/LED_matrix_16x32.pdf
Вот описание данного модуля и описание алгоритма работы с ним. Думаю после прочтения Вы сами ответите на все ваши вопросы.
Всем привет, тема довольно старая но решил поднять. Не понялтно в чем делать графику а точнее в какой программе можно было бы нарисовать и после сохранить как код для импорта в код? Спасибо.