Страницы

Поиск по вопросам

среда, 4 декабря 2019 г.

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

#java #jvm #микроконтроллеры


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


Ответы

Ответ 1



Поскольку 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. А порты будут доступны через файловую систему как устройства вроде /sys/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-программы на своем компьютере.

Комментариев нет:

Отправить комментарий