6 возможных способов подключения телефона к магнитоле

6 возможных способов подключения телефона к магнитоле Лодки

Trema bluetooth модуль в роли ведомого (slave) принимает данные:

Связь осуществляется между двумя Trema Bluetooth модулями HC-05 использующими библиотеку iarduino_Bluetooth_HC05. Скетч модуля исполняющего роль master приведён в следующем примере.

#include <SoftwareSerial.h>                                                     // Подключаем библиотеку SoftwareSerial для общения с модулем по программной шине UART
#include <iarduino_Bluetooth_HC05.h>                                            // Подключаем библиотеку iarduino_Bluetooth_HC05 для работы с Trema Bluetooth модулем HC-05
SoftwareSerial          softSerial(2,3);                                        // Создаём объект softSerial указывая выводы RX, TX (можно указывать любые выводы Arduino UNO). Вывод 2 Arduino подключается к выводу TX модуля, вывод 3 Arduino подключается к выводу RX модуля
iarduino_Bluetooth_HC05 hc05(4);                                                // Создаём объект hc05 указывая любой вывод Arduino, который подключается к выводу K модуля
int                     myArray[3];                                             // Объявляем массив в который будем получать данные, можно создавать массивы или переменные любых типов в .т.ч и char
                                                                                //
void setup(){                                                                   //
                                             Serial.begin  (9600);              // Инициируем передачу данных по аппаратной шине UART для вывода результата в монитор последовательного порта
                                             Serial.print  ("begin: ");         // Выводим текст "begin: " в монитор последовательного порта
    if( hc05.begin(softSerial) )            {Serial.println("Ok");}             // Инициируем работу с Trema модулем hc05, указывая объект softSerial через который осуществляется связь по шине UART
    else                                    {Serial.println("Error");}          // Если работа с модулем не инициирована, то выводим сообщение об ошибке
                                             Serial.print  ("create slave: ");  // Выводим текст "create slave: " в монитор последовательного порта
    if( hc05.createSlave("MyName","4567") ) {Serial.println("Ok");}             // Создаем ведомую роль модулю, указывая его имя и pin-код (в примере имя = "MyName", pin-код = "4567")
    else                                    {Serial.println("Error");}          // Если роль не создалась - выводим сообщение об ошибке
}                                                                               //
                                                                                //
void loop (){                                                                   //
    if(hc05.available()){                                                       // Если есть принятые данные, то ...
        hc05.read(myArray);                                                     // Читаем полученные данные в ранее объявленный массив myArray
                                             Serial.println(myArray[0]);        // Выводим 0 элемент массива myArray в монитор последовательного порта
                                             Serial.println(myArray[1]);        // Выводим 1 элемент массива myArray в монитор последовательного порта
                                             Serial.println(myArray[2]);        // Выводим 2 элемент массива myArray в монитор последовательного порта
    }                                                                           // Функции available() и read() работают только при приёме данных от внешнего Trema Bluetooth модуля использующего данную библиотеку!
}                                                                               // Если передача данных выполняется другим Bluetooth модулем, то приём данных осуществляется посимвольным чтением данных из UART

Инициализация модуля hc05.begin(); и создание ведомой роли hc05.createSlave(); может занять несколько секунд.
В этом примере модуль подключается через программный UART используя библиотеку SoftwareSerial, а при инициализации работы с модулем hc05.begin() указывается объект softSerial.

Смотрите про коптеры:  Настраиваем телеметрию регуляторов скорости в Betaflight | RCDetails Blog

При использовании Trema Bluetooth модуля HC-05 в качестве ведомого можно однократно вызвать функцию createSlave() с указанием имени и pin кода, после чего навсегда исключить эту функцию из кода. Тогда, при подаче питания, Trema Bluetooth модуля HC-05 будет стартовать в режиме ведомого и соединяться с первым ведущим который правильно укажет имя и pin ведомого.

Функция createSlave() объекта hc05 позволяет создать ведомую роль Trema Bluetooth модулю HC-05 при подключении к любым Bluetooth модулям, но функции available() и read() объекта hc05 работают только при организации связи между двумя Trema Bluetooth модулями HC-05 использующими библиотеку iarduino_Bluetooth_HC05!

...                                                                             // Если внешним Bluetooth устройством передающим данные является не Trema Bluetooth модуль, то ...
void loop(){                                                                    // Данные принимаются посимвольным чтением из UART ...
    if(softSerial.available()){                                                 // Если есть принятые данные, то ...
        String str;                                                             // Создаём строку str
        while(softSerial.available()){                                          // Выполняем цикл пока есть что читать ...
            str1 =softSerial.read();                                            // Читаем очередной принятый символ из UART в строку str
            delay(5);                                                           // Задержка на 5 мс на случай медленного приёма
        }                                                                       // Цикл завершён, значит читать больше нечего
        Serial.println(str);                                                    // Выводим прочитанные данные одной строкой
    }                                                                           //
}                                                                               //

Строки кода до функции loop остаются без изменений. Все данные отправленные внешним Bluetooth модулем принимаются как строки.

Trema bluetooth модуль в роли ведущего (master) передаёт данные:

Связь осуществляется между двумя Trema Bluetooth модулями HC-05 использующими библиотеку iarduino_Bluetooth_HC05. Скетч модуля исполняющего роль slave приведён в предыдущем примере.

#include <SoftwareSerial.h>                                                      // Подключаем библиотеку SoftwareSerial для общения с модулем по программной шине UART
#include <iarduino_Bluetooth_HC05.h>                                             // Подключаем библиотеку iarduino_Bluetooth_HC05 для работы с модулем
SoftwareSerial softSerial(2,3);                                                  // Создаём объект softSerial указывая выводы RX, TX (можно указывать любые выводы Arduino UNO). Вывод 2 Arduino подключается к выводу TX модуля, вывод 3 Arduino подключается к выводу RX модуля
iarduino_Bluetooth_HC05 hc05(4);                                                 // Создаём объект hc05 указывая любой вывод Arduino, который подключается к выводу K модуля
int myArray[3] = {123,456,789};                                                  // Определяем массив с данными которые будем передавать, можно создавать массивы или переменные любых типов, в т.ч. и char, но не более 54 байт
void setup(){                                                                    //
                                             Serial.begin  (9600);               // Инициируем передачу данных по аппаратной шине UART для вывода результата в монитор последовательного порта
                                             Serial.print  ("begin: ");          // Выводим текст "begin: " в монитор последовательного порта
    if( hc05.begin(softSerial) )            {Serial.println("Ok");}              // Инициируем работу с Trema модулем hc05, указывая объект softSerial через который осуществляется связь по шине UART
    else                                    {Serial.println("Error");}           // Если работа с модулем не инициирована, то выводим сообщение об ошибке
                                             Serial.print  ("create master: ");  // Выводим текст "create master: " в монитор последовательного порта
    if( hc05.createMaster("MyName","4567") ){Serial.println("Ok");}              // Создаем ведущую роль модулю, указывая имя и pin-код ведомого к которому требуется подключиться (в примере имя = "MyName", pin-код = "4567")
    else                                    {Serial.println("Error");}           // Если роль не создалась или не удалось подключиться к ведомому - выводим сообщение об ошибке
}                                                                                //
void loop (){                                                                    //
                                             Serial.print  ("send: ");           // Выводим текст "send: " в монитор последовательного порта
    if( hc05.send(myArray) )                {Serial.println("Ok");}              // Передаём данные массива myArray через Trema-модуль bluetooth с проверкой доставки
    else                                    {Serial.println("Error");}           // Если данные не приняты ведомым bluetooth устройством - выводим сообщение об ошибке
}                                                                                // Функция send() предназначена для отправки данных только для Trema Bluetooth модулей использующих данную библиотеку!

Инициализация модуля hc05.begin(); и создание ведущей роли с подключением к ведомому hc05.createMaster(); может занять до минуты.В этом примере модуль подключается через программный UART используя библиотеку SoftwareSerial, а при инициализации работы с модулем hc05.begin() указывается объект softSerial.

Смотрите про коптеры:  Покрасочный робот KUKA ready2_spray купить в Москве — цена по запросу

Функция createMaster() объекта hc05 позволяет создать ведущую роль Trema Bluetooth модулю HC-05 при подключении к любым Bluetooth модулям, но функция send() объекта hc05 работает только при организации связи между двумя Trema Bluetooth модулями HC-05 использующими библиотеку iarduino_Bluetooth_HC05!

Так как функция send() добавляет 4 служебных байта к передаваемым данным (2 в начале и 2 в конце), которые приёмник будет считать за полученные данные. Если требуется отправить данные на другие Bluetooth модули, это лучше сделать отправкой строки по шине UART, тогда код loop будет выглядеть так:

...                                                                             // Если внешним Bluetooth устройством принимающим данные является не Trema Bluetooth модуль, то ...
void loop(){                                                                    // Данные передаются строкой или символами через UART ...
    softSerial.println(myArray[0]);                                             // Отправляем значение 0 элемента массива myArray, которое будет принято как строка
    softSerial.println(myArray[1]);                                             // Отправляем значение 1 элемента массива myArray, которое будет принято как строка
    softSerial.println(myArray[2]);                                             // Отправляем значение 2 элемента массива myArray, которое будет принято как строка
}                                                                               //

Строки кода до функции loop остаются без изменений. Все данные передаются символами (байтами) или строками. По этому элементы массива отправляются по отдельности.

Код программы для «малыша»:

#include <SoftwareSerial.h>                                                      //  Подключаем библиотеку SoftwareSerial для общения с модулем по программной шине UART
#include <iarduino_Bluetooth_HC05.h>                                             //  Подключаем библиотеку iarduino_Bluetooth_HC05 для работы с Trema Bluetooth модулем HC-05
SoftwareSerial          softSerial(9, 10);                                       //  Создаём объект softSerial указывая выводы RX, TX (можно указывать любые выводы Arduino UNO). Вывод 2 Arduino подключается к выводу TX модуля, вывод 3 Arduino подключается к выводу RX модуля
iarduino_Bluetooth_HC05 hc05(13);                                                //  Создаём объект hc05 указывая любой вывод Arduino, который подключается к выводу K модуля
                                                                                 //  
uint8_t  pinShield_H2 = 4;                                                       //  Вывод, подключенный к драйверу, для задания направления вращения левым мотором
uint8_t  pinShield_E2 = 5;                                                       //  Вывод ШИМ, подключенный к драйверу, для задания скорости левого мотора
uint8_t  pinShield_E1 = 6;                                                       //  Вывод ШИМ, подключенный к драйверу, для задания скорости правого мотора
uint8_t  pinShield_H1 = 7;                                                       //  Вывод, подключенный к драйверу, для задания направления вращения правым мотором
uint8_t  pinLED_RED   = 12;                                                      //  Вывод с красным светодиодом
uint8_t  pinLED_BLUE  = 11;                                                      //  Вывод с синим светодиодом
uint16_t time_period  = 200;                                                     //  Частота мигания светодиодов (в миллисекундах)
uint8_t  valSpeed     = 255;                                                     //  Максимальная скорость ШИМ (число от 0 до 255)
bool     arrRoute[2]  = {1, 1};                                                  //  Направление движения для каждого мотора ([0]- правый мотор, [1] - левый мотор)
uint16_t arrSpeed[2];                                                            //  Скорость для каждого мотора ([0]- правый мотор, [1] - левый мотор)
uint32_t tmrLED;                                                                 //  Время  последнего включения светодиодов
uint32_t flgTime;                                                                //  Флаг для задания времени принятия пакетов от Bluetooth телефона
uint8_t  flg;                                                                    //  Флаг кнопок
uint32_t tmrWait;                                                                //  Время до начала сопряжения с новыми устройствами
bool     flg_LED;                                                                //  Флаг включения светодиодов
                                                                                 //  </iarduino_bluetooth_hc05.h></softwareserial.h>
void setup() {                                                                   //  
    // BLUETOOTH МОДУЛЬ                                                          //  
    Serial.begin  (9600);                                                        //  Инициируем передачу данных по аппаратной шине UART для вывода результата в монитор последовательного порта
    Serial.print  ("begin: ");                                                   //  Выводим текст "begin: " в монитор последовательного порта
    if (hc05.begin(softSerial))     {Serial.println("Ok");}                      //  Инициируем работу с Trema модулем hc05, указывая объект softSerial через который осуществляется связь по шине UART
    else                            {Serial.println("Error");}                   //  Если работа с модулем не инициирована, то выводим сообщение об ошибке
    tmrWait = millis();                                                          //  Устанавливаем таймер ожидания сопряжения
    while (!hc05.checkConnect() && millis()<tmrWait 60000) {;}                   //  Ждём в течении 60 секунд сопряжения с последним устройством из памяти
    if (millis()<tmrWait 60000)     {Serial.println("Connect with last ADR");}   //  Если сопряжение произошло, то выдаём в монитор порта сообщение об этом
    else {                                                                       //  Если сопряжение не произошло, то
    if (hc05.createSlave("BT_CAR", "1234"))                                      //  Создаем ведомую роль модулю, указывая его имя и pin-код (в примере имя = "BT_CAR", pin-код = "1234")
                                    {Serial.println("Slave create");}            //  Если ведомая роль была создана, выводим сообщение об успехе в монитор порта,
    else                            {Serial.println("Slave not create");}        //  а если не была создана - выводим сообщение об ошибке в монитор порта.
      }                                                                          //  
    // МОТОРЫ                                                                    //  
    pinMode(pinShield_H2, OUTPUT);                                               //  Конфигурируем вывод pinShield_H2 как выход (направление вращения левого мотора)
    pinMode(pinShield_E2, OUTPUT);                                               //  Конфигурируем вывод pinShield_E2 как выход (скорость вращения левого мотора, ШИМ)
    pinMode(pinShield_E1, OUTPUT);                                               //  Конфигурируем вывод pinShield_E1 как выход (скорость вращения правого мотора, ШИМ)
    pinMode(pinShield_H1, OUTPUT);                                               //  Конфигурируем вывод pinShield_H1 как выход (направление вращения правого мотора)
    // СВЕТОДИОДЫ                                                                //  
    pinMode(pinLED_RED,OUTPUT);                                                  //  Конфигурируем вывод pinLED_RED как выход 
    pinMode(pinLED_BLUE,OUTPUT);                                                 //  Конфигурируем вывод pinLED_BLUE как выход
    tmrLED = millis();                                                           //  Устанавливаем таймер светодиодов равным millis()
    flg_LED = 0;                                                                 //  Сбрасываем флаг светодиодов
}                                                                                //  
void loop() {                                                                    //  
  if (softSerial.available()) {                                                  //  Если есть принятые данные, то ...
    String str;                                                                  //  Создаём строку str
    while (softSerial.available()) {                                             //  Выполняем цикл пока есть что читать ...
      str  = char(softSerial.read());                                            //  Читаем очередной принятый символ из UART в строку str
      delay(5);                                                                  //  Задержка на 5 мс на случай медленного приёма
    }                                                                            //  Цикл завершён, значит читать больше нечего
                                            // КНОПКИ ДВИЖЕНИЯ                   //  
                               // Флаг времени            Флаг кнопки            //  
    if (str == "II") {    flgTime = millis();     flg = 1;    }                  //  Кнопка "стрелка вверх-влево"
    if (str == "FF") {    flgTime = millis();     flg = 2;    }                  //  Кнопка "стрелка вверх"
    if (str == "GG") {    flgTime = millis();     flg = 3;    }                  //  Кнопка "стрелка вверх-вправо"
    if (str == "RR") {    flgTime = millis();     flg = 4;    }                  //  Кнопка "стрелка влево"
    if (str == "SS") {    flgTime = millis();     flg = 5;    }                  //  СТОП
    if (str == "LL") {    flgTime = millis();     flg = 6;    }                  //  Кнопка "стрелка вправо"
    if (str == "JJ") {    flgTime = millis();     flg = 7;    }                  //  Кнопка "стрелка вниз-влево"
    if (str == "BB") {    flgTime = millis();     flg = 8;    }                  //  Кнопка "стрелка вниз"
    if (str == "HH") {    flgTime = millis();     flg = 9;    }                  //  Кнопка "стрелка вниз-вправо"
                                        // КНОПКИ ДОПОЛНИТЕЛЬНЫХ ФУНКЦИЙ         //  
                          // Если кнопка нажата        меняем флаг               //  
    if (str == "SWS" || str == "SwS") {flg_LED = !flg_LED;}                      //  Кнопка включения светодиодов
    if (str == "S0S") {flg     = 10;      }                                      //  Ползунок скорости в положении 0
    if (str == "S1S") {flg     = 11;      }                                      //  Ползунок скорости в положении 1
    if (str == "S2S") {flg     = 12;      }                                      //  Ползунок скорости в положении 2
    if (str == "S3S") {flg     = 13;      }                                      //  Ползунок скорости в положении 3
    if (str == "S4S") {flg     = 14;      }                                      //  Ползунок скорости в положении 4
    if (str == "S5S") {flg     = 15;      }                                      //  Ползунок скорости в положении 5
    if (str == "S6S") {flg     = 16;      }                                      //  Ползунок скорости в положении 6
    if (str == "S7S") {flg     = 17;      }                                      //  Ползунок скорости в положении 7
    if (str == "S8S") {flg     = 18;      }                                      //  Ползунок скорости в положении 8
    if (str == "S9S") {flg     = 19;      }                                      //  Ползунок скорости в положении 9
    if (str == "SqS") {flg     = 20;      }                                      //  Ползунок скорости в положении 10
    //  ======================================================================================================================================================
    switch (flg) {//Направление левого мотора    Направление правого мотора      Скорость левого мотора             Скорость правого мотора
      case 1:          arrRoute[1] = 1;             arrRoute[0] = 1;            arrSpeed[1] = (valSpeed / 2);       arrSpeed[0] = valSpeed;             break;       //  С-З
      case 2:          arrRoute[1] = 1;             arrRoute[0] = 1;            arrSpeed[1] = valSpeed;             arrSpeed[0] = valSpeed;             break;       //  С
      case 3:          arrRoute[1] = 1;             arrRoute[0] = 1;            arrSpeed[1] = valSpeed;             arrSpeed[0] = (valSpeed / 2);       break;       //  С-В
      case 4:          arrRoute[1] = 1;             arrRoute[0] = 1;            arrSpeed[1] = 0;                    arrSpeed[0] = valSpeed;             break;       //  З
      case 5:          arrRoute[1] = 1;             arrRoute[0] = 1;            arrSpeed[1] = 0;                    arrSpeed[0] = 0;                    break;       //  Стоп
      case 6:          arrRoute[1] = 1;             arrRoute[0] = 1;            arrSpeed[1] = valSpeed;             arrSpeed[0] = 0;                    break;       //  В
      case 7:          arrRoute[1] = 0;             arrRoute[0] = 0;            arrSpeed[1] = (valSpeed / 2);       arrSpeed[0] = valSpeed;             break;       //  Ю-З
      case 8:          arrRoute[1] = 0;             arrRoute[0] = 0;            arrSpeed[1] = valSpeed;             arrSpeed[0] = valSpeed;             break;       //  Ю
      case 9:          arrRoute[1] = 0;             arrRoute[0] = 0;            arrSpeed[1] = valSpeed;             arrSpeed[0] = (valSpeed / 2);       break;       //  Ю-В
      }                                                                          //  
  } // =======================================================================================================================================================  
  if     (flg == 10){valSpeed = 5;}                                              //  0 режим скорости
  else if(flg == 11){valSpeed = 30;}                                             //  1 режим скорости
  else if(flg == 12){valSpeed = 55;}                                             //  2 режим скорости
  else if(flg == 13){valSpeed = 80;}                                             //  3 режим скорости
  else if(flg == 14){valSpeed = 105;}                                            //  4 режим скорости
  else if(flg == 15){valSpeed = 130;}                                            //  5 режим скорости
  else if(flg == 16){valSpeed = 155;}                                            //  6 режим скорости
  else if(flg == 17){valSpeed = 180;}                                            //  7 режим скорости
  else if(flg == 18){valSpeed = 205;}                                            //  8 режим скорости
  else if(flg == 19){valSpeed = 230;}                                            //  9 режим скорости
  else if(flg == 20){valSpeed = 255;}                                            //  10 режим скорости
                                                                                 //  
  if (flg_LED) {                                                                 //  Если флаг установлен (была нажата кнопка включения фары)
    if (millis() - tmrLED > time_period) {                                       //  мигаем светодиодами с заданной частотой
      tmrLED = millis();                                                         //  сохраняем время
      digitalWrite(pinLED_RED, digitalRead(pinLED_BLUE));                        //  управляем питанием красного светодиода
      digitalWrite(pinLED_BLUE, !digitalRead(pinLED_BLUE));                      //  управляем питанием синего светодиода
      }                                                                          //  
    } else {                                                                     //  если флаг сброшен, то
      digitalWrite(pinLED_RED, LOW);                                             //  гасим светодиоды
      digitalWrite(pinLED_BLUE, LOW);                                            //  
      }                                                                          //  
  if (flgTime > millis()) {                                                      //  Если millis() переполнен, то 
    flgTime = 0;                                                                 //  сбрасываем флаг в ноль
    }                                                                            //  
// ПОДАЧА ЗНАЧЕНИЙ СКОРОСТИ И НАПРАВЛЕНИЯ ВРАЩЕНИЯ НА ВЫВОДЫ                     //  
  if (flgTime > (millis() - 500)) {                                              //  Если сигналы с телефона приходят (в течении 50 мс)
    digitalWrite(pinShield_H2, arrRoute[1]);                                     //  тогда задаем направление вращения правого мотора
    digitalWrite(pinShield_H1, arrRoute[0]);                                     //  и левого мотора
    analogWrite(pinShield_E2, arrSpeed[1]);                                      //  Задаём скорость вращения для правого мотора
    analogWrite(pinShield_E1, arrSpeed[0]);                                      //  и для левого мотора
    } else {                                                                     //  Если пакеты не приходят
    analogWrite(pinShield_E2, 0);                                                //  Останавливаем работу моторов
    analogWrite(pinShield_E1, 0);                                                //  
    }                                                                            //  
}                                                                                //  

Ссылка для скачивания скетча.

В данном коде управление роботом осуществляется в три основных этапа: получение данных с телефона; изменение значений переменных arrSpeed, arrRoute; подача питания на моторы и задание направления их вращения. Так же в коде присутствуют дополнительные блоки: включение/выключение светодиодов; изменение скорости вращения колёс; вход в режим сопряжения.

  • Получение данных с пульта:
    • Данный блок начинается с оператора if , в условии которого написано softSerial.available(). Это условие будет верно, если в последовательный порт будут приходить данные с телефона, в противном случае условие будет ложно;
    • Далее следует еще один оператор while, условием которого опять является softSerial.available(). Если условие верно, то значение, поступившее в последовательный порт, будет записано в переменную str; задержка в 5 миллисекунд сделана для того, чтобы при низкой скорости передачи Arduino успел полностью прочитать значение из последовательного порта в переменную str;
  • Изменение значений переменных arrSpeed, arrRoute:
    • Данный блок начинается с оператора if, в условии которого написано str == XX. В зависимости от значения XX, которое принимает переменная str (одно из 9 для основных функций), сбрасывается flgTime – таймер начала выполнения функции, а так же устанавливается значение флага flg(от 1 до 9);
    • Далее следует конструкция switch...case, в которой оператор switch сравнивает значение флага flg с оператором case и, в зависимости от значения флага flg, выполняет код, где задаётся, на какой мотор будет подано питание (переменнаяarrSpeed ) и с каким направлением вращения ( переменная arrRoute);
  • Подача питания на моторы и задание направления их вращения:
    • Данный блок начинается с оператора if, в условии которого написано flgTime > (millis() - 50). Это условие будет верно в течении 50 миллисекунд после начала приёма сигнала от телефона и установит на выводах Arduino значения переменных arrSpeed и arrRoute. Если же сигнала в течении 50 миллисекунд не поступит, то оператор else сбросит значение скорости в 0 и робот остановится;
  • Включение/выключение светодиодов:
    • Данный блок включает в себя 2 части: получение сигнала с телефона и изменение флага flg_LED; включение/выключение светодиодов;
    • Первая часть начинается с оператора if, в условии которого написано ( str == "SWS" || str == "SwS"). Условие будет верно, если значение переменной str будет равно SWSИЛИSwS, что приведёт к установке флага flg_LED в противоположное от нынешнего значение;
    • Вторая часть начинается с оператора if, в условии которого написано (flg_LED). Условие будет верно, если значение флага flg_LED будет true, что приведёт к включению светодиодов. Если же значение флага flg_LED будет false, то светодиоды погаснут.
  • Изменение скорости вращения колёс:
    • Данный бок включает в себя 2 части: получение сигнала с телефона и изменение флага flg; изменение значения переменной valSpeed;
    • Первая часть начинается с оператора if, в условии которого написано str == XX. В зависимости от значения XX, которое принимает переменная str (одно из 11 для дополнительных функций), устанавливается значение флага flg(от 10 до 20);
    • Вторая часть начинается с оператора if, в условии которого написано flg == XX. В зависимости от значения XX, которое принимает переменная flg (одно из 11 для дополнительных функций), устанавливается значение переменнойvalSpeed(от 5 до 255);
  • Вход в режим сопряжения (выполняется при подаче питания на робота):
    • Данный блок находится в коде void setup() и начинается с оператора if , в условии которого написано hc05.begin(softSerial). Это условие будет верно, если произошла успешная инициализация с Bluetooth модулем по шине UART, о чём будет выведено сообщение в монитор последовательного порта;
    • Далее происходит сброс таймера tmrWait и идёт проверка условия !hc05.checkConnect() && millis()<tmrWait 60000 в операторе циклаwhile . До тех пор, пока не произойдёт сопряжения Bluetooth модуля робота и телефона И не истечёт минута(60 сек), модуль будет выполнять пустой цикл.
    • После цика while следует оператор if, в условии которого написано millis()<tmrWait 60000 . Условие будет верно, если одно из условие !hc05.checkConnect() цикла while изменится на противоположное и произойдёт это раньше, чем через 60 секунд от подачи питания на робота. Тогда в монитор последовательного порта будет выведено сообщение о том, что сопряжение произошло с ранее созданной парой из памяти устройства.
    • Если по истечении минуты не произошло сопряжение ранее созданной пары, то далее следует оператор else, который выполняет вызов функции createSlave("BT_CAR", "1234") объекта hc05, которая назначает Bluetooth модулю робота роль ведомого с именем “BT_CAR” и PIN-кодом “1234”, разрывает ранее установленную связь с мастером (если она была) и стирает список ранее созданных пар. После этого модуль начинает ожидать подключения мастера, который правильно укажет имя и PIN-код модуля. Об успешном или, наоборот, неудачном выполнении функции будет выведено сообщение в монитор последовательного порта.

Получение данных и работа с Trema-модулем Bluetooth HC-05 осуществляется через функции и методы объекта hc05 библиотеки iarduino_Bluetooth_HC05, с подробным описанием которых можно ознакомиться на странице Wiki – Trema-модуль bluetooth HC-05.

Подробнее о модуле:

В ISM диапазоне частот работают и радио модули nRF24L01 , но в отличии от этих модулей, которые работают на определённой частоте диапазона, Trema-модуль Bluetooth HC-05 используют метод AFH (Adaptive Frequency Hopping Feature) адаптивной скачкообразной перестройки несущей частоты (он меняет свою частоту 1600 раз в секунду).

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

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

В роли ведомого, Trema Bluetooth модуль HC-05 поддерживает метод автоматического сопряжения (создания пары) с другими Bluetooth устройствами выступающими в роли ведущих и инициировавших сопряжение.

Trema Bluetooth модуль HC-05 поддерживает автоматическое переподключение к последнему устройству (если информация о сопряжении с ним не была стёрта пользователем из списка пар). Если Вы установили подключение к другому Bluetooth устройству и связь с ним пропала (отключилось питание, увеличилось расстояние и т.д.), то после устранения причины пропадания связи, устройства вновь будут готовы передавать/принимать данные, без Вашего вмешательства.

Trema Bluetooth модуль HC-05, в отличие от Bluetooth модулей HC-06, может работать не только в роли ведомого (slave), ожидая подключение, но и в роли ведущего (Master), инициируя поиск (обнаружение), сопряжение и подключение к другим Bluetooth модулям находящимся в радиусе действия. Модуль способен принимать и отправлять данные как в роли ведущего (master), так и в роли ведомого (slave).

Используя Trema Bluetooth модули HC-05 можно создавать связь между двумя Arduino, или между Arduino и другими устройствами, как ведущими (телефон, планшет, компьютер, …), так и ведомыми (гарнитуры, клавиатуры, мышки, …).

Специально для Trema Bluetooth модуль HC-05 нами разработана библиотека iarduino_Bluetooth_HC05 которая значительно упрощает процесс поиска любых Bluetooth устройств, создания ролей (master/slave) и сопряжения. Поиск и подключение к другим модулям Bluetooth осуществляется по их именам а не адресам.

При использовании библиотеки для связи двух Trema Bluetooth модулей HC-05 можно передавать строки, значения и массивы любых типов, при этом библиотека осуществляет проверку доставки данных используя циклически избыточный код, так что Trema Bluetooth модуль HC-05 передавший данные получает подтверждение приёма, а Trema Bluetooth модуль HC-05 получивший данные может оперировать информацией о количестве элементов массива и его размере.

Подробнее про установку библиотеки читайте в нашей инструкции..

Скетч поиска любых bluetooth устройств в радиусе действия:

#include <SoftwareSerial.h>                                                     // Подключаем библиотеку SoftwareSerial для общения с модулем по программной шине UART
#include <iarduino_Bluetooth_HC05.h>                                            // Подключаем библиотеку iarduino_Bluetooth_HC05 для работы с модулем
SoftwareSerial softSerial(2,3);                                                 // Создаём объект softSerial указывая выводы RX, TX (можно указывать любые выводы Arduino UNO). Вывод 2 Arduino подключается к выводу TX модуля, вывод 3 Arduino подключается к выводу RX модуля
iarduino_Bluetooth_HC05 hc05(4);                                                // Создаём объект hc05 указывая любой вывод Arduino, который подключается к выводу K модуля
int myArray[3] = {123,456,789};                                                 // Определяем массив с данными которые будем передавать, можно создавать массивы или переменные любых типов, в т.ч. и char, но не более 54 байт
void setup(){                                                                   //
                                             Serial.begin  (9600);              // Инициируем передачу данных по аппаратной шине UART для вывода результата в монитор последовательного порта
                                             Serial.print  ("begin: ");         // Выводим текст "begin: " в монитор последовательного порта
    if( hc05.begin(softSerial) )            {Serial.println("Ok");}             // Инициируем работу с Trema модулем hc05, указывая объект softSerial через который осуществляется связь по шине UART
    else                                    {Serial.println("Error");}          // Если работа с модулем не инициирована, то выводим сообщение об ошибке
}                                                                               //
void loop (){                                                                   //
    int i = hc05.find(10);                                                      // Выполняем поиск устройств, не дольше 10 секунд:
    if(i){                                   Serial.print  ("found ");
                                             Serial.print  (i);
                                             Serial.println(" devices:");
        for(int j=0; j<i; j  ){              Serial.print  (  "Name: ");    Serial.print(hc05.findName[j]);
                                             Serial.print  (", Address: "); Serial.print(hc05.findAddr[j]);
                                             Serial.println(";");
        }
    }else{                                   Serial.println("Device not found.");}
}

Инициализация модуля hc05.begin(); может занять несколько секунд.В этом примере модуль подключается через программный UART используя библиотеку SoftwareSerial, а при инициализации работы с модулем hc05.begin() указывается объект softSerial. Но модуль можно подключать и к аппаратному UART, тогда при инициализации работы с модулем hc05.begin() нужно указать Serial или Serial1, Serial2, Serial3, см. пример подключения к Arduino Mega.

Способы соединения

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

Не имеет значения, какая у вас машина. Это может быть Рено Дастер, отечественная Лада Веста или Лада Гранта. У некоторых стоит купленная отдельно магнитола, другие обходятся штатной системой.

Даже существует разнообразие самих магнитол. Есть несколько наиболее распространенных брендов:

  • JVC;
  • Самсунг;
  • Кунвуд;
  • Пионер;
  • Prology;
  • Сони;
  • Алпайн;
  • Terra;
  • Sho Me и пр.

Есть разные версии, модели и поколения. Даже с китайской непонятного происхождения магнитолой, купленной для Chery Tiggo, порой можно за пару минут соединить свой Андроид смартфон. Марки и модели ключевой роли тут не играют. Задача всегда стоит одна и та же. Нужно свой телефон как-то соединить с системой.

Условно все методы можно разделить на проводные и беспроводные.

Сегодня мы рассмотрим следующие способы подключения:

  • С помощью кабеля USB. Актуально, востребовано, не очень сложно. Хотя и со своими минусами;
  • Через AUX. Также распространенный вариант со своими особенностями;
  • Через радио. Да, можно подключиться даже так. Скоро узнаете, о чем идет речь;
  • С помощью системы блютуз. Категория беспроводного соединения;
  • Через тюльпаны. Не самый ходовой способ, но и его обойти вниманием нельзя.

Теперь давайте каждый вариант постараемся коротко, но ясно рассмотреть отдельно. А дальше уже каждый для себя сможет сделать выводы и принять окончательное решение.

Объективно один из самых актуальных способов соединения. Стандартный USB кабель позволяет подключить телефон или просто компьютерную флешку.

Есть специальный шнур, один конец которого выглядит как USB разъем, а второй предназначен для подключения к телефону. Учтите, что старые магнитолы не могут синхронизироваться со смартфонами, потому они воспринимают телефон сугубо как накопитель, то есть карту памяти.

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

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

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

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

Это специальный разъем, доступный на автомагнитолах. Чуть ли не первый функционал, позволяющий соединить телефон и аудиосистему в машине. Если нет AUX на вашем авто, это несколько странно, поскольку такие разъемы используются еще со времен кассетных магнитол.

Фактически это штекер с круглой формой, имеющий размер 3,5 мм. Такой вы используете при подключении наушников. В магазинах не сложно найти соответствующий кабель. А подключение осуществляется до безобразия просто. Берется шнур, один конец идет в телефон, а второй в магнитолу.

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

Вариант очень даже неплохой и удобный. Предельно просто подключить и отключить по мере необходимости.

Учитывая ряд преимуществ, спрос на AUX соединение сохраняется.

Схема подключения робота quadruped:

Соберите механику, подключите Tream-Power Shield, сервоприводы, датчик расстояния и откалибруйте робота, как это описано на странице Сборка QUADRUPED. Электроника Калибровка. Далее на боковые панели установите Bluetooth HC-05 и кнопку, первый модуль подключается к шине UART (в примере используется аппаратная шина UART), а второй к любому выводу Arduino Uno (в примере используется вывод D12).

Вы можете изменить выводы 2 и 3 для подключения датчика HC-SR04 на любые другие, указав их в скетче при объявлении объекта objSensor.

СервоприводыTrema Power Shield
1 конечностьГоризонтальный сустав (№ 0)вывод 4 на белой колодке
Вертикальный сустав (№ 1)вывод 5 на белой колодке
2 конечностьГоризонтальный сустав (№ 2)вывод 6 на белой колодке
Вертикальный сустав (№ 3)вывод 7 на белой колодке
3 конечностьГоризонтальный сустав (№ 4)вывод 8 на белой колодке
Вертикальный сустав (№ 5)вывод 9 на белой колодке
4 конечностьГоризонтальный сустав (№ 6)вывод 10 на белой колодке
Вертикальный сустав (№ 7)вывод 11 на белой колодке

Вы можете изменить выводы 4-11 для подключения сервоприводов на любые другие, указав их в скетче при объявлении массива объектов pinServo[8]. Трехпроводные шлейфы сервоприводов устанавливаются следующим образом:

  • Оранжевый провод подключается к выводу на белой колодке.
  • Красный провод подключается к выводу на красной колодке.
  • Коричневый провод подключается к выводу на чёрной колодке.
BluetoothTrema Power Shield
Bluetooth HC-05вывод RXвывод TX на колодке Serial
вывод TXвывод RX на колодке Serial
вывод K (Key)вывод A0 на белой колодке
вывод V (Vcc)любой вывод на красной колодке
вывод G (GND)любой вывод на чёрной колодке

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

Выводы RX и ТХ модуля подключаются проводами к выводам TX и RX колодки с надписью Serial. Трёхпроводной шлейф подключённый к выводам K, V, G, устанавливается следующим образом:

  • Вывод K (Key) подключается к выводу на белой колодке.
  • Вывод V (Vcc) подключается к выводу на красной колодке.
  • Вывод G (GND) подключается к выводу на чёрной колодке.
КнопкаTrema Power Shield
Trema-кнопкавывод S (Signal)вывод 12 на белой колодке
вывод V (Vcc)любой вывод на красной колодке
вывод G (GND)любой вывод на чёрной колодке

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

Трёхпроводной шлейф подключённый к выводам S, V, G, устанавливается следующим образом:

  • Вывод S (Signal) подключается к выводу на белой колодке.
  • Вывод V (Vcc) подключается к выводу на красной колодке.
  • Вывод G (GND) подключается к выводу на чёрной колодке.

Представленная ниже схема совпадает со схемой из инструкции по сборке QUADRUPED, но к ней добавились два модуля: bluetooth (подключается к выводам A0, TX и RX) и кнопка (подключается к выводу D12).

Элементы схемы: «Э0»…«Э7» – сервоприводы, «Э8» – датчик расстояния, «Э9» – Trema bluetooth модуль, «Э10» Trema кнопка.

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