Еще один интересный и даже полезный проект на NodeMCU — бегущая строка с WiFi управлением. Наверняка, все из нас каждый день видят подобные устройства на улицах города. К примеру, бегущая строка широко применяется на транспорте для вывода номера маршрута, следующей остановки и навязчивой рекламы всякой всячины. Типичная бегущая строка представляет собой светодиодную матрицу со схемой управления разверткой и микроконтроллером на борту. Текст, ползущий по этой матрице, может храниться локально, либо обновляться динамически через WiFi или GSM. Разумеется, имея такую мощную платформу как NodeMCU (или любой другой ESP8266), бегущую строку можно сделать в домашних условиях. Установить её рационально где-нибудь в публичном месте, например в школе. Через такое информационное табло будет удобно сообщать внутренние школьные новости, температуру за окном, или даже фамилии отличников! В нашей лаборатории мы установили бегущую строку в окне на первом этаже. С помощью этого IoT устройства мы поздравляли всех прохожих с Новым Годом и рождеством 🙂
1. Подключение светодиодной матрицы к NodeMCU
Будем работать с готовыми модулями матрицы под управлением микросхемы MAX7219. Подробно о работе таких модулей мы уже писали в одном из уроков для платформы Ардуино — . Вкратце, у каждого такого модуля есть 10 контактов. Пять с одной стороны и столько же с другой. Это сделано для того, чтобы модули можно было соединять друг за другом в цепочку. На входе имеем:- два контакта для питания: земля GND и +5В;
- три контакта для шины SPI: CS, DIN, CLK;
Светодиодная матрица 8×8 с MAX7219 | VCC | GND | DIN | CS | CLK |
NodeMCU | +5V | GND | D7 | D8 | D5 |
Внешний вид стенда:
Вместо четырех отдельных модулей имеет смысл использовать готовую сборку, например, такую:
2. Программа для управления MAX7219 на NodeMCU
Попробуем запустить бегущую строку на матрицах, пока без возможности удаленно подключаться к NodeMCU. То есть бегущая строка будет крутить какой-то статичный текст. По сути, это код из . Единственное, что изменилось — это размер цепочки. Здесь мы используем не шесть матриц, а только четыре. #include3. Веб-сервер на NodeMCU для управления светодиодной матрицей
Теперь добавим в программу веб-сервер, который будет показывать одну единственную HTML страницу с полем для ввода текста бегущей строки и с кнопкой. #include4. Бегущая строка на русском языке
В текущем виде наш аппарат не поддерживает русский язык. Если попытаться ввести текст на русском, на матрице вместо букв появятся utf8 коды. Чтобы это исправить, нам потребуется дополнительная функция utf2rus. Кроме этого, добавим в программу пароль для WiFi точки. #includeСхема сброса по включению питания (Power-On Reset - POR) обеспечивает запуск микроконтроллера только по достижении напряжением Vcc безопасного уровня. Как показано на Рис. 24, встроенный таймер, тактируемый встроенным генератором сторожевого таймера, удерживает запуск MCU на некоторое время после достижения граничного напряжения вкючения питания Vpot , не зависящее от скорости нарастания напряжения Vcc (см. Рис. 26).
В Таблице 6 показаны установки битов SUT1 и SUT0 использующихся для установки длительности периода задержки процедуры запуска. Пользователю предоставляется возможность выбора задержки времени запуска. Установка SUT 1/0 = 00, при которой MCU запускается через 5 тактовых циклов, используется при использовании внешнего тактового сигнала, подаваемого на вывод XTAL1. Такая установка обеспечивает быстрый запуск из режимов power down или power save, при условии наличия тактового сигнала в этих режимах. Подробности в разделе Программирование.
Если встроенная задержка запуска достаточна, то RESET может быть подсоединен к Vcc непосредственно или через внешний нагрузочный резистор. Удержанием вывода на низком уровне, во время подачи напряжения, период сброса по включению питания может быть увеличен. Пример такого тактирования приведен на. Рис. 27.
Рис. 25. Начальный запуск MCU. Вывод RESET подключен к Vcc, быстрое нарастание Vcc
Рис. 26. Начальный запуск MCU. Вывод RESET подключен к Vcc, медленное нарастание Vcc
Сисадмин (он же на английском языке sysadmin , system administrator ) - сокращенное наименование профессии, полное название которой на русском языке звучит как системный администратор . Данная профессия в последнее время стала очень популярной для большинства молодых, и не очень, людей, ей обучают, по ней работают, за неё получают хорошие деньги. Связано это с бурным развитием различных компьютерных технологий и их проникновением во все сферы человеческой жизни. Слово сисадмин часто используется в разговорной речи, в вакансиях и резюме при поиске работы, одним словом - везде. Ниже пойдет речь о том, что же представляет из себя профессия системного администратора.
В современных реалиях, системным администратором может называться фактически любой человек, который занимается обслуживанием и поддержанием работы определенной компьютерной сети, включая все её аппаратные и/или программные компоненты, в которую могут входить:
- Персональные компьютеры, как рабочие станции, так и сервера;
- Сетевое оборудование, такое как коммутаторы, маршрутизаторы, фаерволлы и многое другое;
- Веб-сервера, почтовые сервера, сервера баз данных, и прочие.
Так же в определенных случаях, на плечи системного администратора могут лечь обязанности по обеспечению должной информационной безопасности.
В зависимости от своей специализации, системный администратор может заниматься следующими видами деятельности:
- Администратор рабочих станций и серверов чаще всего занимается починкой как аппаратных (вышедшие из строя материнские платы, погоревшие блоки питания), так и программных (не загружается Windows, не печатаются запятые в Word"e...).
- Администратор корпоративной сети на основе домена Active Directory. Очень популярное занятие, учитывая распространенность операционных систем Windows, а так же необходимость их как-то централизованно контролировать. Такой специалист должен уметь создавать, распределять по группам, редактировать пользователей, выдавать им соответствующие права в домене AD, а так же уметь управлять групповыми политиками для пользователей, их компьютеров и групп, в которых они все состоят.
- Администрирование сетей и сетевого оборудования. В его обязанности входит знание топологии сетей, умение работать как с не настраиваемым, так и с настраиваемым сетевым оборудованием, планирование локальной вычислительной сети, а так же возможность объединения в одну сеть нескольких отдаленных друг от друга рабочих мест, путем настройки NAT"ов и VPN"ов. Не стоит так же забывать и контроле доступа в рамках этой сети, и за её пределами - настройка прокси.
- Администратор веб-сервера, который должен как минимум уметь устанавливать, настраивать и обслуживать один из следующих веб-серверов - Apache, IIS, Nginx, следить за хостингом (который может располагаться как внутри сети организации, так и вне её). Кроме того, хороший администратор должен уметь настроить нормальное распределение ресурсов при высоких нагрузках, кластеризацию и много других специфичных вещей.
- Администрирование почтового сервера так-же является распространенной задачей для сисадмина, в его задачи входит работа с такими популярными решениями как Exim, Microsoft Exchange, Postfix, Sendmail, или корпоративными почтовыми решениями от Google или, например, Yandex. Кроме очевидного контроля за учетными записями (создание, удаление, настройка), так же обязательно уметь настроить антиспам систему и прочее.
- Администратор сайта. В эти обязанности может входить как просто какое-то наполнение содержимым сайта, но раз речь идет о системном администраторе, то по идее он должен уметь и настроить хостинг (в том числе и веб-сервер, о чем уже говорилось выше), установить и настроить нужный сайт, например какую-либо систему управления содержимым (CMS).
- Совсем редко под обязанности системного администратора может попасть задача создания или обслуживания системы видеонаблюдления. В задачах установка и настройка камер, реагирования на различные события, сохранение и воспроизведение записей. Относится к системному администрированию слабо, и часто попадает в его обязанности по совместительству к каким-нибудь другим обязанностям.
За бортом описанных выше занятий системного администратора остались такие возможные вещи, как администрирование баз данных (Microsoft SQL, MySQL и его множественные ответвления, Oracle и т. д.), администрирование 1C (не путать с "программист 1C"), АТС и многое другое.
В одном из ранних уроков мы узнали, что при помощи ШИМ можно изменять скважность сигнала. Тем самым регулировали яркость свечения светодиода. Однако есть более интересный способ, использования широтно-импульсной модуляции.
Итак… Если пропустить генерируемый сигнал через фильтр низких частот, то получится постоянное напряжение.
Так как скважность изменяется от 0 до 0xFF(255), значит у нас будет 255 уровней постоянного напряжения. Проще говоря, есть диапазон напряжения, допустим от 0 до 5В, этот диапазон разбивается на 255 значений. С шагом 5/255=0,0196В можно выставить любое напряжение.
Используя в определенном порядке эти значения, можно получить практически любую форму сигнала. Например, увеличивая заполнение от 0 до 255, а потом уменьшая от 255 до 0 получим пилообразный сигнал.
Теперь перейдем к конкретной цели: получить синусоиду с частотой 50Гц с помощью микроконтроллера Atmega8. Глобальная задача — выставлять через определенные промежутки времени напряжение на выходе ШИМ, по синусоидальному закону.
Разберемся с первой частью задачи. Для того, получить определенные промежутки времени воспользуемся таймером. Допустим таймер настроен на частоту 8МГц, т.е. он будет тикать 8000000 раз в секунду. Синусоида колеблется 50 раз в секунду, значит на один период может приходиться 8000000/50=160000 тиков максимум. Раз у нас 256 уровней напряжения, то и максимальное разрешение синусоиды будет равняться 256.
Что же такое разрешение синуса? В данном случае это количество точек за период по которым построена синусоида. Для примера я построил в Excel, то как будет выглядеть синусоида для разного разрешения.
Для синуса с разрешением 4:
Для синуса с разрешением 8 точек:
Для синуса с разрешением 16 точек:
Думаю «эволюция» синуса наглядно видна — чем больше точек(разрешение), тем меньше угловатостей и тем больше он похож на нормальную синусоиду. В итоге я решил остановиться на разрешении синуса в 128 точек.
Теперь объединяем все сказанное ранее, 160000 тиков делим на разрешение 128 получаем 1250 — через столько тиков должно сработать прерывание, чтобы выставить следующий уровень напряжения. Значение 1250 нужно пихать в регистр сравнения OCR1A
OCR1AH=0x04;
OCR1AL=0xE2;
Вторая часть глобальной задачи — как построить синусоиду. Вспомним математику:D… Синус изменяется от -1 до 1. ШИМом сгенерить отрицательное напряжение не получится. Поэтому нужно сместить график над осью Х — sin(x)+1. Теперь он будет изменяться от 0 до 2, тоже не вариант, т.к. у нас 256 значений напряжения, поэтому умножим на 127, чтобы максимальным было значение 256. В итоге откопал такую формулу:
128 — разрешение синуса, х — номер точки по (от 0 до 128). Сосчитал в Excel, получился массив sin из 128 значений, которые по очереди подставляются в OCR2.
Последнее о чем стоит упомянуть — фильтр низких частот, возможно в ближайшее время появится урок по фильтрам. В данный момент, формулы для его расчета не имеет смысла приводить, т.к. есть сайты с возможностью онлайн расчетов, достаточно набрать «фнч» в гугле.
Файл прошивки и протеуса
По предыдущим заметкам, и у некоторых после прочтения спецификации, вероятно, возникал вопрос - а что это за второй загадочный процессор MCU, работающий на частоте 100 МГц? Зачем он нужен? Как его использовать?
Между тем роль MCU в некоторых случаях исключительно важна. Те, кто пробовал применять Edison для работы с различными сенсорами, возможно, уже заметили - Intel Edison не обеспечивает real-time отклика на их показания при работе из Linux. И тут на помощь приходит MCU. Пришло время немного рассказать про этот встроенный микроконтроллер, его архитектуру, области применения и рассмотреть практический пример.
В программное обеспечение для Intel Edison начиная с версии 2.1 добавлена возможность использования встроенного микроконтроллера.
Рассмотрим систему на чипе, используемую в Intel Edison Compute Module:
Система на чипе, используемая в Intel Edison Compute Module включает в себя два процессора:
- Двухъядерный процессор Intel Atom, работающий на частоте 500 МГц. Обозначен как Host CPU.
- Микроконтроллер с архитектурой Minute IA, работающий на частоте 100 МГц. Обозначен как MCU.
Приложение для микроконтроллера работает поверх ядра Viper и управляет периферией, подключенной к MCU, независимо от процессора Intel Atom. Например, оно может управлять GPIO портами, взаимодействовать с сенсорами по протоколу I2C или UART, и обмениваться данными с процессором Intel Atom.
Зачем нужен микроконтроллер в Intel Edison?
Я бы выделил две области, где можно применить встроенный микроконтроллер:- Работа с портами ввода/вывода и интерфейсами с real-time откликом.
- Энергоэффективность.
Повысить энергоэффективность с помощью микроконтроллера можно в тех приложениях, где основной процессор может находиться в состоянии сна, а микроконтроллер ожидать определенного события (например, превышения пороговых значений с сенсора).
При необходимости микроконтроллер пробуждает основной процессор. Пример реализации приведен в статье Using the MCU SDK and API: Code examples .
В качестве примера работы с микроконтроллером Intel Edison рассмотрим подключение ультразвукового датчика расстояния HC-SR04. Измеренное расстояние будем выводить на символьный экран Grove LCD RGB Backlight.
Датчик имеет 4 вывода:
- Vcc - 5V.
- Trig - сигнал Trigger к датчику. Микроконтроллер подает 10 микросекундный импульс датчику. Датчик инициирует процесс замера.
- Echo - сигнал Echo от датчика к микроконтроллеру. Длительность импульса пропорциональна измеренной дистанции.
- Gnd - Земля.
- 1 канал - Trig
- 2 канал - Echo
Длительность импульса пропорциональна измеренному расстоянию.
Измеренное расстояние вычисляется по формуле (взята из спецификации на датчик):
дистанция(см) = длительность импульса Echo (микросекунды) / 58
По спецификации датчик может замерять расстояния от 2 до 400 см.
Измерить длительность импульса с прогнозируемой погрешностью без real-time будет проблематично.
Процесс замера может быть, например, вытеснен планировщиком и результат измерения будет неверным.
Подключаем HC-SR04 к микроконтроллеру Intel Edison
Используемые компоненты:
- Edison Compute Module
- Edison Arduino Board
- Grove Basic Shield
- Символьный экран Grove LCD RGB Backlight
- Ультразвуковой датчик расстояния HC-SR04
- Макетная плата
Ультразвуковой датчик расстояния HC-SR04 подключается к Grove Basic Shield следующим образом:
- Vcc к +5V.
- Trig к пину #3.
- Echo к пину #4.
- Gnd к Gnd.
Обновление прошивки Intel Edison
Поддержка микроконтроллера доступна в Intel Edison® Board Firmware Software Release начиная с версии 2.1. Если у вас прошивка старее, то её нужно обновить.Узнать текущую версию прошивки можно командой:
# configure_edison --version
Данный пример создавался на прошивке версии 146.
Процесс обновления прошивки подробно описан в статье Flashing Intel Edison . Лично я обычно пользуюсь способом, описанным в разделе Alternate Flashing Method
.
Внимательно прочитайте инструкцию перед прошивкой.
Подключаем Intel Edison через Ethernet-over-USB
Для работы с Edison из среды MCU SDK нужно создать сетевое подключение.Для этого нужно, например, подключить USB кабель к среднему micro-USB порту (переключатель должен быть установлен в сторону micro-USB портов).
В Linux сеть настраивается командой:
# ifconfig usb0 192.168.2.2
IP-адрес Intel Edison: 192.168.2.15
Более подробно процесс подключения описывается в статье Connecting to your Intel® Edison board using Ethernet over USB .
MCU SDK
Для создания приложений, которые будут выполняться на встроенном микроконтроллере, выпущена кроссплатформенная среда разработки MCU SDK , основанная на Eclipse. Процесс установки подробно рассмотрен в статье Installing the MCU SDK .MCU SDK позволяет создавать, компилировать, загружать на плату и отлаживать приложения для микроконтроллера.
Взаимодействие с MCU
Чтобы взаимодействовать с микроконтроллером из Linux доступны несколько интерфейсов:/dev/ttymcu0 - Канал для обмена данными. Из Linux можно работать с помощью стандартных файловых операций. Из программы на микроконтроллере обмен производится с помощью функций host_send и host_receive .
/dev/ttymcu1 - Канал, по которому микроконтроллер отправляет отладочные сообщения функцией debug_print .
/sys/devices/platform/intel_mcu/log_level - Позволяет установить уровень отладочных сообщений (fatal, error, warning, info, debug).
Программа для Linux
Небольшой скрипт на Python, который будет получать данные от встроенного микроконтроллера и выводить их на символьный дисплей. Для работы с символьным дисплеем воспользуемся модулем Jhd1313m1 из библиотеки UPM .Скрипт show_distance.py:
import time
import pyupm_i2clcd
RET_ERROR = -1
if __name__ == "__main__":
lcd = pyupm_i2clcd.Jhd1313m1(6, 0x3E, 0x62)
with open("/dev/ttymcu0", "w+t") as f:
while True:
f.write("get_distance\n") # Send command to MCU
f.flush()
line = f.readline() # Read response from MCU, -1 = ERROR
value = int(line.strip("\n\r\t "))
lcd.clear()
if value == RET_ERROR:
lcd.setColor(255, 0, 0) # RED
lcd.write("ERROR")
else:
lcd.setColor(0, 255, 0) # GREEN
lcd.write("%d cm" % (value,))
time.sleep(1)
Программа для микроконтроллера
Программа на микроконтроллере должна при получении от хоста команды get_distance произвести измерение дистанции и отправить результат на хост (дистанция в сантиметрах, либо -1 в случае ошибки).Настраиваем порты на Edison Arduino Board:
./init_DIG.sh -o 3 -d output ./init_DIG.sh -o 4 -d input
Напомню, что микроконтроллер работает с GPIO портами на Edison Compute Module, которые отличаются от нумерации на Edison Arduino Board. Таблица соответствия приведена, например, в конце статьи Blinking an LED using the MCU .
Программа для микроконтроллера в MCU SDK:
#include "mcu_api.h" #include "mcu_errno.h" // Arduino Extension PIN = 3 #define TRIG 12 // Arduino Extension PIN = 4 #define ECHO 129 // From HC-SR04 datasheet #define MIN_DISTANCE 2 #define MAX_DISTANCE 400 #define MAX_WAIT 10000 #define RET_ERROR -1 int get_distance() { // Send Trig signal to HC-SR04 gpio_write(TRIG, 1); mcu_delay(10); gpio_write(TRIG, 0); // Read Echo signal from HC-SR04 int i; i = 0; while ((gpio_read(ECHO) == 0) && (i < MAX_WAIT)) { mcu_delay(1); i++; } unsigned long t0 = time_us(); if (gpio_read(ECHO) == 0 || i == MAX_WAIT) { return RET_ERROR; } i = 0; while ((gpio_read(ECHO) == 1) && (i < MAX_WAIT)) { mcu_delay(1); i++; } unsigned long t1 = time_us(); if (gpio_read(ECHO) == 1 || i == MAX_WAIT) { return RET_ERROR; } unsigned long distance = (t1 - t0) / 58; if (MIN_DISTANCE < distance && distance < MAX_DISTANCE) { return distance; } else { return RET_ERROR; } } #define MAX_BUF 255 unsigned char buf; void mcu_main() { // Setup Trig as OUTPUT gpio_setup(TRIG, 1); // Initially set Trig to LOW gpio_write(TRIG, 0); // Setup Echo as INPUT gpio_setup(ECHO, 0); while (1) { unsigned int len; len = host_receive(buf, MAX_BUF); if ((len >= 12) && (strncmp(buf, "get_distance", 12) == 0)) { unsigned int distance; distance = get_distance(); len = mcu_snprintf(buf, MAX_BUF, "%d\n", distance); host_send(buf, len); } } }