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

1295
30 декабря 2016, 10:49

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

Answer 1

Поскольку Java изначально разрабатывалась для программирования холодильников и кофеварок, было бы странно, если бы возможность работы с железом была утрачена напрочь.

Самый простой вариант подключения кнопки к микроконтроллеру - это порты GPIO, которые широко распространены в embedded мире. Кнопка одним контактом подключается к выводу порта, другим - к земле (GND). Дальше микроконтроллер либо сам что-то делает, либо по UART/USB/Ethernet/WiFi/Bluetooth отправляет сообщение о нажатой кнопке куда-то еще.

Непосредственно по железу варианты есть следующие.

  1. Использовать специализированный микроконтроллер, заточенный под 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);
        }
    });
    
  1. Использовать полноценную встраиваемую систему общего назначения на базе 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.

  1. Удивительно, но на Java можно писать под 8-битные AVR-микроконтроллеры (те самые, на которых построена Arduino)!

    Это стало возможным благодаря HaikuVM, которая транслирует байткод Java из .class-файлов в С-структуры, линкует к ним интерпретатор и формирует на выходе обычный для AVR-микроконтроллеров HEX-файл, который шьется в железку как обычно.

    Еще есть:

    • NanoVM - виртуальная машина подмножества Java, занимающая 8 кБ в флэш-памяти.

    • uJ - эта VM крупнее (десятки килобайт), но обещает полную поддержку байткода, многопоточность и synchronized.

    Если вы хотите нопку подключить к Arduino, а его в свою очередь подключить к компьютеру и делать что-то на компьютере по нажатию на кнопку, попробуйте JArduino. Этот API требует залить на Arduino свою прошивку, после чего вы сможете взаимодействовать с устройством из обычной Java-программы на своем компьютере.

READ ALSO
Проблема с отображением кнопок в LIBGDX

Проблема с отображением кнопок в LIBGDX

Всем приветПроблема видна на картинках

674
Java.Swing. Закругление углов кнопки

Java.Swing. Закругление углов кнопки

Доброго времени сутокПодскажите,как можно закруглить края кнопки?

536