В широком ассортименте компании Мастер Кит есть три очень похожих внешне модуля: MP8037R, MP8037ADC и MP8037time. Соответственно, «цифровой термометр/термостат», «цифровой модуль защиты и управления», «многорежимный таймер».
При внимательном рассмотрении конструкции и принципиальной схемы, становится ясно, что физически это одно и то же устройство на основе микроконтроллера ATMega168! Разница в функционале достигается всего лишь заменой прошивки микроконтроллера, так называемого firmware – встроенного микропрограммного обеспечения.
Для модулей MP8037 прошивки разрабатываются и компилируются в бинарный код (файл с расширением .hex) с помощью профессиональной среды программирования на языке С. Готовым бинарным кодом микроконтроллер прошивается на производстве посредством промышленного быстродействующего программатора.
Но если у вас есть какая-либо плата популярного контроллера Arduino, то вы можете самостоятельно написать прошивку и «залить» ее в микроконтроллер модуля MP8037, получив, таким образом, свое собственное уникальное устройство с нужным вам функционалом.
Идея состоит в том, чтобы использовать среду Arduino IDE для написания программы, а плату Arduino в качестве программатора для микроконтроллера ATMega168, установленного на модуле MP8037.
Язык программирования для Ардуино прост в освоении; также не вызывает затруднений применение этого языка для управления микроконтроллером.
Поскольку на плате любого модуля MP8037 есть четырехразрядный семисегментный светодиодный индикатор, а также две кнопки, напишем программу, которая при нажатии на правую кнопку будет отсчитывать время в секундах (с десятыми долями), пока эта кнопка нажата. При отпускании правой кнопки отсчет прекращается, при повторном нажатии – продолжается. При нажатии на левую кнопку результат сбрасывается в 0.
В этом материале мы подробно объясним, как это сделать.
Для экспериментов нам понадобятся:
- любой модуль MP8037;
- плата Arduino;
- макетная плата для установки на ней Adruino Nano и коммутации проводников;
- самодельный кабель из 6-ти проводников для соединения Ардуино с модулем MP8037;
- USB кабель для подключения Arduino Nano к компьютеру;
- компьютер с установленной программной оболочкой Arduino IDE.
В качестве модуля мы взяли готовый прошитый MP8037R, в качестве платы Arduino – плату MB NANO из ассортимента Мастер Кит. Аналогичная плата входит в комплект набора для знакомства и изучения Ардуино «Цифровая лаборатория» NR05 из серии Азбука электронщика.
Макетные платы входят в составы наборов этой же серии «Основы схемотехники» NR03 и «Классика схемотехники» NR04. Наборы серии «Азбука электронщика» будут, несомненно, интересны детям, подросткам и всем, кто интересуется электроникой.
Кабель для подключения платы Arduino к модулю можно спаять из планки DK0176 (штыревой соединитель PLS-40) и любых подходящих проводников. Это стандартный кабель для интерфейса SPI, который используется для прошивки микроконтроллеров фирмы Atmel.
Схема кабеля:
Наименование линии | Выводы Ардуино |
| К разъему X2 на плате MP8037 |
+5В | +5V | <-> | 6 |
RESET | D10 | <-> | 5 |
SCK | D13 | <-> | 4 |
MISO | D12 | <-> | 3 |
MOSI | D11 | <-> | 2 |
Общий (GND) | GND | <-> | 1 |
Выглядит он вот так:
Кабель USB должен иметь разъем микро-USB и стандартный разъем для подключения к компьютеру.
Оболочку Arduino IDE можно скачать на сайте www.arduino.cc на страничке https://www.arduino.cc/en/Main/Software. На момент написания этого материала последней версией оболочки была версия 1.8.5. C этой версией мы и проводили все описываемые действия. Кстати, если вы будете продолжать эксперименты с программированием в среде Arduino IDE, рекомендуем установить несколько версий оболочки, в том числе и старые, поскольку не все библиотеки, особенно сторонние, работают с последними версиями оболочки. Варианты установки среды программирования и ее настройки на компьютере неоднократно описаны в сети, например, здесь.
Для начала сделаем из платы Arduino программатор. Для этого необходимо залить на плату скетч (так называются программы для Ардуино) из стандартных примеров оболочки программирования.
Подключим плату Ардуино к компьютеру.
Выберем нужную плату и порт (у нас COM3, у вас может быть другой):
Выберем скетч программатора:
Нажатием на значок со стрелкой, направленной вправо, скомпилируем скетч и загрузим его в Arduino Nano. В случае успешной загрузки в нижней части окна оболочки программирования появится сообщение о завершении загрузки и использовании памяти микроконтроллера. Наш софтверный программатор готов!
Но есть одно «но»…В стандартном наборе плат среды программирования нет отдельно взятых микроконтроллеров, только платы Arduino и другие, а нам необходим конкретно ATMega168PA, работающий на частоте 8 МГц, поскольку именно на эту частоту настроен микроконтроллер на плате MP8037.
Воспользуемся свободно распространяемой библиотекой плат и весьма удобным механизмом среды Ардуино для их включения в набор.
В главном окне оболочки откроем пункт меню «Файл» -> «Настройки» и в пункте «Дополнительные ссылки для Менеджера плат» занесем следующую ссылку:
https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
Закроем настройки и зайдем в пункт меню «Инструменты» -> «Плата» -> «Менеджер плат». В «Менеджере плат» находим библиотеку MiniCore by MCUdude и нажимаем кнопку «Установить». После этого рекомендуется перезапустить Arduino IDE.
Теперь в пункте «Плата» появилась необходимая нам ATMega168 с параметрами. Выберем необходимые:
В некоторых версиях модулей MP8037 могут быть установлены микроконтроллеры ATMega328PA с большей памятью, в остальном аналогичные ATMega168PA. Соответственно, в этом случае при указании платы следует выбирать ATMega328PA и частоту 8 МГц.
Установим Arduino Nano на макетную плату и соединим ее с модулем MP8037 по следующей схеме. Тем самым мы реализовали возможность программировать микроконтроллер модуля MP8037 по интерфейсу SPI, который обеспечивается программным обеспечением, прошитым в плате Ардуино.
Для того чтобы правильно описать в программе выводы микроконтроллера модуля MP8036, и их соответствие названиям выводов, принятых в среде программирования Arduino IDE, сравним принципиальные схемы модуля MP8037R и платы Arduino Nano, на которой также могут быть установлены микроконтроллеры ATMega168 или ATMega328. Напомним, что за исключением объема памяти, они идентичны.
Результаты сведем в таблицу:
Название | Обозначение на схеме MP8037 | Обозначение порта (вывода) ATMega168PA | Обозначение на плате Arduino | Обозначение в программе |
Разряд 1 | LED_DIG1 | PD4 | D4 | 4 |
Разряд 2 | LED_DIG2 | PD3 | D3 | 3 |
Разряд 3 | LED_DIG3 | PD2 | D2 | 2 |
Разряд 4 | LED_DIG4 | PD1 | D1 | 1 |
Сегмент a | LED_A | PD6 | D6 | 6 |
Сегмент b | LED_B | PB4 | D12 | 12 |
Сегмент c | LED_C | PB2 | D10 | 10 |
Сегмент d | LED_D | PB0 | D8 | 8 |
Сегмент e | LED_E | PD7 | D7 | 7 |
Сегмент f | LED_F | PD5 | D5 | 5 |
Сегмент g | LED_G | PB3 | D11 | 11 |
Точка | LED_H | PB1 | D9 | 9 |
Кнопка 1 | S1 | PC2 | A2 | A2 или 16 |
Кнопка 2 | S2 | PC1 | A1 | A1 или 15 |
Реле | GP0 | PC0 | A0 | A0 или 14 |
Для отображения чисел на индикаторах будем использовать динамическую индикацию – то есть, будем синхронизировать поочередное включение четырех разрядов нашего индикатора с включением в нужный момент необходимого для отображения цифры набора сегментов в этом разряде.
Не вдаваясь в подробности программирования на языке Wiring, который используется в Arduino IDE, приведем листинг скетча.
// список выводов Arduino для подключения к разрядам a-g
// семисегментного индикатора
int pins[8]={6,12,10,8,7,5,11,9};
// сегменты для вывода цифр 0-9
byte numbers[10] = { B11111100, B01100000, B11011010,
B11110010, B01100110, B10110110,
B10111110, B11100000, B11111110,
B11110110};
// переменные для хранения и обработки отображаемого числа
int number=0;
int number1=0;
int number2=0;
// выводы для подключения разрядов семисегментного индикатора
int pindigits[4]={1,2,3,4};
// переменная для хранения текущего разряда
int digit=0;
// переменная для отмеривания 100 мс интервала
unsigned long millis1=0;
const int BUTTON=A1; // Контакт A1 для подключения кнопки 1
const int RESET=A2; // Контакт A2 для подключения кнопки 2
void setup()
{
// Сконфигурировать контакты кнопок как входы
pinMode (BUTTON, INPUT_PULLUP);
pinMode (RESET, INPUT_PULLUP);
// Сконфигурировать контакты как выходы
// и установить на них низкий логический уровень
for(int i=0;i<8;i++)
{
pinMode(pins[i],OUTPUT);
digitalWrite(pins[i],LOW);
}
for(int i=0;i<4;i++)
{
pinMode(pindigits[i],OUTPUT);
digitalWrite(pindigits[i],LOW);
}
delay(1000);
}
void loop()
{
// если левая кнопка нажата - сброс
if (digitalRead(RESET) == LOW){
millis1 = millis();
number = 0;
}
// если правая кнопка нажата - счет
if (digitalRead(BUTTON) == LOW){
if(millis()-millis1 > 100)
{millis1=millis1+100;
number=number+1;
if(number==10000)
number=0;
}
}
else millis1 = millis(); number1=number;
// цикл перебора разрядов
for(int i=0;i<4;i++)
{
number2=number1%10;
number1=number1/10;
showNumber(number2,i);
for(int j=0;j<4;j++) digitalWrite(pindigits[j],HIGH);
digitalWrite(pindigits[i],LOW);
delay(3);
}
}
// функция вывода цифры и точки
void showNumber(int num,int dig)
{
for(int i=0;i<8;i++)
{
if(bitRead(numbers[num],7-i)==HIGH) // зажечь сегмент
digitalWrite(pins[i],LOW);
else // потушить сегмент
digitalWrite(pins[i],HIGH);
}
if(dig==1)
digitalWrite(pins[7],LOW);
}
Он снабжен комментариями, которые помогут разобраться, как работает программа. Описание языка можно найти по адресу https://www.arduino.cc/reference/en/
Скопируйте текст скетча в новое окно среды программирования.
Поскольку ранее мы уже установили в среде программирования необходимую плату и ее параметры, осталось нажать кнопку «Загрузка», чтобы запрограммировать микроконтроллер модуля MP8037R.
Поскольку на плате модуля MP8037R разъем X2 не распаян, вставьте цельную шестиконтактную вилку нашего самодельного кабеля в соответствующие отверстия на плате модуля и придержите пальцем, обеспечивая хороший контакт, пока микроконтроллер прошивается.
После прошивки можно отключить разъем кабеля SPI и подать 12В постоянного тока на модуль. На одну секунду после подачи напряжения во всех четырех разрядах загорятся все сегменты для проверки индикатора, после чего устройство готово к работе. Нажимаем и удерживаем правую кнопку – идет счет секунд с десятыми долями, отпускаем – счет прекращается. Нажатие левой кнопки сбрасывает результат. Как запрограммировали – так и работает!
Видео:
Конечно, на первый раз процедура может показаться не слишком простой, но, поверьте, потратив немного времени, вы сможете создавать свои варианты устройств на базе модуля MP8037; сможете задействовать установленное на нем реле, подключите датчик температуры, научитесь отображать поданное на модуль напряжение и многое другое.
Желаем успехов в освоении и применении электроники для проектов DIY.
Ваш Мастер Кит.