В первых двух обзорах (1, 2) мы познакомили вас с составом и основными возможностями набора NR05 «Цифровая лаборатория» из серии «Азбука электронщика».



Мы неоднократно говорили, что возможности набора не исчерпываются теми опытами и проектами, которые входят обучающее пособие. Возможности набора гораздо шире!

Рассмотрим, как можно реализовать с помощью «Цифровой лаборатории» управление исполнительными устройствами с вашего смартфона или планшета.

Связь между смартфоном и модулем Ардуино, установленном на плате расширения, будем осуществлять по технологии Bluetooth. Конечно, это ограничит возможность беспроводного управления дистанцией около 10 м, но в домашних условиях часто большего и не требуется. На основе такой технологии можно успешно управлять несложными роботами или устройствами домашней автоматики, а телефон или смартфон послужат бесплатным универсальным пультом управления, который с легкостью можно перепрограммировать для наилучшего решения поставленной задачи.

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

Мы пойдем по пути ненамного более сложному, но более универсальному – будем писать программы для телефона и для Ардуино самостоятельно. Это поможет вам понять принцип написания таких приложений и использовать его в своих разработках.
Для начала поясним, на каком принципе основана связь, которую мы будем использовать. Как известно, когда модуль Ардуино подключается к компьютеру, на компьютере конфигурируется виртуальный последовательный порт – COM-порт. Он используется для заливки скетчей в Ардуино, а также для обмена информацией между компьютером и микроконтроллером Ардуино. Также на плате Ардуино имеется два контакта, совмещенные с пинами D1 и D0 и обозначаемые RX и TX – соответственно передача (Receive) и прием (Transmit) стандартного интерфейса UART.

Подключив к этим контактам переходник Bluetooth-UART (в нашем распоряжении оказался модуль HC-05, он не входит в состав набора) мы получим аппаратный канал связи между устройством, подключенным по Bluetooth к переходнику, и Ардуино.
Таким образом, записывая в последовательный порт информацию из одного устройства и считывая ее другим (это можно делать в двух направлениях), мы можем организовать обмен информацией между устройствами. Скорость такого обмена между Ардуино и смартфоном в случае применения модуля HC-05 составит 57600 бод.

В качестве исполнительных элементов для наглядности задействуем RGB-светодиод и сервопривод – и тот и другой управляются сигналами ШИМ.

Приведем схему соединений компонентов проекта:



Для управления исполнительными элементами будем передавать из смартфона некую букву, которая определяет, какой элементу предназначена команда, и цифру, которая соответствует параметру команды. Параметром может быть цифра, определяющая надо ли включить или выключить какой-либо исполнительный элемент, или цифра, определяющая параметр ШИМ.

Приведем текст программы для Ардуино. Программа принимает данные из адаптера Bluetooth, расшифровывает их и выполняет необходимые действия: включает или выключает светодиод, регулирует его яркость или угол поворота вала сервопривода.

Текст снабжен достаточным числом комментариев для понимания логики работы программы:

Спойлер
// подключаем библиотеки сервопривода и LCD-индикатора
#include <Servo.h>
#include <LiquidCrystal.h>
// задаем 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!, которая находится в правом верхнем углу главной страницы сайта, переходим на сайт среды программирования.

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

Комментарии (7)


  1. vitaly_KF
    10.03.2016 12:48

    Отлично! Пишите больше да чаще! =)


  1. alexpp
    10.03.2016 13:33

    Смотря на актуальную стоимость модуля синезуба и есп-шки — выбор становится очевиден, и совсем не в пользу первого.


    1. Misteg
      10.03.2016 15:45

      У ESP ещё и нет необходимости писать ПО для телефона, реализация через вэб-морду отлично работает.


    1. Sworfly
      10.03.2016 16:07

      ИМХО, тут выбор нужно делать исходя не из стоимости, а задачи, навыков(все же статья для новичков, а сконфигурировать ESP несколько сложнее, чем через UART гонять байты) и инструментов.


      1. alexpp
        10.03.2016 16:19
        +1

        Имел дело с несколькими купленными у Ляо ESP. На всех была стандартная прошивка, не NodeMCU. Программирование — через привычную Arduino IDE, библиотеки — в большинстве своем те же, либо легко найти портированные.
        Единственный минус — миниатурные размеры самого модуля — может быть довольно сложно с непривычки паять. Если нет дружбы с паяльником, и не хочется мудрить с подключением по USB и питанием — можно купить дев-борд ESP, за 5 зеленых. Что опять таки не сильно больше Ардуино, и сразу начать писать скетчи.


        1. Sworfly
          10.03.2016 16:47

          Для работы с ESP нужно иметь хоть какое-то представление о режимах работы Wi-Fi сетей, IP-адресах, портах и прочих сетевых тонкостях, да и о согласовании уровней забывать не стоит. ESP работает с 3.3В логическими уровнями, а все Arduino, кроме nano, встреченные мной, работали только с 5В.
          Так что новичку придется попотеть с изучением.


  1. merl1n
    10.03.2016 20:57
    +1

    Ну и? Очередная PR статья.