Arduino:Примеры/RowColumnScanning

Материал из Онлайн справочника
Версия от 22:13, 13 декабря 2016; Myagkij (обсуждение | вклад) (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


«Блуждание» светодиодом по LED-матрице размером 8х8 [1]

Светодиодные дисплеи (т.е. LED-дисплеи) часто представляют собой матрицу, состоящей из группы светодиодов – с общими анодами в рядах и общими катодами в столбцах (или наоборот). Вот тут можно посмотреть типичный пример, а ниже – схему из этого примера.

Такие дисплеи очень удобны. Чтобы управлять этой матрицей, нужно подключить все ее ряды и столбцы к микроконтроллеру. Столбцы должны быть подключены к катодам светодиодов (см. рисунок выше), поэтому чтобы включить «столбцовый» светодиод, ему нужно отправить значение LOW. Ряды должны быть подключены к анодам светодиодов, поэтому чтобы включить «рядный» светодиод, ему нужно отправить значение HIGH. Если светодиоды, будь они хоть в рядах, хоть в столбцах, будут получать только значение HIGH или только значение LOW, разницы потенциалов не возникнет, поэтому в итоге светодиоды так и останутся не включенными.

Таким образом, чтобы включить какой-нибудь светодиод, его столбцу нужно отправить значение LOW, а его ряду – HIGH. Чтобы включить сразу несколько светодиодов в ряду, всем им нужно подать значение HIGH, а затем по мере надобности задавать тем или иным столбцам значение LOW. В итоге в столбцах со значением LOW светодиод включится, а в столбцах с HIGH – нет.

Совет! Контакты, которые при помощи функции pinMode() задали как выходные (OUTPUT), по умолчанию имеют значение LOW.

Хотя продаются и уже готовые LED-матрицы, вы можете создать собственную. Для этого воспользуйтесь 64 светодиодами и рисунком выше.

Неважно, к какому именно контакту Arduino вы подсоединяете ряды и столбцы вашей LED-матрицы, поскольку эти нестыковки можно подправить на программном уровне. Так что подключайте контакты так, как вам удобнее. Или воспользуйтесь вариантом, который предложен ниже (за его основу взят рисунок выше).

Номер контакта на LED-матрице Ряд Столбец Номера контакта на Arduino
1 5 - 13
2 7 - 12
3 - 2 11
4 - 3 10
5 8 - 16 (2-ой аналоговый)
6 - 5 17 (3-ий аналоговый)
7 6 - 18 (4-ый аналоговый)
8 3 - 19 (5-ый аналоговый)
9 1 - 2
10 - 4 3
11 - 6 4
12 4 - 5
13 - 1 6
14 2 - 7
15 - 7 8
16 - 8 9

Необходимое оборудование

  • Плата Arduino;
  • Светодиодная матрица 8х8;
  • Два потенциометра;
  • Провода-перемычки;
  • Макетная плата Breadboard;

Цепь

Шестнадцать контактов LED-матрицы подсоединены к шестнадцати контактам Arduino. Четыре аналоговых контакта используются в качестве входных цифровых контактов – с 16-ого по 19-ый. Порядок расположения этих контактов устанавливается на программном уровне, т.е. в двух массивах. Два потенциометра подключены к 0-ому и 1-ому аналоговым контактам. С их помощью и осуществляется управление светодиодом, как бы «блуждающим» по LED-матрице.

Схема

Код

/* 
  «Блуждание» светодиодом по LED-матрице размером 8х8
 
  Этот пример демонстрирует управление светодиодной матрицей размером 8х8 
 при помощи двух аналоговых устройств ввода (потенциометров).
 
 Создан 27 мая 2009,
 модифицирован 30 августа 2011 Томом Иго (Tom Igoe). 
 
 Этот пример работает с матрицей Lumex LDM-24488NI.
 Посмотреть схему подсоединения контактов для нее можно здесь – 
 http://sigma.octopart.com/140413/datasheet/Lumex-LDM-24488NI.pdf
  
 Если вы используете другую матрицу со «столбцовыми» катодами, 
вам нужно лишь поменять номера контактов в массивах row[] и col[].
 
 Ряды – это аноды. Столбцы – это катоды. 
 ---------
 
 Порядок подключения контактов для матрицы:
 * к цифровым контактам со 2-ого по 13-ый
 * к аналоговым контактам со 2-ого по 5-ый (т.е. используя их в качестве цифровых контактов с 16-ого по 19-ый)
 Порядок подключения контактов для потенциометров:
 * центральные контакты подключены к 0-ому и 1-ому аналоговым контактам Arduino
 * боковые контакты подключены к «земле» и 5-вольтовому контакту на Arduino
 
 Этот пример не защищен авторским правом.
 
 http://www.arduino.cc/en/Tutorial/RowColumnScanning
 
 Более подробно можно почитать здесь –http://www.tigoe.net/pcomp/code/category/arduinowiring/514 
 */

// Массив для номеров «рядных» контактов:
const int row[8] = {
  2,7,19,5,13,18,12,16 };

// Массив для номеров «столбцовых» контактов:
const int col[8] = {
  6,11,10,3,17,4,8,9  };

// Делаем 2-мерный массив из 64 пикселей:
int pixels[8][8];           

// Начальная позиция курсора:
int x = 5;
int y = 5;

void setup() {
  // Перебираем контакты:
  for (int thisPin = 0; thisPin < 8; thisPin++) {
    // Делаем контакты выходными:
    pinMode(col[thisPin], OUTPUT); 
    pinMode(row[thisPin], OUTPUT);  
    // Задаем для «столбцовых» контактов (т.е. для катодов) значение HIGH,
    // чтобы убедиться, что светодиоды будут выключены:
    digitalWrite(col[thisPin], HIGH);    
  }

  // Инициализируем пиксельную матрицу:
  for (int x = 0; x < 8; x++) {
    for (int y = 0; y < 8; y++) {
      pixels[x][y] = HIGH;
    }
  }
}

void loop() {
  // Считываем входящие данные:
  readSensors();

  // Обновляем экран:
  refreshScreen();
}

void readSensors() {
  // Сбрасываем последнюю позицию:
  pixels[x][y] = HIGH;
  // Считываем данные и преобразовываем их в значения для осей X и Y:
  x = 7 - map(analogRead(A0), 0, 1023, 0, 7);
  y = map(analogRead(A1), 0, 1023, 0, 7);
  // Задаем для новой позиции пикселя значения LOW,
  // чтобы при следующем обновлении экрана
  // включить светодиод, находящийся на этой позиции. 
  pixels[x][y] = LOW;

}

void refreshScreen() {
  // Перебираем ряды (аноды):
  for (int thisRow = 0; thisRow < 8; thisRow++) {
    // Задаем «рядному» контакту (аноду) значение HIGH:
    digitalWrite(row[thisRow], HIGH);
    // Перебираем столбцы (катоды):
    for (int thisCol = 0; thisCol < 8; thisCol++) {
      // Получаем позицию, где пиксель находится в данный момент:
      int thisPixel = pixels[thisRow][thisCol];
      // Включаем светодиод, 
      // ряд которого получил значение HIGH, 
      // а столбец – LOW:
      digitalWrite(col[thisCol], thisPixel);
      // Выключаем пиксель:
      if (thisPixel == LOW) {
        digitalWrite(col[thisCol], HIGH);
      }
    }
    // Отправляем «рядному» контакту значение LOW,
    // чтобы выключить сразу весь ряд:
    digitalWrite(row[thisRow], LOW);
  }
}

См.также

  1. pinMode()
  2. for()
  3. digitalWrite()
  4. if()
  5. map()
  6. Writing Functions
  7. For Loop
  8. Array
  9. If Statement
  10. LED Bar Graph

Внешние ссылки