Я захотел поиграть со светодиодной матрицей, но в интернете нашёл довольно мало информации и примеров именно с программной частью, есть описание матрицы, немного про мультиплексирование и много туториалов для Arduino.
Окей, теперь электроника. Ножка МК не выдерживает ток для питания нескольких светодиодов, пока я эксперементировал сжёг PORTD у ATmega32. Для решения проблемы есть несколько решений, использовать транзисторы или регистры сдвига. Я лишь хотел заставить его работать, так что я решил что у меня будет гореть только 1 светодиод в такт.
Нужно пройти каждый светодиод отдельно и зажечь его если нужно на 0.3 мс, затем потушить. Получается что МК не зажигает больше чем 1 светодиод значит ничего не сгорит, но минус в том что программная часть сложнее и требуется больше памяти.
Вот что у меня получилось
Код не идеален, вообщем есть массив где храниться строка, через определённое время все столбцы строки сдвигаются влево, когда строка дойдет до конца, всё начнётся заново.
Информация отсюда:
easyelectronics.ru
poprobotics
Светодиодная матрица это просто много светодиодов которые представляют таблицу.
Чтобы зажечь выделенный светодиод нужно подать + на R2 и - на C3. Таким образом можно зажечь любой светодиод или группу светодиодов в 1 столбце или ряду. Если попытаться зажечь светодиоды в разных рядах и колоннах одновременно, то загорятся и другие светодиоды. К примеру если вместе с нашим красным светодиодом зажечь тот что в левом нижнем углу R6 - C0 то загорятся еще 2 R6 C3 и R2 C0.
Но есть еще и другие схемы подключения где используется меньше ножек МК к примеру "Чарлиплексинг" "Charlieplexing" которую предложил Charlie Allen. Статья на вики
Как видно с 3 ногами можно зажечь 6 светодиодов, с 10 => 90. Используя N ног можно зажечь N^2 - N светодиодов. Есть еще и другие способы подключения.
Смысл работы матрицы такой, нужно быстро включать и выключать каждый столбец или строку последовательно зажигая там необходимые светодиоды, нашему глазу будет казаться что они не мигают а горят постоянно.
Окей, теперь электроника. Ножка МК не выдерживает ток для питания нескольких светодиодов, пока я эксперементировал сжёг PORTD у ATmega32. Для решения проблемы есть несколько решений, использовать транзисторы или регистры сдвига. Я лишь хотел заставить его работать, так что я решил что у меня будет гореть только 1 светодиод в такт.
Нужно пройти каждый светодиод отдельно и зажечь его если нужно на 0.3 мс, затем потушить. Получается что МК не зажигает больше чем 1 светодиод значит ничего не сгорит, но минус в том что программная часть сложнее и требуется больше памяти.
Вот что у меня получилось
#include <avr/io.h> #include <util/delay.h> int main() { DDRD=0xFF; DDRA=0xFF; int fps = 8; int pic = 0; int frames = 0; PORTA = 0b11111011; // GND PORTD = 0b00000001; int matrix[8][60] = { {0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,1,1,1,1,1,0,1,1,0,0,0,1,1}, {0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,1,1,1,1,0,0,0,1,1,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,1,1,0}, {0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0}, {0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,1,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,1,1,1,0,0,0,0,0,1,1,0,1,1,1,1,1,0,1,1,0,0,0,1,1}, }; int matrix2[8][60] = { {0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,1,1,1,1,1,0,1,1,0,0,0,1,1}, {0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,1,1,1,1,0,0,0,1,1,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,1,1,0}, {0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0}, {0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,1,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,1,1,1,0,0,0,0,0,1,1,0,1,1,1,1,1,0,1,1,0,0,0,1,1}, }; while(1) { pic++; if(pic >= fps) { pic = 0; frames++; for(int n = 0; n < 8; n++) { for(int k = 0; k < 59; k++) { if(k != 58) matrix[n][k] = matrix[n][k+1]; else matrix[n][k] = 0; } } } if(frames >= 60) { for(int n = 0; n < 8; n++) { for(int k = 0; k < 59; k++) { matrix[n][k] = matrix2[n][k]; frames = 0; } } } for(int row = 0; row < 8; row++) { PORTD = (1 << row); // so PORTC = 0,1,2,4 VCC for(int col = 0; col < 8; col++) { PORTA ^= (matrix[row][col] << col); _delay_ms(0.3); PORTA = 0xFF; } } } }
Код не идеален, вообщем есть массив где храниться строка, через определённое время все столбцы строки сдвигаются влево, когда строка дойдет до конца, всё начнётся заново.
Информация отсюда:
easyelectronics.ru
poprobotics
Комментариев нет :
Отправить комментарий