СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

«Беспроводной модуль Bluetooth»

Категория: Прочее

Нажмите, чтобы узнать подробности

Данная методическая разработка предназначена для ознакомления учащихся с основным принципам работы и подключения беспроводного модуля Bluetooth к Arduino.

Просмотр содержимого документа
««Беспроводной модуль Bluetooth»»

Муниципальное бюджетное учреждение

дополнительного образования «Станция юных техников»

города Каменск-Шахтинский









Беспроводной модуль Bluetooth Методическая разработка

(Для учащихся робототехнических объединений учреждений дополнительного образования)







Автор: Барышев Е. В.

педагог дополнительного образования.







Пояснительная записка.

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

Методическая разработка является приложением к образовательной программе «Робототехника» и направлена на достижение следующих целей и задач:

Образовательные:

  • научить основным принципам передачи сигнала по радиоканалу, Bluetooth;

  • способствовать формированию знаний и умений в области связи.

Развивающие:

  • способствовать развитию креативности, нестандартного мышления и пространственного воображения;

  • способствовать развитию творческих способностей, фантазии и эстетического вкуса.

Воспитывающие:

  • способствовать формированию потребности к осознанному использованию компьютерных технологий при обучении в школе и в повседневной жизни;

  • воспитание чувства взаимоуважения между кружковцами.



Принцип работы и подключение bluetooth-модуля к Arduino.

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

Hам понадобится:

  • Arduino;

  • модуль bluetooth;

  • компьютер;

  • соединительные провода.

    1. Описание модуля bluetooth HC-06

Существует большое количество реализаций модулей Bluetooth. Каждая имеет свои особенности, но, в общем и целом они все очень похожи. Рассмотрим представителя bluetooth модуля семейства HC-06.

Данный модуль работает на частоте от 2,40ГГц до 2,48ГГц и поддерживает спецификацию bluetooth версии 2.1+EDR: пониженное потребление энергии, повышенный уровень защиты данных и лёгкое соединение Bluetooth-устройств. Устойчивый приём с модулем гарантирован в пределах 10 метров.

Назначение выводов bluetooth-модуля HC-06

Назначение выводов bluetooth-модуля такое:

Вывод

Назначение

VCC и GND

«плюс» и «минус» питания модуля, поддерживаются напряжения от 3,6 до 6 вольт;

TX и RX

передатчик и приёмник модуля;

MCU-INT (Status, State)

вывод статуса;

Clear (Reset)

сброс и перезапуск модуля, в данном случае осуществляется низким логическим уровнем.

Последние два вывода могут быть не задействованы; часто можно встретить модули вообще без этих выводов.

    1. Схема подключения bluetooth-модуля к Arduino

Подключим bluetooth модуль к Arduino по приведённой схеме. Обратите внимание, что передатчик (Tx) Ардуино подключается к приёмнику (Rx) модуля, и наоборот.

Схема подключения модуля bluetooth к Arduino

На выводе Status появляется высокий уровень, когда модуль сопряжён с другим bluetooth устройством, и низкий – когда не сопряжён. Можно считывать его значение, подключив к пину Arduino и назначив ему режим работы pinMode(pinStatus, INPUT) и таким образом узнавать состояние модуля. Но не на всех модулях индикатор статуса работает корректно, поэтому мы не будем его использовать в данном примере.

В результате должно получиться примерно как на фотографии.

Bluetooth модуль подключён к Arduino

    1. Скетч для Arduino для работы по bluetooth

Напишем такой скетч и загрузим в память Arduino:

const int ledPin = 13; // вывод встроенного светодиода

char incomingbyte; // переменная для данных Bluetooth

void setup()

{

pinMode(ledPin, OUTPUT);

Serial.begin(9600);

}

void loop()

{

if (Serial.available() 0) { // если порт доступен

incomingbyte = Serial.read(); // считываем с порта данные

switch(incomingbyte) {

case '1': // если приходит "1"

digitalWrite(ledPin, HIGH); //

break;

case '0': // если приходит "0"

digitalWrite(ledPin, LOW); //

break;

}

}

}



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

  1. Сопряжение с bluetooth устройством

Теперь нужно добавить bluetooth-устройство в список доверенных устройств. Включаем Bluetooth на компьютере, идём в Параметры Устройства Bluetooth.

Если в области уведомлений при включении bluetooth на компьютере появилась иконка bluetooth, то можно кликнуть по ней правой кнопкой мыши и выбрать пункт Добавление устройства Bluetooth:

Добавление устройства Bluetooth

Убеждаемся, что наш bluetooth-модуль виден компьютеру. Выбираем его из списка и нажимаем кнопку Связать. В диалоговое окно вводим пароль по умолчанию 1234. При успешном добавлении устройство появится в списке с пометкой Сопряжено.

Сопряжение с bluetooth-устройством

Пароль по умолчанию для конкретного модуля может отличаться от "1234". Эту информацию должен предоставить изготовитель (продавец) модуля.

Если вы хотите подключиться к вашему модулю bluetooth со смартфона, то порядок действий аналогичный: включить bluetooth на смартфоне, обнаружить модуль, подключённый к Arduino, выполнить сопряжение с ним.



    1. Подключаемся к bluetooth-модулюпо bluetooth с компьютера

Для подключения к bluetooth модулю можно использовать различные программы, которые могут подключаться к COM-порту. Например, такие как HyperTerminal, PuTTY, TeraTerm, Zelectro Controller и другие. Они все бесплатные и свободно распространяются в интернете.

Программа Zelectro Controller.

Zelectro Controller- приложение от команды Zelectro, облегчающее управление Arduino платой по каналам связи, эмулирующим COM порт.

Примером таких каналов связи могут служить: радиоканал (используя, например, APC220), bluetooth и другие.

Ссылка на скачивание приложения: Zelectro Controller

Исходный код можно найти здесь: github/ZController

Принцип работы довольно прост: приложение отправляет в выбранный COM порт символы при нажатии и отпускании клавиш. В Arduino скетче вы получаете и обрабатываете поступающие символы. Также реализовано решение, позволяющее корректно реагировать на потерю связи с платой. Сделано это посредством отправки контрольного символа с заданным интервалом.

Необходимо установить пакет .NET 4.0.

Перейдем непосредственно к программе. При первом запуске главное окно приложения выглядит так:

При нажатии на клавише "Добавить кнопку" отображается форма:



После добавления кнопки на форму её можно передвигать в режиме редактирования.

В качестве примера добавим несколько кнопок на форму.

При двойном нажатии на одну из новых кнопок отображается форма для редактирования:

Удалить кнопку можно нажав правой клавишей мыши и выбрав "Удалить".

Для полной очистки формы нажмите кнопку "Очистить панель" .

Чтобы перейти в рабочий режим, нажимаем кнопку смены режима .

Устанавливаем необходимую скорость, выбираем порт, нажимаем "Подключить".

Строка "Отправлено" показывает нам последний отправленный символ.

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

Теперь рассмотрим работу с контрольным символом. Зачем он, собственно, нужен?

Представим следующую ситуацию:

При получении символа 'W': Arduino включает мотор, и робот едет вперед.

При получении символа 'S': Ardunio выключает мотор.

Происходит обрыв связи после отправки символа 'W' (или устройство вышло из радиуса действия) и последующие символы 'S' уже не получить. Как результат - робот едет вперед до победного, (например, куда-нибудь в воду). Решаем проблему.

Заходим в режим настроек и нажимаем клавишу "контрольный символ" .

В открывшемся диалоге указываем символ, устанавливаем интервал отправок (от 100 до 30 000 мс). Сохраняем.

При подключении видим следующую строку в статус баре:

Теперь Z-Controller отправляет в компорт выбранный контрольный символ с заданным интервалом. В скетче мы следим за его поступлением, и если его долго нет - обрабатываем это событие.

Последним шагом рассмотрим функцию генерации скетча. Найти её можно всё в том же "Меню". Кликнув на пункт "Сгенерировать скетч" получаем заготовку под наши настройки.

Пример сгенерированного и отредактированного кода для модели робота с двумя сервомеханизмами, мотором-насосом, двумя ходовыми двигателями:



//Скетч для модели управляемый по bluetooth.

#include Servo.h // Добавляем библиотеку для работы с сервомеханизмами

Servo myservoH; // Горизонтальная серва углы от 25 до 145 (центровка 85)

Servo myservoV; // Вертикальная серва углы от 0 до 35

const int H_SERVO_PIN = 9; // Горизонтальная серва подключена к пину 11

const int V_SERVO_PIN = 10; // Пин вертикального сервопривода

const float H_L_ANGLE = 145; // Максимальные угол поворота башни налево

const float H_R_ANGLE = 25; // Максимальные угол поворота башни направо

const float H_DEF_ANGLE = 85; // Дефолтный угол (центровка)

const float V_U_ANGLE = 55; // Максимальные угол поворота башни вверх

const float V_D_ANGLE = 0; // Максимальные угол поворота башни вниз

const float V_DEF_ANGLE = 25; // Дефолтный угол (центровка)

//Размер шага V_STEP и H_STEP подбираем экспериментально для достижения нужной скорости поворота серв

const float V_STEP = 0.007; // Шаг - значение отвечающее за скорость вращения по вертикали.

const float H_STEP = 0.007; // Шаг - значение отвечающее за скорость вращения по горизонтали

float curVAngle = V_DEF_ANGLE; // Переменная текущего угла вертик. сервы

float curHAngle = H_DEF_ANGLE; // Переменная текущего угла гориз. сервы

bool moveServoVUp = false; // Флаг движения верт. сервы вверх

bool moveServoVDown = false; // Флаг движения верт. сервы вниз

bool moveServoHLeft = false; // Флаг движения гориз. сервы влево

bool moveServoHRight = false; // Флаг движения гориз. сервы вправо

const int TIMEOUT_TIME_MS = 150;

unsigned long lastPilotSymbolTime;

char symbol;

int val;

int IN1 = 5; // выводы для мотор - шилда подключены к следующим пинам Arduino

int IN2 = 6;

int IN3 = 7;

int IN4 = 8;

// Для удобства подключения, затвор мосфета подключен к аналоговому входу A0, однако,

// входы A0-A6 можно использовать как цифровые, в коде будут нумероваться как 14-19

int SHOT = 14; // пин А0 на Arduino

int LED = 4; // Используем встроенный светодиод для индикации работы

enum States

{

WAITING,

READING,

RUNNING,

ERROR,

TIMEOUT

};

States state;

States onWait();

States onRead();

States onRun();

States onError();

States onTimeout();

void performServo();

void setup()

{

Serial.begin(9600); // скорость связи с компьютером

lastPilotSymbolTime = 0;

pinMode(IN1, OUTPUT);

pinMode(IN2, OUTPUT);

pinMode(IN3, OUTPUT);

pinMode(IN4, OUTPUT);

pinMode(SHOT, OUTPUT);

myservoH.attach(H_SERVO_PIN); // устанавливаем пин как вывод управления сервой

myservoV.attach(V_SERVO_PIN);

myservoH.write(curHAngle);

myservoV.write(curVAngle);

pinMode(LED, OUTPUT); // используем 4 пин как индикатор включённой ардуины

digitalWrite(LED, HIGH);

}

void loop()

{

switch (state)

{

case WAITING:

state = onWait();

break;

case READING:

state = onRead();

break;

case RUNNING:

state = onRun();

break;

case TIMEOUT:

state = onTimeout();

break;

default:

state = onError();

}

performServo();

}

States onWait()

{

if (Serial.available() 0)

{

return READING;

}

if (lastPilotSymbolTime && (millis() - lastPilotSymbolTime TIMEOUT_TIME_MS))

{

return TIMEOUT;

}

return WAITING;

}

States onRead()

{

symbol = Serial.read();

return RUNNING; }

States onRun()

{

switch (symbol)

{

case 'W': //начало действий при полученном символе 'W' (вперед)

digitalWrite(IN1, HIGH);

digitalWrite(IN2, LOW);

digitalWrite(IN3, HIGH);

digitalWrite(IN4, LOW);

break;

case 'w': //начало действий при полученном символе 'w' (стоп вперед)

digitalWrite(IN1, LOW);

digitalWrite(IN2, LOW);

digitalWrite(IN3, LOW);

digitalWrite(IN4, LOW);

break;

case 'S': //начало действий при полученном символе 'S' (назад)

digitalWrite(IN1, LOW);

digitalWrite(IN2, HIGH);

digitalWrite(IN3, LOW);

digitalWrite(IN4, HIGH);

break;

case 's': //начало действий при полученном символе 's' (назад стоп)

digitalWrite(IN1, LOW);

digitalWrite(IN2, LOW);

digitalWrite(IN3, LOW);

digitalWrite(IN4, LOW);

break;

case 'A': //начало действий при полученном символе 'A' (влево)

digitalWrite(IN1, LOW);

digitalWrite(IN2, HIGH);

digitalWrite(IN3, HIGH);

digitalWrite(IN4, LOW);

break;

case 'a': //начало действий при полученном символе 'a' (влево стоп)

digitalWrite(IN1, LOW);

digitalWrite(IN2, LOW);

digitalWrite(IN3, LOW);

digitalWrite(IN4, LOW);

break;

case 'D': //начало действий при полученном символе 'D' (вправо)

digitalWrite(IN1, HIGH);

digitalWrite(IN2, LOW);

digitalWrite(IN3, LOW);

digitalWrite(IN4, HIGH);

break;

case 'd': //начало действий при полученном символе 'd' (вправо стоп)

digitalWrite(IN1, LOW);

digitalWrite(IN2, LOW);

digitalWrite(IN3, LOW);

digitalWrite(IN4, LOW);

break;

case 'Z': //начало действий при полученном символе 'Z' (вкл пушка)

digitalWrite(SHOT, HIGH);

break;

case 'z': //начало действий при полученном символе 'z' (выкл пушка)

digitalWrite(SHOT, LOW);

break;

// Сервы

case 'I': // servoV вверх

moveServoVUp = true;

break;

case 'K': // servoV вниз

moveServoVDown = true;

break;

case 'i': // servo V стоп

moveServoVUp = false;

moveServoVDown = false;

break;

case 'L': // servo H движется к 25

moveServoHRight = true;

break;

case 'J': // servo H движется к 145

moveServoHLeft = true;

break;

case 'l': // servo H стоп

moveServoHLeft = false;

moveServoHRight = false;

break;

case 'U':

curVAngle = V_DEF_ANGLE;

curHAngle = H_DEF_ANGLE;

myservoV.write(curVAngle);

myservoH.write(curHAngle);

break;

case 'T': //начало действий при полученном символе 'T' (остановка)

digitalWrite(IN1, LOW);

digitalWrite(IN2, LOW);

digitalWrite(IN3, LOW);

digitalWrite(IN4, LOW);

digitalWrite(SHOT, LOW);

break;

case 'P': //получили контрольный символ, не изменяйте этот код

lastPilotSymbolTime = millis();

break;

default:

return ERROR;

}

return WAITING;

}

States onError()

{

//Получены неоговоренные символы. Очищаем ввод и продолжаем.

//Здесь можно добавить какие-то действия для этой ситуации.

while (Serial.available())

{

Serial.read();

}

return WAITING;

}

States onTimeout()

{

//Действия при таймауте. Вероятно, связь утеряна, но при получении контрольного символа она будет восстановлена.

//Здесь, например, уместно выключить двигатели

digitalWrite(IN1, LOW); // На пары выводов IN поданы сигналы одинакового уровня, моторы не работают

digitalWrite(IN2, LOW);

digitalWrite(IN3, LOW);

digitalWrite(IN4, LOW);

digitalWrite(SHOT, LOW);

if (Serial.available())

{

return READING;

}

return TIMEOUT;

}

//Функция управления сервоприводами (вызывается в теле loop на каждой итерации)

//Выполняет изменения положения серв на подобранный шаг согласно установленным флагам движения

//Флаги устанавливаются согласно поступившим символам управления сервами

void performServo()

{

// Установлен флаг движения вверх и текущий угол не максимальный

if (moveServoVUp && curVAngle + V_STEP

{

// К текущему верт. углу прибавляем шаг

curVAngle += V_STEP;

}

// Установлен флаг движения вниз и текущий угол не минимален

else if (moveServoVDown && curVAngle - V_STEP = V_D_ANGLE)

{

// От текущего верт. угла отнимаем шаг

curVAngle -= V_STEP;

}

// Установлен флаг движения влево и текущий угол не максимален

if (moveServoHLeft && curHAngle + H_STEP

{

// К текущему гор. углу прибавляем гор. шаг

curHAngle += H_STEP;

}

// Установлен флаг движения вправо и текущий угол не минимален

else if (moveServoHRight && curHAngle - H_STEP = H_R_ANGLE)

{

// От текущего угла отнимаем гор. шаг

curHAngle -= H_STEP;

}

// Если было движние по вертикали

if (moveServoVUp || moveServoVDown)

{

myservoV.write(curVAngle);

}

// Если было движение по горизонтали

if (moveServoHLeft || moveServoHRight)

{

myservoH.write(curHAngle);

}

}



Главное окно приложения Zelectro Controller

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

Кнопка (символ)

Действие робота

Кнопка (символ)

Действие робота

W

Вперед

I

Башня вверх

A

Влево

J

Башня влево

S

Назад

K

Башня вниз

D

Вправо

L

Башня вправо

Z

Включение насоса

U

Центровка башни



Если всё правильно настроить и иметь в распоряжении подходящие аппараты и устройства, то можно совершать управление через Bluetooth телефоном на платформе Android в приложении Blueinput Teksoft.

Заключение

Данная методическая разработка была апробирована в робототехническом объединении учащимися 3 года обучения.



18