Начало работы с JavaFX на Raspberry Pi

Начало работы с JavaFX на Raspberry Pi

Из этой статьи вы узнаете, как разработать приложение на JavaFX в стиле дашборд, используя библиотеку TilesFX .

На рис. 1 изображен пользовательский интерфейс (далее UI).

<b>Рис. 1</b> UI приложенияРис. 1 UI приложения

Также вы можете ознакомиться с видео , на котором показана работа приложения на Raspberry Pi 3B+ и функциональность интерфейса с тачскрином.

Приведенный код и рассмотренные методы применимы только к микрокомпьютерам Raspberry Pi на чипах ARM v7 и ARM v8. В разделе спецификаций плат Raspberry Pi на Википедии вы найдете типы поставляющихся с этими процессорами плат:

● Модель A+, версия 3;

● Модель B, версии 2, 3 и 4;

● Вычислительный модуль (Compute Module), версия 3.

Прочие используемые в проекте электронные компоненты вы найдете в большинстве стартовых наборов Arduino/Pi. Если вы хотите использовать другие элементы, можете начать с компонентов из проекта, и подстроить их под свои нужны. Мой комплект выглядит следующим образом:

● Raspberry Pi 3 Модель B+;

● SD карта 32 GB (или более) на ОС Raspberry Pi (бывш. Raspbian);

● Монитор, клавиатура и мышь;

● Светодиод и резистор (для большинства подойдет 330 Ом);

● Датчик расстояния HC-SR04;

● Беспаечная макетная плата и провода.

Подготовка платы Raspberry Pi

Если вы работаете Raspberry Pi впервые, подготовьте карту SD с операционной системой. В проекте используется Full ОС Raspbian (полная версия). Загрузите инструмент Imager . Для своей работы я взял версию Raspberry Pi Imager 1.2 от марта 2020 г. (рис. 2 и рис. 3). Убедитесь, что устанавливаете полную версию.

<b>Рис. 2 </b>Страница скачивания инструмента ImagerРис. 2 Страница скачивания инструмента Imager <b>Рис.3</b> Выберите полную версию (Raspbian Full)Рис.3 Выберите полную версию (Raspbian Full)

Как только SD карта будет готова, вставьте ее в плату Raspberry Pi, запустите операционную систему и выполните действия по настройке и подключению к вашей сети Wi-Fi.

Установка JDK (Java Development Kit) с помощью JavaFX

В примечаниях к релизу Raspbian указано, что используемая мной версия ОС включает OpenJDK 11.

Теперь плата готова к запуску любых приложений на основе Java 11. Однако JavaFX больше не является частью JDK (начиная с Java 11), и запустить JavaFX-программу на Raspberry Pi «из коробки» не получится.

К счастью, BellSoft разработала Liberica JDK . Предназначенная для Raspberry Pi версия включает JavaFX, поэтому вы сможете запускать упакованное приложение JavaFX с помощью команды java -jar yourapp.jar . Используйте ссылку для загрузки от BellSoft, чтобы установить альтернативную JDK:

Когда инсталляция будет завершена, проверьте версию снова. Она должна выглядеть следующим образом:

На моей тестовой плате хранятся различные версии Liberica JDK. Переключаться между ними несложно с помощью команды update-alternatives . (см. Рис.4)

<b>Рис. 4 </b>Переключение между версиями Liberica JDKРис. 4 Переключение между версиями Liberica JDK

В папке исходного кода Chapter_04_Java/scripts на GitHub расположены установочные скрипты различных версий Liberica JDK. Они содержат ссылки для скачивания. (см. Рис. 5)

<b>Рис. 5</b> Установочные скрипты различных версий Liberica JDKРис. 5 Установочные скрипты различных версий Liberica JDK

Различные схемы нумерации Raspberry Pi

Прежде чем подключать компоненты к разъемам GPIO (Интерфейс ввода/вывода общего назначения) на плате, изучите три схемы нумерации, используемые для идентификации пинов. Вас может запутать работа с разъемами GPIO. Детальную информацию можно найти в подробном руководстве по распиновке GPIO . Ниже приведена краткая сводка.

Нумерация Header Pin. Это логическая нумерация заголовка платы. Один ряд содержит четные пины, другой – нечетные.(см. Рис. 6)

<b>Рис. 6</b> Нумерация пинов заголовка платыРис. 6 Нумерация пинов заголовка платы

Нумерация BCM. Относится к номеру канала Broadcom – нумерации внутри микросхемы, используемой на Raspberry Pi.

Нумерация WiringPi. Wiring Pi – основной фреймворк, используемый Pi4J (в проекте он применяется в качестве библиотеки в Java) для управления GPIO. Причина другой схемы нумерации кроется в истории платы. Когда еще велась разработка первых моделей Raspberry Pi, предполагалось всего восемь контактов. В результате дальнейшего развития микрокомпьютера и добавления дополнительных контактов, нумерацию в WiringPi расширили, чтобы можно было на них ссылаться.

Чтобы Java разработчикам было проще понять разницу между различными типами заголовков, пинами и функциями, я разработал небольшую библиотеку, расположенную в репозитории Maven по адресу be.webtechie.pi-headers . Используя ее и небольшое приложение JavaFX, я сделал вспомогательную таблицу (см. Рис. 7), которая упрощает поиск и сопоставление номеров с соответствующими им пинами на плате. Более подробную информацию вы найдете по ссылке “ Raspberry Pi history, versions, pins and headers as a Java Maven library .”

<b>Рис. 7 </b>Сопоставление номеров с пинами на платеРис. 7 Сопоставление номеров с пинами на плате

Подключение оборудования

Давайте подключим оборудование, чтобы использовать часть мощностей платы Pi: светодиод, кнопку и датчик расстояния. См. Табл. 1, Рис. 8, Рис. 9.

<b>Табл. 1 </b>Сопоставление пинов с соответствующими устройствамиТабл. 1 Сопоставление пинов с соответствующими устройствами <b>Рис. 8</b> Подключение проводовРис. 8 Подключение проводов <b>Рис. 9</b> Схема подключенияРис. 9 Схема подключения

На рис. 10 изображена система с использованием моста на макетной плате RasPiO , что упрощает поиск правильного пина. Разъем моста помещает номера BCM в логическом порядке, но я все еще использую отдельную макетную плату, чтобы было немного больше места. Portsplus предлагает аналогичное удобное решение.

<b>Рис. 10 </b>Фото системы с использованием моста макетной платы RasPiOРис. 10 Фото системы с использованием моста макетной платы RasPiO

Чтобы проверить, подключен ли светодиод в правильном положении с учетом его полярности, отсоедините кабель между светодиодом и пином GPIO (оранжевый кабель на рис. 10) и подключите его непосредственно к контакту 3,3 В (или к плюсу на плате). Если светодиод не загорится, вам нужно поменять его положение.

Проверьте светодиод и кнопку через терминал

Чтобы проверить соединение, запустите команду gpio через терминал.

Примечание: Если вы работаете с платой Raspberry Pi 4, обязательно используйте версию 2.52 утилиты gpio. Поскольку внутренняя проводка процессора на плате Pi 4 отличается от предыдущих моделей, при необходимости доступно обновление для утилиты. Проверьте свою версию с помощью команды gpio -v через терминал и, если нужно, установите новую с помощью следующих команд:

Включить (1) и выключить (0) светодиод:

Состояние кнопки (1=нажата, 2=не нажата) 27 пина WiringPi

Переключение светодиода с помощью Java

Начинается самое интересное! Следующий код настраивает 29 пин WiringPi и 10 раз переключает его между включением и выключением с интервалом в 500 мс, используя ту же команду, которую я применял в терминале. Создайте файл под именем HelloGpio.java со следующим содержанием:

Поскольку код будет использовать Java 11 (или выше), файл Java может быть выполнен без компиляции:

Использование датчика движения

Написанное для этого блока приложение использует обычный ультразвуковой датчик расстояния, который можно найти во многих стартовых наборах Arduino и Pi. Это модуль под названием HC-SR04; дополнительную информацию и примеры вы можете найти в интернете. Модулю требуются входные и выходные GPIO-соединения. Датчик работает по той же схеме, что и система, используемая летучей мышью для полета в темноте: он использует отражение ультразвука для расчета расстояния до объекта.

Для измерения расстояния требуется, чтобы приложение и модуль выполнили следующие действия:

  1. Модуль нужно запитать на 5 V;
  2. Приложению нужно установить вывод trig в положение high как минимум на 10 мкс;
  3. Модуль посылает несколько (обычно восемь) сигналов 40 кГц и определяет, когда сигнал принимается обратно;
  4. Вывод echo устанавливается в положение high на ту же продолжительность, что и время, необходимое для возврата ультразвука к датчику;
  5. Приложение измеряет длительность положения high echo-вывода, чтобы рассчитать расстояние на основе скорости звука.

Готовое приложение

Запуск одного файла Java хорошо для тестирования системы, но это только первый шаг. В приложении используется библиотека Pi4J для объединения Java и портов GPIO на плате Raspberry Pi. Pi4J должен быть установлен на Raspberry Pi и может быть интегрирован в приложение Java с Maven. Полный исходный код примера вы можете найти на GitHub .

Следующие зависимости Maven указаны в файле POM:

● Для JavaFX, расширенная зависимость javafx-web, которая включает:

○ javafx-controls – основу для приложения JavaFX;

○ Веб-компоненты, необходимые для TilesFX.

● TilesFX для панели инструментов Tiles;

● Pi4J для использования портов GPIO.

Вот классы для взаимодействия с оборудованием.

Класс GpioHelper. В нем сгруппированы функции, связанные с портами GPIO. Код начинается с определения контактов, к которым подключены компоненты оборудования, и инициализации Pi4J GpioController. Расширенная функциональность обрабатывается в отдельных классах: ButtonChangeEventListener и DistanceSensorMeasurement (описаны вкратце). Дополнительные методы и геттеры будут использоваться в UI позже.

Класс ButtonChangeEventListener. Поскольку этот класс реализует Pi4J GpioPinListenerDigital, он может обрабатывать изменение кнопки и сохранять изменение в XYChart.Series с отметкой времени.

Класс DistanceSensorMeasurement. Этот класс является Runnable. Он добавляет отмеренное расстояние к аналогичной серии данных с отметкой времени для каждого пробега.

UI. Благодаря TilesFX приложение в стиле дашборда может быть создано быстро. Полное построение интерфейса выполняется в классе DashboardScreen.java . В следующем фрагменте кода показана кнопка переключателя для включения и выключения светодиода:

Чтобы показать измерение расстояния , я использую tile типа SMOOTHED_CHART , который в свою очередь использует XYChart.Series из доступного через GpioHelper DistanceSensorMeasurement .

Класс приложения. Теперь все элементы готовы к объединению в класс приложения JavaFX. Ниже описано, как инициализировать GpioHelper и использовать его для инициализации DashboardScreen, а также есть дополнительный код, позволяющий красиво закрыть приложение.

Запуск приложения на одноплатном компьютере Raspberry Pi

Вы можете запустить приложение на своем ПК через среду IDE, и UI отобразится, но большинство возможностей будут недоступны, потому что необходимы Pi4J и аппаратные компоненты. Перейдем к Raspberry Pi! Сначала вам нужно установить Pi4J. Это можно сделать с помощью однострочной команды:

$ curl -sSL https://pi4j.com/install | sudo bash

Финальный шаг – загрузить скомпилированный файл JAR с вашего ПК на плату Pi, что можно сделать с помощью SSH, USB-накопителя, загрузки или SD-карты. Поместите файл в /home/pi и запустите его с помощью java -jar :

Сначала на экране отобразятся логи, а чуть позже откроется экран JavaFX. Диаграмма расстояний получает новое значение каждую секунду, а диаграмма кнопки обновляется при каждом ее нажатии. Светодиод можно переключать с помощью кнопки переключения на экране в одной из плиток. (см. Рис. 11)

<b>Рис. 11 </b>Фото запущенного приложения вместе с Raspberry Pi и другими компонентамиРис. 11 Фото запущенного приложения вместе с Raspberry Pi и другими компонентами

Заключение

Как только вы узнаете, какую версию Java нужно использовать на Pi, вы можете очень быстро начать работу с простыми тестовыми программами и расширить их с помощью пользовательского интерфейса JavaFX. Создание сложного приложения требует дополнительных усилий, чтобы настроить все в вашей среде IDE и иметь возможность тестового запуска. Это позволяет вам легко разрабатывать программы на ПК и выполнять их на Pi.

Текст опубликован в переводе. Автор оригинальной статьи Frank Delporte.

Изучение Java – непростая задача. Можно освоить необходимые знания самостоятельно, но если вы только начинаете путь в профессии, стоит обратить внимание на курс Факультета Java-разработки онлайн-университета GeekBrains. Занятия ведут опытные преподаватели, а студенты во время обучения создают проекты, которые будет не стыдно показать потенциальным работодателям. Кроме того о нлайн-университет помогает выпускникам с трудоустройством.