Урок 15. Bluetooth модуль HC-06 подключение к Arduino. Управление устройствами с телефона. – Описания, примеры, подключение к Arduino

Урок 15. Bluetooth модуль HC-06 подключение к Arduino. Управление устройствами с телефона. - Описания, примеры, подключение к Arduino Лодки

Serial bluetooth terminal

Чтобы подключиться к последовательному порту через Bluetooth, нам нужен клиент для Android. Давайте поищем такое приложение в Play Store.

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

Наше устройство на экране поиска в Serial Bluetooth Terminal
Наше устройство на экране поиска в Serial Bluetooth Terminal

Давайте попробуем подключиться, и если все пройдет успешно, мы увидим сообщение Connected.

Подключились к нашему модулю
Подключились к нашему модулю

И последнее, но не менее важное: мы посылаем команды модулю. Светодиод rgb должен быть изменен программой на Arduino.

Задаем белый цвет rgb светодиода через приложение
Задаем белый цвет rgb светодиода через приложение

Каждая выбранная цифра влияет на другой цвет светодиода RGB. Цвета переключаются в цикле, как вы помните. Отправьте 0 на первые два цвета, 250 на последний, и один цвет должен загореться.

Цвет изменяется по bluetooth
Цвет изменяется по bluetooth

Беспроводное программирование arduino через bluetooth

После настройки модуля и монтажа схемы следующим шагом будет беспроводное программирование Arduino с помощью Bluetooth.

На данном этапе предполагается, что модуль HC-05 уже соединен с компьютером.

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

На приведенном ниже изображении видно, что виртуальные последовательные порты отображаются корректно:

  • Затем откройте Arduino IDE и выберите новый последовательный порт, который был создан, когда HC-05 был подключен к компьютеру.

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

Если по какой-то причине скетч не может быть сохранен на Arduino, то необходимо проверить емкость конденсатора, очень хорошей идеей для этого является увеличение его значения для обеспечения корректной перезагрузки Arduino при открытом последовательном порте Bluetooth, в этом случае рекомендуются значения от 100 nF до 1 μF.

Машина-робот на базе arduino с управление через bluetooth

#include // Включить библиотеку управления двигателями

#include // Подключаем библиотеку для сервоприводов

#include // Включить библиотеку для работы с последовательным интерфейсом через дискретные порты

//Создаем объекты для двигателей
AF_DCMotor motor1(1); //канал М1 на Motor Shield — левый
AF_DCMotor motor2(2); //канал М2 на Motor Shield — правый

// Создаем объект для сервопривода
Servo vservo;

SoftwareSerial BTSerial(A0, A1); // RX, TX

// Создаем переменную для команд Bluetooth
char vcmd;
// Создаем переменные для запоминания скорости двигателей
int vspdL, vspdR;
/* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах.
Текущая скорость должна быть больше этого значения. В противном случае двигатели со стороны направления поворота просто не будут вращаться */
int vspd = 200;

void setup() {
// Устанавливаем скорость передачи данных по Bluetooth
BTSerial.begin(9600);
// Устанавливаем скорость передачи данных по кабелю
Serial.begin(9600);
// Выбираем пин к которому подключен сервопривод
vservo.attach(9); // или 10, если воткнули в крайний разъём
// Поворачиваем сервопривод в положение 90 градусов при каждом включении
vservo.write(90);
// Устанавливаем максимальную скорость вращения двигателей
vspeed(255,255);
}

void loop() {
// Если есть данные
if (BTSerial.available())
{
// Читаем команды и заносим их в переменную. char преобразует код символа команды в символ
vcmd = (char)BTSerial.read();
// Отправляем команду в порт, чтобы можно было их проверить в «Мониторе порта»
Serial.println(vcmd);

// Вперед
if (vcmd == ‘F’) {
vforward();
}
// Назад
if (vcmd == ‘B’)
{
vbackward();
}
// Влево
if (vcmd == ‘L’)
{
vleft();
}
// Вправо
if (vcmd == ‘R’)
{
vright();
}
// Прямо и влево
if (vcmd == ‘G’)
{
vforwardleft();
}
// Прямо и вправо
if (vcmd == ‘I’)
{
vforwardright();
}
// Назад и влево
if (vcmd == ‘H’)
{
vbackwardleft();
}
// Назад и вправо
if (vcmd == ‘J’)
{
vbackwardright();
}
// Стоп
if (vcmd == ‘S’)
{
vrelease();
}
// Скорость 0%
if (vcmd == ‘0’)
{
vspeed(0,0);
}
// Скорость 10%
if (vcmd == ‘1’)
{
vspeed(25,25);
}
// Скорость 20%
if (vcmd == ‘2’)
{
vspeed(50,50);
}
// Скорость 30%
if (vcmd == ‘3’)
{
vspeed(75,75);
}
// Скорость 40%
if (vcmd == ‘4’)
{
vspeed(100,100);
}
// Скорость 50%
if (vcmd == ‘5’)
{
vspeed(125,125);
}
// Скорость 60%
if (vcmd == ‘6’)
{
vspeed(150,150);
}
// Скорость 70%
if (vcmd == ‘7’)
{
vspeed(175,175);
}
// Скорость 80%
if (vcmd == ‘8’)
{
vspeed(200,200);
}
// Скорость 90%
if (vcmd == ‘9’)
{
vspeed(225,225);
}
// Скорость 100%
if (vcmd == ‘q’)
{
vspeed(255,255);
}
}
}

// Вперед
void vforward() {
vspeed(vspdL,vspdR);
vforwardRL();
}

// Вперед для RL
void vforwardRL() {
motor1.run(FORWARD);
motor2.run(FORWARD);
}

// Назад
void vbackward() {
vspeed(vspdL,vspdR);
vbackwardRL();
}

// Назад для RL
void vbackwardRL() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
}

// Влево
void vleft() {
vspeed(vspdL,vspdR);
motor1.run(BACKWARD);
motor2.run(FORWARD);
}

// Вправо
void vright() {
vspeed(vspdL,vspdR);
motor1.run(FORWARD);
motor2.run(BACKWARD);
}

// Вперед и влево
void vforwardleft() {
if (vspdL > vspd) {
vspeed(vspdL-vspd,vspdR);
}
else
{
vspeed(0,vspdR);
}
vforwardRL();
}

// Вперед и вправо
void vforwardright() {
if (vspdR > vspd) {
vspeed(vspdL,vspdR-vspd);
}
else
{
vspeed(vspdL,0);
}
vforwardRL();
}

// Назад и влево
void vbackwardleft() {
if (vspdL > vspd) {
vspeed(vspdL-vspd,vspdR);
}
else
{
vspeed(0,vspdR);
}
vbackwardRL();
}

// Назад и вправо
void vbackwardright() {
if (vspdR > vspd) {
vspeed(vspdL,vspdR-vspd);
}
else
{
vspeed(vspdL,0);
}
vbackwardRL();
}

// Стоп
void vrelease(){
motor1.run(RELEASE);
motor2.run(RELEASE);
}

// Изменение скорости
void vspeed(int spdL,int spdR){
if (spdL == spdR) {
vspdL=spdL;
vspdR=spdR;
}
motor1.setSpeed(spdL);
motor2.setSpeed(spdR);
}

Модуль hc-05 и hc-06

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

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

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

В качестве примера рассмотрим модуль HC-06, который является ведомым устройством. он постоянно ожидает запросов на подключение. Поэтому, если устройство подключено к модулю HC-06, все данные, полученные от Arduino, отправляются ему, и наоборот.

Обратите внимание, что HC-06 выступает в роли ведомого, а HC-05 – в роли ведущего и ведомого, в этом случае HC-05 имеет в общей сложности 6 выводов, а HC-06 – всего 4.

Подключение угла и код

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

На рисунке 1 показана схема подключения. Потяните плюсовой провод к зеленому проводу, а остальные – к минусовому. Провода подключаются к выходам A0-A2 через резистор, установленный для устранения помех и предотвращения короткого замыкания. Остальные порты сохраняются путем их выбора.

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

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

int speedTurn = 180; //скорость поворота, от 0 до 255

//пины для определения поворота
int pinRed = A0;
int pinWhite = A1;
int pinBlack = A2;

int pinAngleStop = 12; //выводит ток на светодиод, если достигнут максимальный угол, нужен 
//только для отладки 

void setup() {
 //пины поворота на считывание
  pinMode(pinRed, INPUT);
  pinMode(pinBlack, INPUT);
  pinMode(pinWhite, INPUT);
//светодиод 
  pinMode(pinAngleStop, OUTPUT);
//пины драйвера двигателя, направление и скорость
  pinMode(angleDirection, OUTPUT);
  pinMode(angleSpeed, OUTPUT);

  Serial.begin(9600);
}
//функция вызывается из loop(), когда приходит команда с андроида
void turn(int angle) {
  digitalWrite(pinAngleStop, HIGH); //выдаем ток на провод, подключенный к плюсу
  delay(5); //немного ждем, чтобы ток "успел" дойти
  
  if(angle > 149) {
        if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinBlack) == LOW) { 
          //если достигнуто крайне правое положение, выйти из функции не подавая ток, чтобы не 
          //сжечь мотор
          return;
        }
        //если угол не максимальный, поворачиваем
        digitalWrite(angleDirection, HIGH);
        analogWrite(angleSpeed, speedTurn);
  } else if (angle < 31) { 
        if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) {
          //если достигнуто крайне левого положение, выйти из функции не подавая ток, чтобы не 
          //сжечь мотор
          return;
        }
        //если угол не максимальный, поворачиваем
        digitalWrite(angleDirection, LOW);
        analogWrite(angleSpeed, speedTurn);
  }
  digitalWrite(pinAngleStop, LOW); //убираем ток с определителя угла
  delay(5);
}

Реализация — arduino

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

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


Максимум числа светодиодов — 6, по количеству PWM выходов выбранного Ардуино.

Для завершения: необходимо подключить модуль sinezub для приема команд и отправки текущих данных на телефон через Bluetooth.

В результате появился скетч для Arduino:

Код скетча
#include <SoftwareSerial.h>

enum LedState { LED_ON, LED_OFF };
boolean isFadeMode = false;

#define LED_CNT 6
int ledPins[LED_CNT] = {11, 10, 9, 6, 5, 3}; // pwm pins
int ledBrightnessesWave[LED_CNT] = {0, 50, 100, 150, 205, 255}; // represents initial brightness for wave mode
int ledStepsWave[LED_CNT] = {-5, 5, 5, 5, 5, 5}; // represents initial change for wave mode
int ledBrightnesses[LED_CNT]; // represents brightness for pin
int ledSteps[LED_CNT]; // represents change, each pin gets its own change so it wont interfere with any other pin

int ledSpeed = 50;
int maxLedBrightness = 255;
int ledBrightnessesConst = 255; // represents brightness for pins in no wave or fade mode

LedState led_state;

#define rxPin 2
#define txPin 4

#define SPEED_PREFIX 'G'
#define SPEED_PREFIX_MAX 'P'
#define BRIGHTNESS_PREFIX 'Q'
#define BRIGHTNESS_PREFIX_MAX 'Z'

#define MIN_SPEED_DELAY 5
#define MAX_SPEED_DELAY 100
#define MIN_BRIGHTNESS 5
#define MAX_BRIGHTNESS 255

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()
{
  for (int i = 0; i < LED_CNT; i  )
  {
    pinMode(ledPins[i], OUTPUT); //set pwm pins to output

    //copy initial values
    ledBrightnesses[i] = ledBrightnessesWave[i];
    ledSteps[i] = ledStepsWave[i];
  }
  
  led_state = LED_ON;
  
  Serial.begin(9600);

  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);

  mySerial.begin(115200);
}

int getBrightness(int b)
{
  return b;
}

int valueToDelay(int value)
{
  return MIN_SPEED_DELAY   (MAX_SPEED_DELAY - MIN_SPEED_DELAY) * value / (SPEED_PREFIX_MAX - SPEED_PREFIX);
}

int valueToBrightness(int value)
{
  return MIN_BRIGHTNESS   (MAX_BRIGHTNESS - MIN_BRIGHTNESS) * value / (BRIGHTNESS_PREFIX_MAX - BRIGHTNESS_PREFIX);
}

void recalculateBrightness(int brValue)
{
  ledBrightnessesConst = valueToBrightness(brValue);
}

void ledFade()
{
  if (led_state == LED_OFF)
  {
    for (int i = 0; i < LED_CNT; i  )
    {
      analogWrite(ledPins[i], ledBrightnessesConst); // update all pins
    }
    
    return;
  }

  String s = "###";
  for (int i = 0; i < LED_CNT; i  )
  {
    analogWrite(ledPins[i], getBrightness(ledBrightnesses[i]));

    int newBr = ledBrightnesses[i]   ledSteps[i];
    if (newBr <= 0 || newBr >= maxLedBrightness)
    {
      ledSteps[i] =- ledSteps[i]; //change direction if exceeds max/min value
    }
    else
    {
      ledBrightnesses[i] = newBr;
    }

    s.concat(ledBrightnesses[i]);
    if (i < LED_CNT - 1) //skip separator for last entity
      s.concat("-");
  }
  s.concat("***");
  
  char charBuf[1000];
  s.toCharArray(charBuf, 1000);
  mySerial.write(charBuf);
  mySerial.flush();
  
  delay(ledSpeed);
}

void loop()
{
  if (mySerial.available())
  {
    char command = mySerial.read();
    Serial.println("command is -> "   command);
    
    boolean handled = false;
    boolean changeFadeMode = false;
    
    switch (command)
    {
      case 'a':
        led_state = LED_OFF;
        handled = true;
        break;
      case 'b':
        led_state = LED_ON;
        ledSpeed = 50;
        handled = true;
        //do these lines to set wave mode
        changeFadeMode = true;
        isFadeMode = true;
        break;
      case 'c':
        led_state = LED_ON;
        ledSpeed = 30;
        handled = true;
        //do these lines to set wave mode
        changeFadeMode = true;
        isFadeMode = true;
        break;
      case 'd':
        led_state = LED_ON;
        ledSpeed = 10;
        handled = true;
        //do these lines to set wave mode
        changeFadeMode = true;
        isFadeMode = true;
        break;
      case 'e':
        led_state = LED_ON;
        changeFadeMode = true;
        handled = true;
        break;
      default:
        break;
    }
    
    if (changeFadeMode)
    {
      if (isFadeMode)
      {
        Serial.println("Set fade mode off");
        for (int i = 0; i < LED_CNT; i  )
        {
          //copy initial values
          ledBrightnesses[i] = ledBrightnessesWave[i];
          ledSteps[i] = ledStepsWave[i];
        }
      }
      else
      {
        Serial.println("Set fade mode on");
        for (int i = 0; i < LED_CNT; i  )
        {
          ledBrightnesses[i] = 0;
          ledSteps[i] = 5;
        }
      }
      isFadeMode = !isFadeMode;
    }
    else
    {
      //do nothing
    }
    
    if (!handled)
    {
      boolean isSpeedCommand = command >= SPEED_PREFIX && command <= SPEED_PREFIX_MAX;
      boolean isBrCommand = command >= BRIGHTNESS_PREFIX && command <= BRIGHTNESS_PREFIX_MAX;
      
      if (isSpeedCommand)
      {
        led_state = LED_ON;
        int speedValue = command - SPEED_PREFIX; //from 0 to 9
        ledSpeed = valueToDelay(speedValue);
      }
      if (isBrCommand)
      {
        led_state = LED_OFF;
        int brValue = command - BRIGHTNESS_PREFIX; //from 0 to 9
        recalculateBrightness(brValue);
      }
    }
  }
  
  ledFade();
}

В результате команды изменяется либо скорость, либо яркость светодиодов. В приведенных ниже примерах я выключаю подсветку и изменяю скорость в зависимости от полученной команды. Строка чисел типа ###0-50-100-150-200-250*** посылается контроллером на сопряженное устройство каждый цикл. Числа представляют собой значения яркости шести светодиодов до максимального значения 255.

Схема:
Урок 15. Bluetooth модуль HC-06 подключение к Arduino. Управление устройствами с телефона. - Описания, примеры, подключение к Arduino

Управляем arduino через bluetooth hc-06, с компьютера или смартфона

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

HC-06

Сам модуль Bluetooth. В таком виде его можно использовать в различных устройствах, где он впаивается непосредственно в плату. Модуль имеет 34 вывода, среди которых: контакты для подключения к компьютеру через UART, способ передачи звука PCM (импульсно-кодовая модуляция), аналоговые вход и выход, контакты для подключения к разъему USB, интерфейс SPI, а также порты общего назначения. На самом деле не все эти контакты доступны для использования, доступ к звуковым выходам (5-8), аналоговым входам и выходам (9, 10), а также к группе контактов для подключения к USB (15, 20) заблокирован.

Включая в себя чип BC417 (BlueCore4-External device), HC-06 использует Bluetooth V2.0. Кроме того, плата имеет кварц 26 МГц и 8 МБ флэш-памяти. Питание осуществляется от напряжения 3,3 В.

HC-06

Для своих конструкций удобнее всего использовать модуль с макетной платой, на которой выведены необходимые контакты для подключений, а так же имеется стабилизатор напряжения, который позволяет питаться от 5 вольт.
При покупки подобных модулей, можете столкнуться с различными их маркировками. По сути это одно и то же устройство, отличающееся прошивкой, которая определяет режим модуля (master / slave).

HC-05

Ключевое различие между HC-05 и HC-06 заключается в том, что HC-05 может использоваться в качестве ведущего или ведомого устройства. Режимы устанавливаются с помощью AT-команд. На плате модуля имеется кнопка, переключающая режим ввода в AT. Этот режим позволяет модулю обнаружить такое устройство и инициировать связь с ним. На модуле HC-06 может быть только один ведомый режим.

Кроме того, существуют модели HC-03 и HC-04, однако они предназначены для промышленного использования.

Маркировка контактов на плате HC-06.

HC-06

STATE – проверка состояние модуля. На этом контакте дублируется сигнал, который отображает встроенный на плате светодиод. Если он очень быстро мигает, значит модуль находится в активном состоянии. В режиме установления связи ток составляет 30-40 мА. Когда модуль устанавливает связь с другим устройством, светодиод просто горит. В режиме передачи данных ток составляет 8 мА.
RX – получение данных.
TX – передача данных.
GND – подключается к земле.
5V – питание 5 Вольт
EN –  включение / выключение модуля. Если на этот контакт подать логическую 1 (5 вольт),  модуль выключится, если подать логический 0 или не подключаться к этому контакту, модуль будет работать.

H C-06 автоматически распознается другими устройствами как “HC-06” с пин-кодом “1234”.

Если вы хотите изменить эти данные, вам следует подключить модуль к компьютеру и ввести AT-команды с помощью терминальной программы. Это можно сделать с помощью адаптера USB – COM с TTL-уровнями. Для этой цели подойдет адаптер PL2303HX, CH340G или аналогичный. Это означает, что драйвер USB-адаптера уже установлен на компьютере.

HC-06 UART

Контакты следует подключить следующим образом:

Красный светодиод на плате модуля Bluetooth начнет быстро мигать, если эта сборка подключена к компьютеру. Для ввода AT-команд можно использовать любую терминальную программу; я использую для этого Arduino IDE.

Arduino IDE

Выберите номер виртуального COM-порта, в моем случае COM44, который подключен к USB-адаптеру. Должен открыться “Монитор последовательного порта”.

Arduino IDE

После ввода команды “AT” заглавными буквами, если устройство успешно подключено, ответ должен быть “OK”. Скорость связи по умолчанию – 9600 бод.

Если вы введете “AT VERSION”, ответом будет “OKlinvorV1.8”.

С помощью команды “AT NAMEyyy”, где yuu – произвольный латинский символ, мы можем изменить имя, по которому будет найден наш модуль bluetooth (по умолчанию HC-06). В моем примере я ввел “AT NAMEfox”, и ответом было OKsetname.

Вы можете изменить свой пин-код (по умолчанию 1234) с помощью AT-команды “AT PINxxxxx”. Ответом будет “OKsetPIN”.

Команда “AT BAUDx”, где x – значение от 1 до 9, может быть использована для изменения скорости передачи данных (по умолчанию 9600).

1 – 1200
2 – 2400
3 – 4800
4 – 9600
5 – 19200
6 – 38400
7 – 57600
8 – 115200
9 – 230400

Допустим, если ведём команду «AT BAUD8», где 8 — скорость 115200 бод, в ответ возвратится «OK115200».

Подключение HC-06 к Arduino.

Пример 1. С помощью этого скетча мы сможем включать и выключать светодиод, подключенный к выводу 13 Arduino через модуль Bluetooth.

Arduino led

Для подключения этого светодиода, если его нет на плате, подключите его к контакту 13 схемы, а номинал резистора можно взять от 220 до 1 кОм.

Arduino HC-06

При обесточенном Arduino подключите HC-06. Вывод RX Arduino подключается к выводу TX модуля (вывод 1 платы UNO), а вывод TX подключается к выводу RX. Источник напряжения 5 В и GND подключается к соответствующим выводам Arduino.

Arduino HC-06

Конструкция собрана. Светодиод на HC-06 должен начать быстро мигать, как только на Arduino будет подано питание.

Arduino управляется компьютером при помощи HC-06.

На примере Windows XP я покажу пример. Любой USB-адаптер Bluetooth должен быть подключен к компьютеру, а драйверы должны быть установлены.

Bluetooth

Как я уже упоминал, я использовал этот адаптер.

Bluetooth

Когда устройство подключено к ПК, в трее (рядом с часами) появляется соответствующий значок.

Bluetooth

Используйте контекстное меню, чтобы выбрать “Добавить устройство Bluetooth”, щелкнув правой кнопкой мыши на этом значке.

Bluetooth

Нажмите “Далее” после выбора радиокнопки “Устройство установлено и готово для обнаружения”.

Bluetooth

Наш модуль Bluetooth появится в списке обнаруженных устройств под новым именем. Выберите его и нажмите Далее.

Bluetooth

Введите пин-код для подключения к модулю, выбрав “Использовать ключ доступа из документации”. По умолчанию у меня стоял код 1234, но я изменил его на 9999. Нажмите “Далее”.

Bluetooth

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

Как обычно, откройте терминальную программу, на этот раз Arduino IDE. Выберите исходящий порт (у меня COM45), откройте “Serial Port Monitor” и введите поочередно команды “1” и “0”. Светодиод загорается при команде “1”, гаснет при команде “0”.

С помощью HC-06 вы можете управлять Arduino с помощью смартфона.

Большинство современных смартфонов имеют встроенную функцию Bluetooth. Остается только установить программу-терминал. В частности, для ведения этого блога я использовал Lumia 640 DS, оснащенный Windows Mobile 10. В качестве терминальной программы я использую “BT Terminal”. Приложение Bluetooth Terminal доступно для устройств Android.

Владельцы смартфонов Apple не смогут использовать модули Bluetooth HC-05 и HC-06 (Bluetooth V2.0), они должны использовать адаптеры с BLE (bluetooth low energy), спецификация Bluetooth 4.0. Ярким примером является модуль HM-10.

Bluetooth

Использование Bluetooth для сопряжения устройства HC-06 со смартфоном.

1. В «Параметрах» смартфона выбираем пункт «Устройства».
2. Далее «Bluetooth и другие устройства».
3. Включаем ползунком блютуз смартфона и нажимаем на «плюс в квадрате» для поиска и добавления нового Bluetooth-устройства, в нашем случае  HC-06.

Bluetooth

4. В разделе «Добавить устройство» выбираем «Bluetooth».
5. Смартфон произведёт поиск Bluetooth-устройств находящихся в округе и отобразит их имена. В моём примере найден модуль HC-06, который я переименовал в «fox».

Bluetooth

6. Необходимо ввести пин-код устройства, которое мы хотим подключить, а затем нажать кнопку “Подключить”.

BT Terminal

Запустите терминальную программу “BT Terminal”. В списке можно выбрать модуль HC-06, подключенный к смартфону.

BT Terminal

Появится поле и кнопка для отправки команд. Когда вы вводите “1” и “0”, вы увидите, как светодиод на выводе 13 либо загорается, либо гаснет.

Пример 2. Я хочу попробовать управлять тремя светодиодами с помощью Bluetooth-модуля HC-06, подключив три светодиода к Arduino.

Arduino leds

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

int data;
int LED1 = 9;
int LED2 = 11;
int LED3 = 13;
void setup()
{
Serial.begin(9600);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
}
void loop()
{
if (Serial.available())
{
data = Serial.read();
if (data == ‘1’)
{
digitalWrite(LED1, HIGH);
}
if ( data == ‘2’)
{
digitalWrite(LED1, LOW);
}
if (data == ‘3’)
{
digitalWrite(LED2, HIGH);
}
if ( data == ‘4’)
{
digitalWrite(LED2, LOW);
}
if (data == ‘5’)
{
digitalWrite(LED3, HIGH);
}
if ( data == ‘6’)
{
digitalWrite(LED3, LOW);
}
}
}

При заполнении скетча модуль HC-06 должен быть отсоединен от Arduino, поскольку и компьютер, и Bluetooth работают через UART. Один UART Arduino не может использоваться более чем одним устройством.

Запустите терминальную программу и попробуйте скетч в действии. Смысл управления светодиодами заключается в следующем, есть три светодиода, каждый из которых может быть либо включен, либо выключен. Таким образом, получается 6 команд. Команды – это числа от 1 до 6 (1, 3, 5 – включить 1, 2 и 3 светодиоды. 2, 4, 6 – выключить). Числа можно вводить по одному или в комбинациях. 145 – зажечь первый, погасить второй, зажечь третий.

Пример 3. Мы можем подключить релейный модуль из статьи “Подключение силовой нагрузки к Arduino, через релейный модуль” и управлять силовой нагрузкой с помощью Bluetooth. По сути, мы получим “умную розетку”. Релейный модуль позволяет управлять нагрузками (лампочками, насосами, вентиляторами) дистанционно.

Arduino smart house

Эскиз данного примера будет доступен в ближайшее время.

Управляем arduino-машинкой при помощи g-сенсора со смартфона

///////////////////////////////////////////// 

//        RemoteXY include library         // 

///////////////////////////////////////////// 

/* определение режима соединения и подключение библиотеки RemoteXY */ 

#define REMOTEXY_MODE__SOFTWARESERIAL 

#include <SoftwareSerial.h> 

#include <RemoteXY.h> 

/* настройки соединения */ 

#define REMOTEXY_SERIAL_RX 2 

#define REMOTEXY_SERIAL_TX 3 

#define REMOTEXY_SERIAL_SPEED 9600 

/* конфигурация интерфейса  */ 

unsigned char RemoteXY_CONF[] = 

{ 3,0,23,0,1,5,5,15,41,11

,43,43,1,2,0,6,5,27,11,5

,79,78,0,79,70,70,0 }; 

/* структура определяет все переменные вашего интерфейса управления */ 

struct { 

    /* input variable */

signed char joystick_1_x; /* =-100..100 координата x положения джойстика */

signed char joystick_1_y; /* =-100..100 координата y положения джойстика */

unsigned char switch_1; /* =1 если переключатель включен и =0 если отключен */

    /* other variable */

unsigned char connect_flag;  /* =1 if wire connected, else =0 */

} RemoteXY; 

///////////////////////////////////////////// 

//           END RemoteXY include          // 

///////////////////////////////////////////// 

/* определяем пины управления правым мотором */

#define PIN_MOTOR_RIGHT_UP 7

#define PIN_MOTOR_RIGHT_DN 6

#define PIN_MOTOR_RIGHT_SPEED 10

/* определяем пины управления левым мотором */

#define PIN_MOTOR_LEFT_UP 5

#define PIN_MOTOR_LEFT_DN 4

#define PIN_MOTOR_LEFT_SPEED 9

/* определяем пин управления светодиодом */

#define PIN_LED 13

/* определяем два массива с перечислением пинов для каждого мотора */

unsigned char RightMotor[3] = 

{PIN_MOTOR_RIGHT_UP, PIN_MOTOR_RIGHT_DN, PIN_MOTOR_RIGHT_SPEED};

unsigned char LeftMotor[3] = 

{PIN_MOTOR_LEFT_UP, PIN_MOTOR_LEFT_DN, PIN_MOTOR_LEFT_SPEED};

/*

управление скоростью мотора

motor – ссылка на массив пинов

v – скорость мотора, может принимать значения от -100 до 100

*/

void Wheel (unsigned char * motor, int v)

{

if (v>100) v=100;

if (v<-100) v=-100;

if (v>0) {

digitalWrite(motor[0], HIGH);

digitalWrite(motor[1], LOW);

analogWrite(motor[2], v*2.55);

}

else if (v<0) {

digitalWrite(motor[0], LOW);

digitalWrite(motor[1], HIGH);

analogWrite(motor[2], (-v)*2.55);

}

else {

digitalWrite(motor[0], LOW);

digitalWrite(motor[1], LOW);

analogWrite(motor[2], 0);

}

}

void setup()

{

/* инициализация пинов */

pinMode (PIN_MOTOR_RIGHT_UP, OUTPUT);

pinMode (PIN_MOTOR_RIGHT_DN, OUTPUT);

pinMode (PIN_MOTOR_LEFT_UP, OUTPUT);

pinMode (PIN_MOTOR_LEFT_DN, OUTPUT);

pinMode (PIN_LED, OUTPUT);

  /* инициализация модуля RemoteXY */

RemoteXY_Init ();

}

void loop()

{

/* обработчик событий модуля RemoteXY */

RemoteXY_Handler ();

  /* управляем пином светодиода */

digitalWrite (PIN_LED, (RemoteXY.switch_1==0)?LOW:HIGH);

  /* управляем правым мотором */

Wheel (RightMotor, RemoteXY.joystick_1_y – RemoteXY.joystick_1_x);

/* управляем левым мотором */

Wheel (LeftMotor, RemoteXY.joystick_1_y   RemoteXY.joystick_1_x);

}

Смотрите про коптеры:  CxemCAR на Arduino - Bluetooth управление машинкой с Android
Оцените статью
Радиокоптер.ру
Добавить комментарий