Микроконтроллеры и Java

1,00
р.
Интересует такой вопрос. Допустим, у меня есть какая-то кнопка, которая лежит на столе. Какие микроконтроллеры, устройства и т.п. можно использовать, чтобы реализовать взаимодействие этой кнопки и java?

Ответ
Поскольку Java изначально разрабатывалась для программирования холодильников и кофеварок, было бы странно, если бы возможность работы с железом была утрачена напрочь.
Самый простой вариант подключения кнопки к микроконтроллеру - это порты GPIO, которые широко распространены в embedded мире. Кнопка одним контактом подключается к выводу порта, другим - к земле (GND). Дальше микроконтроллер либо сам что-то делает, либо по UART/USB/Ethernet/WiFi/Bluetooth отправляет сообщение о нажатой кнопке куда-то еще.
Непосредственно по железу варианты есть следующие.
Использовать специализированный микроконтроллер, заточенный под Java. Да, такие есть. Например семейство 3G-модулей Centerion. Прошивка представляет собой мидлет Java ME и может заливаться в том числе по воздуху. Прослушивание порта выглядит как-то так: Vector inPins = new Vector() inPins.addElement("GPIO11")
InPort inPort = new InPort(inPins) inPort.addListener(new InPortListener() { public void portValueChanged(int val) { System.out.println("Port value: " + val) } })


Использовать полноценную встраиваемую систему общего назначения на базе ARM-процессора, такую как BeagleBone или RaspberryPi. Там у вас будет полноценный Linux с возможностью установки полноценной Java SE или Java SE Embedded. А порты будут доступны через файловую систему как устройства вроде ys/class/gpio/gpio49. Можно взаимодействовать с портом обычными средствами файлового ввода-вывода (что будет относительно медленно, хотя и достаточно для многих задач) или через прямой досутп к памяти через memory-mapped файл /dev/mem (что будет быстро). Но куда приятнее будет воспользоваться развесистым API сторонней библиотеки pi4j: GpioController gpioController = GpioFactory.getInstance() GpioPinDigitalInput pin02 = gpioController.provisionDigitalInputPin(RaspiPin.GPIO_02,PinPullResistance.PULL_DOWN) pin02.addListener(new GpioPinListenerDigital() { @Override public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent gpioPinDigitalStateChangeEvent) { System.out.println("state: " + gpioPinDigitalStateChangeEvent.getState()) } })
Кроме того, существует еще и Java ME Embedded, предоставляющий нативный API доступа к портам в пакете com.oracle.deviceaccess: GPIOPin switchPin = null switchPin = (GPIOPin) PeripheralManager.open(1) switchPin.setInputListener(new PinListener() { @Override public void valueChanged(PinEvent event) { // do something } })
К слову, жизнь тут не ограничена ARM, есть и MIPS и Intel Atom. Но подходы там те же. Очень интересными выглядят сторонние программные платформы на основе Java:
MicroEJ. На Youtube есть ролик, где java-приложение с графикой исполняется на очень слабом железе (Cortex™-M0+ @48 MHz, 256 KB Flash, 32 KB RAM). Android Things от Google, ранее известная как Brillo.


Удивительно, но на Java можно писать под 8-битные AVR-микроконтроллеры (те самые, на которых построена Arduino)! Это стало возможным благодаря HaikuVM, которая транслирует байткод Java из .class-файлов в С-структуры, линкует к ним интерпретатор и формирует на выходе обычный для AVR-микроконтроллеров HEX-файл, который шьется в железку как обычно. Еще есть:
NanoVM - виртуальная машина подмножества Java, занимающая 8 кБ в флэш-памяти. uJ - эта VM крупнее (десятки килобайт), но обещает полную поддержку байткода, многопоточность и synchronized.
Если вы хотите нопку подключить к Arduino, а его в свою очередь подключить к компьютеру и делать что-то на компьютере по нажатию на кнопку, попробуйте JArduino. Этот API требует залить на Arduino свою прошивку, после чего вы сможете взаимодействовать с устройством из обычной Java-программы на своем компьютере.