TC15-11 — это светодиодная матрица, размерности 8х8 светодиодов 🙂
Размеры
Снизу матрицы, находится два ряда пинов, со стандартным шагом 2.54, что позволяет удобно воткнуть сетодиодную матрицу в две беспаечные макетные платы.
Осчёт пинов ведётся от угла, на котором сходятся стороны матрицы с выступами.
Принципиальная схема
— матричное включение светодиодов.
Т.о., подключив столбец (Column) на землю и подавая +5V (лучше через токоограничительный резистор) на строчку (Row), мы зажгём светодиод находящийся в заданном узле матрицы.
Нарисуем выводы матрицы более понятно 🙂
Используем 5-вольтовый стабилизатор питания CraftDuino и зажгём светодиод в первой строчке и первом столбце.
Для этого: подключим 9-й пин (R1) к выходу 5V контроллера, а 13-й пин (C1) через токоограничительный резистор (470 Ом) на выход GND.
Работает 🙂
С этим разобрались, а значит теперь можно подключить светодиодную матрицу к контроллеру Ardunio/CraftDuino для различной световой индикации.
Лучший вариант, конечно, использовать SPI-расширитель выводов, но в простом случае, достаточно задействовать почти все порты контроллера Arduino/CraftDuino.
Вариант подключения
Direct wiring an Arduino to an LED matrix
— обратите внимание, что на картинке диоды подключены наоборот — и для светодиодной матрицы TC15-11 их нужно перевернуть (см. TC15-11 internal circuit diagram выше) 🙂
Исходя из другого включения светодиодов в TC15-11, поправим скетчи:
DirectDriveLEDMatrix.pde — скетч выводит «HELLO «:
/* * Show messages on an 8x8 led matrix, * scrolling from right to left. * * Uses FrequencyTimer2 library to * constantly run an interrupt routine * at a specified frequency. This * refreshes the display without the * main loop having to do anything. * * http://www.arduino.cc/playground/Main/DirectDriveLEDMatrix * edited by noonv * https://robocraft.ru */ #include <FrequencyTimer2.h> #define SPACE { \ {0, 0, 0, 0, 0, 0, 0, 0}, \ {0, 0, 0, 0, 0, 0, 0, 0}, \ {0, 0, 0, 0, 0, 0, 0, 0}, \ {0, 0, 0, 0, 0, 0, 0, 0}, \ {0, 0, 0, 0, 0, 0, 0, 0}, \ {0, 0, 0, 0, 0, 0, 0, 0}, \ {0, 0, 0, 0, 0, 0, 0, 0}, \ {0, 0, 0, 0, 0, 0, 0, 0} \ } #define H { \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 1, 1, 1, 1, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0} \ } #define E { \ {0, 1, 1, 1, 1, 1, 1, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 1, 1, 1, 1, 1, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 1, 1, 1, 1, 1, 0} \ } #define L { \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 0, 0, 0, 0, 0, 0}, \ {0, 1, 1, 1, 1, 1, 1, 0} \ } #define O { \ {0, 0, 0, 1, 1, 0, 0, 0}, \ {0, 0, 1, 0, 0, 1, 0, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 1, 0, 0, 0, 0, 1, 0}, \ {0, 0, 1, 0, 0, 1, 0, 0}, \ {0, 0, 0, 1, 1, 0, 0, 0} \ } byte col = 0; byte leds[8][8]; // pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1) // 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 int pins[17]= {-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6}; // col[xx] of leds = pin yy on led matrix // 1 2 3 4 5 6 7 8 int cols[8] = {pins[13], pins[3], pins[4], pins[10], pins[06], pins[11], pins[15], pins[16]}; // row[xx] of leds = pin yy on led matrix // 1 2 3 4 5 6 7 8 int rows[8] = {pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5]}; const int numPatterns = 6; byte patterns[numPatterns][8][8] = { H,E,L,L,O,SPACE }; int pattern = 0; void setup() { // sets the pins as output for (int i = 1; i <= 16; i++) { pinMode(pins[i], OUTPUT); } // set up cols and rows for (int i = 1; i <= 8; i++) { digitalWrite(cols[i - 1], LOW); } for (int i = 1; i <= 8; i++) { digitalWrite(rows[i - 1], LOW); } clearLeds(); // Turn off toggling of pin 11 FrequencyTimer2::disable(); // Set refresh rate (interrupt timeout period) FrequencyTimer2::setPeriod(2000); // Set interrupt routine to be called FrequencyTimer2::setOnOverflow(display); setPattern(pattern); } void loop() { pattern = ++pattern % numPatterns; slidePattern(pattern, 60); } void clearLeds() { // Clear display array for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { leds[i][j] = 0; } } } void setPattern(int pattern) { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { leds[i][j] = patterns[pattern][i][j]; } } } void slidePattern(int pattern, int del) { for (int l = 0; l < 8; l++) { for (int i = 0; i < 7; i++) { for (int j = 0; j < 8; j++) { leds[j][i] = leds[j][i+1]; } } for (int j = 0; j < 8; j++) { leds[j][7] = patterns[pattern][j][0 + l]; } delay(del); } } // Interrupt routine void display() { digitalWrite(cols[col], HIGH); // Turn whole previous column off col++; if (col == 8) { col = 0; } for (int row = 0; row < 8; row++) { if (leds[col][7 - row] == 1) { digitalWrite(rows[row], HIGH); // Turn on this led } else { digitalWrite(rows[row], LOW); // Turn off this led } } digitalWrite(cols[col], LOW); // Turn whole column on at once (for equal lighting times) }
DirectDriveLEDMatrix_life.pde - скетч с игрой "Жизнь":
/* * Conway's "Life" * * Adapted from the Life example * on the Processing.org site * * Needs FrequencyTimer2 library * * http://www.arduino.cc/playground/Main/DirectDriveLEDMatrix * edited by noonv * https://robocraft.ru */ #include <FrequencyTimer2.h> byte col = 0; byte leds[8][8]; // pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1) int pins[17]= {-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6}; // col[xx] of leds = pin yy on led matrix int cols[8] = {pins[13], pins[3], pins[4], pins[10], pins[06], pins[11], pins[15], pins[16]}; // row[xx] of leds = pin yy on led matrix int rows[8] = {pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5]}; #define DELAY 0 #define SIZE 8 extern byte leds[SIZE][SIZE]; byte world[SIZE][SIZE][2]; long density = 50; void setup() { setupLeds(); randomSeed(analogRead(5)); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (random(100) < density) { world[i][j][0] = 1; } else { world[i][j][0] = 0; } world[i][j][1] = 0; } } } void loop() { // Display current generation for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { leds[i][j] = world[i][j][0]; } } delay(DELAY); // Birth and death cycle for (int x = 0; x < SIZE; x++) { for (int y = 0; y < SIZE; y++) { // Default is for cell to stay the same world[x][y][1] = world[x][y][0]; int count = neighbours(x, y); if (count == 3 && world[x][y][0] == 0) { // A new cell is born world[x][y][1] = 1; } if ((count < 2 || count > 3) && world[x][y][0] == 1) { // Cell dies world[x][y][1] = 0; } } } // Copy next generation into place for (int x = 0; x < SIZE; x++) { for (int y = 0; y < SIZE; y++) { world[x][y][0] = world[x][y][1]; } } } int neighbours(int x, int y) { return world[(x + 1) % SIZE][y][0] + world[x][(y + 1) % SIZE][0] + world[(x + SIZE - 1) % SIZE][y][0] + world[x][(y + SIZE - 1) % SIZE][0] + world[(x + 1) % SIZE][(y + 1) % SIZE][0] + world[(x + SIZE - 1) % SIZE][(y + 1) % SIZE][0] + world[(x + SIZE - 1) % SIZE][(y + SIZE - 1) % SIZE][0] + world[(x + 1) % SIZE][(y + SIZE - 1) % SIZE][0]; } void setupLeds() { // sets the pins as output for (int i = 1; i <= 16; i++) { pinMode(pins[i], OUTPUT); } // set up cols and rows for (int i = 1; i <= 8; i++) { digitalWrite(cols[i - 1], LOW); } for (int i = 1; i <= 8; i++) { digitalWrite(rows[i - 1], LOW); } clearLeds(); // Turn off toggling of pin 11 and 3 FrequencyTimer2::disable(); // Set refresh rate (interrupt timeout period) FrequencyTimer2::setPeriod(2000); // Set interrupt routine to be called FrequencyTimer2::setOnOverflow(display); } void clearLeds() { // Clear display array for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { leds[i][j] = 0; } } } // Interrupt routine void display() { digitalWrite(cols[col], HIGH); // Turn whole previous column off col++; if (col == 8) { col = 0; } for (int row = 0; row < 8; row++) { if (leds[col][7 - row] == 1) { digitalWrite(rows[row], HIGH); // Turn on this led } else { digitalWrite(rows[row], LOW); // Turn off this led } } digitalWrite(cols[col], LOW); // Turn whole column on at once (for equal lighting times) }
Для работы скетчей требуется библиотека FrequencyTimer2.
Библиотеку, в примерах которой уже находятся вышеприведённые скетчи можно скачать здесь:
FrequencyTimer2-rc.zip
Для подключения TC15-11 потребуются:
- TC15-11 - 1 шт.
- Arduino/CraftDuino - 1 шт.
- беспаечная макетная плата - 2 шт.
- провода гибкие - 20 шт.
Загружаем скетч DirectDriveLEDMatrix и любуемся результатом:
Видео
CraftDuino и светодиодная матрица 8x8 (TC15-11)
Ссылки
документация (datasheet) на TC15-11 (PDF)
Direct wiring an Arduino to an LED matrix
FrequencyTimer2
Ping Pong com Matriz de Leds 8x8
«Бегущая строка» — динамическая индикация на примере светодиодной матрицы RL-M2388 и Arduino Mega
Arduino Forum:
Arduino Forum › Hardware › Interfacing › driving 8x8 LED using 2 74HC595
LED Matrix animation editor
led matrix 8x40 school project
По теме
Библиотека TimerOne
Игра "Жизнь" на Arduino
Энкодер и шкала
Приобрести свтетодиодную матрицу TC15-11 можно в Нашем Магазине:
Матрица сетодиодная 8х8
0 комментариев на «“TC15-11 — матрица светодиодная 8х8”»
Возник вопрос: как вы подключили резистр.сборки к модулю TC15-11? Могли бы вы выложить принципиальную схему данного подключения?
На видео шрифт с шириной линий в один пиксель выглядит, если честно, весьма отвратно. Я когда играл с матрицей, делал потолще.видео
может кто нибуть помочь как поменять направление текста?
Слишком много кушает выводов ардуино…
Как переделать под N-ое количество 74hc595?(имеются аж 20 штук…) max2719 нет возможности заказать, а в китовом наборе только голая матрица =(
Добрый день. Подскажите пожалуйста новичку. Насколько я понял методы матрицы должны подключаться к земле. Каким образом из выходов дуины получилась земля?
Не методы а катоды. Т9 поменял
Подачей на них лог.0 (LOW), естественно.
Собственно так же, как получается +5В при подаче лог.1 (HIGH)