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

Останнім часом в Інтернеті з’являється все більше проектів, які базуються на використанні Arduino і Bluetooth з’єднання. Модулі Bluetooth Serial для DIY-пристроїв широко представлені в продажі за ціною від 5 до 10 доларів за модуль.

Підключення модуля Bluetooth до Arduino Uno

Модуль Bluetooth спілкується з Arduino за допомогою послідовного з'єднання. Він має чотири виводи, які будемо використовувати:

  1. • VCC використовується для живлення модуля - підключається до виводу 5В
  2. • GND - контакт заземлення. Повинен бути з'єднаний з виводом Ground
  3. • TXD використовується для передачі даних від модуля до Arduino. Він повинен бути підключений до виводу RX в Arduino, яка є контактом 0 у випадку Uno.
  4. • RXD використовується для отримання даних з Arduino. Повинен бути підключений до виводуTX Arduino, який є контактом 1 у разі Arduino Uno.

Інші контакти модуля Bluetooth, якщо такі є, ми використовувати не будемо.
На модулі, як ви можете бачити на фотографії вище, вхід TX розрахований на 3,3 В. Це означає, що, хоча ми можемо живити модуль від 5 В з Arduino, лінії зв'язку від і до модуля повинні бути в 3,3 В.
Відправка даних з модуля Bluetooth (через контакт модуля TX) не буде проблемою, так як вхід RX Arduino буде інтерпретувати сигнал 3,3 В від модуля Bluetooth правильно.
Для отримання даних від Arduino ми повинні зробити трохи більше роботи. Вивід RX Arduino Uno працює на 5 В, так що ми будемо посилати більш високу напругу на вхід RX модуля Bluetooth, ніж рекомендовано на модулі. Це може призвести до пошкодження модуля Bluetooth!

Багато онлайнових підручників припускають, що це не проблема, і можна безпечно підключити виводи TX/RX модуля Bluetooth безпосередньо до Arduino. Не варто ризикувати своїм модулем Bluetooth. Щоб убезпечити себе, використайте два резистори для створення подільника напруги і зменшення напруги сигнального виводу TX Arduino від 5 В до приблизно 3,3 В.
На схемі використані резистори 20кОм і 10 кОм, але ви можете замінити на інші значення, але так, щоб отримати Vout близько 3,3 В, на основі рівняння для подільника напруги на схемі нижче:

У схемі вище, ми маємо R1 = 10кОм і R2 = 20кОм і Vin = 5 В. Для Vout отримуємо: Vout = 5В x 20кОм / (20кОм + 10кОм) = 5В x 20кОм/30кОм = 5В x 2/3 = 10В/3 = 3.33 В.
Власне, ви можете використовувати будь-яку іншу комбінацію резисторів, але R2 повинно мати в два рази менший опір, ніж R1.

Налаштування комп’ютера з модулем Bluetooth

Наступним кроком є підключення до плати Arduino за допомогою Bluetooth. Для цього від'єднайте USB-кабель від Arduino і підключіть до Arduino живлення від окремого джерела. При подачі живлення на Arduino червоний світлодіод на модулі Bluetooth повинен блимати.
Якщо у вашому комп’ютері немає вбудованого блютуз, то можна скористатися модулем блютузом у вигляді флешки.
Післяустановки драйверів можно приступати до работи.
Йдемо в панель керування, клікаємо ярлик блютуза і вибираємо "Показати пристрої Bluetooth":

Комп’ютер виконає пошук і ви побачите свій модуль. Натискуємо "Далі":

Вибираємо другий варіант - "Введіть код утворення пари пристрою":

Для HC-06 це код 1234:

Завершується все таким зображенням:

Далі випливає віконце:

А за ним ще одне:

Перший етап налаштування завершений.
Важливо не забути, яким COM-портом у вас визначився блютуз. Це завжди можна подивитися, виконавши наступні дії:

Як бачимо, в даному випадку використаний COM21.

Прості скетчі для Arduino

Тепер ви можете працювати з Arduino IDE так, як ніби плата Arduino безпосередньо підключена до комп'ютера. Можете підключити свою плату Arduino до зовнішнього джерела живлення і використовувати з'єднання Bluetooth для завантаження скетчів. Спробуйте відкрити скетч "Blink" і натисніть на завантаження в Arduino: через деякий час скетч повинен завантажитись (це займає більше часу, ніж за допомогою кабелю USB) і світлодіод на платі Arduino Uno повинен почати блимати.
Тепер створіть і завантажте в Arduino простий скетч:

void setup()
{
    Serial.begin(9600);
    pinMode(13, OUTPUT);
}

void loop()
{
    if (Serial.available() > 0) {
        char ch = Serial.read();
        Serial.print("Received: ");
        Serial.println(ch);
        if (ch == 'a') {
            digitalWrite(13, HIGH);
        }
        else {
            digitalWrite(13, LOW);
        }
    }
}

Функція setup не робить нічого особливого: задає швидкість передавання даних та встановлює вивід 13 як вихідний.
У функції loop представлений умовний тип оголошення if для C++. Умова корисна, коли ви хочете, щоб програма зробила щось тільки тоді, коли умова істинна.
Те, що йде після ключового слова if, є умовою, взятою в дужки. У даному скетчі умова, яку перевіряємо це Serial.available() > 0. Щоб перевіритии, істинна ця умова є чи ні, Arduino викликатиме функцію Serial.available, яка повертає кількість байтів даних, які були отримані через послідовний порт, і порівняє це число з 0. Якщо кількість доступних байтів більша, ніж 0, то умова істинна і будуть виконані команди, які знаходяться між відкритими і закритим  фігурними дужками. Якщо умова не виконується, то вся група команд у фігурних дужках буде пропущена.
Тобто, функція Serial.available повертає позитивне число тільки тоді, коли майстер на іншому кінці послідовного зв'язку послав дані. Вказуючи if Serial.available() > 0  в C++ означає на звичайній мові, що "якщо є доступні дані". Якщо умова не виконується (тобто false), то це означає, що в даний момент дистанційно не передається ніяких даних, так що в цьому випадку не треба нічого робити і пропустити решту.
Так що ж відбувається, коли умова істинна?
Найперше, що ми робимо всередині блоку if – це зчитується байт з послідовного порту, використовуючи функцію Serial.read. Зверніть увагу, що використовується змінна для зберігання результату, але цього разу вона оголошена з типом char, який в C++ є типом, який представляє собою один байт даних.
Після того, як ми отримали байт даних, виводимо його, використовуючи функції print і println.
Після того? як роздрукували дані, переходимо до іншої умови. На цей раз умова ch == 'a', яка буде істинна тільки тоді, коли отримані дані являють собою малу літеру a. У цьому випадку ми встановлюємо на виводі 13 високу напругу (HIGH), яка вмикає світлодіод.
Оголошення else, що слідує далі, є розширенням if. Вище вже говорили, що коли умова хибна, то команди всередині фігурних дужок пропускаються. Коли є блоки з умовами if і else, то умова визначає, який з двох блоків виконується.
Отже, коли Arduino отримує a, то вмикається світлодіод на виводі 13. Будь-які інші отримані дані, вимкнуть його. За допомогою цього простого скетчу ми побудували пульт дистанційного керування для світлодіода на платі Arduino через блютуз!
Якщо виникає проблема з завантаженням скетча в Arduino, то рекомендується відключити виводи RX і TX, на період завантаження нового скетча.
Перевіряємо скетч за допомогою Arduino Serial monitor, встановивши спочатку швидкість передачі даних 9600 бод.

Виконання простих команд АТ

Виконаємо конфігурацію модуля HC-06 Bluetooth за допомогою AT команд, основні з яких зведено в таблицю:

Врахуємо, що HC-06 має таку конфігурацію за замовчуванням:

  1. • Назва / ID: linvor
  2. • Швидкість передачі даних: 9600
  3. • Сполучення код / пароль: 1234
  4. • Немає контролю парності

Тестування зв'язку з модулем:
1. Відкрийте Arduino Serial Monitor. переконайтеся, що вибрали правильний порт і швидкість передачі 9600.
2. Ви повинні побачити текст: Type AT commands!, Якщо ні, то щось не так, і ви повинні повторно перевірити налаштування.
3. Введіть AT в полі введення Serial Monitor Arduino IDE і натисніть кнопку Send (Надіслати). Ви повинні побачити відповідь: ОК. Тепер ви готові змінити налаштування модуля.
4. Наберіть AT+VERSION без пробілів в полі введення Serial Monitor Arduino IDE і натисніть кнопку Надіслати. Ви повинні отримати відповідь, яка буде мати ім'я модуля і версію, наприклад, OKlinvorV1.8.
5. Одним з найбільш корисних атрибутів є швидкість передачі даних Bluetooth. Ви можете встановити її, посилаючи команду у вигляді AT+BAUD4, де останнє число (4 в цьому випадку) визначає швидкість.
Перевірте, яка максимальна швидкість передачі даних підтримується.

Використання емулятора терміналу для передачі через послідовний порт

Не завжди можливо і зручно використовувати Serial Monitor Arduino. У цьому випадку ви повинні встановити програму-емулятор терміналу. Це необхідно тому, що починаючи з ОС Vista, Windows не має вбудованого терміналу. Як правило, це такі безкоштовні програми як Tera Term або Putty. 
Розглянемо як працювати з Putty.
Завантажте Putty, якщо програма ще не встановлена на вашому комп'ютері. Запустивши Putty, ви отримаєте екран входу в систему:
 
 
Виберіть використання режиму послідовного порта (Serial), введіть правильне значення COM-порта. (Ви можете знайти його на вкладці властивостей пристрою Bluetooth у вікні пристроїв Windows, як було показано вище)
Встановіть швидкість 9600 бод. Натисніть кнопку Open (Відкрити). Можна перевірити введені при налаштуванні порта дані:
 
 
Якщо все працює правильно, то з'явиться повітряна куля в кутку екрану і буде запрошений PIN-код, який ви не ввели при з’єднанні. Введіть "1234".
Putty може отримувати значення, наприклад, від датчика. Ви їх правильно побачите. Термінал Putty відображає тільки те, що ви отримуєте назад через послідовний порт, а не те, що ви посилаєте. Якщо вам потрібно відправити велике повідомлення Arduino, наприклад, скетч, то рекомендується його скопіювати та вставити у вікно.
 

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

Arduino вимірює температуру за допомогою цифрового датчика температури DS18B20 і робить його доступним через Bluetooth, створюючи свого роду віддалений монітор температури. Значення температури потім передаються через послідовний порт Arduino (контакт 0 і PIN 1) до модуля Bluetooth Arduino. Блок-схема системи:

Цифровий датчик температури DS18B20 є ідеальним для любителів і деяких промислових додатків. Співтовариство датчиків Arduino вже має бібліотеки для взаємодії з цим датчиком, що дозволяє легше інтегрувати його в проекти.
Модуль Bluetooth Arduino працює як прозоре посиланню і просто передає те, що відправляється на послідовний порт з парним Bluetooth приймачем. Показання приймача Bluetooth відображається за допомогою стандартного додатку терміналу Bluetooth.
Код скетчу Arduino:

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

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

// Встановлення oneWire для з’єднання з будь-яким пристроєм OneWire(а не лише з датчиками температури Maxim/Dallasre)
OneWire oneWire(ONE_WIRE_BUS);

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

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

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

Створення інтерфейсу на Python для відображення температури


Нарешті, ми побудуємо додаток, який працюватиме на комп'ютері, щоб відправляти запит для отримання з плати Arduino нового виміру, приймати дані та відображати їх на екрані. Виберемо Python для реалізації інтерфейсу, бо він досить легко взаємодіє з послідовним портом за допомогою PySerial і також легко побудувати інтерфейс з Tkinter, який за умовчанням встановлюється разом з Python.
Код на Python, збережений у файлі «python sensor_gui.py»:

# Графічний інтерфейс користувача для датчика Bluetooth

# Імпорт
import time
import serial
from Tkinter import *

# Параметри послідовного порта
serial_speed = 115200
serial_port = '/dev/cu.AdafruitEZ-Link06d5-SPP'

# Перевірка з’єднання USB-Serial
# serial_port = '/dev/tty.usbmodem1421'

ser = serial.Serial(serial_port, serial_speed, timeout=1)

# Основний додаток Tkinter
class Application(Frame):

    # Вимірювання датчиком
    def measure(self):

        # Запит даних і читання відповіді
        ser.write("m")
        data = ser.readline()

        # Якщо відповідь отримана, то оброблення та відображення даних
        if (data != ""):
            processed_data = data.split(",")

            self.temp_data.set(" " + str(processed_data[0]))
            self.temperature.pack()

        # Затримка в 1 секунду між вимірюваннями
        self.after(1000,self.measure)

    # Створення елемента відображення
    def createWidgets(self):

        self.temperature = Label(self, textvariable=self.temp_data, font=('Verdana', 40, 'bold'))
        self.temp_data.set(" ")
        self.temperature.pack()

    # Ініціалізація змінних і запуск вимірювань
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.temp_data = StringVar()
        self.createWidgets()
        self.pack()
        self.measure()

# Створення і запуск GUI
root = Tk()
app = Application(master=root)
app.mainloop()

Код Python починається з ініціалізації послідовного з'єднання. Потім, ядром сценарію Python є функція measure(), яка постійно виконується кожну секунду. Потім, інша частина сценарію просто відображає ці дані в простому вікні Tkinter. Ви можете отримати повний код з репозиторію GitHub.
Нарешті, введіть "python sensor_gui.py" в терміналі. Ви повинні отримати щось подібне:

Вітаємо, ви тільки що побудували дистанційний вимірювач температури!
Звичайно, ви можете використовувати код, розглянутий в цьому проекті, для побудови взаємодії інших датчиків з комп'ютером через Bluetooth, наприклад, датчиків освітленості чи датчиків руху. Кожен новий модуль Bluetooth, який ви додаватимете, буде виглядати як новий послідовний порт на вашому комп'ютері, так що ви можете мати декілька чудових датчиків Bluetooth, розміщених у своєму будинку, щоб створити цілу систему домашньої автоматизації!

 

Новини

  • 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 Новини

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