Телефонуйте » (+38) 096 227 41 41

Метою уроку є вивчення основ встановлення з'єднання між Arduino Uno і телефоном Android за допомогою Bluetooth. Смартфони мають багато цікавих функцій (камера, динаміки, мікрофон, хороший екран, щоб показати дані з датчиків, Wi-Fi адаптер...), які зроблять чудові доповнення до будь-якого проекту Arduino.

В попередньому уроці ми розглядали налаштування з'єднання Bluetooth між Arduino Uno і ПК за допомогою модуля Bluetooth. Апаратно Arduino має вбудовану підтримку для послідовного зв'язку на контактах 0 (RX) і 1 (TX). Ми підключали модуль Bluetooth до Arduino через ці виводи.
Є кілька мінусів такого підключення Bluetooth:

  • ·    Ви більше не зможете використовувати послідовну консоль IDE Arduino для налагодження коду. Це тому, що апаратне забезпечення Arduino, яке використане для послідовного зв'язку з модулем Bluetooth, необхідне також для встановлення зв'язку з комп'ютером через порт USB.
  • ·    З тієї ж причини, ви не можете запрограмувати Arduino, в той час як модуль Bluetooth під’єднаний і включений.
  • ·    І останнє, але не менш важливе: ви не можете використовувати послідовну консоль IDE Arduino для налаштування деяких параметрів модуля Bluetooth (наприклад, імені, швидкості передачі даних за замовчуванням, коду підключення і т.д.).

Бібліотека SoftwareSerial допомагає вирішити ці проблеми і поставляється попередньо встановленою з останньою версією Arduino IDE.

Під’єднання Bluetooth з використанням бібліотеки SoftSerial

Вбудована підтримка послідовної передачі виконана за допомогою реалізованого на чіпі спеціального пристрою UART (universal asynchronous receiver/transmitter – універсальний асинхронний приймач/передавач). Дане обладнання дозволяє чіпу Atmega мати послідовний зв'язок навіть під час роботи з іншими завданнями, поки є вільна пам’ять серед 64 байт послідовного буфера. Але таке рішення, як зазначалось, має свої недоліки.
Бібліотека SoftwareSerial дозволяє реалізувати послідовний зв'язок через інші виводи цифрових сигналів Arduino, використовуючи програмне забезпечення для реплікації функціональності (звідси назва "SoftwareSerial"). Можна мати кілька програмних послідовних портів зі швидкістю до 115200 біт. Параметри бібіотеки дозволяють інвертувати сигнали для пристроїв, в яких цього вимагає протокол.
Змінимо схему підключення модуля Bluetooth до Arduino:

Ми знову використали модуль HC-06 Bluetooth, який дуже простий в налаштуванні для плати Arduino. Модуль призначений для бездротової передачі даних в залежному (slave) режимі. Дальність роботи модуля HC-06 може досягати 9 метрів. Якщо вам треба встановити зв’язок між смартфоном і платою Arduino, то модуль Bluetooth HC-06 буде працювати нормально. Але якщо ви хочете зв’язатися з іншою платою розробника Arduino, то знадобиться модуль HC-05, який може працювати і в режимі майста (master) і в залежному режимі.
В наведеній вище схемі виконані такі під’єднання модуля HC-06 до плати Arduino:
VCC <--> 5 В
GND <--> GND («земля»)
TXD <--> Pin 3 (буде виводом Rx приймача на Arduino)
RXD <--> Pin 4 (буде виводом Tx передавача на Arduino)
Завантажимо в Arduino тестовий скетч (включений модуль Bluetooth не повинен заважати його завантаженню):

/* Програма вмикає/вимикає світлодіод командами, надісланими через BlueTooth,
а також змінює параметри роботи BlueTooth, які котролюються з Serial Monitor
Скетч модіфікований для роботи з бібліотекою SoftwareSerial */

#include <SoftwareSerial.h>

const int rxPin = 3; // SoftwareSerial RX pin, під’єднаний до виводу TX HC-06
const int txPin = 4; // SoftwareSerial TX pin, під’єднаний до виводу RX HC-06
SoftwareSerial mySerial(rxPin, txPin); // RX, TX - створення програмного послідовного порта mySerial

const int ledPin = 13; // вивід 13, під’єднаний до вбудованого світлодіода
int state = 0;         // якщо state=1, то світлодіод увімкнений і
                       // якщо state=0, то світлодіод вимкнений
int flag = 0;          // прапор для запобігання дублювання повідомлень

void setup()
{
  Serial.begin(9600);  // встановлення швидвості передавання Serial 9600 бод

  mySerial.begin(9600); // встановлення швидкості передавання mySerial також 9600 бод
  // встановлення виводу як вихідного:
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW); // світлодіод ініціалізуємо як вимкнений
  Serial.println("Starting config"); // передача через Serial
  delay(1000);  // затримка 1 сек

  // встановлення швидкості передачі 9600 на BlueTooth
  mySerial.print("AT+BAUD4");
  waitForResponse();


  // повинна бути надіслана відповідь з OK
  mySerial.print("AT");
  waitForResponse();

  // повинна бути надіслана відповідь з версією
  mySerial.print("AT+VERSION");
  waitForResponse();

  // встановлення пін-коду в 1234 (тобто, не змінюємо код за замовчуванням)
  mySerial.print("AT+PIN1234");
  waitForResponse();

  // встановлення імені HC-06
  mySerial.print("AT+NAMEHC-06");
  waitForResponse();

  Serial.println("Done!"); // передача через Serial
}

void waitForResponse()
{

    // міст між mySerial і Serial для відображення на Serial Monitor
    delay(1000);
    while (mySerial.available())
    {
      Serial.write(mySerial.read());
    }
    Serial.write("\n");
}

void loop()
   {
// Вмикання/вимикання світлодіоду командами «0» і «1»
    // читаємо вхідний сигнал порта і зберігаємо його в змінній state
    // if(mySerial.available() > 0) // розкоментувати для роботи зі смартфона через BlueTooth

       if(Serial.available() > 0) // тест з ПК, закоментувати для роботи зі смартфона через BlueTooth
    {
    // state = mySerial.read(); // розкоментувати для роботи зі смартфона через BlueTooth

       state = Serial.read(); // тест з ПК, закоментувати для роботи зі смартфона через BlueTooth
      flag=0; // скидаємо flag а також виводимо змінну state
    }
    // якщо змінна state рівна '0', то світлодіод буде вимкнений
    if (state == '0')
    {
        digitalWrite(ledPin, LOW);
        if(flag == 0)
        {
         // mySerial.println("LED: off"); // розкоментувати для роботи зі смартфона через BlueTooth

            Serial.println("LED: off");  // тест з ПК, закоментувати для роботи зі смартфона через BlueTooth
          flag = 1;
        }
    }
    // якщо змінна state рівна '1', то світлодіод буде увімкнений
    else if (state == '1')
      {
        digitalWrite(ledPin, HIGH);
        if(flag == 0)
        {
        //  mySerial.println("LED: on"); // розкоментувати для роботи зі смартфона через BlueTooth

            Serial.println("LED: on");// тест з ПК, закоментувати для роботи зі смартфона через BlueTooth
          flag = 1;
        }
      }
}

Приєднаємось до Arduino за допомогою Serial Monitor і повинні побачити щось подібне:.

Starting config
OK9600
OK
OKlinvorV1.8
OKsetPIN
OKsetname
Done!

А за допомогою натискання клавіш «1» і «0» спробуйте вмикати і вимикати світлодіод, який розміщений на платі Arduino, що також буде відображатися в Serial Monitor:

LED: on
LED: off

Якщо все працює так, як описано, то можемо вважати налаштування Bluetooth на Arduino закінченим і перейдемо до налаштування телефону Android.

Налаштування телефону Android

  • Встановіть один з безкоштовних додатків Blueterm або Bluetooth Terminal на свій телефон Android.
  • Переконайтеся, що Bluetooth включений і дозволений на вашому телефоні. Перейдіть в меню налаштувань телефону - налаштування Bluetooth повинні бути в категорії "Бездротові мережі".

Як приклад, наводимо фотоінструкцію для телефону Samsung Galaxy на Android.
З’єднання з телефоном:

Використання простого і безкоштовного емулятора термінала Bluetooth Terminal:

Тепер можна спробувати передати зі смартфона на Arduino через Bluetooth команди AT, розглянуті в попередньому уроці.

Вимірювання температури і передача її значення через Bluetooth на Android

Залишаємо приєднаним модуль Bluetooth і додаємо датчик температури за схемою, наведеною в даному уроці. Завантажуємо в Arduino скетч:

#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const int rxPin = 3; // SoftwareSerial RX pin, під’єднаний до виводу TX HC-06
const int txPin = 4; // SoftwareSerial TX pin, під’єднаний до виводу RX HC-06
SoftwareSerial mySerial(rxPin, txPin); // RX, TX

// Шина даних приєднана до порта 2 на Arduino
#define ONE_WIRE_BUS 2

// Встановлення oneWire для з’єднання
OneWire oneWire(ONE_WIRE_BUS);

// Посилаємо запит oneWire до Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // запуск послідовного порта
   mySerial.begin(9600);
  // запуск бібліотеки
  sensors.begin();
}

void loop(void)
{
  sensors.requestTemperatures(); // Посилаємо команду для отримання температури
  mySerial.print("Temperature is: ");
  mySerial.print(sensors.getTempCByIndex(0));
  mySerial.println(" degrees Celsius ");
  delay(1000);
}

Якщо в попередньому уроці ми створювали на Python інтерфейс для відображення на екрані ПК отриманого значення температури, то для відображення температури на екрані смартфона скористаємося вже готовим додатком, наприклад, DataViz:

Програма налаштована отримувати послідовно передані дані на смартфон через Bluetooth від адаптера HC-06 і відображає показання температури з отриманого рядка, наприклад, в такому вигляді: "Temperature is: 29.7 degrees Celsius".

Керування світлодіодною стрічкою на Arduino за допомогою Android

Ще один цікавий проект можна побудувати, модифікувавши розглянутий раніше проект керування світлодіодною стрічкою, під’єднаною до Arduino, щоб керувати діода зі смартфона.
Умовно схему підключення світлодіодної стрічки та модуля Bluetooth до Arduino можна зобразити так:

Для підключення використаємо польові транзистори, як на першому уроці, в якому ми детально розглядали підключення світлодіодної стрічки, тому не будемо його зараз описувати.
Для керування светлодіодами стрічки використаємо скетч:

#include <SoftwareSerial.h>

const int rxPin = 3; // SoftwareSerial RX pin, під’єднаний до виводу TX HC-06
const int txPin = 4; // SoftwareSerial TX pin, під’єднаний до виводу RX HC-06
SoftwareSerial mySerial(rxPin, txPin); // RX, TX

unsigned long x;
int REDPIN = 9;    // червоні світлодіоди підключаємо до виводу 9
int GREENPIN = 10; // зелені світлодіоди підключаємо до виводу 10
int BLUEPIN = 11;  // сині світлодіоди підключаємо до виводу 11
int a,b,c = 0;
 
void setup()
{
  mySerial.begin(9600);
  mySerial.setTimeout(4);
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
}
 
void loop()
{
 if (mySerial.available())
 {
  x = mySerial.parseInt();
  if (x>=0 && x<=299) {
    a = x;
    analogWrite(REDPIN, a);
    }
 if (x>=300 && x<=599) {
    b = x-300;
    analogWrite(BLUEPIN, b);
    }
  if (x>=600 && x<=899) {
    c = x-600;
    analogWrite(GREENPIN, c);
    }
 }
}

Тепер завантажимо на смартфон додаток Bluetooth Servo RGB Arduino для керування через Bluetooth RGB-стрічкою.

На жаль, діапазон чисельних значень для передачі інтенсивності кольору складає 300 значень, а не 256, тому при керуванні світлодіода після перевищення значення вхідого 255 інтенсивність кольору різко зменшується.

За матеріалами: github.com, zelectro.cc,dwightreid.com

Новини

  • SDR в IoT

    iotSDR пропонує платформу розробок для IoT-радіо та мережевих доменів. На платі два передавачі Microchip AT86RF215, для вводу-виводу модему на Xilinx ZYNQ SoC, приймач GNSS MAX2769 для GPS, Galileo, BieDou та Glonass. Плата сумісна з ПЗ GNURadio SDR. Дозволяє розробити протоколи фізичного рівня LoRa, SigFox, WightLess, Bluetooth, BLE, 802.15.4, ZigBee тощо для IoT, або шлюз IoT через TheThingsNetwork, LPWAN або Google Thread. Пам'ять EEPROM: 1x AT24MAC602 , flash-пам'ять: 1x QSPI 128 Мб, RAM: 256 MБ DDR3,слот для Micro SD карти, входи/виходи: 2x 8-бітних інтерфейси PL, інтерфейс 8-бітного PS, Gigabit Ethernet, USB 2.0 (USB3310), USB 2.0 (CP2104), 2x SMA RF-роз'єми для приймача діапазонів IoT, 2x SMA RF-роз'єми для приймача 2,4 ГГц , RF-роз'єм приймач GNSS, FPGA-роз'єм JTAG для програмування. Розміри плати: 76,2 мм x 101,6 мм.

     

    in Новини

Записатися на курс