TC15-11 — матрица светодиодная 8х8


TC15-11
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”»

  1. Слишком много кушает выводов ардуино…
    Как переделать под N-ое количество 74hc595?(имеются аж 20 штук…) max2719 нет возможности заказать, а в китовом наборе только голая матрица =(

  2. Добрый день. Подскажите пожалуйста новичку. Насколько я понял методы матрицы должны подключаться к земле. Каким образом из выходов дуины получилась земля?

    • Каким образом из выходов дуины получилась земля?

      Подачей на них лог.0 (LOW), естественно.
      Собственно так же, как получается +5В при подаче лог.1 (HIGH)

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение