Карманные мозги, что управляют всем: микроконтроллеры от первых 4-бит до IoT-революции

Исторический обзор появления микроконтроллеров
Микроконтроллеры возникли из потребности создать маленький компьютер на одном чипе, способный управлять устройствами дешевле, чем связка отдельного процессора, памяти и периферии. Первый в мире микропроцессор Intel 4004 (1971) требовал множество внешних микросхем памяти и логики, что делало его применение в массовых приборах слишком дорогим.
Прорыв произошел в 1974 году, когда инженеры Gary Boone и Michael Cochran из Texas Instruments создали первый микроконтроллер TMS1000. Этот чип объединил в одном корпусе 4-битный процессор (CPU), встроенную память (ПЗУ) с программой, оперативную память (ОЗУ) для данных и тактовый генератор – полноценную встраиваемую систему на кристалле. Вскоре микроконтроллеры начали быстро распространяться: японские производители электроники в 1970-х внедряли микроконтроллеры в автомагнитолы, электронные замки, а также в системы управления двигателем автомобилей.
Как программировались первые микроконтроллеры
Программирование ранних микроконтроллеров было настоящим искусством. Изначально инженеры писали код в машинном языке, то есть вручную составляли последовательности двоичных кодов (0 и 1) для каждой инструкции, а затем записывали их в ПЗУ устройства.
Например, простейшая операция сложения могла выглядеть как набор битов 1000 0001. Подобные «магические числа» нужно было знать и рассчитывать самому. Это было весьма утомительно и чревато ошибками, поэтому вскоре появились инструментальные программы – ассемблер. Ассемблер позволял записывать программу в виде понятных мнемонических команд (например, ADD R1 вместо двоичного кода), а затем автоматически переводил их в машинный код для конкретного микроконтроллера. Такой подход заметно ускорил разработку и снизил вероятность ошибок.
Объемы памяти первых микроконтроллеров были очень малы (первые чипы имели всего несколько сотен байт, для сравнения: этот текст во много раз больше). Поэтому программистам приходилось писать крайне оптимизированный код, чтобы уложиться в доступные ресурсы.
Высокоуровневые языки в те годы только зарождались: компиляторы для Си или Фортрана существовали в основном для больших компьютеров, а не для крохотных микроконтроллеров. Таким образом, ассемблер стал главным языком первых поколений микроконтроллеров.
Для загрузки программы в микроконтроллер применялись различные методы. Как отмечалось, массовые тиражи чипов обычно программировались “навекиˮ на заводе (mask ROM). Однако разработчикам нужна была отладка, поэтому появились перепрограммируемые микроконтроллеры. Ранние образцы требовали особых приборов: микросхему помещали в программатор, стирали ультрафиолетовой лампой (в случае EPROM) и заново записывали код. Это был долгий цикл. К счастью, с появлением EEPROM и флеш-памяти процесс упростился: достаточно было подключить устройство к компьютеру через специальный программатор или интерфейс. Сегодня загрузка новой прошивки зачастую осуществляется по USB нажатием одной кнопки, что контрастирует с “ручным“ стилем программирования первых MCU.
(Пример: один из первых контроллеров – Intel 8048 – программировался разработчиком с помощью ассемблера Intel MCS-48. Инженер набирал код командами вроде MOV A,#0x5 (загрузить число 5) и компоновал их, следя за тем, чтобы итоговый машинный код поместился, к примеру, в 1 килобайт ПЗУ. Каждая ошибка означала перезапись чипа через EPROM-программатор и новую проверку.)
Появление Arduino и причины его популярности
К началу 2000-х программирование микроконтроллеров оставалось уделом энтузиастов и инженеров, требуя знаний электроники и низкоуровневого кода. Прорыв в популяризации микроконтроллеров произошел с появлением платформы Arduino. Проект Arduino стартовал в 2005 году в Итальянском Институте Дизайна (Interaction Design Institute Ivrea) под руководством Массимо. Целью было создать доступный и недорогой инструмент для художников, дизайнеров, студентов, который позволил бы им использовать микроконтроллеры в своих интерактивных проектах без глубоких знаний электроники и архитектуры микроконтроллеров.
Arduino состоит из аппаратной части (печатной платы с микроконтроллером AVR от Atmel, например ATmega328P на самой распространенной плате Arduino Uno) и простой среды разработки (Arduino IDE). Ключевой особенностью стало то, что плата продавалась уже с прошитым загрузчиком: для записи программы не требовался внешний программатор, достаточно обычного USB-кабеля. Язык программирования основан на упрощенном C/C++ (среди разработчиков известен как Wiring). Он интуитивно понятен, имеет множество готовых библиотек для работы с датчиками, моторчиками, дисплеями и т.д. Это снизило порог вхождения до минимума: даже новичок мог заставить мигать светодиод или опрашивать датчик с помощью нескольких строк кода.
Создание подобной машинки стало делом нескольких часов работы, что вовлекало все больше энтузиастов.