«Цифровая лаборатория» – общение со смартфоном по Bluetooth
В первых двух обзорах (1, 2) мы познакомили вас с составом и основными возможностями набора NR05 «Цифровая лаборатория» из серии «Азбука электронщика».
Мы неоднократно говорили, что возможности набора не исчерпываются теми опытами и проектами, которые входят обучающее пособие. Возможности набора гораздо шире!
Рассмотрим, как можно реализовать с помощью «Цифровой лаборатории» управление исполнительными устройствами с вашего смартфона или планшета.
Связь между смартфоном и модулем Ардуино, установленном на плате расширения, будем осуществлять по технологии Bluetooth. Конечно, это ограничит возможность беспроводного управления дистанцией около 10 м, но в домашних условиях часто большего и не требуется. На основе такой технологии можно успешно управлять несложными роботами или устройствами домашней автоматики, а телефон или смартфон послужат бесплатным универсальным пультом управления, который с легкостью можно перепрограммировать для наилучшего решения поставленной задачи.
В интернете можно найти несколько проектов, которые позволяют связать Ардуино с телефоном по Bluetooth, и такие проекты, безусловно, помогут освоить принцип такой связи, но основным их недостатком является невозможность приспособить функционал программы управления и ее внешний вид под конкретные нужды пользователя.
Мы пойдем по пути ненамного более сложному, но более универсальному — будем писать программы для телефона и для Ардуино самостоятельно. Это поможет вам понять принцип написания таких приложений и использовать его в своих разработках.
Для начала поясним, на каком принципе основана связь, которую мы будем использовать. Как известно, когда модуль Ардуино подключается к компьютеру, на компьютере конфигурируется виртуальный последовательный порт — COM-порт. Он используется для заливки скетчей в Ардуино, а также для обмена информацией между компьютером и микроконтроллером Ардуино. Также на плате Ардуино имеется два контакта, совмещенные с пинами D1 и D0 и обозначаемые RX и TX — соответственно передача (Receive) и прием (Transmit) стандартного интерфейса UART.
Подключив к этим контактам переходник Bluetooth-UART (в нашем распоряжении оказался модуль HC-05, он не входит в состав набора) мы получим аппаратный канал связи между устройством, подключенным по Bluetooth к переходнику, и Ардуино.
Таким образом, записывая в последовательный порт информацию из одного устройства и считывая ее другим (это можно делать в двух направлениях), мы можем организовать обмен информацией между устройствами. Скорость такого обмена между Ардуино и смартфоном в случае применения модуля HC-05 составит 57600 бод.
В качестве исполнительных элементов для наглядности задействуем RGB-светодиод и сервопривод — и тот и другой управляются сигналами ШИМ.
Приведем схему соединений компонентов проекта:
Для управления исполнительными элементами будем передавать из смартфона некую букву, которая определяет, какой элементу предназначена команда, и цифру, которая соответствует параметру команды. Параметром может быть цифра, определяющая надо ли включить или выключить какой-либо исполнительный элемент, или цифра, определяющая параметр ШИМ.
Приведем текст программы для Ардуино. Программа принимает данные из адаптера Bluetooth, расшифровывает их и выполняет необходимые действия: включает или выключает светодиод, регулирует его яркость или угол поворота вала сервопривода.
Текст снабжен достаточным числом комментариев для понимания логики работы программы:
#include
#include
// задаем 5 значений для определения номера нажатой кнопки
// в функции get_key
#define NUM_KEYS 5
int adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};
// создаем экземпляр объекта LCD-индикатора
LiquidCrystal lcd (A1, A2, A3, 2, 4, 7);
// создаем экземпляр объекта сервопривода
Servo servo;
int btValue; // переменная для хранения полученных из BT-адаптера данных
char command; // команда, поступающая из COM-порта
void setup () {
// открываем COM-порт bluetooth, очищаем его, устанавливаем тайм-аут
Serial.begin (57600);
Serial.flush ();
Serial.setTimeout (4);
// иницилиазируем LCD (16 символов, 2 строки)
lcd.begin (16, 2);
lcd.clear ();
lcd.print («Master Kit-READY»);
delay (2000);
lcd.clear ();
// назначаем 3-й цифровой пин для сервопривода
servo.attach (3);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
digitalWrite (5, LOW);
digitalWrite (6, LOW);
digitalWrite (9, LOW);
}
void loop () {
int key = get_key (); // проверяем, нажата ли кнопка на плате и определяем ее номер
// если кнопка нажата, отправляем ее номер в COM-порт
// этот номер будем считывать смартфоном
if (key > 0){
Serial.print (key);
delay (500);
}
// если есть данные, пришедшие по bluetooth, запоминаем их
if (Serial.available () > 0) {
// читаем первый байт из порта (команду)
command = Serial.read ();
// читаем цифры из порта (параметр команды)
btValue = Serial.parseInt ();
// отображаем на LCD данные, принятые по bluetooth
lcd.setCursor (0,0);
lcd.print (command);
lcd.print (' ');
lcd.print (btValue);
lcd.print (» »);
delay (10);
switch (command) {
case 'P': // если принята команда P, то переключаем цвета светодиода
pinSwitch (btValue);
break;
case 'S': // S — cлайдер 1 (ШИМ красный цвет)
pwm5(btValue);
break;
case 'M': // М — слайдер 2 (ШИМ сервопривод)
servo3(btValue);
break;
}
}
}
// функция изменяет состояние цифрового пина на противоположное
void pinSwitch (int Pin){
digitalWrite (Pin, ! digitalRead (Pin));
}
// функция изменяет ШИМ на выводе 5 (красный цвет светодиода)
void pwm5(int pwmValue){
analogWrite (5, pwmValue);
}
// функция изменяет ШИМ на выводе 3
void servo3(int angleValue){
int angle = map (angleValue, 0, 180, 5, 180);
servo.write (angle);
}
// функция возвращает номер нажатой кнопки на плате
int get_key ()
{
int input = analogRead (A6);
int k;
for (k = 0; k < NUM_KEYS; k++)
if (input < adcKeyVal[k])
return k + 1;
return 0;
}
Теперь займемся программой для смартфона, которая должна передавать команду с параметром. Воспользуемся для этого возможности проекта MIT App Inventor.
MIT App Inventor — это среда программирования, разработанная в Массачусетском Технологическом Институте (MIT). Он служит для разработки приложений для мобильных устройств (смартфонов и планшетных компьютеров), работающих на операционной системе Android.
Это не совсем язык программирования в общепринятом смысле, при его использовании не надо писать текстовый код в виде строчек. Программа формируется в виде изображенных на экране блоков, которые просто перетаскиваются и складываются, как пазлы. Если блоки подходят друг к другу по логике программы, они «слипаются», если не подходят, то их невозможно соединить. Изначально такой способ программирования разрабатывался для обучения школьников, поэтому он довольно прост для освоения. Конечно, как и в каждом языке в нем есть свои тонкости и приемы, но на сайте есть достаточно информации и примеров для освоения языка. Много программ выложено на сайте в свободном доступе.
Для того, чтобы воспользоваться средой программирования App Inventor, доступной по адресу ai2.appinventor.mit.edu, необходимо иметь аккаунт Google, с помощью которого происходит авторизация на сайте проекта. Создание программы производится в любом браузере. Компьютер, на котором работает этот браузер, должен быть постоянно подключен к интернету. Смартфон или планшет, на который будет устанавливаться созданная с помощью App Inventor программа, должен иметь версию OC Android не ниже 4.0.
В браузере вы создаете дизайн (внешний вид) и логику работы программы в виде блоков, там же готовый проект компилируется в исполняемый файл с расширением apk. Этот файл несколькими способами может быть загружен на мобильное устройство и запущен на нем. Пожалуй, самый удобный из этих способов заключается в установке на мобильное устройство приложения «MIT AI2 Companion» (оно есть в Play Market). App Inventor формирует QR-код, содержащий ссылку на созданное вами приложение, а AI2 Companion считывает и устанавливает (или обновляет) его. Вы даже можете нарисовать и загрузить свою иконку для запуска своего приложения. Таким образом, App Inventor позволяет создавать вполне работоспособные и наглядные приложения для Андроид. Пусть их код не оптимален, но удобство, простота и скорость создания таких приложений во многих случаях вполне окупают этот недостаток.
Приложение, которое работает в нашем проекте, выложено в галерею MIT AI2 Appiventor под именем BToothHC05.
Приложение позволяет найти устройство Bluetooth, подключиться к нему, оно формирует команды с параметрами и отсылает их подсоединенному устройству, считывает данные с устройства и отображает номер нажатой на плате расширения кнопки.
Дизайн экрана выглядит в соответствии со следующей картинкой:
Здесь есть элементы (зеленые квадраты, символизирующие вставленные изображения), не несущие функционала, а служащие разделителями для улучшения внешнего вида.
Если вы зашли на сайт AppInventor и находитесь в среде программирования в режиме Designer, то при щелчке правой кнопкой мыши на соответствующем элементе дизайна вы увидите справа его свойства. Перейдя в режим Blocks можно видеть все блоки разрабатываемого приложения.
Почти все блоки, по сути, представляют собой обработчики событий: нажатие кнопки на сенсорном экране, сдвиг ползунка слайдера, срабатывание таймера, изменение наклона телефона (да, в App Inventor можно задействовать практически все датчики мобильного устройства!).
Рассмотрим функциональное назначение каждого блока.
В этом блоке при нажатии на экранную кнопку Connect/Disconnect (событие Button4Connect.Click) происходит отсоединение (call BluetoothClient1.Disconnect) Bluetooth устройства, если оно уже подсоединено (BluetoothClient1.IsConnected), изменение текста на кнопке на«Disconnected» и ее цвета на серый, или вызов списка возможных устройств для подсоединения (ListPicker1.Open), если соединения нет. Как видно, блок вполне читаем с точки зрения даже начинающего программиста!
В этих трех блоках (сверху вниз):
— назначаем глобальную переменную (ее будут «видеть» все блоки) switch1 для переключения режимов работы: слайдер или наклон;
— при вызове списка устройств ListPicker1 для подсоединения требуем отображать их адреса и имена;
— при выборе из списка ListPicker1 устройства подсоединиться к нему, поменять цвет кнопки и отобразить надпись Connected to ИмяУстройства. ИмяУстройства формируется из длинной символьной последовательности; берется 8 символов начиная, с 18-го.
Изображенные выше три блока посылают через установленное соединение символы «P5», «P9» и «P6», которые должны включить или выключить соответственно красный, зеленый или синий цвет светодиода.
Когда слайдер Slider1, управляющий яркостью красного цвета светодиода сдвигается, этот блок посылает символ «S» и цифры, соответствующие положению слайдера.
Когда Slider2, который управляет сервоприводом сдвигается, если соответствующий режим включен (switch1 = 0), посылаем символ M и позицию слайдера.
Если включен режим работы от датчика наклона, блок посылает M и угол наклона + 90 градусов для управления сервоприводом.
Этот блок переключает режимы работы сервопривода от слайдера или датчика наклона и соответственно меняет надпись на кнопке (Text) и ее цвет (BackgroundColor).
Этот два блока срабатывают по событию таймера. Первый блок (Clock1) каждые 0,1 секунды (этот интервал установлен в свойствах таймера Clock1) проверяет наличие данных о том, была ли нажата кнопка на плате расширения. Если кнопка была нажата, то в течение 1 секунды (второй блок — Clock2) информация о номере нажатой кнопки отображается на экране смартфона.
Посмотрим теперь на видео, как реально происходит управление светодиодом и сервоприводом от смартфона в соответствии с нашими программами.
Таким же образом можно управлять достаточно большим числом подсоединенных к Ардуино исполнительных устройств. Это не требует какой-то огромной работы программиста при использовании AppInventor, да и программирование Ардуино достаточно просто и наглядно. Вы можете легко добавить или убрать ненужные программные блоки и получить необходимый вам функционал.
Как видно из этого материала, плата расширения из набора «Цифровая лаборатория» позволяет достаточно удобно и наглядно пользоваться дополнительными модулями Ардуино.
Приложение.
Начало работы в среде программирования MIT AppInventor.
Как мы уже писали, для работы в проекте AppInventor необходим аккаунт Google. Если у вас имеется смартфон на Андроиде, то такой аккаунт у вас, скорее всего, уже есть. Если же нет, то его можно получить, зайдя на сайт Google по следующей ссылке.
Далее заходим на сайт AppInventor и по ссылке Create Apps!, которая находится в правом верхнем углу главной страницы сайта, переходим на сайт среды программирования.
В качестве иллюстрации ниже приведена ссылка на небольшое видео, демонстрирующее создание простейшей программы, которая выводит текст при нажатии на кнопку, сформированную на сенсорном экране смартфона.