В наши дни слово микроконтроллер стало обыденным, порой даже для ученика средних классов. Снизился уровень вхождения людей в область микроэлектроники, и произошло это прежде всего благодаря работе таких энтузиастов, как разработчики платформы Arduino.
Микроконтроллер теперь можно встретить в школьных проектах, в любительских электронных устройствах и даже в DIY-украшениях. Однако, слово есть, а его содержимое чаще всего остаётся загадкой для многих пользователей. Микроконтроллер — чёрный ящик, который может «оживлять» самодельные устройства с помощью программы. Но что же такое микроконтроллер и как он устроен?
Чтобы разобраться с этим сложным термином, сначала обратим внимание на другое, гораздо более известное понятие — компьютер. Слово компьютер знает каждый человек на планете. У большинства современных людей доступ к персональному компьютеру есть с самого детства: дома, в школе, в университете, на работе.
Для чего люди используют компьютер? По большей части для обработки информации. Например, компьютер помогает ученику искать информацию в интернете, программисту писать программы, художнику создавать изображения, конструктору рассчитывать узлы будущей машины.
В центре любого компьютера находится микропроцессор — это устройство, которое осуществляет все расчёты, необходимые для обработки информации. Микропроцессор установлен на материнскую плату, которая связывает его с памятью и разной периферией: с монитором, с клавиатурой и мышью, с видеокамерой и аудиоколонками.
А что со смартфонами, в них тоже есть микропроцессор? И да и нет. В мобильных устройствах как правило устанавливают так называемую систему на кристалле (SoC). Внешне эта система выглядит как микросхема с множеством контактов, почти как обычный микропроцессор. Но в SoC кроме микропроцессора есть ещё дополнительные модули связи и графический ускоритель.
Но что делать инженеру, который хочет наделить обычный бытовой прибор: стиральную машину, холодильник или даже чайник способностью работать по программе? Не вставлять же в них целый компьютер — это будет избыточно и дорого. Для этих целей инженеры придумали особый вид вычислительных машин — микроконтроллеры.
В отличие от компьютера, микроконтроллеру не нужна материнская плата. Это сильно упрощает его встраивание и удешевляет стоимость системы в целом. По большей части, всё что ему требуется для работы находится внутри одной микросхемы: вычислительное ядро, постоянная и оперативная память, а также аппаратные интерфейсы для работы с периферией.
Есть и ещё одно концептуальное отличие, которое можно выразить следующим образом: устройство с микроконтроллером призвано взаимодействовать с материальным миром, тогда как компьютер предназначен для работы человека с информацией. Другими словами, результат работы компьютера остаётся в памяти компьютера, а результат работы микроконтроллера виден в реальном мире.
А теперь разберёмся подробнее с тем как устроен микроконтроллер.
Цифровая электроника
Микроконтроллер относится к цифровым устройствам. Это значит, что он умеет считывать, обрабатывать и генерировать цифровые сигналы. Но что такое цифровой сигнал?
Возьмём, например, обычный мультивибратор — схему, которая способна генерировать последовательность прямоугольных импульсов. Эти импульсы — самый что ни на есть цифровой сигнал. Мы можем соединить выход мультивибратора с другим цифровым устройством, пусть, с десятичным счётчиком. Последний, как уважающий себя цифровой гражданин будет исправно регистрировать импульсы и делать свою работу — считать их и передавать соответствующий сигнал дальше, к другим цифровым устройствам.
И если мы делаем цифровую электронную схему для какой-то прикладной задачи, то рано или поздно сигнал достигнет исполнительного устройства, например, двигателя стиральной машины. Двигатель включится и начнёт стирать нам одежду.
Существует великое множество цифровых микросхем, которые реализуют различные важные функции: микросхемы памяти умеют хранить данные в двоичном виде, микросхемы логики осуществляют логические операции и их комбинации, и т.п. Из этих микросхем можно собрать даже вычислительную машину, что и делалось на заре ЭВМ. Но на очередном этапе миниатюризации инженеры создали микропроцессоры и микроконтроллеры, которые сильно упростили создание электронных цифровых устройств.
В отличие от микросхем с жёсткой логикой, микроконтроллер умеет работать по программе. То есть с помощью него можно реализовать любую логику, которая требуется в данной задаче. И это самое большое его преимущество.
Выводы общего назначения — GPIO
Одна из важнейших подсистем микроконтроллера — это интерфейс GPIO (General Purpose Inputs Outputs). С английского GPIO переводится как: «входы/выходы общего назначения», или как: «выводы общего назначения». Эти выводы могут регистрировать и генерировать цифровые сигналы. А внутренняя логика обработки этих сигналов обеспечивается программой.
Каждый контакт GPIO может работать в двух режимах: в режиме выхода (OUTPUT) и в режиме входа (INPUT).
В режиме выхода контакт можно представить в виде переключателя, который соединяет ножку микросхемы либо с питанием, либо с общим проводом, в зависимости от команды в программе. По сути — это программно управляемый электронный ключ.
Интерфейс GPIO в режиме выхода используется для управления любыми устройствами: светодиодами, силовыми транзисторами и реле, цифровыми микросхемами, и пр.
В режиме входа контакт GPIO считывает электрический сигнал на ножке микроконтроллера и делает его доступным для дальнейшей обработки в программе. Вход используется для подключения различных датчиков, кнопок.
Разумеется с помощью GPIO можно программно реализовать и любой цифровой протокол обмена данными: UART, I2C, SPI и т.п., правда, с некоторыми негативными последствиями.
Память
Как и в обычном компьютере, память микроконтроллера делится два вида:
ПЗУ — постоянное запоминающее устройство или постоянная память. В ПЗУ хранится программа микроконтроллера. Данные в ПЗУ хранятся даже при выключенном питании микроконтроллера, так что можно быть уверенным, что однажды будучи записанной, программа останется в микроконтроллере навсегда.
ОЗУ — оперативное запоминающее устройство или оперативная память. Эта память используется для хранения переменных и стека в ходе выполнения программы. ОЗУ является энергозависимым, значит при выключении питания память полностью очищается.
Также микроконтроллеры в своей работе могут использовать EEPROM — это тоже постоянная память, но которая может быть использована программистом для своих нужд. Например, в EEPROM можно хранить настройки прибора.
Как уже было сказано ранее, памяти у микроконтроллера гораздо меньше, чем у его старшего брата — компьютера. Так что при написании программы мы можем легко столкнуться с её нехваткой. Следует всегда держать в голове эту особенность микроконтроллера и стараться оптимизировать программу, в частности, правильно выбирать типы переменных.
Аппаратные интерфейсы
Как уже упоминалось выше с помощью GPIO можно организовать обмен данными с другими устройствами по любому протоколу, будь то I2C, SPI или UART. Но такой подход чреват разными неприятностями:
- по-первых, при программной реализации протокола не получится добиться высоких скоростей обмена;
- во-вторых, реализованный таким образом обмен будет отвлекать ядро от основных вычислений, замедляя их;
- в-третьих, придётся разбираться с тем как устроен протокол.
Очень хорошо, что в микроконтроллерах есть набор аппаратных интерфейсов, которые полностью берут на себя обеспечение обмена данными. Аппаратный интерфейс — это отдельное устройство внутри микросхемы микроконтроллера, которое полностью берет на себя реализацию протокола.
В разных МК набор интерфейсов разный и по-разному организован. Где-то они связаны с конкретными контактами микросхемы, которые нельзя поменять. В других микроконтроллерах аппаратный интерфейс можно назначить на любые контакты. Часто бывает и так, что одни и те же контакты используются сразу для нескольких интерфейсов и при выборе одного, остальными приходится жертвовать.
ШИМ, АЦП и ЦАП
Кроме интерфейсов, контакты микроконтроллера могут быть связана со специальными функциями, которые сильно упрощают работу с периферией.
ШИМ — широтно импульсная модуляция. Применяется для управления двигателями и другой мощной нагрузкой, например, светодиодами.
АЦП — аналого-цифровой преобразователь. С помощью этого устройства можно считывать аналоговые сигналы, например, от датчиков.
ЦАП — цифро-аналоговый преобразователь. Может создать на контакте напряжение произвольной величины.
Отладочная плата
Сам по себе микроконтроллер — это микросхема, которая, к тому же, может иметь очень маленький размер — несколько миллиметров. К ней провод то подключить будет проблематично, не говоря уже о соединении её с компьютером через USB.
Отладочная плата — это печатная плата, на которой размещается микросхема микроконтроллера, несколько радиодеталей для обеспечения её работы, которые ещё называются обвязкой, и набор удобных разъёмов. Дополнительно на плате могут быть размещены преобразователи напряжения, дополнительная память и различные периферийные устройства: датчики, внешние аппаратные интерфейсы (например, USB-UART), светодиодные индикаторы, кнопки, и т.д.
Пожалуй, самая популярная отладочная плата среди любителей — это Arduino UNO. Разработчики этой платы, а также специальной среды разработки для неё — Arduino IDE, сделали настоящий прорыв в области DIY-электроники. Благодаря концепции Arduino программировать микроконтроллеры смогли даже люди, не обладающие глубокими техническими знаниями.
Сегодня имеется множество плат совместимых с Arduino UNO. Например, UNO2 от RobotClass или RedBoard от Sparkfun:
Разумеется, есть отладочные платы и на основе других микроконтроллеров. Вот некоторые из известных:
Blue Pill — плата на основе STM32F103C8T6; кроме Blue Pill существуют и другие варианты с разными МК из серии STM32;
Node MCU — серия отладочных плат на основе SoC ESP, включая ESP8266 и ESP32.
Adafruit Feather — линейка плат компании Adafruit на разных микроконтроллерах, включая Atmega, ESP/ESP32, RP2040;
Графит — отладочные платы на основе ESP/ESP32 и RP2040, разработанные в RobotClass (подробнее про Графит с ESP32).
Разумеется, при достаточном уровне знаний и навыков можно сконструировать свою отладочную плату. Можно даже собрать её на макетной плате при помощи перемычек, как это сделано в проекте Shrimp.
Программа
Процессы написания программы для микроконтроллера и компьютера очень похожи: используются похожие редакторы кода, знакомые языки программирования. Но есть и важное отличие: после написания, программу необходимо как-то загрузить в память микроконтроллера.
Как и в случае программ для компьютера, разработка программ для МК ведётся в среде разработки (IDE). Среда разработки — это приложение для компьютера, в котором есть редактор исходного кода и различные инструменты для его обработки, компиляции и отладки, включая и загрузку на микроконтроллер.
Ниже список известных IDE для популярных в DIY микроконтроллеров.
Arduino IDE — изначально разработана для отладочных плат Arduino с микроконтроллером Atmega. В дальнейшем её функционал расширен настолько, что она может работать с большим количеством других МК.
STM32CubeIDE — официально поддерживаемая ST Microelectronics среда разработки для МК их производства.
Keil MDK — мощная IDE для микроконтроллеров с архитектурой ARM Cortex-M;
PlatformIO — расширение для Visual Studio Code, которое поддерживает множество платформ и микроконтроллеров, включая Arduino, ESP и другие.
Code Composer Studio — этой IDE пользуются для разработки под микроконтроллеры и процессоры Texas Instruments, включая MSP430 и Sitara.
IAR Embedded Workbench — коммерческая IDE, поддерживающая широкий спектр архитектур микроконтроллеров. Известна своей эффективностью и оптимизацией.
Atmel Studio — Ранее известен как AVR Studio, эта IDE предназначена для разработки под микроконтроллеры Atmel AVR и ARM, теперь принадлежащие Microchip.
Загрузка на микроконтроллер
Когда программа написана, её нужно загрузить в постоянную память микроконтроллера. Этот процесс ещё называют прошивкой. В зависимости от конкретного МК могут быть разные варианты того, как это сделать.
Загрузка через программатор
Программатор — это отдельное электронное устройство которое с одной стороны подключается к компьютеру, а с другой к микроконтроллеру. Как правило, с помощью программатора можно также производить отладку программы.
Например, для прошивки STM32 можно использовать программатор ST-Link Mini V2. Для прошивки микроконтроллеров Atmega, который используются в платах Arduino, подойдёт программатор AVR ASP.
Загрузка с помощью загрузчика
Загрузчик — это такая программа, однажды помещённая в память микроконтроллера и позволяющая прошивать его через доступные интерфейсы: UART, USB, SPI, даже через WiFi.
Например, в отладочных платах Arduino имеется загрузчик, который работает с UART. Чтобы им воспользоваться, необходимо подключить плату к USB-порту компьютера через преобразователь интерфейса USB-UART (его ещё называют USB-UART мост). Этот преобразовательно может быть отдельным устройством, либо быть встроенным в саму отладочную плату, как на Arduino UNO.
Когда микроконтроллер подключается таким образом к компьютеру, то в операционной системе последнего автоматически определяется новый последовательный порт. В Windows он называется COM-порт, в Linux — tty. Дальнейшие действия зависят от программных инструментов, с которыми работает разработчик. Например, в Arduino IDE достаточно будет указать в настройках правильный COM-порт и смело прошивать микроконтроллер своей программой.