Как добавить bluetooth в потолочный вентилятор

Как добавить bluetooth в потолочный вентилятор
Как добавить bluetooth в потолочный вентилятор
Anonim

Как добавить Bluetooth в потолочный вентилятор

Как добавить возможности BLE к беспроводному потолочному вентилятору, включив в пульте дистанционного управления nRF51.

обзор

Это часть серии статей о nRF51. NRF51 - это система на кристалле с Cortex M0 и радиочипом BLE, все в одном. В этой статье описывается мой опыт использования специальной периферийной службы для добавления возможностей BLE к беспроводному потолочному вентилятору.

Предыдущие статьи:

BLE с использованием nRF51: среда сборки ARM-GCC

Требования

  • Устройство, которое имеет nRF51

    Используется в статье: nRF-Dongle

  • Мобильное приложение основано на учебнике.

    Используется в статье: Android v5.1.1

  • Беспроводной пульт дистанционного управления
  • NMOS-транзисторы
  • Провод малого калибра
  • Настройка инструментальной цепочки в предыдущей статье.

BLE в потолочном вентиле

Помещение этой статьи добавляет BLE к потолочному вентилятору, чтобы его можно было контролировать с помощью мобильного устройства. Есть несколько способов сделать это:

  1. Добавьте контроллер с поддержкой BLE на внутреннюю часть выпускной коробки. Это позволит вам включать и выключать вентилятор. Это потребует работы с электросети.
  2. Добавьте контроллер BLE внутри самого вентилятора и коснитесь монтажной платы в вентиляторе. Это потребовало бы большой работы, связанной с отключением вентилятора и изменением схемы. Напряжение также вероятно высокое.
  3. Измените потолочный вентилятор, который уже имеет возможности беспроводной связи. Обычно эти вентиляторы имеют своего рода пульт и работают с мгновенными переключателями. Вы можете имитировать эти мгновенные переключатели с транзисторами, подключенными к отдельному микроконтроллеру.

Эта статья будет посвящена третьему варианту.

Обратное проектирование удаленного

Удаленный мой потолочный вентилятор использовал Emerson. Я понятия не имею, откуда он пришел, потому что он пришел с домом. Я могу сказать, что он работает на частоте 300 МГц с этикетки, поэтому мне не придется беспокоиться о том, что это мешает BLE вообще. Он также работает примерно на 6V от батареек 4 AAA, которые я могу использовать для питания nRF51.

Image
Image
Image
Image

Я открыл устройство и нашел радио, несколько кнопок и какой-то микроконтроллер или кодировщик.

Image
Image
Image
Image

Кажется, что самый простой способ взломать схему - через кнопки. Я могу имитировать нажатия кнопок с помощью nRF51. Преимущество этого метода в том, что я все еще могу использовать обычные кнопки. Целью исследования схемы является выяснение того, как нажатия кнопок переводятся в команды, передаваемые по воздуху. Обычно кнопки просто тянут напряжение высоко или низко. Я следовал следам с земли и обнаружил, что все кнопки подключены к земле. Это хороший индикатор того, что кнопки при нажатии нажимают низкое напряжение. Я использовал мультиметр для измерения напряжения на трассе кнопки, которая питает микроконтроллер. Он был подключен к положительному напряжению питания, которое составляет около 6 В. Я не могу подключить это напрямую к nRF51, иначе он повредит его. Я должен использовать NMOS-транзисторы, чтобы снизить напряжение. Транзисторы должны иметь VGS на пороге, который ниже 1, 8 В, VDSmax, который выше 6 В, и что ток, протекающий через цепь кнопки, меньше, чем IDmax.

Изменение удаленного

Я спаял транзисторы и некоторые провода к цепи, так что слив был подключен к линиям MCU, источнику на землю и затвору к проводам. Затем я припаял провода к контактам GPIO nRF51. Для питания nRF51 мне нужно было немного понизить напряжение, так как встроенный регулятор может обрабатывать только 5, 5 В. Я использовал два регулярных диода в серии, что дало мне около 1 В капли. Это падение 1V не будет одинаковым во всех ситуациях, но оно дает достаточный запас ниже 5.5V, чтобы быть разумным. Вы могли бы также припаять какой-то другой регулятор на доске, если бы у вас был один. Диоды также предлагают защиту от обратной полярности для nRF51, если кто-то кладет батареи назад.

Image
Image
Image
Image

После программирования и тестирования я записал nRF51 для предотвращения коротких замыканий и поместил их в корпус. Он просто подходит к радио.

Image
Image

Изменение кода периферийного устройства BLE

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

Скачать код


#include "nrf_gpio.h" #define BUTTON_UP_PIN 15 #define BUTTON_DOWN_PIN 16 #define BUTTON_HIGH_PIN 17 #define BUTTON_MED_PIN 18 #define BUTTON_LOW_PIN 19 #define BUTTON_OFF_PIN 20 #define BUTTON_PRESS_TIME_MS 100 #define DEVICE_NAME "Den Fan" /**< Name of device. Will be included in the advertising data. */ #define APP_ADV_INTERVAL 1600 /**< The advertising interval (in units of 0.625 ms.)*/ #define APP_ADV_TIMEOUT_IN_SECONDS 0 /**< The advertising timeout in units of seconds. */

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


static void gpio_init(void) { nrf_gpio_cfg_output(BUTTON_UP_PIN); nrf_gpio_cfg_output(BUTTON_DOWN_PIN); nrf_gpio_cfg_output(BUTTON_HIGH_PIN); nrf_gpio_cfg_output(BUTTON_MED_PIN); nrf_gpio_cfg_output(BUTTON_LOW_PIN); nrf_gpio_cfg_output(BUTTON_OFF_PIN); nrf_gpio_pin_clear(BUTTON_UP_PIN); nrf_gpio_pin_clear(BUTTON_DOWN_PIN); nrf_gpio_pin_clear(BUTTON_HIGH_PIN); nrf_gpio_pin_clear(BUTTON_MED_PIN); nrf_gpio_pin_clear(BUTTON_LOW_PIN); nrf_gpio_pin_clear(BUTTON_OFF_PIN); }

Я изменил запись записи, чтобы переключать контакты только в том случае, если charcteristic соответствует настраиваемой периферии BLE.


case BLE_GATTS_EVT_WRITE: DEBUG_PRINTF("BLE_GATTS_EVT_WRITE"); for(i=0;i evt.gatts_evt.params.write.len;i+) DEBUG_PRINTF("Data %d: 0x%x", i, p_ble_evt->evt.gatts_evt.params.write.data(i)); if (p_ble_evt->evt.gatts_evt.params.write.handle == periph_handles.char1_handles.value_handle) { on_custom_ble_write(p_ble_evt); }

Затем мне пришлось написать новую функцию для переключения булавки при возникновении события записи BLE. Я установил его как общий, поэтому номер кнопки можно изменить в приложении для Android.


static void on_custom_ble_write(ble_evt_t * p_ble_evt) { DEBUG_PRINTF("on_custom_ble_write"); if(p_ble_evt->evt.gatts_evt.params.write.len>0) { if(p_ble_evt->evt.gatts_evt.params.write.data(0) >=0 &p_ble_evt->evt.gatts_evt.params.write.data(0) evt.gatts_evt.params.write.data(0), BUTTON_PRESS_TIME_MS); nrf_gpio_pin_set(p_ble_evt->evt.gatts_evt.params.write.data(0)); nrf_delay_ms(BUTTON_PRESS_TIME_MS); nrf_gpio_pin_clear(p_ble_evt->evt.gatts_evt.params.write.data(0)); } } }

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

Приложение Android основано на предыдущей статье. Я добавил несколько кнопок для каждой кнопки потолочного вентилятора.

Image
Image

У меня не было достаточно выходов, чтобы сделать кнопку REV, поэтому я оставил это. Затем мне пришлось добавить функции для каждой кнопки. Они аналогичны функции char_write от ранее, за исключением того, что на этот раз они пишут значение для нужного нажатия кнопки.


public void onClickUpLight(View v){ if(mBluetoothLeService != null) { mBluetoothLeService.writeCustomCharacteristic(15); } } public void onClickLowLight(View v){ if(mBluetoothLeService != null) { mBluetoothLeService.writeCustomCharacteristic(16); } } public void onClickHi(View v){ if(mBluetoothLeService != null) { mBluetoothLeService.writeCustomCharacteristic(17); } } public void onClickMed(View v){ if(mBluetoothLeService != null) { mBluetoothLeService.writeCustomCharacteristic(18); } } public void onClickLow(View v){ if(mBluetoothLeService != null) { mBluetoothLeService.writeCustomCharacteristic(19); } } public void onClickOff(View v){ if(mBluetoothLeService != null) { mBluetoothLeService.writeCustomCharacteristic(20); } }

Скачать код

Попытка

Что еще?

NRF51 может быть сопряжен с другими устройствами различными способами. Например, вы можете использовать его как датчик с АЦП или управлять другим устройством через I2C. Вы также можете управлять многими устройствами, такими как в этой статье, только с GPIO! Выйдите и попробуйте добавить BLE к чему-то в своем доме!

Попробуйте этот проект сами! Получить спецификацию.