
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)