Подключение матрицы 7*5

andrei
Offline
Зарегистрирован: 22.05.2012

Господа, нужна ваша помощь. Приобрел в местном магазине светодиодную матрицу 7*5, судя по описанию двухцветную. Вот уже третий день пытаюсь подключить её к Arduino Uno. Сначала я полез смотреть инструкцию, хорошо html.alldatasheet.com/html-pdf/232907/KINGBRIGHT/TBA20-11EGWA/605/1/TBA20-11EGWA.html

После долгого изучения я как человек до этой покупки только мигавший светодиодом, решил что без примера не обойтись, модернизировл немного код отсюда arduino.cc/playground/Main/DirectDriveLEDMatrix

Подключил согласно инструкции, первая цифра - пин ардуино, вторая - пин на матрице:

2-12, 3-20, 4-11, 5-7, 6-1, 7-10, 8-2, 9-18, 10-3, 11-5, 12-13, 13-8

вот что вышло:

/*
 * 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.
 *
 */

#include <FrequencyTimer2.h>

#define H { \
    {1, 0, 0, 0, 1}, \
    {1, 0, 0, 0, 1}, \
    {1, 0, 0, 0, 1}, \
    {1, 1, 1, 1, 1}, \
    {1, 0, 0, 0, 1}, \
    {1, 0, 0, 0, 1}, \
    {1, 0, 0, 0, 1}  \
}


byte col = 0;
byte leds[7][5];

// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
int pins[13]= {-1, 12, 20, 11, 7, 1, 10, 2, 18, 3, 5, 13, 8};

// col[xx] of leds = pin yy on led matrix
int cols[5] = {pins[18], pins[3], pins[5], pins[13], pins[8]};

// row[xx] of leds = pin yy on led matrix
int rows[7] = {pins[12], pins[20], pins[11], pins[7], pins[1], pins[10], pins[2]};

const int numPatterns = 7;
byte patterns[numPatterns][7][5] = {
  H
};

int pattern = 0;

void setup() {
  // sets the pins as output
  for (int i = 1; i <= 13; i++) {
    pinMode(pins[i], OUTPUT);
  }

  // set up cols and rows
  for (int i = 1; i <= 7; i++) {
    digitalWrite(cols[i - 1], LOW);
  }

  for (int i = 1; i <= 5; 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, 10);
}

void clearLeds() {
  // Clear display array
  for (int i = 0; i < 7; i++) {
    for (int j = 0; j < 5; j++) {
      leds[i][j] = 0;
    }
  }
}

void setPattern(int pattern) {
  for (int i = 0; i < 7; i++) {
    for (int j = 0; j < 5; j++) {
      leds[i][j] = patterns[pattern][i][j];
    }
  }
}

void slidePattern(int pattern, int del) {
  for (int l = 0; l < 7; l++) {
    for (int i = 0; i < 7; i++) { //4
      for (int j = 0; j < 5; j++) {
        leds[j][i] = leds[j][i+1];
      }
    }
    for (int j = 0; j < 5; j++) {
      leds[j][7] = patterns[pattern][j][0 + l];
    }
    delay(del);
  }
}

// Interrupt routine
void display() {
  digitalWrite(cols[col], LOW);  // Turn whole previous column off
  col++;
  if (col == 5) {
    col = 0;
  }
  for (int row = 0; row < 7; row++) {
    if (leds[col][6 - row] == 1) {
      digitalWrite(rows[row], LOW);  // Turn on this led
    }
    else {
      digitalWrite(rows[row], HIGH); // Turn off this led
    }
  }
  digitalWrite(cols[col], HIGH); // Turn whole column on at once (for equal lighting times)
}

 

 Запостил в общий раздел потому что не пойму где ошибка - в подключении или в коде.

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Как минимум постоянные выходы за границы массива видны.

В строке 30, объявили массив Pins размеров в 13-ть элементов, а потом в строке 33 и 36, пытаемся обратится к его 18-тому и 20-тому элементу.

В строке 52, пытаемся пробежатся по до шестого элемента массива cols, хотя у него размер - пять элементов.

Вообщем наверняка еще куча таких же подарков, это первое что в глаза бросилось.

andrei
Offline
Зарегистрирован: 22.05.2012

 тоесть вот в этом участке

// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
int pins[13]= {-1, 12, 20, 11, 7, 1, 10, 2, 18, 3, 5, 13, 8};

// col[xx] of leds = pin yy on led matrix
int cols[5] = {pins[18], pins[3], pins[5], pins[13], pins[8]};

// row[xx] of leds = pin yy on led matrix
int rows[7] = {pins[12], pins[20], pins[11], pins[7], pins[1], pins[10], pins[2]};

неверно указаны пины? судя по комментариям нужно указать пины самой матрицы. мне показалось странным что нигде не указаны пины самой Ардуино

leshak
Offline
Зарегистрирован: 29.09.2011

 Я не вникал, верно или нет. я вижу что вы объявляете массивы одного размера, а потом пытаетесь достучатся к элементам с большими индексами.

Ну это как у вас есть коробочка на 13-ть ячеек, а вы пытаетесь что-то доставить из 18-той ячейки. Правильное-ли содержимое лежит в этих 13-ти ячейках - не важно. Сам запрос pins[18] - неверен. Скорее всего он вернут ноль, либо случайный мусор, а не номер пина.

Вот эта цифра 18, это не "номер пина", это индекс в массиве pins.

Когда вы пишите int cols[5]={... pins[3]...}, то вы в массив cols помещаете не "3-тий цифровой пин ардуины", а 11-тый.  (3-тий элемент массива pins).