На обзоре один из самых дешевых, и наверное самых интересных в своём роде шилдов для форм фактора Arduino Uno/Mega. Простой как топор и в то же время вызывающий любопытство - Multifunctional Shield for Uno/Mega. 

         Ну что же, начнём обзор по данному шилду, автора статьи он прежде всего заинтересовал не своей функциональностью, как о том говорит его название, а своей смешной ценой - 80 рублей. Это конечно же и привлекло внимание, но и функционал его тоже заставил задуматься, всё таки китайские друзья неплохо постарались в этом плане. Как вы уже поняли из названия, данный шилд предназначен для форм фактора плат Uno, либо Mega. Итак, тест этого шилда можно начать с включения дисплея. Далее, конечно нужно будет развивать эту тему, тестируя всё остальное, но это потом. А сейчас по дисплею...

         Дисплей управляется двумя сдвиговыми регистрами 74HC595(на фото ниже они обозначены позицией №2), то есть эти микросхемы являются драйверами дисплея. Сам дисплей вставляется в штыревые гнёзда обозначенные позицией №1, в оригинале на таких шилдах дисплей просто припаян к плате, штыревые гнёзда - это уже собственноручная модификация от автора. Регистры 74HC595 подключаются к плате Arduino задействуя пины 4(74HC595[Latch]), 7(74HC595[Shift]) и 8(74HC595[Data]), они обозначены позицией №3

 

 

         Сам дисплей представляет собой многоразрядный семисегментный индикатор с общим анодом. На фото он показан на самом верху, видно, что дисплей с разделителем типа двоеточие, такие обычно используются для индикации временных значений. Зная используемые пины подключения, можно залить в плату тестовый скетч и посмотреть как работает дисплей. Работа скетча заключается в том, чтобы вывести числа от 1 до 4 в одноименные знакоместа дисплея. С чем данный скетч справляется прекрасно... Итак, скетч хорошо прокомментирован, как всегда его можно просто скопировать из окна браузера.

 

#define LATCH 4 /*RCK 2*/
#define DATA 8  /*DIO 3*/
#define CLOCK 7 /*SCK 4*/

/*
 * Переменная cycleCounter - счетчик циклов сканирования
 * за каждый цикл сканирования loop, будет отрисовываться одна цифра
 * в заданном разряде.
 */
static unsigned char cycleCounter = 0;

/*
 * Определяем разряды на трубке, начнем с крайнего левого
 * он будет первым(самым младшим), крайний правый будет шестым
 * самым старшим.
 */
/* Разряды 0-й 1-й 2-й 3-й */
byte numbDigits[8] = {0x01, 0x02, 0x04, 0x08};

/*
 * Формируем из сегментов цифру
 */
/* Цифры 0 1 2 3 4 5 6 7 8 9 */
byte numbSerial[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

/*
 * Точка для разряда
 */
byte pointDigit = 0x80;

void setup()
{
  /*Определяем все назначенные пины как выходы*/
  pinMode(LATCH, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA,  OUTPUT);
}

void loop()
{
  /*Перед началом цикла сканирования, сравниваем счетчик*/
  /*если прошло 4 цикла, и счетчик был инкрементирован*/
  /*то сбрасываем*/
  if(cycleCounter == 4)
  {
    cycleCounter = 0;
  }

  /*Чтобы начать работу с дисплеем нужно установить пин "защелку"*/
  /*в низкий уровень, пока есть низкий уровень можно записывать*/
  /*в регистр значения, кодирующие включение нужных сегментов*/
  /*в нужном разряде */
  digitalWrite(LATCH, LOW);

  /*Сначала сдвигаем байт кодирующий цифру */
  shiftOut(DATA, CLOCK, MSBFIRST, numbSerial[cycleCounter + 1]);

  /*Затем сдвигаем байт кодирующий разряд */
  shiftOut(DATA, CLOCK, MSBFIRST, numbDigits[cycleCounter]);

  /*Затем нужно "защелкнуть данные", установить пин Latch*/
  /*в высокий уровень, если этого не сделать то на дисплее будет*/
  /*видна непонятная "каша" из разных зажженых сегментов*/
  digitalWrite(LATCH, HIGH);

  cycleCounter ++;

  delayMicroseconds(1000);
}

Ну что же, на этом пока всё, в дальнейших статьях мы постараемся рассмотреть примеры применения данного шилда.