2.2 Формирование библиотеки светодиодов
Формирование библиотеки с готовыми данными необходимо для возможности анализа и сравнения результатов построения функций преобразования. Для исследования показаний оптических преобразователей были выбраны 10 моделей светодиодов с разным набором характеристик, указанных в технической документации, которые позволяют сделать выводы при анализе характеристик:
1) АЛ102
а) Угол распространения света ± 30
б) Номинальный ток 10 мА
в) Световая мощность 20 мВт
2) Nichia NSPW515DS
а) Угол распространения света ± 40
б) Номинальный ток 30 мА
в) Световая мощность 96 мВт
3) TLUR6400
а) Угол распространения света ± 30
б) Номинальный ток 20 мА
в) Световая мощность 40 мВт
4) TLHE510
а) Угол распространения света ± 10
б) Номинальный ток 30 мА
в) Световая мощность 60 мВт
5) TLDR5800
а) Угол распространения света ± 5
б) Номинальный ток 50 мА
в) Световая мощность 90 мВт
6) VLHW4100
а) Угол распространения света ± 60
б) Номинальный ток 25 мА
в) Световая мощность 70 мВт
7) TLHB5400
а) Угол распространения света ± 40
б) Номинальный ток 20 мА
в) Световая мощность 78 мВт
8) TLLR540
а) Угол распространения света ± 30
б) Номинальный ток 7 мА
в) Световая мощность 14 мВт
9) 3803X
а) Угол распространения света ± 10
б) Номинальный ток 50 мА
в) Световая мощность 90 мВт
10) TLLG440
а) Угол распространения света ± 25
б) Номинальный ток 7 мА
в) Световая мощность 14 мВт
Данный набор предоставляет модели с различным углом распространения света, но одинаковой силой тока для того, чтобы анализировать зависимость функции преобразования от угла распространения света. Также данный набор включает модели с одинаковым углом распространения света, но разной силой тока, что позволяет анализировать зависимость функции преобразования от силы тока. Подводя итог, составленный список позволяет максимально широко исследовать зависимость функции преобразования от входных значений.
2.3 Разработка ПО
Для проверки адекватности построенной математической модели датчика разработано программное обеспечение, включающее набор следующих функций:
1) Добавление и удаление модели светодиода.
При запуске ПО пользователю предоставлено 10 моделей светодиодов для того, чтобы можно было приступить к его освоению и моделированию сразу после запуска программы. Пользователю предоставлена возможность для добавления и удаления моделей светодиодов в программу. Добавление происходит во внутренний файл приложения с помощью сериализации. При запуске приложения считывается содержимое данного файла, из которого десериализуются модели светодииодов доступные для использования. Таким образом предоставляется возможность сохранения данных не только в рамках текущей сессии пользователя, но и после перезапуска программы. Для добавления модели светодиода в систему, пользователю необходимо нажать на кнопку “Добавить датчик”. После этого будет открыто диалоговое окно, в котором необходимо ввести параметры модели, такие как название модели, угол рассеивания и мощность, которые указываются производителем в технической характеристике светодиода (рис. 8). Данные поля имеют ограничения:
а) Название светодиода - максимум 100 символов.
б) Угол рассеивания - числовое значение от 1 до 90 градусов.
в) Мощность излучения - числовое значение от 1 до 100 мВт
Для удаления модели светодиода пользователю необходимо выбрать из раскрывающегося списка модель, которую необходимо удалить из базы приложения и нажать на кнопку “Удалить датчик”. После этого запускается диалоговое окно, которое требует подтвердить совершаемую операцию, для того чтобы не допустить случайного удаления модели.
Рис. 8 Добавление датчика в ПО
2) Выбор динамических параметров.
В ходе анализа факторов, оказывающих наибольшее влияние на характеристики оптических преобразователей, были выявлены основные параметры, которые добавлены на панель графического интерфейса, такие как коэффициент примесей в среде, коэффициент отражающей поверхности и коэффициент шероховатости поверхности. Данные поля допускают значения в диапазоне от 0.01 до 1. Также для расчетов характеристик необходимо указать расстояние от светодиода до фотодиода и ширину принимающей поверхности фотодиода (рис. 9).
Рис. 9 Выбор динамических параметров
3) Построение функции преобразования в виде графика.
Для того чтобы построить функцию преобразования с выбранным светодиодом пользователю необходимо нажать на кнопку “Построить график”. Далее происходит проверка значений на корректность. Если все поля заполнены верно, то в системе координат отображается график функции преобразования (рис. 10), иначе пользователю будет показано диалоговое окно с просьбой изменить неверно введенный параметр. Внизу, под графиком, изображено название используемого датчика для идентификации. На данном графике изображена зависимость тока на фотодиоде в зависимости от расстояния до отражающей поверхности. В момент, когда отражающая поверхность находится слишком близко к светодиоду, отраженные лучи не попадают на поверхность фотодиода, поэтому ток на фотодиоде равен нулю. При отдалении отражающей поверхности от плоскости светодиода и фотодиода количество лучей, попадающих на поверхность фотодиода, резко увеличивается, тем самым увеличивается ток на фотодиоде, достигая точки максимума. Далее при увеличении расстояния отражающей поверхности от плоскости, количество лучей, попадающих на фотодиод, постепенно уменьшается, уменьшая ток на фотодиоде.
4) Сравнение графиков в одной системе координат.
Разработанное ПО позволяет отображать несколько графиков в одной системе координат. Для этого пользователю необходимо изменить набор динамических параметров или выбрать другой датчик для анализа и нажать еще раз на кнопку “Построить график”. В системе координат, изображающей графики будет выведено несколько графиков (рис. 11). Данная функция позволяет определить наиболее подходящий для решения конкретной задачи светодиод. В зависимости от угла распространения светодиода определяется начальное расстояние, при котором свет поступает на фотодиод, диапазон и чувствительность графика. В зависимости от технических характеристик светодиода определяется максимальное значение тока на фотодиоде.
Рис. 10. График функции преобразования
Рис. 11 Сравнение графиков функций преобразования для разных светодиодов
5) Очистка графика.
Для очистки графика пользователю необходимо нажать на кнопку “Очистить график”. В данном случае система координат очищается, и пользователю предоставлена возможность начать моделирование заново.
6) Вывод диапазона и чувствительности графиков в виде таблицы.
Для того чтобы анализировать графики справа от системы координат изображается таблица с выводом основных данных, рассчитанных при построении графика (рис. 12). Данная таблица содержит 3 поля:
а) Название светодиода
б) Диапазон графика. В данном случае происходит расчет расстояния от начала графика до точки максимума. Точкой максимума в данном случае является конечная энергия, поступившая на фотодиод.
в) Чувствительность графика. В данном случае происходит расчет тангенса угла наклона прямой от начала графика до точки максимума.
Рис. 12 Таблица рассчитанных параметров функций преобразования
7) Проведение математических операций над функциями преобразования.
Разработанное ПО позволяет проводить стандартные математические операции над функциями (сложение, вычитание, деление, умножение). Для выполнения набора операций необходимо сохранять результат операций в очередь с помощью нажатия на кнопку “Сохранить в очередь” и отображать при необходимости с помощью кнопки “Достать из очереди”.
8) Выгрузка результатов работы ПО в excel таблицу.
Для того чтобы экспортировать результаты проведенного анализа, необходимо нажать на кнопку в нижней панели графика “Скачать отчет”. После этого происходит выгрузка всех данных, включающая введенные пользователем данные и данные, рассчитанные в результате построения функции преобразования в виде excel таблицы.
В качестве архитектурного решения в данной работе применен паттерн MVC (Model-View-Controller). Это подход, который предполагает выделение кода в отдельные блоки, которые отвечают за выполнение разных задач [4]. Компоненты MVC:
1) Модель -- это компонент, отвечающий хранение данных.
2) Представление -- это компонент, отвечающий за взаимодействие с пользователем. То есть код компонента view определяет внешний вид приложения и способы его использования.
3) Контроллер -- этот компонент отвечает за связь между model и view. Код компонента controller определяет, как представление реагирует на действия пользователя (рис. 13).
Рис. 13 Взаимодействие компонентов MVC
Рассмотрим основные компоненты и алгоритмы разработанного ПО.
В данном ПО моделью является LED (светодиод). Модель LED состоит из трех полей:
1) Name - название светодиода.
2) Power - мощность светодиода.
3) Degree - максимальный угол распространения света.
Для того, чтобы не допустить повторения моделей в ПО переопределены методы сравнения объектов equals/hashcode. Данные методы позволяют по заданным критериям сравнивать объекты. В случае с моделями фотодиодов необходимо сравнить все поля на равенство значений и предотвратить попадание дубликата в список.
В качестве слоя представления (отображение графических компонентов) используется файл формата fxml. FXML - специфичный формат XML для JavaFX. В нем определяются все графические компоненты и их свойства, а также описывается связь с контроллером. Для того чтобы привязать данную разметку к контроллеру происходит ее загрузка с помощью класса FXMLLoader. После того, как разметка загружена, она устанавливается для отображения с помощью класса Scene. Загруженная в Scene разметка отображается пользователю после запуска программы. Рассмотрим необходимые для решения поставленных задач графические компоненты, реализованные в ПО:
1) TextField - поле однострочного ввода. Данное поле необходимо для ввода пользователем значений. Оно позволяет устанавливать различные валидаторы ввода значений во избежание ошибки пользовательского ввода. Для решения поставленных задач реализованы символьные валидаторы на длину значения, чтобы предотвратить слишком длинные названия светодиодов и числовые валидаторы для корректного ввода целых и десятичных значений. Рассмотрим самый используемый в ПО валидатор ввода десятичных значений в диапазоне от 0.01 до 1 (см. Приложение 1). Для этого задается регулярное выражение, допускающее ввод либо 1, либо 0 с последующим знаком точки. Далее введенное значение преобразуется в вещественный тип Double, и, если преобразование успешно, введенный символ отображается в поле ввода.
2) HBox и VBox. Данные элементы являются контейнерами, которые позволяют компоновать графические элементы вертикально и горизонтально. Фактически, они отвечают за расположение элементов в окне программы.
3) LineChart - компонент для отображения графиков. Данный компонент принимает на вход массив значений для осей X и Y и на основании данных строит функцию. Также включает в себя набор функций для именования графиков и отметки ключевых значений.
4) TableView - таблица. TableView позволяет создать настраиваемую таблицу. В данном ПО в качестве строки таблицы используется сущность TableModel. TableModel в свою очередь состоит из 3 полей: название светодиода, диапазон и чувствительность графика.
5) ComboBox - раскрывающийся список. Данный компонент предназначен для выбора конкретного элемента из списка. В рамках ПО ComboBox предоставляет возможность выбрать необходимую для анализа модель светодиода.
6) Button - кнопка. К каждой кнопке прикрепляется EventHandler, который описывает действие, которое необходимо выполнить.
Controller - самая объемная и значимая часть разработанного ПО. В нем реализованы все связи между графическими компонентами, а также содержатся логика и основные алгоритмы ПО, которые рассмотрены далее.
Для начала рассмотрим принцип работы с файлами. Запись и чтение в файл реализовано для возможности хранить список используемых светодиодов и основано на сериализации. Сериализация -- это процесс, который конвертирует объект в последовательность из байтов, по которой можно восстановить объект в любой времени. Для реализации механизма сериализации модель светодиода LED наследуется от маркерного интерфейса Serializable [5]. Это интерфейс-идентификатор, который не имеет методов, но он указывает виртуальной машине Java, что объекты этого класса могут быть сериализованы. Рассмотрим алгоритмы чтения и записи моделей светодиодов в файл.
Для чтения данных из файла используется объект ObjectInputStream. Данный объект принимает в конструкторе ссылку на поток ввода для десериализации данных. В качестве потока используется файловый поток FileInputStream, который принимает на вход название файла, из которого считываются данные. Данные моделей светодиодов располагаются в файле converter.txt. Для считывания содержимого файла используется метод ObjectInputStream.readObject(), который далее преобразовывается в массив моделей, готовых к отображению и использованию в рамках ПО. При завершении работы с потоком его необходимо закрыть с помощью метода close(), который определен в интерфейсе Closeable. При закрытии потока освобождаются все выделенные для него ресурсы, в данном случае это файл. Если пропустить закрытие потока, то может произойти утечка памяти, которая впоследствии приведет к искажению данных файла. Так как во время открытия или считывания файла может произойти ошибка ввода-вывода, то код считывания помещается в блок try. И чтобы быть уверенным, что поток закроется при любой ситуации, даже если при работе с ним возникнет ошибка, необходимо поместить вызов метода close() в блок finally (см. Приложение 2).
При добавлении модели светодиода в систему, она добавляется в список всех моделей. Далее создается объект FileOutputStream, который предназначен для записи байтов в файл. В конструктор объекта передается название файла, в который записываются данные. Аналогично чтению, запись происходит в файл converter.txt. После этого поток байтов упаковывается в объект ObjectOutputStream. Этот класс является фильтрующим потоком, который окружает низкоуровневый поток байтов и предоставляет поток сериализации. Для записи списка моделей светодиодов в файл используется метод ObjectOutputStream.writeObject(), который запускает механизм сериализации. После завершения операции открытый поток закрывается с помощью вызова метода ObjectOutputStream.close() (см. Приложение 2).