«Каких Марин?» или управляем контроллером через bluetooth с помощью мобильного приложения на Xamarin (Android) / Хабр

«Каких Марин?» или управляем контроллером через bluetooth с помощью мобильного приложения на Xamarin (Android) / Хабр Машинки

Часть i: введение

Если не считать вставок кода C#, то эта статья будет короткой, поскольку мы уже рассмотрели основные приемы управления потоком. Ниже приведен список предыдущих статей, в которых мы обсуждали основные трюки контроллера CANNY:

  1. “Раз, два, три – елка зажглась!”. или мой первый взгляд на крошечный контроллер CANNY 3 – в этой статье мы рассмотрели, как выглядит контроллер и как работать в среде разработки CannyLab.
  2. “У цели много лиц” или автоматизация автоматического управления лампами с помощью крошечного контроллера CANNY 3 и фоторезистора – в этой статье мы обсудили, как использовать виртуальный COM-порт USB, как подключить датчики к АЦП и высокочастотные ШИМ-преобразователи на выходах контроллера.
  3. “Как яблоко в глазу…” или создание простой системы безопасности на основе микроконтроллера (CANNY или Arduino) и Raspberry PI – в этой статье мы рассмотрели работу с UART и повторили то, что узнали ранее.

Для этой статьи я использовал следующее оборудование: миниатюрный контроллер CANNY 3, bluetooth-адаптер HC-06, концевой выключатель (концевой выключатель Trema-модуля), герконовый выключатель, старые проводные наушники, макетную плату, провода и “крокодилы”.

С помощью мобильного приложения мы будем следить за тем, какие датчики работают, и при необходимости можем вручную подать звуковой сигнал.

Содержание этой статьи представлено строго в учебных и демонстрационных целях. Моей целью было показать некоторые хитрости контроллера, а также заставить купленное на тот момент оборудование хоть как-то работать на свою стоимость.

Несмотря на далекий от реальности характер проблемы, которую мы пытаемся решить, представим, что мы проектируем и создаем систему слежения за раздвижными дверями. Концевой выключатель будет подавать сигнал, когда она достигнет конца, а герконовый выключатель будет срабатывать, когда она будет двигаться. Наш пищащий динамик привлекает внимание, если нужно что-то сделать, например, закрыть дверь. Мой динамик сломался, поэтому у меня есть только старые наушники.

И, как всегда, на заметку. Не следует воспринимать эту статью как последнее слово истины. Мои первые попытки во многих вещах, вероятно, можно улучшить.

Добавляем основной код

Пришло время оживить наше приложение. Можно посмотреть документ MainActivity.java (src * ru.amperka.arduinobtled). Его начальный код выглядит следующим образом:

MainActivityAutogen.java
packageru.amperka.arduinobtled;
 
importandroid.os.Bundle;importandroid.app.Activity;importandroid.view.Menu;
 
publicclass MainActivity extends Activity {
 
        @Override
	protectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);}
 
	@Override
	publicboolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);returntrue;}
 
}

Давайте дополним код в соответствии с нашими потребностями:

  1. Мы включим Bluetooth, если он отключен.
  2. Мы будем обрабатывать нажатия кнопок
  3. Мы будем отправлять информацию о том, какая кнопка была нажата.

На Arduino будет отправлен байт с двухзначным номером. Число представляет собой номер вывода, к которому подключен тот или иной светодиод, а вторая цифра указывает на состояние светодиода: 1 – включен, 0 – выключен.

Число-команда, рассчитывается очень просто:
Если нажата красная кнопка, то берется число 60 (для красного светодиода мы выбрали 6-й пин Arduino) и к нему прибавляется 1 или 0 в зависимости от того, должен ли сейчас гореть светодиод или нет. Для зеленой кнопки всё аналогично, только вместо 60 берется 70 (поскольку зеленый светодиод подключен к 7 пину).
В итоге, в нашем случае, возможны 4 команды: 60, 61, 70, 71.

Внедрите все это в коде.

MainActivity.java
packageru.amperka.arduinobtled;
 
importjava.io.IOException;importjava.io.OutputStream;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;
 
importandroid.app.Activity;importandroid.bluetooth.BluetoothAdapter;importandroid.bluetooth.BluetoothDevice;importandroid.bluetooth.BluetoothSocket;importandroid.content.Intent;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Toast;importandroid.widget.ToggleButton;
 
publicclass MainActivity extends Activity implementsView.OnClickListener{
 
    //Экземпляры классов наших кнопок
    ToggleButton redButton;
    ToggleButton greenButton;
 
    //Сокет, с помощью которого мы будем отправлять данные на Arduino
    BluetoothSocket clientSocket;
 
    //Эта функция запускается автоматически при запуске приложения
    @Override
    protectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //"Соединям" вид кнопки в окне приложения с реализацией
        redButton =(ToggleButton) findViewById(R.id.toggleRedLed);
        greenButton =(ToggleButton) findViewById(R.id.toggleGreenLed);
 
        //Добавлем "слушатель нажатий" к кнопке
        redButton.setOnClickListener(this);
        greenButton.setOnClickListener(this);
 
        //Включаем bluetooth. Если он уже включен, то ничего не произойдетString enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE;
        startActivityForResult(new Intent(enableBT), );
 
        //Мы хотим использовать тот bluetooth-адаптер, который задается по умолчанию
        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
 
        //Пытаемся проделать эти действияtry{//Устройство с данным адресом - наш Bluetooth Bee//Адрес опредеяется следующим образом: установите соединение//между ПК и модулем (пин: 1234), а затем посмотрите в настройках//соединения адрес модуля. Скорее всего он будет аналогичным.
            BluetoothDevice device = bluetooth.getRemoteDevice("00:13:02:01:00:09"); 
 
            //Инициируем соединение с устройствомMethod m = device.getClass().getMethod("createRfcommSocket", newClass[]{int.class});
 
            clientSocket =(BluetoothSocket) m.invoke(device, 1);
            clientSocket.connect();
 
            //В случае появления любых ошибок, выводим в лог сообщение}catch(IOException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(SecurityException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(NoSuchMethodException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(IllegalArgumentException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(IllegalAccessException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(InvocationTargetException e){
            Log.d("BLUETOOTH", e.getMessage());}
 
        //Выводим сообщение об успешном подключении
        Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show();
 
    }
 
    @Override
    publicboolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);returntrue;}
 
 
    //Как раз эта функция и будет вызываться 
 
    @Override
    publicvoid onClick(View v){
 
        //Пытаемся послать данныеtry{//Получаем выходной поток для передачи данныхOutputStream outStream = clientSocket.getOutputStream();
 
            int value =;
 
            //В зависимости от того, какая кнопка была нажата, //изменяем данные для посылкиif(v == redButton){
                value =(redButton.isChecked()?1:)60;}elseif(v == greenButton){
                value =(greenButton.isChecked()?1:)70;}
 
            //Пишем данные в выходной поток
            outStream.write(value);
 
        }catch(IOException e){//Если есть ошибки, выводим их в лог
            Log.d("BLUETOOTH", e.getMessage());}}}

2 Параметры соединения

Параметры, определяющие связь:

  • Интервал подключенияИнтервал подключения может принимать значения от 7,5 мс до 4,0 секунд с шагом 1,25 мс. Центральный блок может принимать во внимание предпочтительные параметры подключения периферийных устройств (PPCP). Блок ЦПУ имеет право принимать, изменять или отклонять их. Настройка Slave Latency позволяет периферийному устройству оставлять без ответа определенное количество событий соединения и не прослушивать CPU во время этих событий, не прерывая соединение. Это позволяет периферийному устройству переходить в режим энергосбережения на длительный период времени. Например, если установлена задержка 3, периферийное устройство может пропустить три последовательных события вызова, но затем должно выйти из режима энергосбережения, прослушать ЦП и ответить на следующее событие вызова. Время наблюдения Время наблюдения используется для обнаружения потери соединения. Он определяется как максимальное время между двумя полученными пакетами данных, после которого соединение считается потерянным. Он может быть установлен в диапазоне от 100 мс до 32 секунд с шагом 10 мс. Другое условие выглядит следующим образом: время часов > (1 задержка ведомого) * интервал соединения * 2 Есть одно исключение, когда время часов не применяется – когда соединение установлено, но еще не установлено. В этом случае ведущий решит потерять соединение, если он не получит пакет от ведомого в течение 6 интервалов соединения.
  • Data Length Extension (DLE) Это опция, которая позволяет пакетам данных содержать больше байт (до 251 байта, когда эта опция отключена, полезная нагрузка составляет 27 байт). Эта функция была введена в версии 4.2 спецификации Bluetooth.
  • Maximum Transmission Unit (MTU) Термин Maximum Transmission Unit используется в компьютерных сетях и определяет максимальный размер данных, которые могут быть переданы с помощью определенного протокола. Максимальная единица передачи атрибутов (в спецификации обозначается как ATT_MTU) – это наибольший размер полезной нагрузки атрибута, который может быть передан между клиентом и сервером. Эффективный размер ATT_MTU определяется минимальным значением максимального ATT_MTU, поддерживаемого ведущим и ведомым устройствами. Например, если ведущее устройство поддерживает ATT_MTU 100 байт, а ведомое устройство сообщает, что поддерживает ATT_MTU 150 байт, ведущее устройство решает, что для данного соединения следует использовать ATT_MTU 100 байт.Примечание: Для достижения максимальной пропускной способности убедитесь, что включено увеличение длины передачи (если вы используете Bluetooth 4.2 или более позднюю версию). Это позволит сократить избыточные служебные данные, такие как заголовки пакетов, за счет уменьшения количества отправляемых пакетов.
Смотрите про коптеры:  Как включить Bluetooth на компьютере: все версии Windows и MacOS

1 Протокол атрибутов (ATT)

В соответствии с ATT определяется, как данные представляются клиентам и как данные структурируются сервером. ATT берет на себя две роли:

  • Сервер: это сущность, которая предоставляет данные, которые он содержит или контролирует, а в некоторых случаях и другие аспекты поведения сервера, которые могут контролировать другие сущности. Это устройство, которое принимает входящие команды от связанного с ним устройства и отправляет ответы, сообщения и указания. Например, беспроводной термометр будет вести себя как сервер, предоставляя температуру окружающей среды, единицу измерения, уровень заряда и, возможно, интервалы, через которые термометр проводит измерения и записывает результаты. Он также может уведомлять клиента (как объясняется позже) об изменениях температуры, так что клиенту не нужно ждать, пока данные будут готовы к отправке.
  • Клиент: устройство, которое взаимодействует с сервером для чтения данных, предоставляемых сервером, и/или управления его поведением. Это устройство, которое отправляет команды и запросы и принимает входящие уведомления и указания. В приведенном выше примере мобильный телефон, подключенный к беспроводному термометру и считывающий показания температуры, выступал в роли клиента. Данные, предоставляемые сервером, группируются в атрибуты. Атрибут – это общий термин для любого типа данных, предоставляемых сервером, он определяет структуру этих данных. Например, услуги и функции (которые будут описаны позже) являются атрибутами. Состав атрибута показан ниже:
  • Тип атрибута (универсальный уникальный идентификатор, UUID) Это 16-битное число (для стандартных атрибутов Bluetooth SIG) или 128-битное число (для UUID, специфичных для производителя). Например, UUID атрибута значения температуры, одобренного консорциумом, равен 0x2A1C. Одобренные консорциумом типы атрибутов имеют общий специальный 128-битный UUID (за исключением 16-битного UUID): 0000XXXXXX-0000-1000-8000-00805F9B9B34FT 16-битный UUID заменит символы XXXX в базовом UUID. Например, разработчик может создать свой собственный UUID для показаний температуры, например:F5A1287E-227D-4C9E-AD2C-11D0FD6ED640Преимуществом использования стандартных UUID является уменьшение размера пакета, поскольку UUID может быть передан как 16-битное число вместо полного 128-битного числа.
  • Дескриптор атрибутаЭто 16-битное число, которое сервер присваивает каждому из своих атрибутов. Этот номер используется клиентом как ссылка на определенный атрибут, а сервер гарантирует, что эта ссылка будет уникальной для атрибута, которому она присвоена, на протяжении всего соединения между устройствами. Дескриптор может иметь любое значение в диапазоне 0x0001-0xFFFFFF, значение 0x0000 зарезервировано.
  • Права атрибутаПрава определяют, может ли атрибут быть прочитан или записан, может ли он посылать уведомления или указания, и какие уровни доступа требуются для каждой из этих операций. Эти права не определены протоколом атрибутов (ATT) и не могут быть прочитаны через него, они определяются на более высоком уровне (GATT или уровень приложения).

3.2 Характеристики

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

  • Свойства: представлены набором битов, которые определяют, как может быть использовано значение признака. Примеры свойств: чтение, запись, запись без ответа, уведомление, указание.
  • Дескрипторы: используются для хранения информации о значении признака. Примеры использования: расширенные свойства, пользовательское описание, поля, используемые для подписки на уведомления и подсказки, поля, описывающие представление характеристики, такие как формат или единица измерения.

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

К API можно обращаться, не понимая, что результатом вызова будет запись 0x0001 в дескриптор конфигурации характеристик клиента (CCCD).

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

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

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

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

Списки утвержденных услуг и их спецификации можно найти здесь. Спецификации, одобренные FDA, можно посмотреть по этому адресу.

Аппаратные спецификации

Несмотря на то, что ThinkPad X1 Fold готов к серийному производству, Lenovo, как и прежде, не раскрывает основные возможности своего электронного компонента. Нет ни оперативной памяти, ни встроенного накопителя, не известна также производительность центрального процессора. На данный момент Lenovo уточнила, что больше не будет использовать чипы производства AMD, а предпочтение будет отдано продукции Intel.

«Каких Марин?» или управляем контроллером через bluetooth с помощью мобильного приложения на Xamarin (Android) / Хабр
Экран новинки Lenovo может сгибаться практически под любым углом

Также стали известны параметры главного компонента ThinkPad X1 Fold – его экрана. LG Display изготовила панель pOLED для Lenovo с разрешением 2048×1536 точек и соотношением сторон 4:3. По словам производителя, дисплей прошел несколько тестов на прочность.

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

Основные особенности Lenovo ThinkPad X1 Fold

Несмотря на то, что шарнир обеспечивает плотное прилегание половинок дисплея в закрытом положении, смартфон Samsung Galaxy Fold также пострадал от этой проблемы. Из-за негерметичности в шарнир этого устройства может попасть пыль и даже крупные частицы грязи, что приведет к его поломке и риску повреждения дисплея.

Возможна ли истинная персонализация коммуникации на рынке B2B?

Деятельность.

ThinkPad X1 Fold весит около 1 кг, оснащен динамиками Dolby Audio и будет предлагать опциональный модем 5G для доступа к мобильным сетям пятого поколения. Производитель модемов пока не объявлен – напомним, что Intel продала часть своего модемного бизнеса компании Apple летом 2021 года, хотя позже Intel признала, что сделка не принесла им выгоды.

Заготовка

Разработка для ОС Android ведется в среде разработки ADT, Android Development Tools. Которую можно скачать с портала Google для разработчиков.
После скачивания и установке ADT, смело его запускаем. Однако, еще рано приступать к разработке приложения. Надо еще скачать Android SDK нужной версии. Для этого необходимо открыть Android SDK Manager «Window → Android SDK Manager». В списке необходимо выбрать нужный нам SDK, в нашем случае Android 2.3.3 (API 10). Если телефона нет, то выбирайте 2.3.3 или выше; а если есть — версию, совпадающую с версией ОС телефона. Затем нажимаем на кнопку «Install Packages», чтобы запустить процесс установки.

«Каких Марин?» или управляем контроллером через bluetooth с помощью мобильного приложения на Xamarin (Android) / Хабр

После загрузки и установки приложения приступаем к его разработке. Выберите “Файл → Новый → Проект приложения Android”. Вам нужно заполнить окно так, как показано на рисунке.

«Каких Марин?» или управляем контроллером через bluetooth с помощью мобильного приложения на Xamarin (Android) / Хабр

В выпадающих списках «Minimum Required SDK», «Target SDK», «Compile With» выбираем ту версию, которую мы скачали ранее.
Более новые версии SDK поддерживают графические темы для приложений, а старые нет. Поэтому в поле «Theme» выбираем «None».
Нажимаем «Next».

Снимите флажок “Create a custom launcher icon”: в этой статье мы не будем рассматривать создание значка приложения. Нажмите “Next” (Далее).

В зависимости от появившегося окна вы можете выбрать вид “Деятельность”: вид того, что появится на экране при запуске приложения. Вам будет предложено начать с “пустой активности”. Нажмите на кнопку “Далее”.

В нашем приложении будет только одна Activity, поэтому вам не нужно будет вносить никаких изменений в появившееся окно. Поэтому мы просто нажмем кнопку “Finish”.

Вот и всё, наше приложение создано.

Настройка bluetooth low energy модуля

Начнем с настройки модуля Bluetooth; если вы знаете, что делаете, это не займет много времени. Так получилось, что у меня в руках оказался модуль

CC41-A

На интегральной схеме.

Техасские инструменты CC2541

Который в “соседнем магазине” обошелся мне в 340 рублей. В связи с этим я подробно остановлюсь на его конфигурации, но суть модуля одинакова для всех модулей на базе этого чипа.

Распиновка BLE модуля на примере HM-10, кликабельно

Если у вас есть преобразователь USB-TTL, просто подключите к нему модуль BLE, и вы получите прямой доступ к модулю с компьютера через COM-порт. Посмотрите описание вашего модуля, возможно, он работает с логикой 3,3 В, поэтому на линиях TX-RX и RX-TX вам придется использовать диммер уровня логического сигнала (диммер уровня напряжения, на вкус и цвет EasyElectronics). Модуль CC41-A, хотя на нем и написано “LEVEL:3.3V”, прекрасно справляется с 5В логикой.

Подключение BLE модуля к USB-TTL конвертеру, кликабельно

В качестве альтернативы конвертеру, вы можете использовать ваш контроллер для реализации простого последовательного моста: что бы вы ни отправили на один последовательный порт, он будет отправлять на другой, и наоборот. Вы должны использовать библиотеку SoftwareSerial для Arduino Uno:

Смотрите про коптеры:  Управление чужим телефоном через блютуз. Управление компьютером через андроид

Подключение BLE модуля к Arduino Uno, кликабельно

Запустите программу терминала (можно использовать Serial Monitor из Arduino IDE, я предпочитаю Bray’s Terminal) и подключитесь к COM-порту, где модуль BLE блокируется со стандартной конфигурацией:

Отправка данных

Отправка данных на устройство осуществляется путем записи значения в характеристику, а более конкретно – вызовом функции

Записать значение()

Свойства объекта от

ArrayBuffer

В качестве аргумента. Чтобы преобразовать строку в

Буфорские таблетки

Он самый простой в использовании

Кодировщик текста

// Отправить данные подключенному устройству
function send(data) {
  data = String(data);

  if (!data || !characteristicCache) {
    return;
  }

  writeToCharacteristic(characteristicCache, data);
  log(data, 'out');
}

// Записать значение в характеристику
function writeToCharacteristic(characteristic, data) {
  characteristic.writeValue(new TextEncoder().encode(data));
}


На всякий случай приводим данные к строковому типу, используя глобальный объект

String

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

// Отправить данные подключенному устройству
function send(data) {
  data = String(data);

  if (!data || !characteristicCache) {
    return;
  }

  data  = 'n';

  if (data.length > 20) {
    let chunks = data.match(/(.|[rn]){1,20}/g);

    writeToCharacteristic(characteristicCache, chunks[0]);

    for (let i = 1; i < chunks.length; i  ) {
      setTimeout(() => {
        writeToCharacteristic(characteristicCache, chunks[i]);
      }, i * 100);
    }
  }
  else {
    writeToCharacteristic(characteristicCache, data);
  }

  log(data, 'out');
}

Добавление символа перевода строки на стороне контроллера улучшает обработку сообщения

n

Затем сообщение разбивается на фрагменты с помощью регулярного выражения, которое правильно обрабатывает символы возврата каретки (CR, r) и перевода строки (LF, n), после чего первый фрагмент отправляется немедленно, а таймеры устанавливаются для отправки остальных с периодом кратности 100 миллисекунд.

Обмен данными между терминалом и браузером, на которые можно нажать.

Работает! Теперь наша двусторонняя связь с устройством полностью функционирует, и JS завершен.

Подключение и настройка. шаг за шагом.

Подключение hc-05 к scron-mini


Подключается HC-05 к scron-mini по стандартной схеме:

Таймер scron-mini будет питать HC-05. При включении таймера scron-mini HC-05 уже готов к работе без каких-либо дополнительных настроек. При подаче питания на scron-mini мигает красный светодиод. Стандартные параметры порта для подключения к UART – 9600/8-N-1. Для начала работы необходимо установить и запустить Bluetooth-терминал на мобильном устройстве (например, ” “).

“).


В Bluetooth Terminal в меню выбираем Connect a device – Secure.
scron-mini-hc-05-step2.png
В списке доступных устройств выбрать устройство HC-05, пароль для сопряжения по-умолчанию 1234 (пароль и наименование в HC-05 можно изменить при помощи AT-команд, об этом много написано, не будем повторяться).  
scron-mini-hc-05-step3.png
В настройках терминала надо поставить галочку чтобы к каждой строке добавлялись символы перевода каретки и новой строки.  Теперь, у нас всё готово чтобы по bluetooth выполнять команды на таймере scron-mini. 
scron-mini-hc-05-step4.png

Примеры выполнения команд.

Например, отправим команду на включение канала 3 на 10 минут “ON 3 T=600”.  
scron-mini-hc-05-step5.pngЗатем можем посмотреть состояние всех каналов командой “STATUS”.  
scron-mini-hc-05-step6.png

Подключение к устройству

Полный алгоритм соединения состоит из нескольких этапов:

  1. Запрос устройства Bluetooth: браузер запускает диалог для поиска и выбора ближайшего устройства, пользователь делает выбор, код приложения получает объект
  2. Подключение к устройству из кода приложения:
  3. Соединение с сервером общего профиля атрибутов (GATT-сервер), получение запрашиваемой услуги, получение запрашиваемого атрибута.
  4. Подключение к серверу общих профилей атрибутов (GATT Server),
  5. Получение запрашиваемой услуги,
  6. Получение запрашиваемого атрибута.

Формализуйте это в коде:

// Кэш объекта выбранного устройства
let deviceCache = null;

// Запустить выбор Bluetooth устройства и подключиться к выбранному
function connect() {
  return (deviceCache ? Promise.resolve(deviceCache) :
      requestBluetoothDevice()).
      then(device => connectDeviceAndCacheCharacteristic(device)).
      then(characteristic => startNotifications(characteristic)).
      catch(error => log(error));
}

// Запрос выбора Bluetooth устройства
function requestBluetoothDevice() {
  //
}

// Подключение к определенному устройству, получение сервиса и характеристики
function connectDeviceAndCacheCharacteristic(device) {
  //
}

// Включение получения уведомлений об изменении характеристики
function startNotifications(characteristic) {
  //
}

// Вывод в терминал
function log(data, type = '') {
  //
}

Мы реализовали функцию

Подключиться ()

Эта цепочка объектов Promise соответствует шагам подключения.

Мы также ввели переменную deviceCache, в которой мы будем хранить объект устройства, выбранного пользователем, чтобы в случае необходимости мы могли повторно подключиться к нему.

Как только тернарный оператор появляется в теле connect(), он создает Promise с объектом deviceCache, если он ненулевой, иначе он вызывает функцию запроса выбора Bluetooth-устройства.

Если на каком-либо этапе возникает ошибка, мы отправляем ее на терминал с помощью функции log(), которую также реализуем позже.

Получение данных

Можно получать данные от устройства асинхронно, используя механизм уведомлений, возникающий при изменении значения характеристики BLE. Нам нужно только подписаться на соответствующие события

Изменённое значение атрибута

Функции. После включения уведомлений необходимо включить эту характеристику. Кроме того, удалите обработчик из характеристики при выключении устройства:

// Включение получения уведомлений об изменении характеристики
function startNotifications(characteristic) {
  log('Starting notifications...');

  return characteristic.startNotifications().
      then(() => {
        log('Notifications started');
        // Добавленная строка
        characteristic.addEventListener('characteristicvaluechanged',
            handleCharacteristicValueChanged);
      });
}

// Отключиться от подключенного устройства
function disconnect() {
  if (deviceCache) {
    log('Disconnecting from "'   deviceCache.name   '" bluetooth device...');
    deviceCache.removeEventListener('gattserverdisconnected',
        handleDisconnection);

    if (deviceCache.gatt.connected) {
      deviceCache.gatt.disconnect();
      log('"'   deviceCache.name   '" bluetooth device disconnected');
    }
    else {
      log('"'   deviceCache.name  
          '" bluetooth device is already disconnected');
    }
  }

  // Добавленное условие
  if (characteristicCache) {
    characteristicCache.removeEventListener('characteristicvaluechanged',
        handleCharacteristicValueChanged);
    characteristicCache = null;
  }

  deviceCache = null;
}

// Получение данных
function handleCharacteristicValueChanged(event) {
  let value = new TextDecoder().decode(event.target.value);
  log(value, 'in');
}

event.target.value

– это объект…

Который содержит

Сообщение с вашего устройства отобразится в окне сообщений. Использование веб-сайта

TextDecoder

На втором этапе мы преобразуем массив байт в текст.

Отправка данных с терминала и получение в браузере кликабельного

С символами CR, LF или без них устройство принимает сообщения стабильно. Длинное сообщение принимается полностью, но разбивается на кратные 20 байтам части.

Соединение двух и более блоков ev3

USB-соединение.

Кирпичи LEGO Mindstorms EV3 можно подключить к компьютеру или другим кирпичам EV3 через USB-соединение. В этом случае скорость и стабильность соединения лучше, чем у других методов, включая Bluetooth.

L EGO Mindstorms EV3 имеет два порта USB.

В режиме петли осуществляется связь между LEGO EV3 и другими устройствами LEGO EV3.

1

Когда устройства LEGO EV3 подключены в режиме последовательной цепи, они будут функционировать как одно устройство.

Этот способ

  • Предназначен для подключения более одного LEGO Mindstorms EV3;
  • Используется для подключения большего количества датчиков, двигателей и других устройств;
  • Позволяет осуществлять связь между несколькими LEGO Mindstorms EV3 (до 4), что дает нам до 16 внешних портов и столько же внутренних;
  • Дает возможность управлять всей цепочкой с основного LEGO Mindstorms EV3;
  • Не может работать при активном Wi-Fi или Bluetooth соединении.

Чтобы активировать режим последовательной цепи, перейдите в окно конфигурации проекта и установите соответствующий флажок.

2

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

   

Ниже представлена таблица вариантов использования блоков EV3:

Подключение через Bluetooth

L EGO Mindstorms EV3 можно подключить к ПК, другому LEGO Mindstorms EV3, смартфонам и другим устройствам Bluetooth через Bluetooth. Радиус действия Bluetooth-соединения составляет до 25 м.

E V3 LEGO Mindstorms может использоваться 7 блоками одновременно. Вы можете отправлять сообщения каждому подчиненному EV3 с главного блока EV3. Только главный блок EV3 может отправлять сообщения подчиненным, но не наоборот.

Последовательность подключения EV3 к Bluetooth

Следующие шаги помогут вам подключить два или более устройства EV3 через Bluetooth:

1. откройте вкладку “Конфигурация”.

5

Нажмите кнопку Bluetooth и выберите его.

  

Установите флажок в поле “Видимость Bluetooth”.

7

4. Убедитесь, что слева вверху виден знак Bluetooth (“<").

5. Описанную выше процедуру необходимо повторить для желаемого количества блоков EV3.

6. Перейдите на вкладку “Подключение”.

  

7. Нажмите кнопку Поиск:

10

8. Нажимая центральную кнопку на EV3, выберите EV3, который вы хотите подключить (или к которому вы хотите подключиться).

 

9. С помощью ключа доступа соедините один и второй блок.

  

Если все сделано правильно, в левом верхнем углу появится символ “<>“, как и при подключении других устройств EV3, если их более двух.

Соединение будет потеряно, если вы выключите LEGO EV3, и вам придется повторить все действия.

У каждого блока должна быть программа.

Пример одной из программ:

16

E V3 блок 1: При нажатии сенсорного датчика блок EV3 передает текст на главный блок 2 с задержкой в 3 секунды.

Пример программы блока 2

17

Получив текст от первого блока, второй блок выводит слово (в нашем примере слово “Hello”) на 10 секунд.

18

Подключение по сети Wi-Fi.

Wi-Fi донгл может быть подключен к USB-порту EV3 для обеспечения связи на более дальнем расстоянии.

Установка специального модуля на устройство EV3, использование USB-разъема (беспроводной адаптер Netgear N150 (WNA1100) и подключение Wi-Fi донгла позволит подключить Wi-Fi.

Ответственный за информацию: методист ГМЦ ДОгМ Солуянов Евгений Александрович, e-mail: soluyanovea@radiocopter.ru, тел. 8 (495) 912-32-61, доб. 108.

Соединяем ev3 и arduino по bluetooth

В наших предыдущих проектах, таких как “EV3 Bluetooth Guitar” и “Electric Violin from LEGO EV3”, мы использовали Bluetooth для передачи данных с EV3 на Arduino.

 

Наша команда долго ждала, когда кто-нибудь разработает инструмент для взаимодействия Arduino с EV3, но так и не дождалась, поэтому мы разработали инструмент сами. Мы надеемся, что он будет полезен для сообщества Mindstorms и для ваших проектов.

Смотрите про коптеры:  Как сделать гусеницы для Т-80 в масштабе 1/72 : Техники и секреты : Статьи

Описание протокола Bluetooth есть в исходном коде EV3, который является открытым. В целом, оно хорошо прокомментировано и понятно. Через именованные почтовые слоты EV3 может отправлять и получать три типа данных – числа, текст и логику.

Отправив букву “t” в удаленный слот под названием text, вы получите по Bluetooth последовательные значения 11000100819E05746578740005007465787400, а отправив число -3,14 в слот под названием Numeric, вы получите последовательные значения 13000100819E084E756D6572696963000400C3F548C0. Не очень понятно, не так ли?

Чтобы уменьшить необходимость вводить длинные строки цифр, мы публикуем ряд функций Arduino для связи с EV3. Вместо того чтобы создавать библиотеку, мы написали их в общем виде для наших собственных нужд.

Первый шаг – “сопряжение” вашего EV3 с модулем Bluetooth, подключенным к Arduino, и определение имени модуля на стороне Arduino. Он не будет знать, что общается не с самим собой, а с кучей микросхем и проводов, выдавая себя за другой EV3. Поскольку для связи с Arduino можно использовать любой язык программирования платформы EV3, поддерживающий Bluetooth, независимо от того, используете ли вы EV3-G, EV3 Basic или RobotC, это идеальный вариант.

Например, в EV3-G код, который будет отправлять данные на Arduino, будет выглядеть так:

Важно указать тип получаемых данных и название почтового слота.

Вы можете использовать функцию AskForEV3Message() для получения данных от EV3 в вашей программе, как это сделано ниже:

AskForEV3Message();

if (in_message_type != 0) Serial.println(in_mailbox);

if (in_message_type == 1) Serial.println(in_value_logic);

if (in_message_type == 2) Serial.println(in_value_numeric);

if (in_message_type == 3) Serial.println(in_value_chars);

Теперь мы отправим данные на удаленный EV3 из вашего кода Arduino. Отправьте данные соответствующих типов с помощью трех функций MakeLogicEV3Message, MakeNumericEV3Message и MakeTextEV3Message, например:

// отправить истину в слот EV3 TestLogic

MakeLogicEV3Message(“TestLogic”, true);

// отправляем случайное число от 0 до 100 в EV3 слот MyNumeric

MakeNumericEV3Message(“MyNumeric”, (int)random(100));

// отправьте строку “example_text” в слот EV3 EV3Text

MakeTextEV3Message(“EV3Text”, “text_example”);

Пожалуйста, согласитесь открыть код ваших будущих проектов так же, как мы делаем это для вас. Удачи!

Управляем компьютером на виндовс 10 при помощи телефона

Давайте начнем с основ. Все просто: достаточно провести пальцем по черному экрану приложения, и курсор мыши будет перемещаться соответствующим образом. Если вы касаетесь экрана одним пальцем, это соответствует нажатию левой кнопки мыши, а если двумя пальцами – правой.

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

В верхнем меню находятся дополнительные опции. Выберите синий круг, чтобы вызвать “Cortana” для получения помощи. При нажатии на эту функцию в Windows 10 откроется поисковая система, если этот помощник недоступен. Кроме того, откроется клавиатура, которая позволяет очень быстро найти и запустить любой пункт в меню “Пуск”.

При выборе следующего значка будут показаны все открытые окна. Работа с несколькими окнами в Windows 10 станет намного проще благодаря этой функции.

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

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

Значки панели управления имеют символ “S”, который обозначает жесты. Новый жест можно добавить с помощью функции “Новый жест”.

Затем этот жест может быть связан с определенным действием, например, запуском приложения Spotify на компьютере. Это можно сделать, создав жест “S”, а затем перейдя на вкладку “Управление жестами”.

Выберите вкладку “Пользовательские жесты” в окне настроек с помощью значка шестеренки в окне контроллера. Для редактирования жеста нажмите на только что созданный жест в программе (раздел “Управление жестами”).

Выбор жестов указан в разделе “Выбранный жест” в настройках утилиты Controller. В меню “Выбрать действие” можно назначить любое действие, например, переключение песен. Мы просто указываем желаемое действие и далее определяем его. Выбор пункта “Запустить приложение” позволяет выбрать, какую программу запустить.

Читать Тачпад не работает на моем ноутбуке

Часть ii: подключение схемы и программа для canny 3 tiny

Прежде всего, чтобы никого не обидеть в плане авторских прав, уточню, что идею подключения контроллера к HC-06, управления им через приложение “Serial bluetooth terminal” и некоторые приемы в разработке схемы я позаимствовал из

Хотя я, конечно, адаптировал их к своей задаче.

Схема электрооборудования выглядит следующим образом:

Контакторы и герконы подключены к контактам 6 и 5 на контроллере, наушники к контакту 4 (HF PWM), UART RX и TX подключены к контактам 1 и 2, контакт 3 подает “5V”, а “-” используется для связи с землей.

Вот как он выглядит в собранном состоянии:

В других версиях среды разработки и с рядом других контроллеров может потребоваться внести изменения в схему (программу) для CANNY 3 tiny.

Вот что случилось:

Ранее мы обсудили, как настроить контроллер и отправлять сообщения через UART.

Давайте более подробно рассмотрим два других.

При получении сообщения по UART включится сирена (наушники). В принципе, необходимо разобрать пример, получающий сообщение по UART.

На первом этапе мы проверяем, были ли получены данные от UART, если да, то подаем их на вход “E” D-триггера, в этом случае триггер копирует значение со входа “D”, в который мы запишем первые два символа сообщения, полученного от UART. Поскольку моей целью было не усложнять, я выбрал простую схему.

Предположим, что каждое число от 00 до 99 будет приходить к нам через UART, преобразуем это число из символьной формы в цифровую (рекомендую почитать, как работает блок конвертера, у меня с ним была заминка). Далее, любое значение “>0” на входе детектора нарастающего фронта вызывает единичный сигнал, который активирует на 5 секунд выход №4, представляющий собой высокочастотный ШИМ.

С помощью настроек можно регулировать период заполнения ШИМ ВЧ, в зависимости от того, как звучат наушники.

Переходим к “Формированию сообщений”. На первый взгляд, его реализация может показаться необычной. Ввиду того, что я не до конца понимаю, как работать с программой Serial bluetooth terminal и с аналогичным bluetooth протоколом в Xamarin, это неудивительно.

Как я уже упоминал, я еще не научился получать сообщения от контроллера на смартфон. В отличие от проводного UART в прошлой статье, Bluetooth работает по-другому, вместо отправки сообщения он способен прочитать только его часть, тем самым искажая смысл сообщения.

В результате я решил, что самый простой способ отправить сообщение – это отправить один номер, который гарантированно дойдет до получателя без потерь.

С помощью нашего датчика мы контролируем дискретное состояние концевого выключателя и геркона. У нас есть четыре возможных комбинации: геркон и концевой выключатель выключены, включен только один из них, оба включены.

Поскольку геркон и концевой выключатель дают дискретный сигнал (0/1), необходимо каким-то образом их различать. Это делается путем умножения сигнала герконового переключателя на 2. Получается, что сумма сигналов дает нам значения от 0 до 3.

Прибавив к этому значению пятьдесят, мы получаем не совсем очевидный вариант. Что касается проблемы, CannyLab посылает в UART пару символов, то есть вместо 3, допустим, 03, но при этом можно потерять часть информации. В качестве примера, если присутствует значение 01, программа смартфона может прочитать только первый “0”, что будет означать ошибку.

Я упростил задачу, преобразовав данные с помощью буквы или пробела вместо замены символа “D1”. Я преобразовал значение 01 в 51 (02 в 52 и т.д.). В “пятерке” нет сигнала, и я обрезал его на уровне программы смартфона. Таким образом, мы всегда уверены, что доберемся до важного содержания сообщения.

В контроллере загрузите программу, нажмите “run”, и HC-06 должен начать периодически моргать красным светодиодом.

https://www.youtube.com/watch?v=L_WAfUeQZro

Далее сопрягаем мобильное устройство с адаптером. Если вы используете приложение типа “Serial Bluetooth terminal” или любое другое с аналогичной функциональностью, вы можете проверить работоспособность.

Обратите внимание на адрес Bluetooth-адаптера, он понадобится нам в следующей главе.

Если вы отправите “11”, то услышите неприятный писк в наушниках. Данные поступают от датчиков, в зависимости от состояния. Следующим шагом будет набросок примитивного приложения.

Оцените статью
Радиокоптер.ру
Добавить комментарий

Adblock
detector