В начало | Зарегистрироваться | Заказать наши киты почтой
 
 
 
 

Обмен данными между Java-приложением и МК. Часть 2. По воздуху, Bluetooth

📆15 августа 2022   ✒️ayan   🔎1.380   💬2  

Привет всем датагорчанам-любителям МК! Сегодня мы рассмотрим двусторонний обмен между Java-приложением и микроконтроллером посредством Bluetooth. Заодно сделаем весёлую штуку: рисуем цветными пикселями в приложении и получаем такой же рисунок на матрице из адресуемой RGB-ленты.

Задание

Соберем устройство:
• передающее значение освещённости Java-приложению на компьютере,
• управляющее RGB-лентой, выбор конкретного светодиода которой и его цвета определяется Java-приложением.

Нам потребуются:
Микроконтроллер ATmega328p (далее — «МК») с частотой тактирования 8 МГц. Bluetooth-модуль HC-05. RGB-лента WS2812B. Фоторезистор. Резистор на 1 кОм. Блок питания на 5 В (пойдёт от смартфона).

Схема соединений и алгоритм работы

представлена на Рисунке 1.
Обмен данными между Java-приложением и МК. Часть 2. По воздуху, Bluetooth
Рисунок 1. Схема соединений устройства

Алгоритм работы устройства следующий:
а) АЦП микроконтроллера в автоматическом режиме напряжение, величина которого отражает уровень освещенности на фоторезисторе, и передаёт полученное значение Java-приложению.

б) При перемене цвета любого из 105 лэйблов в графическом интерфейсе Java-приложение передаёт соответствующую информацию МК для изменения цвета соответствующего светодиода RGB-ленты.

Видео-демострация проекта



Программа для Atmega328P


Контроль за уровнем освещённости

осуществляется измерением напряжения на выводе PC0 МК, соединённом с точкой между фоторезистором и резистором.
Параметры функционирования АЦП определяются кодом нижеприведённых файлов.

adc.h

adc.c

Как видите:
• На каждое тысячное (значение макроопределения ADC_COUNTER_MAX) измерение в обработчике прерывания устанавливается в 1 флаг adcFlag. Реакция на это событие осуществляется в функции deviceControl, о чём — ниже.
• Во избежание шума результат измерения выравнивается по левому краю (бит ADLAR регистра ADMUX). Далее, в deviceControl, считывается значение лишь старшего байта ADCH регистра данных АЦП.

Управление RGB-лентой

происходит посредством ассемблер-кода, представленного ниже.

WS2812B.S

Принцип работы WS2812B, а также подробные пояснения к коду вы можете увидеть в первой части статьи.

Обмен данными с Java-приложением

происходит через модуль HC-05 посредством протокола UART, код которого представлен ниже.

Serial.h

Serial.c

Отличие от аналогичного кода в первой части статьи заключается лишь в количестве принимаемых байтов (11 против 4). Обусловлено это следующими причинами:
а) Введён однобайтный ключ, назначение которого будет пояснено позже.

б) Добавлен 1 байт для номера светодиода, цвет которого необходимо изменить.

в) Значение цвета разложено на сотни, десятки и единицы для каждой составляющей (красной, синей и зелёной).

Общий контроль за устройством

обусловлен кодом из файлов device.

device.h

device.с

Коротко о каждой из функций:
1. В deviceInit() настраивается необходимая периферия: UART, АЦП и пин PB0, управляющий лентой.

2. Функции stripOff() и setLedColor() служат для выключения ленты и записи в буфер параметров цвета определённого светодиода, соответственно.

3. В deviceControl() циклично опрашиваются три флага:
а) receiveFlag, сигнализирующий о размещении в массив receivedByte пакета данных, поступивших от Java-приложения. Нулевой элемент массива receivedByte[0] содержит упоминавшийся выше ключ, в зависимости от значения которого происходит следующее:
• 1 — из данных элементов receivedByte[2]–receivedByte[10] «склеиваются» значения зелёной, красной и синей составляющих цвета, в который затем и окрашивается светодиод с номером, хранящемся в receivedByte[1].
• 2 — устанавливается в 1 флаг communicationFlag, что разрешает МК отправку значения напряжения Java-приложению. Данное значение отправляется приложением в самом начале работы лишь один раз и свидетельствует о его готовности принимать данные от МК.

б) флаг adcFlag устанавливается в 1 обработчиком прерывания АЦП по завершению измерения. В этом случает происходит отправка значения напряжения при условии, что communicationFlag установлен в 1.

Java-приложение

Код приложения состоит из 5 классов, ответственных за:
Frame — графически интерфейс,
BluetoothClient, IncomingMessagesLoggingRunnable, DeviceDiscoveredLoggingCallback — обмен по протоколу Bluetooth,
Main — диспетчеризацию данных.

Класс Frame

В конструкторе класса создаётся поле интерфейса (фрэйм), включающее в себя:
Button «Scanning» и «Connect» для поиска bluetooth-устройства и соединения с ним, соответственно.
ComboBox для отражения списка найденных bluetooth-устройств.
• 105 Label, имитирующих светодиоды RGB-ленты.
Button «Color» для вызова цветовой палитры.
Label с надписью «Luminosity».
ProgressBar, отражающий текущее значение напряжения на выводе PC0 МК, т.е. освещённости.


Рисунок 2. Графический интерфейс приложения

Методы класса призваны:
1. actionPerformed() реагировать на нажатие кнопок:
• «Scanning» и «Connect» — установкой в 1 флагов scanningButtonFlag и connectButtonFlag, соответственно, реакция на что осуществляется в классе Main.
• «Color» — вызовом цветовой палитры.

2. MouseListener() при нажатии левой клавиши мыши:
• окрашивать в предварительно выбранный цвет Label, на который в данный момент установлен курсор
• устанавливать в 1 флаг sendFlag c дальнейшей реакцией в классе Main.

3. showMessageDialog() выдавать сообщение о соединении приложения с модулем HC-05.


Класс BluetoothClient

В данном классе создаётся экземпляр DDLC класса DeviceDiscoveredLoggingCallback и содержится лишь один метод startDiscovery(), обеспечивающий поиск bluetooth-устройств.


Класс IncomingMessagesLoggingRunnable

отвечает за приём данных от МК, для чего создаётся поток input. Поступающие данные сохраняются в массив buffer, после чего поднимается флаг receiveFlag. Реакция на последнее событие реализована в классе Main.


Класс DeviceDiscoveredLoggingCallback

создаёт экземпляр IMLR класса IncomingMessagesLoggingRunnable, и содержит следующие методы:
а) openConnection() осуществляет соединение приложения с HC-05, создавая при этом отдельный поток outputStream для передаваемых данных. Кроме того, метод запускает методы checkReceivedData() и sendData().

б) checkReceivedData() запускает задачу timerTask, которая при установке в 1 флага receiveFlag поднимает флаг dataReceivedFlag, реакция на что происходит в Main.

в) sendData() отправляет микроконтроллеру 11 байтов с информацией о светодиоде, состояние которого необходимо изменить.

г) deviceDiscovered() сохраняет адреса и имена обнаруженных bluetooth-устройств в одноимённые массивы.

д) inquiryCompleted() поднятием флага DDLCflag сигнализирует о завершении поиска bluetooth-устройств.


Класс Main

В этом классе создаются экземпляры классов Frame и BluetoothClient.

Далее, в цикле опрашиваются флаги и в случае поднятия:
scanningButtonFlag — запускается поиск bluetooth-устройств,

DDLCflag — выдаётся сообщение о завершении поиска, активируется кнопка «Connect» и деактивируется «Scanning»,

ConnectButtonFlag — деактивируется кнопка «Connect» и активируется «Color», а также устанавливается соединение с выбранным bluetooth-устройством (в нашем случае — с HC-05),

sendFlag — формируются и отправляются микроконтроллеру 11 байт со значениями ключа, номера и цвета светодиода.



Файлы

🎁Исходники - kod.zip  15.82 Kb ⇣ 14

Камрад, рассмотри датагорские рекомендации

🌼 Полезные и проверенные железяки, можно брать

Опробовано в лаборатории редакции или читателями.




 

Читательское голосование

Нравится

Статью одобрили 15 читателей.

Для участия в голосовании зарегистрируйтесь и войдите на сайт с вашими логином и паролем.
 

Поделись с друзьями!

 

 

Связанные материалы

 

Схема на Датагоре. Новая статья Обмен данными между Java-приложением и МК. Часть 1. По проводу, USB-UART... Приветствую всех жителей и гостей кибер-города Датагор! Работа устройства на базе микроконтроллера...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 6. Протоколы обмена данными I2C и SPI... В проекте из предыдущей части нашей ассемблерной эпопеи мы подключали к микроконтроллеру светодиод...
Схема на Датагоре. Новая статья Машинка с пропорциональным управлением по Bluetooth из-под Android... Не будем покупать плохие игрушки у Китайцев, а купим у них дешевый конструктор-шасси, несколько...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 7. Компиляция, отладка, загрузка... Привет датагорцам и гостям нашего кибер-города! В предыдущих частях материала по Ассемблеру...
Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 3. TFT дисплей 2.8" (240х320) на ILI9341... Битва за урожай закончена, можно продолжить повествование. Полноцветный TFT-дисплей 240×320 ILI9341...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 5. Периферия МК.... Сегодня мы рассмотрим работу следующих модулей периферии: • порта ввода-вывода, • таймера •...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 1. Начало пути... Приветствую всех сограждан и читателей журнала Датагор! Пользуясь кучей времени, предоставленной...
Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST7735... Следующий из рассматриваемых нами модулей обладает полноцветным дисплеем под управлением...
Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 4. Android... Вообще то я планировал рассказать сегодня про дисплей на базе ILI9481. Однако, он настолько похож...
Схема на Датагоре. Новая статья Ассемблер для микроконтроллера с нуля. Часть 2. Шаблонные файлы и инструкции МК... В предыдущей части статьи мы провели подготовительную работу и вкратце разобрали принципы работы...
Схема на Датагоре. Новая статья Электронные часы-термометр с беспроводным датчиком через радиомодуль nRF24L01... Здравствуйте, уважаемые Датагорцы! Представляю вашему вниманию электронные часы с функцией...
Схема на Датагоре. Новая статья Здравствуй, Ёлка, Новый год! Своими руками - светящийся RGB-LED поясок для платья снегурочки + настольная ёлочка... Началось всё с идеи украсить новогоднее платье дочки для утренника в садике на "Новый...
 

Комментарии, вопросы, ответы, дополнения, отзывы

 

<
Читатель Датагора

Datagor

<
Читатель Датагора

erbol

Добавить комментарий, вопрос, отзыв 💬

Камрады, будьте дружелюбны, соблюдайте правила!

  • Смайлы и люди
    Животные и природа
    Еда и напитки
    Активность
    Путешествия и места
    Предметы
    Символы
    Флаги
 
 
В начало | Зарегистрироваться | Заказать наши киты почтой