Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/RowColumnScanning

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

LEDmatrix img.jpg

LEDmatrix schem.png

Такие дисплеи очень удобны. Чтобы управлять этой матрицей, нужно подключить все ее ряды и столбцы к микроконтроллеру. Столбцы должны быть подключены к катодам светодиодов (см. рисунок выше), поэтому чтобы включить «столбцовый» светодиод, ему нужно отправить значение 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-матрице.

RowColScan bb.png

Схема

RowColScan schem.png

Код

  1. /*
  2.   «Блуждание» светодиодом по LED-матрице размером 8х8
  3.  
  4.   Этот пример демонстрирует управление светодиодной матрицей размером 8х8
  5.  при помощи двух аналоговых устройств ввода (потенциометров).
  6.  
  7.  Создан 27 мая 2009,
  8.  модифицирован 30 августа 2011 Томом Иго (Tom Igoe).
  9.  
  10.  Этот пример работает с матрицей Lumex LDM-24488NI.
  11.  Посмотреть схему подсоединения контактов для нее можно здесь –
  12.  http://sigma.octopart.com/140413/datasheet/Lumex-LDM-24488NI.pdf
  13.  
  14.  Если вы используете другую матрицу со «столбцовыми» катодами,
  15. вам нужно лишь поменять номера контактов в массивах row[] и col[].
  16.  
  17.  Ряды – это аноды. Столбцы – это катоды.
  18.  ---------
  19.  
  20.  Порядок подключения контактов для матрицы:
  21.  * к цифровым контактам со 2-ого по 13-ый
  22.  * к аналоговым контактам со 2-ого по 5-ый (т.е. используя их в качестве цифровых контактов с 16-ого по 19-ый)
  23.  Порядок подключения контактов для потенциометров:
  24.  * центральные контакты подключены к 0-ому и 1-ому аналоговым контактам Arduino
  25.  * боковые контакты подключены к «земле» и 5-вольтовому контакту на Arduino
  26.  
  27.  Этот пример не защищен авторским правом.
  28.  
  29.  http://www.arduino.cc/en/Tutorial/RowColumnScanning
  30.  
  31.  Более подробно можно почитать здесь –http://www.tigoe.net/pcomp/code/category/arduinowiring/514
  32.  */
  33.  
  34. // Массив для номеров «рядных» контактов:
  35. const int row[8] = {
  36.   2,7,19,5,13,18,12,16 };
  37.  
  38. // Массив для номеров «столбцовых» контактов:
  39. const int col[8] = {
  40.   6,11,10,3,17,4,8,9  };
  41.  
  42. // Делаем 2-мерный массив из 64 пикселей:
  43. int pixels[8][8];          
  44.  
  45. // Начальная позиция курсора:
  46. int x = 5;
  47. int y = 5;
  48.  
  49. void setup() {
  50.   // Перебираем контакты:
  51.   for (int thisPin = 0; thisPin < 8; thisPin++) {
  52.     // Делаем контакты выходными:
  53.     pinMode(col[thisPin], OUTPUT);
  54.     pinMode(row[thisPin], OUTPUT);  
  55.     // Задаем для «столбцовых» контактов (т.е. для катодов) значение HIGH,
  56.     // чтобы убедиться, что светодиоды будут выключены:
  57.     digitalWrite(col[thisPin], HIGH);    
  58.   }
  59.  
  60.   // Инициализируем пиксельную матрицу:
  61.   for (int x = 0; x < 8; x++) {
  62.     for (int y = 0; y < 8; y++) {
  63.       pixels[x][y] = HIGH;
  64.     }
  65.   }
  66. }
  67.  
  68. void loop() {
  69.   // Считываем входящие данные:
  70.   readSensors();
  71.  
  72.   // Обновляем экран:
  73.   refreshScreen();
  74. }
  75.  
  76. void readSensors() {
  77.   // Сбрасываем последнюю позицию:
  78.   pixels[x][y] = HIGH;
  79.   // Считываем данные и преобразовываем их в значения для осей X и Y:
  80.   x = 7 - map(analogRead(A0), 0, 1023, 0, 7);
  81.   y = map(analogRead(A1), 0, 1023, 0, 7);
  82.   // Задаем для новой позиции пикселя значения LOW,
  83.   // чтобы при следующем обновлении экрана
  84.   // включить светодиод, находящийся на этой позиции.
  85.   pixels[x][y] = LOW;
  86.  
  87. }
  88.  
  89. void refreshScreen() {
  90.   // Перебираем ряды (аноды):
  91.   for (int thisRow = 0; thisRow < 8; thisRow++) {
  92.     // Задаем «рядному» контакту (аноду) значение HIGH:
  93.     digitalWrite(row[thisRow], HIGH);
  94.     // Перебираем столбцы (катоды):
  95.     for (int thisCol = 0; thisCol < 8; thisCol++) {
  96.       // Получаем позицию, где пиксель находится в данный момент:
  97.       int thisPixel = pixels[thisRow][thisCol];
  98.       // Включаем светодиод,
  99.       // ряд которого получил значение HIGH,
  100.       // а столбец – LOW:
  101.       digitalWrite(col[thisCol], thisPixel);
  102.       // Выключаем пиксель:
  103.       if (thisPixel == LOW) {
  104.         digitalWrite(col[thisCol], HIGH);
  105.       }
  106.     }
  107.     // Отправляем «рядному» контакту значение LOW,
  108.     // чтобы выключить сразу весь ряд:
  109.     digitalWrite(row[thisRow], LOW);
  110.   }
  111. }

См.также

  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

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

  1. Arduino - Row-columm Scanning to control an 8x8 LED Matrix