Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Стандартный последовательный Bluetooth с Win 10 IoT-Core RPI2

Компоненты и расходные материалы

Raspberry Pi 2, модель B
× 1
Стандартный USB-ключ Bluetooth
× 1
Arduino UNO
× 1
Bluetooth-модем SparkFun - BlueSMiRF Silver
× 1

Приложения и онлайн-сервисы

Microsoft Windows 10 IoT Core
Microsoft Visual Studio 2015

Об этом проекте

Далее

Подробно этот проект обсуждается на embedded101.com:

«Win 10 IoT-Core:универсальное последовательное приложение Bluetooth для Windows»

О

Этот проект представляет собой универсальное приложение для Windows, которое подключает устройство IoT-Core, такое как Raspberry PI 2, к встроенному устройству Bluetooth через последовательный профиль Bluetooth с помощью генетического USB-ключа Bluetooth.

Фон

.Bluetooth поддерживает одноранговые сети на небольшом расстоянии. В отличие от сети Wi-Fi, подключение по Bluetooth осуществляется один к одному. Два устройства могут подключаться и взаимодействовать. Например, два устройства могут подключаться симметрично, используя профиль последовательного порта и передавать необработанные данные между собой. Однако, как правило, соединение Bluetooth асимметрично:один конец генерирует определенный формат данных, который будет использоваться на другом конце. Например, мобильный телефон может реализовать профиль A2DP (Advanced Audio Distribution Profile) и передавать звук в головной гарнитур, который реализует профиль HSP (Headset). OBEX (Обмен объектами) - это симметричное соединение между двумя устройствами, когда они обмениваются данными между ними.

В проекте Microsoft IOT-Core Bluetooth Sample используется GATT (Generic Attribute Profile Profile). Это обеспечивает услуги по обнаружению и описанию профилей для протокола Bluetooth с низким энергопотреблением. С помощью этого протокола к одному концу могут быть подключены простые устройства с низким энергопотреблением, генерирующие данные, которые будут использоваться сложным процессором.

Это намного более простой проект, чем образец Microsoft. Это касается только более общего SPP (профиля последовательного порта), который основан на профиле RFCOMM. Он был разработан с очень старым USB-ключом Bluetooth и поэтому должен работать с любым Bluetooth-ключом.

Приложение IoT

Это простое тестовое приложение для Windows (Windows 10) с последовательным интерфейсом Bluetooth. Он начинается с перечисления (в виде списка) всех устройств, сопряженных по Bluetooth с устройством, на котором запущено приложение. Один выбирается двойным щелчком, который инициирует соединение. Текст для отправки вводится в текстовое поле и отправляется при нажатии кнопки. Приложение автоматически получает любой отправленный ему текст (и отображает его). Следовательно, когда конечная точка (как указано выше) просто повторяет полученный текст, отправленный текст должен снова появиться в поле приема в приложении UW.


Конечная точка

Для тестирования используется Arduino Uno с адаптером Bluetooth. У него простой экран, который просто отображает любые символы, полученные через соединение Bluetooth:

Настройка щита:

  // Приложение последовательной обратной связи // Прошлая установка // Инициировано подключенной системой // Примечание можно использовать с Bluetooth, где RxTx устройства BT // подключены к TxRx платы Arduino. // Однако для программирования необходимо отключить адаптер BT .void setup () {// Мой адаптер настроен на этот BAUD 115200 // Это скорость порта адаптера Arduino для BT // Устанавливается, когда адаптер BT находится в командном режиме. // Это НЕ скорость BT, которую вы не можете установить. Serial.begin (115200); задержка (333); в то время как (! серийный); задержка (1000); Serial.println ("Быстрая коричневая лиса перепрыгивает через ленивую собаку!");}  

Петля щита:

  void loop () {char ch =Serial.read (); в то время как (255 ==(байт) ch) {ch =Serial.read (); } Serial.print (ch);}  

Сопряжение

Bluetooth - это одноранговый сценарий. Прежде чем они смогут подключиться через Bluetooth, они должны быть спарены. В приложении это не делается. Сопряжение с ключом доступа между встроенными устройствами может быть проблематичным, поскольку они часто не имеют заголовка и могут не поддерживать всплывающие окна (в отличие от IoT-Core). Для этого существует веб-портал IoT-Core, а также утилита командной строки на устройстве, которую можно запустить через оболочку SSH. Самая последняя версия веб-портала ОС поддерживает сопряжение ключей доступа, которое отсутствовало во время Windows 10 RTM. В статье «Win 10 IoT-Core:Bluetooth Universal Windows Serial App» подробно обсуждается сопряжение в этом контексте.

Запуск проекта

Проект приложения создается с помощью Visual Studio 2015 с использованием шаблона универсального приложения для Windows:

Новый проект -> Visual C # -> Windows-> Пустое приложение (универсальная версия Windows)

Создание пользовательского интерфейса приложения

Пользовательский интерфейс реализован на XAML

Создайте пользовательский интерфейс в соответствии с макетом, как указано выше (или аналогичным):

Пользовательский интерфейс довольно прост и создан следующим образом:

  • Все текстовые элементы являются текстовыми блоками, за исключением SendText, который является TextBox.
  • SendText принимает CarriageReturn (т. е. многострочный).
  • Для текста Recvd включен WrapText (т. е. многострочный).
  • Элементы пользовательского интерфейса организованы в строки с использованием StackPanel с горизонтальной ориентацией.
  • Эти StackPanel затем укладываются в StackPanel с вертикальной ориентацией вместе со ListBox.

Вы можете предпочесть разметку пользовательского интерфейса с помощью Relative StackPanels или использовать строки и столбцы сетки и т. Д.

ConnectDevices - это ListBox с источником привязки, установленным на PairedDevices ( см. Позже ) и ItemTemplate, состоящий из TextBlock, привязанного к свойству Name PairedDevices ( см. позже ).

          

Конфигурация приложения

  • В приложении не используются функции IOT-Core, поэтому ссылки на расширения не требуются.
  • Приложению потребуются некоторые специальные возможности для Bluetooth и последовательного порта, добавленные в Package.appxmanifest.
  • К сожалению, пользовательский интерфейс, который вы получаете для этого, если дважды щелкните этот файл в обозревателе решений, не поддерживает добавление этих возможностей, поэтому вам нужно добавить их вручную, щелкнув файл правой кнопкой мыши в обозревателе решений и выбрав Открыть с помощью-> Редактор XML.

Измените раздел возможностей (внизу) на:

           

Возможности internetClient уже будут там. Это не требуется для этого приложения, поэтому вы можете удалить его. Я оставляю это.

Информация о сопряженном устройстве

При запуске приложения сопряженные устройства перечисляются с помощью:

DeviceInformationCollection DeviceInfoCollection

=await DeviceInformation.FindAllAsync (RfcommDeviceService.GetDeviceSelector (RfcommServiceId.SerialPort));

Затем эта коллекция преобразуется в ObservableCollection . что его можно использовать в ListBox:

_pairedDevices =новая коллекция ObservableCollection ();

DeviceInfoCollection повторяется путем создания PairedDeviceInfo объект для каждого элемента, который затем добавляется в _pairedDevices сборник.

PairedDeviceInfo это класс со свойствами:

Имя

Идентификатор

DeviceInfo

У класса есть соответствующий конструктор.

Информация об устройстве это Windows.Devices.Enumeration.DeviceInformation

В списке сопряженных устройств Имя поле отображается (привязано).

Когда устройство выбрано (двойным щелчком), информация об устройстве конечной точки фактически является частью выбранного пункта меню и поэтому используется для установления соединения.

Подключение

DeviceInformation используется для получения службы RFCOMM. Затем соединение устанавливается как StreamSocket с использованием имени хоста конечной точки (фактически, его Mac-адрес Bluetooth) и строки ServiceName.

  _service =await RfcommDeviceService.FromIdAsync (DeviceInfo.Id); _ socket =new StreamSocket (); await _socket.ConnectAsync (_service.ConnectionHostName, _service.ConnectionServiceName);  

Если все в порядке, то у нас есть соединение ... сокет будет значимым (не нулевым).

Конечно, это ошибка (попробуйте поймать)

Отправка текста и получение текста используют свойства сокета InputStream и OutputStream.

Получить текст

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

  private async void Listen () {ReadCancellationTokenSource =new CancellationTokenSource (); если (_socket.InputStream! =null) {dataReaderObject =новый DataReader (_socket.InputStream); // продолжаем чтение последовательного ввода while (true) {await ReadAsync (ReadCancellationTokenSource.Token); }}} DataReader dataReaderObject; частный CancellationTokenSource ReadCancellationTokenSource; частная асинхронная задача ReadAsync (CancellationToken cancellationToken) {uint ReadBufferLength =1024; // Если была запрошена отмена задачи, соблюдаем cancellationToken.ThrowIfCancellationRequested (); // Устанавливаем InputStreamOptions для завершения операции асинхронного чтения, когда доступен один или несколько байтов dataReaderObject.InputStreamOptions =InputStreamOptions.Partial; // Создание объекта задачи для ожидания данных в serialPort.InputStream loadAsyncTask =dataReaderObject.LoadAsync (ReadBufferLength) .AsTask (cancellationToken); // Запускаем задачу и ждем UInt32 bytesRead =await loadAsyncTask; если (bytesRead> 0) {строка recvdtxt =dataReaderObject.ReadString (bytesRead); }}  

Отправить текст

В то время как полученный текст выполняется асинхронно, поскольку поступление текста не является детерминированным с точки зрения приложения, отправленный текст обрабатывается из пользовательского интерфейса приложения и поэтому по сути является синхронным (хотя для освобождения пользовательского интерфейса используется ожидание).

  private async void Send (string msg) {Task storeAsyncTask; DataWriter dataWriteObject =новый DataWriter (_socket.OutputStream); dataWriteObject.WriteString (сообщение); // Запускаем асинхронную задачу для завершения операции записи storeAsyncTask =dataWriteObject.StoreAsync (). AsTask (); UInt32 bytesWritten =ожидание storeAsyncTask;}  

Состояния кнопок

Командные кнопки включаются и отключаются в зависимости от состояния приложения. Например, кнопки «Отправить» и «Начать запись» отключаются, когда приложение не подключено, но становятся активными, когда приложение подключено, и т. Д.

Наслаждаться! :)

Код

iotbluetoothserial на Github
Также на Codeplex (зеркало) https://iotgenbluetoothserialuwa.codeplex.com/https://github.com/djaus2/iotbluetoothserial

Производственный процесс

  1. GoPiGo v2 с Windows IoT
  2. Затемнение света с ШИМ с помощью кнопки
  3. Устройство измерения расхода воздуха под давлением с аналоговым датчиком
  4. Игра с гироскопом Arduino с MPU-6050
  5. Камера безопасности Discord с ESP32
  6. Датчик DHT11 со светодиодами и пьезо-динамиком
  7. Unopad - MIDI-контроллер Arduino с Ableton
  8. Пульт дистанционного управления для телевизора с питанием от батареи и футляр, напечатанный на 3D-принтере
  9. Arduino с Bluetooth для управления светодиодом!
  10. Простой датчик препятствий с Arduino