Мысли о микрокомпьютерах

... построить дом, посадить дерево, помигать светодиодами.

Однажды в 11 классе я сделал проект для участия в конкурсе программистов. Это был прибор, который измерял напряжение и отправлял его цифровое значение на компьютер, а там отдельное приложение рисовало красивый график. Основная сложность состояла именно в подключении самодельного устройства к компьютеру. У COM-порта, USB и PS/2 довольно мутные протоколы, так что самым доступным способом оказался LPT-порт принтера. Да и с тем всё непросто: входных пинов всего 5, и, чтобы запихать 12 бит данных, мне пришлось городить схему из мультиплексоров, которые отправляли на LPT-порт сначала первые 4 байта, потом вторые, а потом третьи. Вряд ли я смог бы сделать такую схему сам, если б не помощь отца.

Схема подключения 12-разрядного АЦП к LPT-порту
Реализация схемы

Сейчас подобная задача решается уже без таких мучений. Микрокомпьютеры вроде Raspberry Pi оснащены достаточным количеством GPIO-контактов (General Purpose Input-Output). Через них можно отправлять 0 и 1 в свои программы или же наоборот, отправлять 0 и 1 (0/+5V) на свои устройства. Например, чтобы мигнуть лампочкой, вам нужны 2 строчки кода, резистор и светодиод. Можно просто приделать 2 проводка к кнопке и узнать в коде программы нажата она или нет. Библиотеки для работы с итерфейсом GPIO есть для C, Python, и для Javascript.

Распайка Raspberry Pi 2
Программа на Javascript, которая мигает светодиодом

У Raspberry Pi, кроме GPIO-интерфейса, есть четыре USB 2.0 порта, HDMI для подключения монитора, а ещё есть интерфейсы SPI, UART и I2C. I2C мне очень понравился тем, что он довольно простой и для него есть много готовых устройств. В I2C данные передаются по двум проводам, к этой двупроводной шине можно подключить 112 устройств одновременно. Каждое I2C устройство должно иметь свой адрес, по которому к нему можно обращаться из кода программы.

Теперь энтузиастам стала доступна модульность на уровне железа, когда продают не просто чип сенсора, а маленькое I2C-устройство в виде маленькой платы с чипом и правильными резисторами. Больше не нужно заниматься травлением, пайкой, разводкой, подбором резисторов «развязки». Можно, например, просто купить на Aliexpress датчик давления BMP180, подключить его двумя проводками по I2C прямо к Raspberry, а дальше уже колдовать на программном уровне.

I2C датчик давления BMP180

Путь от идеи до реализации стал занимать часы, а не дни и недели. Это очень важно, потому что со временем запал проходит и 99% проектов забрасываются после первых неудач. Поразительно, ведь аппаратная часть моего школьного проекта теперь может быть заменена I2C–устройством чуть больше пятирублёвой монетки. Вместо страданий над оцифровкой можно заняться чем-то интересным: например, изобрести специфический сенсор для контроля мутности воды или придумать хитрый алгоритм для обработки полученных данных.

16 битный АЦП ADS1115 с I2C интерфейсом

Микрокомпьютеры Raspberry Pi, Banana Pi, Odroid C2 изначально задумывались, как ультра-дешёвые (≈$35) решения для школ. Однако, энтузиасты широко используют такие компьютеры для создания домашних медиа-центров, автомобильных компьютеров и построения умного дома. Я на базе Raspberry Pi сделал походный WiFi-роутер с мощной антенной, способный раздавать гостиничный WiFi на телефоны.

WiFi-роутер из Raspberry

Говоря о микрокомпьютерах, многие вспоминают Arduino. Однако, эта платформа довольно сильно отличается от вышеупомянутых. Arduino — это «микроконтроллер с человеческим лицом», более низкоуровневая система с более высоким порогом входа, где разработчику нужно программировать AVR-микроконтроллер. Arduino, конечно, даёт больше возможностей на уровне железа, но имеет слабую вычислительную мощность для обработки данных. Raspberry Pi же, работающий на процессоре с архитектурой ARM, — это полноценный компьютер с 1Gb оперативной памяти, 1.2GHz процессором, WiFi, USB-портами, HDMI, операционной системой и высокоуровневыми средствами разработки от C++ до Node.js. Программирование микроконтроллеров — это, конечно, дело интересное, но более сложное, и, как по мне, реже применимое в жизни, чем программирование под Linux.

Для Raspberry Pi создан специальный Linux на базе Debian — Raspbian. Решение многих задач и проблем можно найти на форумах Ubuntu и Debian, но и сообщество Raspberry Pi тоже очень велико. Есть даже отдельный раздел на Stack Exchange. Удобно, что вся система живёт на SD-карточке, потому очень просто делать бэкапы и восстанавливать образы, если что-то сломалось.

Рабочий стол Raspbian
Консоль Raspberrian с данными о I2C устройствах

Да, именно благодаря Raspberry Pi мне стал интересен Linux. В обычной жизни он мне не особенно нужен, но программировать на Raspberry — значит программировать под Linux. Забавы ради, приходится разбираться с кучей новых вещей, которые иногда неожиданно пригождаются в работе.

В итоге, если в своей жизни вы ещё не мигали светодиодами, или хотели бы поразбираться с Linux, но не знаете, зачем он вам, то Raspberry будет неплохим способом потратить время. Ну и конечно, я завидую современным школьникам — такой простор для творчества.