Введение
Казалось бы, что приборы — это жутко сложные вещи, работающие на какой-то магии. Да, понятно, что в цифровых приборах есть какие-то программы, но не очень может быть понятно, как же они там работают, среди кучи каких-то деталей и микросхем? Там часто не увидишь ни процессора, ни жёсткого диска, ни оперативной памяти, как в обычном компьютере, просто куча каких-то чёрных деталек, соединённых дорожками.
Но часто одна из таких чёрных коробочек и является мини-компьютером с памятью, процессором и средствами общения с внешним миром.
Сейчас средства разработки и порог вхождения в этот мир снизился настолько, что очень много кто, кто имеет компьютер, желание и небольшого количества денег на покупку какой-нибудь платки сможет начать делать всякие удивительные вещи: автоматизацию быта, игрушки, инструменты и многое другое. Какие-нибудь таймеры для кухни, заваривалка для чая, управление яркостью каких-нибудь светильников по времени, автоматический полив растений, кормилка для кошечки, климат-контроль... Да мало ли какие задачи можно поручить выполнять автоматике дома или на даче? Вот и посмотрим, как со всем этим быть.
Устройство внутри
Самый обычный микроконтроллер в виде микросхемы состоит, как правило, из нескольких блоков:
- Постоянная память, где хранится программа и какие-то данные для неё (картинки, тексты, таблицы и т.д.);
- Оперативная память, где хранятся изменяемые данные, когда программа выполняется;
- Ядро, которое выполняет инструкции программы, записанные в постоянной памяти. Обычно оно умеет делать не так уж и много различных действий: сложение, вычитание, логические операции, чтение и запись памяти, проверки результатов операций, перемещение в другие места программы и подобное. Но и этого достаточно.
- Устройства ввода-вывода и спецназначения. Управление ножками и проверка их состояния, приёмопередатчики для связи с другими устройствами, измерители, генераторы сигналов, модули шифрования и много чего ещё. Позже разберёмся получше.
Есть, конечно, и всякие технические тонкости, но опустим.
Устройство снаружи
Микроконтроллер снаружи можно рассматривать как чёрный ящик, который умеет что-то делать с электрическими сигналами. Основной способ общения микроконтроллера — цифровой. То есть сигналы имеют два уровня: низкий (обычно 0 вольт) и высокий (сколько-то больше нуля).
Устройство имеет целую кучу выводов-ножек (от 6 и до сотен), часть из которых ответственны за просто питание (туда подводится постоянное напряжение), а другие умеют делать что-то полезное:
- Менять уровень на ножке. Например, переключать его с 0 на сколько-то вольт и обратно. И это немало, ведь через разные электрические схемы это может зажечь или погасить лампочку, открыть или закрыть дверь, включить или остановить двигатель, дать сигнал какому-то другому устройству, что что-то ему надо бы сделать и многое другое. Вся мощь электроники покорится этой ножке!
- Проверять уровень на ножке, низкий он там или высокий? А это уже позволяет проверять состояние целой кучи датчиков: светло или темно, ходит кто или нет, закрыта дверь или открыта, вращается мотор или нет, влажный грунт или сухой, есть ветер или нет, нажата кнопка или нет и т.д. Всё, любое состояние, которое может быть электрически разделено на низкое или высокое напряжение может быть обработано микроконтроллером!
- Измерять напряжение на ножке: так можно понимать состояния каких-то явлений: заряд батареи, силу ветра, освещённость, температуру, влажность, всё, что угодно, что с помощью каких-то датчиков и схем можно превратить в напряжение.
- Задавать напряжение на ножке: можно и датчиком побыть или поуправлять чем-то...
- Общаться с другими цифровыми устройствами, есть ряд стандартных протоколов общения в пределах электронной платы. Приборы могут быть и сложные, которые не запихнёшь в логику включил-выключил-проверил. Например, экраны. В них надо передавать аж целую картинку! Или модуль GPRS-модема, там же интернет, надо что-то в него посылать и обратно получать. Но и кроме них найдётся с кем пообщаться...
Подытожим: возможностей у микроконтроллеров масса, нужно лишь понять, как их реализовать.
Для начала, впрочем, достаточно и первых двух!
Загрузка программы
Если есть готовый код программы, то его с помощью устройства-программатора можно загрузить в контроллер. Выглядит это так: берём программатор, втыкаем проводочки в разъём на плате, втыкаем его через USB в компьютер, в специальной программке открываем файл с программой и нажимаем кнопку "Загрузить". После чего программа оказывается в микросхеме и, если она правильная, даже тут же начнёт работать.
Также существуют и программаторы-отладчики, они позволяют не только загрузить программу, но и контролировать ход её выполнения, проверять память, состояние всех внутренних блоков. И, если программа была написана в какой-нибудь современной среде, то процесс её отладки и проверки никак практически не будет отличаться от процесса отладки самой обычной программы в компьютере: Написал код, нажал "Собери", нажал "Выполни" — и вуаля, процесс пошёл.
Вот примеры программаторов:
Написание программ
Если не затрагивать детские программируемые конструкторы, где программа может составляться графически из блоков на экране компьютера, то обычно всё же пишут код на одном из языков программирования: С или С++. Бывают и иные варианты, но этот предпочтительнее. Это всегда какой-то бесконечный цикл, основная программа в контроллере не завершается никогда — работает, пока есть питание.
Да, если уж лезть в пасть к дракону, то программированию придётся учиться, как и электронике. Но с малого и по кусочкам съесть можно и слона.
В любом случае, начинать лучше всего с готовой платы, STM32Discovery ли это, Arduino или ещё что-то — не так и важно. Желательно, конечно, чтобы это была достаточно популярная плата, чтоб и статей хватало, и знающих людей, которые могли бы направить куда надо.
Готовая плата заведомо работает, на неё есть готовые примеры, может, генераторы кода, что-то, что даст первый толчок и быстрый успех.
Шаги
Таким образом, начало изучения будет выглядеть как-то так:
- Выбираем контроллер (советую STM32);
- Выбираем отладочную платку под неё из того, что доступно в ближайших магазинах электроники или в интернете (например, STM32F0Discovery), и программатор, если он в плату не встроен (в рекомендованной он есть);
- Покупаем и получаем, открываем, смотрим, включаем. Там уже есть какая-то программа. В простых платах это обычно моргание светодиодами и обработка нажатий на кнопку.
- Скачиваем и устанавливаем драйвера и среду разработки (например, STM32CubeIDE).
- Открываем среду разработки, создаём пустой проект, который, впрочем, должен собираться и загружаться в плату. Да, при этом плата перестанет что-либо делать, но так в пустой программе и нет никаких инструкций.
- Ищем статьи по началу работы, желательно в этой конкретной среде, и пытаемся повторить самую примитивную программу, какую только возможно. Почти наверняка она будет такой:
инициализация
бесконечный цикл {
зажечь светодиод
подождать полсекунды
погасить светодиод
подождать полсекунды
}
7. Загружаем, проверяем, если работает — вы восхитительны!