Как добавить Bluetooth в потолочный вентилятор
Как добавить возможности BLE к беспроводному потолочному вентилятору, включив в пульте дистанционного управления nRF51.
обзор
Это часть серии статей о nRF51. NRF51 - это система на кристалле с Cortex M0 и радиочипом BLE, все в одном. В этой статье описывается мой опыт использования специальной периферийной службы для добавления возможностей BLE к беспроводному потолочному вентилятору.
Предыдущие статьи:
BLE с использованием nRF51: среда сборки ARM-GCC
Требования
- Устройство, которое имеет nRF51
Используется в статье: nRF-Dongle
- Мобильное приложение основано на учебнике.
Используется в статье: Android v5.1.1
- Беспроводной пульт дистанционного управления
- NMOS-транзисторы
- Провод малого калибра
- Настройка инструментальной цепочки в предыдущей статье.
BLE в потолочном вентиле
Помещение этой статьи добавляет BLE к потолочному вентилятору, чтобы его можно было контролировать с помощью мобильного устройства. Есть несколько способов сделать это:
- Добавьте контроллер с поддержкой BLE на внутреннюю часть выпускной коробки. Это позволит вам включать и выключать вентилятор. Это потребует работы с электросети.
- Добавьте контроллер BLE внутри самого вентилятора и коснитесь монтажной платы в вентиляторе. Это потребовало бы большой работы, связанной с отключением вентилятора и изменением схемы. Напряжение также вероятно высокое.
- Измените потолочный вентилятор, который уже имеет возможности беспроводной связи. Обычно эти вентиляторы имеют своего рода пульт и работают с мгновенными переключателями. Вы можете имитировать эти мгновенные переключатели с транзисторами, подключенными к отдельному микроконтроллеру.
Эта статья будет посвящена третьему варианту.
Обратное проектирование удаленного
Удаленный мой потолочный вентилятор использовал Emerson. Я понятия не имею, откуда он пришел, потому что он пришел с домом. Я могу сказать, что он работает на частоте 300 МГц с этикетки, поэтому мне не придется беспокоиться о том, что это мешает BLE вообще. Он также работает примерно на 6V от батареек 4 AAA, которые я могу использовать для питания nRF51.


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


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


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

Изменение кода периферийного устройства 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 основано на предыдущей статье. Я добавил несколько кнопок для каждой кнопки потолочного вентилятора.

У меня не было достаточно выходов, чтобы сделать кнопку 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 к чему-то в своем доме!
Попробуйте этот проект сами! Получить спецификацию.