☕ Начало работы с JavaFX на Raspberry Pi
Raspberry Pi идеально подходит для любителей поэкспериментировать с электронными компонентами. Если объединить его с инструментами Java-разработчика, вы откроете для себя новый мир.
Недорогой одноплатный компьютер Raspberry Pi отлично работает с Java, отчего hardware-разработка становится не сложнее классической разработки ПО.
Из этой статьи вы узнаете, как разработать приложение на JavaFX в стиле дашборд, используя библиотеку TilesFX.
На рис. 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). Убедитесь, что устанавливаете полную версию.
Как только SD карта будет готова, вставьте ее в плату Raspberry Pi, запустите операционную систему и выполните действия по настройке и подключению к вашей сети Wi-Fi.
Установка JDK (Java Development Kit) с помощью JavaFX
В примечаниях к релизу Raspbian указано, что используемая мной версия ОС включает OpenJDK 11.
Java-версия:
Теперь плата готова к запуску любых приложений на основе 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)
В папке исходного кода Chapter_04_Java/scripts
на GitHub расположены установочные скрипты
различных версий Liberica JDK. Они содержат ссылки для скачивания. (см. Рис. 5)
Различные схемы нумерации Raspberry Pi
Прежде чем подключать компоненты к разъемам GPIO (Интерфейс ввода/вывода общего назначения) на плате, изучите три схемы нумерации, используемые для идентификации пинов. Вас может запутать работа с разъемами GPIO. Детальную информацию можно найти в подробном руководстве по распиновке GPIO. Ниже приведена краткая сводка.
Нумерация Header Pin. Это логическая нумерация заголовка платы. Один ряд содержит четные пины, другой – нечетные.(см. Рис. 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.”
Подключение оборудования
Давайте подключим оборудование, чтобы использовать часть мощностей платы Pi: светодиод, кнопку и датчик расстояния. См. Табл. 1, Рис. 8, Рис. 9.
На рис. 10 изображена система с использованием моста на макетной плате RasPiO, что упрощает поиск правильного пина. Разъем моста помещает номера BCM в логическом порядке, но я все еще использую отдельную макетную плату, чтобы было немного больше места. Portsplus предлагает аналогичное удобное решение.
Чтобы проверить, подключен ли светодиод в правильном положении с учетом его полярности, отсоедините кабель между светодиодом и пином 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-соединения. Датчик работает по той же схеме, что и система, используемая летучей мышью для полета в темноте: он использует отражение ультразвука для расчета расстояния до объекта.
Для измерения расстояния требуется, чтобы приложение и модуль выполнили следующие действия:
- Модуль нужно запитать на 5 V;
- Приложению нужно установить вывод trig в положение high как минимум на 10 мкс;
- Модуль посылает несколько (обычно восемь) сигналов 40 кГц и определяет, когда сигнал принимается обратно;
- Вывод echo устанавливается в положение high на ту же продолжительность, что и время, необходимое для возврата ультразвука к датчику;
- Приложение измеряет длительность положения 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)
Заключение
Как только вы узнаете, какую версию Java нужно использовать на Pi, вы можете очень быстро начать работу с простыми тестовыми программами и расширить их с помощью пользовательского интерфейса JavaFX. Создание сложного приложения требует дополнительных усилий, чтобы настроить все в вашей среде IDE и иметь возможность тестового запуска. Это позволяет вам легко разрабатывать программы на ПК и выполнять их на Pi.
Текст опубликован в переводе. Автор оригинальной статьи Frank Delporte.
Хочу научиться программировать с нуля, но не знаю, с чего начать. Что делать?
Можно учиться самостоятельно (долго) или пойти на курсы с преподавателями (быстро). Плюс нужно учитывать, что джунов много, конкуренция выше и работодатели повышают порог вхождения при найме на работу. Чтобы получить актуальные знания, мы в proglib.academy запустили курсы:
- Основы программирования на Python.
- Профессия Python-разработчик.
- Алгоритмы и структуры данных.
- Математика для Data Science.
- Профессия Data Science.
- Frontend Basic: принцип работы современного веба.
- Профессия Фронтенд-разработчик.
- Обработка естественного языка. Полный курс.
На подходе еще больше 10 курсов для взрослых и детей.