Mcu будет такой сигнал. Используем встроенный микроконтроллер в Intel Edison

По предыдущим заметкам, и у некоторых после прочтения спецификации, вероятно, возникал вопрос - а что это за второй загадочный процессор MCU, работающий на частоте 100 МГц? Зачем он нужен? Как его использовать?
Между тем роль MCU в некоторых случаях исключительно важна. Те, кто пробовал применять Edison для работы с различными сенсорами, возможно, уже заметили - Intel Edison не обеспечивает real-time отклика на их показания при работе из Linux. И тут на помощь приходит MCU. Пришло время немного рассказать про этот встроенный микроконтроллер, его архитектуру, области применения и рассмотреть практический пример.

В программное обеспечение для Intel Edison начиная с версии 2.1 добавлена возможность использования встроенного микроконтроллера.

Рассмотрим систему на чипе, используемую в Intel Edison Compute Module:

Система на чипе, используемая в Intel Edison Compute Module включает в себя два процессора:

  1. Двухъядерный процессор Intel Atom, работающий на частоте 500 МГц. Обозначен как Host CPU.
  2. Микроконтроллер с архитектурой Minute IA, работающий на частоте 100 МГц. Обозначен как MCU.
Рассмотрим микроконтроллер детальнее. Вычислительное ядро Minute IA представляет собой энергоэффективную архитектуру, основанную на 486 с добавлением команд для совместимости с Pentium. Помимо вычислительного ядра, микроконтроллер содержит подсистему ввода-вывода (GPIO, I2C, High Speed UART, DMA) и SRAM. Микроконтроллер имеет доступ ко всем портам GPIO в Edison Compute Module. Суммарный объем SRAM для кода и данных 192 кб. На микроконтроллере запущена операционная система реального времени Viper OS от компании WindRiver.

Приложение для микроконтроллера работает поверх ядра Viper и управляет периферией, подключенной к MCU, независимо от процессора Intel Atom. Например, оно может управлять GPIO портами, взаимодействовать с сенсорами по протоколу I2C или UART, и обмениваться данными с процессором Intel Atom.

Зачем нужен микроконтроллер в Intel Edison?

Я бы выделил две области, где можно применить встроенный микроконтроллер:
  1. Работа с портами ввода/вывода и интерфейсами с real-time откликом.
  2. Энергоэффективность.
Процессор Intel Atom и стандартный дистрибутив Yocto Linux не позволяют «из коробки» реализовать приложения с real-time откликом. Приложение может быть вытеснено планировщиком задач, что приведет к недопустимой и непрогнозируемой задержке. На микроконтроллере запущено единственное приложение и real-time операционная система, поэтому обеспечить real-time отклик возможно. Это требуется для работы со многими датчиками, где протокол взаимодействия зависит от строгого соблюдения коротких временных интервалов. Для их подключения без встроенного микроконтроллера пришлось бы использовать отдельный микроконтроллер, на котором реализовать всю функциональность по работе с такими датчиками. В качестве примера решения для Intel Edison с внешним микроконтроллером можно привести плату расширения SparkFun Block for Intel Edison - Arduino .

Повысить энергоэффективность с помощью микроконтроллера можно в тех приложениях, где основной процессор может находиться в состоянии сна, а микроконтроллер ожидать определенного события (например, превышения пороговых значений с сенсора).
При необходимости микроконтроллер пробуждает основной процессор. Пример реализации приведен в статье 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
Микроконтроллер подает импульс на Trig . После этого датчик отвечает импульсом на 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
  • Макетная плата
Первым делом подключаем Edison Compute Module к Edison Arduino board. Затем подключаем плату расширения Grove Basic Shield к Edison Arduino Board. Grove LCD RGB Backlight подключается к I2C разъему на Grove Basic Shield.

Ультразвуковой датчик расстояния HC-SR04 подключается к Grove Basic Shield следующим образом:

  • Vcc к +5V.
  • Trig к пину #3.
  • Echo к пину #4.
  • Gnd к Gnd.
Пины 3, 4 выбраны случайным образом, вместо них можно использовать другие.

Обновление прошивки 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); } } }

Сисадмин (он же на английском языке 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"), АТС и многое другое.

SPI (Serial Peripheral Interface) – последовательный синхронный стандарт передачи данных в режиме полного дуплекса, разработанный компанией Motorola для обеспечения простого и недорогого сопряжения микроконтроллеров и периферии. SPI также иногда называют четырехпроводным (англ. four-wire) интерфейсом.SPI является синхронным протоколом, в котором любая передача синхронизирована с общим тактовым сигналом, генерируемым ведущим устройством (процессором). Принимающая периферия (ведомая) синхронизирует получение битовой последовательности с тактовым сигналом. К одному последовательному периферийному интерфейсу ведущего устройства-микросхемы может присоединяться несколько микросхем. Ведущее устройство выбирает ведомое для передачи, активируя сигнал «выбор кристалла» (chip select) на ведомой микросхеме. Периферия, не выбранная процессором, не принимает участие в передаче по SPI.
В SPI используются четыре цифровых сигнала:

  • MOSI или SI – выход ведущего, вход ведомого (англ. Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому;
  • MISO или SO – вход ведущего, выход ведомого (англ. Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему.
  • SCK или SCLK – последовательный тактовый сигнал (англ. Serial CLocK). Служит для передачи тактового сигнала для ведомых устройств.
  • CS или SS – выбор микросхемы, выбор ведомого (англ. Chip Select, Slave Select).Как правило, выбор микросхемы производится низким логическим уровнем.

В зависимости от комбинаций полярности и фазы синхроимпульсов возможны четыре режима работы SPI.

Режим SPI Временная диаграмма
Режим SPI0

Режим SPI1
Активные уровень импульсов — высокий.

Режим SPI2

Сначала защёлкивание, затем сдвиг.

Режим SPI3
Активные уровень импульсов — низкий.
Сначала сдвиг, затем защёлкивание.

В таблице принято:

  • MSB — старший бит;
  • LSB — младший бит.

Мастеру приходится настраиваться на тот режим, который используется ведомым.
При обмене данными по интерфейсу SPI микроконтроллер может работать как ведущий (режим Master) либо как ведомый (режим Slave). При этом пользователь может задавать следующие параметры:

  • режим работы в соответствии с таблицей;
  • скорость передачи;
  • формат передачи (от младшего бита к старшему или наоборот).

Соединение двух микроконтроллеров по структуре ведущий – ведомый по интерфейсу SPI осуществляется по следующей схеме.

Выводы SCK, CS для ведущего микроконтроллера являются выходами, а ведомого микроконтроллера – входами.

Передача данных осуществляется следующим образом. При записи в регистр данных SPI ведущего микроконтроллера запускается генератор тактового сигнала модуля SPI, и данные начинают побитно выдаваться на вывод MOSI и соответственно поступать на вывод MOSI ведомого микроконтроллера. После выдачи последнего бита текущего байта генератор тактового сигнала останавливается с одновременной установкой в «1» флага «Конец передачи». Если поддерживаются и разрешены прерывания от модуля SPI, то генерируется запрос на прерывание. После этого ведущий микроконтроллер может начать передачу следующего байта либо, подав на вход SS ведомого напряжение уровня логической «1», перевести его в состояние ожидания.

Одновременно с передачей данных от ведущего к ведомому происходит передача и в обратном направлении, при условии, что на входе SS ведомого присутствует напряжение низкого уровня. Таким образом, в каждом цикле сдвига происходит обмен данными между устройствами. В конце каждого цикла флаг прерывания устанавливается в «1» как в ведущем микроконтроллере, так и в ведомом. Принятые байты сохраняются в приемных буферах для дальнейшего использования.

При приеме данных принятый байт должен быть прочитан из регистра данных SPI до того, как в сдвиговый регистр поступит последний бит следующего байта. В противном случае первый байт будет потерян.

Вывод SS предназначен для выбора активного ведомого устройства и в режиме Slave всегда является входом. Каждый раз, когда на вывод SS подается напряжение уровня логической «1», происходит сброс модуля SPI. Если изменение состояния этого вывода произойдет во время передачи данных, и прием, и передача немедленно прекратятся, а передаваемый и принимаемый байты будут потеряны.

Если микроконтроллер находится в режиме Master, направление передачи данных через вывод SS определяется пользователем. Если вывод сконфигурирован как выход, он работает как линия вывода общего назначения и не влияет на работу модуля SPI. Как правило, в этом случае он используется для управления выводом SS микроконтроллера, работающего в режиме Slave.

Если вывод сконфигурирован как вход, то для обеспечения нормальной работы модуля SPI на него должно быть подано напряжение высокого уровня. Подача на этот вход напряжения низкого уровня от какой-либо внешней схемы будет воспринята модулем SPI как выбор микроконтроллера в качестве ведомого (при этом ему начинают передаваться данные).

Пример использования интерфейса SPI для микроконтроллеров STM32 хорошо описан в

12

Подключаемые резисторы (как внутренние, так и внешние), необходимые только для контактов MCU INPUT? Напротив, контакт MCU, сконфигурированный как OUTPUT, «знает, на каком уровне он находится», потому что он управляет - «плавающий» вывод MCU OUTPUT, привязанный к некоторому входу другой схемы, не имеет смысла, поскольку состояние вывода MCU может быть только высоким или низким... у меня это право? Теперь, при загрузке или сбое MCU, может оказаться выгодным, чтобы привязка к линии ввода «MCU output to IC input» была привязана к этому каналу, чтобы гарантировать, что вход в какой-либо IC никогда не плавает.

Может быть, я просто ответил на свой вопрос здесь... резисторы pull-up/down могут использоваться как на входных, так и на выходных контактах, в зависимости от приложения?

  • 5 ответов
  • Сортировка:

    Активность

16

Вытягивание и выталкивание обычно используются для обеспечения того, что линия имеет определенное состояние, а не активно. Они используются на входах для предотвращения плавающих линий, быстрого переключения между высоким и низким и средним «неопределенным» регионом. Выходы обычно не нужны.

Но большинство контактов mcu являются GPIO, а иногда при запуске определяются как входы вместо выходов. Как вы уже сказали, иногда вы не хотите, чтобы входной сигнал IC-штыря плавал при запуске, особенно как штырь сброса, который вы обычно будете использовать с вашим GPIO вашего микроконтроллера.

Это когда вы используете Weak Вытягивание или выключение на линии. Поскольку они слабы, и вы выбираете состояние по умолчанию, они не создают помех для вашей схемы (если входной сигнал всегда должен быть низким, а затем вытягивается высоко, вы выбираете слабое выключение и наоборот), но они потребляют немного тока. Вот почему вы выбираете резистор слабый (более высокий, более слабый), достаточный для работы.

Других нормальные настройки вывода, который использует подтягиваться (или отжимания, реже) является Open Drain или открытого коллектор соединения. Они только приводят к низкому соединению или освобождают линию, оставляя ее плавающей. Подтягивания используются, чтобы привести линию в высокое логическое состояние.

0

Вы упомянули соединения Open Drain и Open Collector, они не применяются к микроконтроллерам, не так ли? Просто Моссеты используются для установки логического уровня? Я хотел уточнить, может ли микроконтроллер управлять линией с высоким сопротивлением выталкивания. - genericpurpleturtle 16 окт. 17 2017-10-16 12:00:41

7

У вас есть это право; обычно вам не нужны подтягивания на выходах, но они могут быть полезны для обеспечения безопасности во время загрузки и т. д.

Еще одна причина использования подтягивания на выходе: если к каждому подключению подключено несколько выходов нескольких MPU другой, вы действительно не хотите, чтобы один вождение VCC и еще один вождение 0V по тому же проводу! Таким образом, вы либо набираете 0V на выходе, либо отключите выход (возможно, настроив его как вход). Когда все выходы отключены, провод подтягивается до «1» (Vcc). Это называется «проводным И» сигналом. (Вы можете сделать то же самое вождение «1» или выключить, с выпадающим R, тогда он называется проводным OR).

Этот шаблон имеет несколько применений, в том числе позволяет любому одному MPU сигнализировать об ошибке или включать светодиод или позволять им по очереди передавать сообщения друг другу по одному проводу.

2

Ответ: это зависит от семейства микроконтроллеров и от того, что по умолчанию является положением Power On Reset. Если микроконтроллер может быть сконфигурирован только для «выхода» или «ввода» на штырь, это обычно означает, что для вывода используется драйвер тотема-полюса, что означает, что это, по сути, выход CMOS-затвора, и в этом случае выход всегда приводится к рельсу, поэтому нет причин пассивно влиять на него. Единственный случай, когда имеет смысл использовать pull-ups/pull-downs на выходе, когда он настроен как Open Collector/Open Drain топология. Гораздо чаще встречаются внутренние параметры pull-up/pull-down, которые применимы только тогда, когда контакт сконфигурирован как вход. Если вы можете гарантировать, что в вашей системе вход всегда управляется чем-то, это отнимает немного энергии.

3

Как вы заявили, использование резисторов pullup/pulldown на выводах, которые, как ожидается, выводятся, могут быть там, чтобы гарантировать входное состояние.

Это делается для уменьшения прошивки/отказа MCU, но будет работать только для защиты от состояния высокого импеданса (в основном штырь сконфигурирован как вход случайно).

Еще один интересный и даже полезный проект на NodeMCU — бегущая строка с WiFi управлением. Наверняка, все из нас каждый день видят подобные устройства на улицах города. К примеру, бегущая строка широко применяется на транспорте для вывода номера маршрута, следующей остановки и навязчивой рекламы всякой всячины. Типичная бегущая строка представляет собой светодиодную матрицу со схемой управления разверткой и микроконтроллером на борту. Текст, ползущий по этой матрице, может храниться локально, либо обновляться динамически через WiFi или GSM. Разумеется, имея такую мощную платформу как NodeMCU (или любой другой ESP8266), бегущую строку можно сделать в домашних условиях. Установить её рационально где-нибудь в публичном месте, например в школе. Через такое информационное табло будет удобно сообщать внутренние школьные новости, температуру за окном, или даже фамилии отличников! В нашей лаборатории мы установили бегущую строку в окне на первом этаже. С помощью этого IoT устройства мы поздравляли всех прохожих с Новым Годом и рождеством 🙂

1. Подключение светодиодной матрицы к NodeMCU

Будем работать с готовыми модулями матрицы под управлением микросхемы MAX7219. Подробно о работе таких модулей мы уже писали в одном из уроков для платформы Ардуино — . Вкратце, у каждого такого модуля есть 10 контактов. Пять с одной стороны и столько же с другой. Это сделано для того, чтобы модули можно было соединять друг за другом в цепочку. На входе имеем:
  • два контакта для питания: земля GND и +5В;
  • три контакта для шины SPI: CS, DIN, CLK;
Допустим, мы хотим сделать бегущую строку из четырёх таких модулей. Берем первый модуль и подключаем его к NodeMCU согласно схеме:
Светодиодная матрица 8×8 с MAX7219 VCC GND DIN CS CLK
NodeMCU +5V GND D7 D8 D5
Затем, к первому модулю подключаем остальные три:
Внешний вид стенда:
Вместо четырех отдельных модулей имеет смысл использовать готовую сборку, например, такую:

2. Программа для управления MAX7219 на NodeMCU

Попробуем запустить бегущую строку на матрицах, пока без возможности удаленно подключаться к NodeMCU. То есть бегущая строка будет крутить какой-то статичный текст. По сути, это код из . Единственное, что изменилось — это размер цепочки. Здесь мы используем не шесть матриц, а только четыре. #include #include #include Max72xxPanel matrix = Max72xxPanel(D8, 4, 1); unsigned long ticker_next; String tape = "Hello from RobotClass!"; int spacer = 1; int width = 5 + spacer; void setup(void){ matrix.setIntensity(7); } void handleTicker(){ for (int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++) { matrix.fillScreen(LOW); int letter = i / width; int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; while (x + width - spacer >= 0 && letter >= 0) { if (letter < tape.length()) { matrix.drawChar(x, y, tape, HIGH, LOW, 1); } letter--; x -= width; } matrix.write(); delay(50); } } void loop(void){ handleTicker(); } Подаем питание и на матрице начинает двигаться бегущая строка с текстом «Hello from RobotClass!»

3. Веб-сервер на NodeMCU для управления светодиодной матрицей

Теперь добавим в программу веб-сервер, который будет показывать одну единственную HTML страницу с полем для ввода текста бегущей строки и с кнопкой. #include #include #include #include #include #include const char* ssid = "ESP"; // запускаем WiFi точку ESP ESP8266WebServer server(80); // запускаем сервер на порту 80 Max72xxPanel matrix = Max72xxPanel(D8, 4, 1); unsigned long ticker_next; String tape = "RobotClass"; int spacer = 1; int width = 5 + spacer; // HTML страница index.html const char page = "" "Ticker control" "" "
" "" "" "
" "" ""; // функция вызывается, когда клиент жмет кнопку void handleSubmit(){ tape = server.arg("text"); server.send(200, "text/html", page); } void handleRoot() { if (server.hasArg("text")) { handleSubmit(); } else { server.send(200, "text/html", page); } } void setup(void){ delay(1000); WiFi.softAP(ssid); server.on("/", handleRoot); server.begin(); matrix.setIntensity(7); } void handleTicker(){ for (int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++) { matrix.fillScreen(LOW); int letter = i / width; int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; // центровка по вертикали while (x + width - spacer >= 0 && letter >= 0) { if (letter < tape.length()) { matrix.drawChar(x, y, tape, HIGH, LOW, 1); server.handleClient(); } letter--; x -= width; } matrix.write(); delay(50); } } void loop(void){ server.handleClient(); handleTicker(); } Загружаем программу на Node MCU и подаем питание. По-умолчанию, бегущая строка будет крутить текст «RobotClass». Чтобы его изменить, необходимо подключиться к WiFi точке «ESP» и зайти через браузер по адресу: http://127.0.0.1/ В ответ появится страница с полем для ввода текста бегущей строки и кнопкой «Set text». Вводим в поле новый текст, жмем кнопку и смотрим на бегущую строку! Your browser does not support the video tag.

4. Бегущая строка на русском языке

В текущем виде наш аппарат не поддерживает русский язык. Если попытаться ввести текст на русском, на матрице вместо букв появятся utf8 коды. Чтобы это исправить, нам потребуется дополнительная функция utf2rus. Кроме этого, добавим в программу пароль для WiFi точки. #include #include #include #include #include #include const char* ssid = "ESP"; const char* pwd = "makemyday"; // пароль для WiFi точки ESP8266WebServer server(80); Max72xxPanel matrix = Max72xxPanel(D8, 4, 1); unsigned long ticker_next; String tape = "RobotClass.ru"; int spacer = 1; int width = 5 + spacer; const char page = "" "" "" "Ticker control" "" "
" "" "" "
" "" ""; String utf8rus(String source){ int i,k; String target; unsigned char n; char m = { "0", "\0" }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; break; } } } // switch m = n; target = target + String(m); } return target; } void handleSubmit(){ tape = utf8rus(server.arg("text")); server.send(200, "text/html", page); } void handleRoot() { if (server.hasArg("text")) { handleSubmit(); } else { server..softAP(ssid, pwd); server.on("/", handleRoot); server.begin(); matrix.setIntensity(7); } void handleTicker(){ for (int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++) { matrix.fillScreen(LOW); int letter = i / width; int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; while (x + width - spacer >= 0 && letter >= 0) { if (letter < tape.length()) { matrix.drawChar(x, y, tape, HIGH, LOW, 1); server.handleClient(); } letter--; x -= width; } matrix.write(); delay(50); } } void loop(void){ server.handleClient(); handleTicker(); } Готово! Теперь устройство готово к непрерывной эксплуатации. Осталось сделать крепление для матрицы и поставить бегущую строку на видное место. Чертежи подходящего крепления можно найти тут:
2024 psiholog112.ru. Интернет. Безопасность. Полезные советы. Программы. Система.