CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

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


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
  * http://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
  * http://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
  • +1
  • 21 февраля 2012, 10:33
  • noonv

Комментарии (4)

RSS свернуть / развернуть
комментарий был удален

+
0
На видео шрифт с шириной линий в один пиксель выглядит, если честно, весьма отвратно. Я когда играл с матрицей, делал потолще. видео
avatar

nes

  • 12 июля 2012, 11:11
+
0
может кто нибуть помочь как поменять направление текста?
avatar

TheChay24

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

TotCambIKoka

  • 7 февраля 2017, 07:44

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.