Многофункциональный модуль для Arduino

Платформа Arduino прекрасна своими модулями расширения (shields). Их множество, на все случаи жизни. Большая часть модулей имеет некоторую специализацию, будь то модуль драйверов двигателей, модуль дисплея 1602 или модуль для работы с сетью Ethernet. Но есть такие, которые можно назвать многофункциональными. Именно о таком модуле и пойдёт речь в этой статье.

Многофункциональный модуль расширения для Arduino

На универсальном модуле расширения есть

  • четырёхразрядный семисегментный индикатор, плюс два сдвиговых регистра: для коммутации разрядов и сегментов;

  • четыре светодиода;

  • зуммер;

  • потенциометр многооборотный;

  • три кнопки, плюс кнопка сброса;

  • разъёмы для подключения датчиков LM35, DS18B20 и инфракрасного приёмника;

  • разъём APC220 для подключения одноимённого радиомодуля либо модулей Bluetooth со стандартным набором контактов;

  • прочие GPIO.

Характеристики

  • напряжение питания: 5 В;

  • размеры: 69 × 53,5 мм.

Подключение

Принципиальная схема платы

Принципиальная схема многофункционального модуля

Таблица контактов Arduino, к которым подключены элементы модуля:

Элемент

Arduino

Семисегментный индикатор

Latch 4, Clock 7, Data 8

Светодиоды

D10, D11, D12, D13

Зуммер

D3

Потенциометр

A0

Кнопки

A1, A2, A3

Разъём датчиков LM35, DS18B20

A4

Разъём инфракрасного приёмника

D2

Разъём APC220

GND, +5V, D0(RX), D1(TX)

Прочие разъёмы

D5, D6, D9, A5

Примечание

Также необходимо отдельно отметить две перемычки на плате:

  • J1 — подключает подтяжку к питанию через резистор 10 кОм;

  • J2 — подключает подтяжку кнопок к питанию через резистор 10 кОм.

Программа

В действительности, модуль не несёт на себе каких-то специфичных устройств, так что для работы со всей имеющейся периферией подойдут программы из разных уроков:

  • работа с аналоговым датчиком температуры LM35;

  • работа с цифровым датчиком температуры DS18B20;

  • про зуммер;

  • про потенциометр;

  • про кнопки.

Пожалуй, полезным будет только пример программы для работы с сегментным индикатором.

#define LATCH_DIO 4 // линия синхронизации данных, защелка (LCHCLK)
#define CLK_DIO 7 // линия тактирования (SFTCLK)
#define DATA_DIO 8 // линия передачи данных (SDI)

byte counter = 0;

// коды цифр от 0 до 9
const byte seg_digits[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
// коды разрядов
const byte seg_num[] = {0xF1,0xF2,0xF4,0xF8};

// таймер
unsigned long counter_next;
unsigned int counter_to = 200;

void setup (){
    // настройка контактов индикатора
    pinMode(LATCH_DIO, OUTPUT);
    pinMode(CLK_DIO, OUTPUT);
    pinMode(DATA_DIO, OUTPUT);
}

void loop(){
    unsigned long tm = millis();
    if( counter_next < tm ){
        counter_next = tm + counter_to;
        counter++;
    }

    // вывод числа на индикатор поразрядно
    writeNumber(0 , 0); // первый разряд (индекс 0)
    writeNumber(1 , (counter/100) % 10); // второй разряд
    writeNumber(2 , (counter/10) % 10); // третий разряд
    writeNumber(3 , counter % 10); // четвёртый разряд
}

// вывод цифры в заданный разряд
void writeNumber(byte seg, byte val){
    digitalWrite(LATCH_DIO,LOW);
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, seg_digits[val]);
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, seg_num[seg] );
    digitalWrite(LATCH_DIO, HIGH);
}