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
Вот описание данного модуля и описание алгоритма работы с ним. Думаю после прочтения Вы сами ответите на все ваши вопросы.
Всем привет, тема довольно старая но решил поднять. Не понялтно в чем делать графику а точнее в какой программе можно было бы нарисовать и после сохранить как код для импорта в код? Спасибо.