Любое электронное устройство требует систем ввода и отображения информации. Конечно, проблему можно решить минимальными средствами. Одной кнопкой с помощью морзянки можно передать любую информацию, аналогично одним светодиодом ее можно отобразить, однако, это требует определенной сноровки. Сегодня почти у каждого в кармане есть прекрасное устройство ввода и отображения информации, такое как телефон. Я уже давно писал, что фотокубикам не нужен какой-то специальный орган управления, достаточно и последовательного интерфейса, к которому может быть подключен как пульт дистанционного управления, так и экран. А если экран сенсорный, то и пульта с кнопками не надо. Причем экран может быть один, подключаемый по мере необходимости к разным установкам. Действительно, зачем иметь несколько экранов, если не предполагается на них смотреть одновременно; можно носить один и переключать на него текущую задачу.
Таким образом, задачей сегодняшней статьи является описание системы, связывающей телефон под управлением ОС Android с кубиками, построенными с использованием микро-ЭВМ на платформе Arduino. Проблема, однако, состоит в том, что разъемов для подключения внешних устройств у телефона нет. Говорят, у некоторых телефонов железо поддерживает порт USB для подключения периферии, но не в этой жизни. Чтобы воспользоваться данной возможностью, придется ставить натуральный Linux вместо пародии на него. Тем не менее, решение есть, даже более интересное. У любого телефона есть множество беспроводных интерфейсов. Среди них есть и Bluetooth, который можно рассматривать как хорошо замаскированный последовательный порт. Arduino тоже способна работать с Bluetooth. Это может быть плата со встроенным модулем ArduinoBT или отдельный модуль, присоединенный к последовательному порту. Поскольку у меня уже были платы Mega и Nano, то логичным решением казалось приобретение отдельного модуля BT. Быстрый поиск по московским интернет-магазинам показал, что в отличие от его компьютерного собрата с красивым корпусом и интерфейсом USB, встраиваемый вариант с последовательным интерфейсом является дефицитным продуктом. Он есть, но выбор небогатый и цены раза в три больше. В результате я купил якобы вот это устройство Bluetooth COM-порт (Master/Slave). Судя по заявленным характеристикам, предлагаемое устройство совпадало с уже использованными умельцами и описанными в сети. Например, в статье «Arduino робот. Этап 2 — связь по bluetooth». (Отмечу, что на приведенной в статье схеме делителя для согласования напряжения, похоже, забыли букву «к» в «кОм». 43 Ом на землю — это для цифровых выходов Arduino маловато будет). Очень полезной для меня оказалась и статья на английском «Serial Bluetooth module slave test» и особенно обсуждение в комментариях к ней с разбором проблем.
Плата очень маленькая и подпаиваться к ней не очень удобно. Я решил эту проблему так, как показано на фотографии.
Для начала надо запрограммировать сам модуль Bluetooth. С этой целью его надо подключить к последовательному порту, причем не RS232, а к однополярному, да еще и с напряжением 3,3 В. Я для этого воспользовался платой Seeeduino Mega.
Плата Seeeduino Mega. Переключатель 5 — 3,3 В, помеченный цифрой 1, установлен в положение 3,3 В.
У нее четыре аппаратных последовательных порта (UART). Порт с номером ноль 0 связан с USB и через него с компьютером, к порту за номером 1 я подключил купленное устройство. Плата имеет переключатель 5 — 3,3 В (помечен цифрой 1 на фотографии), и, следовательно, установив его в положение 3,3 В, можно не делать делитель на входе. Для работы с 5 В платами я сделал делитель из двух сопротивлений номиналом 30 кОм и 64 кОм.
Модуль Bluetooth припаян к макетной плате, соединенной с Seeeduino Mega, которая переключена в режим 3,3 В, поэтому модуль подключен напрямую ( без делителя) к ножкам RX1 и TX1.
Правда, быстро выяснилось, что нет в мире совершенства и простота подключения уравновешивается невозможностью работать с командой Serial в последних версиях Arduino IDE. С версией Arduino IDE 0022 и avr-gcc 4.5.3 под Linux система не работала, а с 0017 под Win XP все работало. Поиск в интернете показал, что проблема известна и, вероятно, связана с версией avr-gcc. Сообщалось, что откат на версию 4.3.3 решил проблему. Вот только откат по gcc мог создать много других проблем, поэтому я экспериментировать не стал. Для настройки модуля нам надо транслировать команды с компьютера в модуль обратно. Для этого слегка модернизируем предлагаемую в виде примера программу MultiSerialMega:void setup() {
// initialize both serial ports:
Serial.begin(9600);
Serial1.begin(57600);
}
void loop() {
// read from port 1, send to port 0:
if (Serial1.available()) {
int inByte = Serial1.read();
Serial.print(inByte, BYTE);
}
if (Serial.available()) {
// read the oldest byte in the serial buffer:
int incomingByte = Serial.read();
Serial1.print(incomingByte, BYTE);
}
}
Первые эксперименты показали, что здесь что-то не так либо с самим устройством, либо с описанием. При подаче питания устройство обнаружилось телефоном под именем linvor, но не реагировало на команды, подаваемые через последовательный порт. Анализ информации в интернете по ключевому слову linvor показал, что одинаковые внешне устройства имеют разные системы команд и светодиод индикации состояния подключаются к разным контактам. Кроме того, некоторые имеют контакт выбора режимов, а некоторые нет. Хорошо, хоть ножки питания и сигналов совпадали. А коли так, то можно попытаться заставить ответить само устройство, что оно из себя представляет. Надо было только подобрать скорость передачи данных, заданную по умолчанию. Наконец скорость подобрана, она оказалось 9600 бод, а не 38400 бод, как следовало из документации, приведенной на сайте продавца. Посылаем команду AT, получаем ответ OK. Посылаем команду AT+VERSION и получаем в ответ OKlinvorV1.5. (Замечу, что для старшей версии команда имеет другой синтаксис — AT+VERSION?). Таким образом, из всех возможных вариантов я получил самое простое и дешевое устройство, в котором о переключении Master/Slave можно забыть. Функционально, тем не менее, оно меня устраивало, и раздражение вызывали не лишние деньги, все равно более дешевого устройства в Москве не наблюдалось, а потраченные усилия и время.
![Схема](panoamarino/linvor15.png)
Список команд по настройке у этой версии совсем короткий, поэтому приведу его целиком:software version Linvor v1.5.
Command Description
Options
Response
AT+VERSION Returns the software version of the module
OKlinvorV1.5
AT+BAUDx Sets the baud rate of the module
The command AT+BAUD8 sets the
baud rate to 115200
1 >> 1200
2 >> 2400
3 >> 4800
4 >> 9600 (Default)
5 >> 19200
6 >> 38400
7 >> 57600
8 >> 115200
9 >> 230400
OK115200
AT+NAMEOpenPilot Sets the name of the module
Any name can be specified up to 20 characters
OKsetname
AT+PINxxxx Sets the pairing password of the device Any 4 digit number can be used,
the default pincode is 1234
С помощью команды AT+BAUD7 я задал скорость 57600 бод, что должно было быть одинаково приемлемо для обеих имевшихся у меня плат Arduino.
Теперь, когда задачи, связанные с программированием модуля и его подключением, решены, надо научить телефон управлять моей установкой по съемке сферических панорам. Это оказалось довольно просто, если воспользоваться результатами проекта Amarino. Если удовлетвориться работой с командной строкой, то для этого оказалось достаточно загрузить в телефон программу Amarino_2.apk и AmarinoPluginBundle.apk. Здесь важным моментом является то, что при установке телефон должен быть подключен к компьютеру, на котором установлен пакет Android SDK Tools, и папка с ним включена в PATH. Если в дальнейшем есть желание писать собственные программы для Android и еще не установлен Android SDK Tools, то есть смысл сперва установить свободную интегрированную среду разработки Eclipse и затем с ее помощью уже установить ADT Plugin. Для этого выбираем в меню: Help > Install New Software, нажимаем Add, в открывшемся окне набираем https://dl-ssl.google.com/android/eclipse/, нажимаем OK. Подробно об установке на английском можно прочитать здесь.
![eclipse](panoamarino/eclipsem.jpg)
Интегрированная среда разработки Eclipse.
При программировании Аrduino можно воспользоваться соответствующей библиотекой MeetAndroid — Arduino Library и примерами из Amarino. Если работать с Seeeduino Mega, то в библиотеке MeetAndroid.cpp надо заменить Serial на Serial1. Однако, поскольку Mega мне нужна была только для программирования модуля, а установка для съемки панорам у меня собрана на Freeduino Nano v5, то я через делитель подключил модуль к ее нулевому порту и вернулся со старого компьютера с XP на новый с Slackware 13.37-64. Отмечу, что в случае Nano программировать плату можно только отключив модуль. Другими словами: отключаем питание, отключаем модуль, подключаем к компьютеру, программируем, отключаем компьютер, подключаем модуль, подключаем питание и работаем.
Общий вид установки. В качестве источника питания используется буферный накопитель «Вампирчик», с которого берется 9 В. Он удобен тем, что позволяет легко менять напряжение и контролировать уровень заряда аккумуляторов и потребляемый ток. Напряжения в 5 и 3,3 В создаются преобразователями на плате Arduino.
Модуль Bluetooth припаян к макетной плате, соединенной с Freeduino Motor Shield v3, с которой в свою очередь контачит плата Freeduino Nano v5. Для питания модуля BT 3,3 В берутся с платы Freeduino Nano v5. Сигнал берется с единственного аппаратного порта этой платы — ножки 0 и 1. Поскольку у этой платы амплитуда сигнала 5 В, то в цепь ножки 1 включен делитель напряжения.
Здесь в очередной раз выяснилось, что обновление программ не всегда оправданно — версия Arduino IDE 1.0-rc1 вступила в конфликт с библиотекой MeetAndroid. Поэтому программа писалась с помощью Arduino IDE 0022. Целиком ее можно скачать здесь. Ниже приведу только фрагменты кода, связанные с управлением по Bluetooth....
#include
// declare MeetAndroid so that you can call functions with it
MeetAndroid meetAndroid;
...
int wzat;
... void setup()
{
Serial.begin(57600);//Задаем скоростьпоследовательного порта платы Nano
//Регистрируем функции, которые должны вызываться при получении соответствующего флага meetAndroid.registerFunction(fo, 'o');//Затвор
meetAndroid.registerFunction(fp, 'p');//Низ
...
meetAndroid.registerFunction(ft, 't');//Пуск
meetAndroid.registerFunction(fk, 'k');//Передача параметра - Задержка
meetAndroid.registerFunction(fm, 'm');//Передача параметра
} void loop() {
meetAndroid.receive();//Принимаем сообщения присланные телефоном
} // Функции реакции на зарегистрированные события void fk(byte flag, byte numOfValues)
{
wp = 1000*meetAndroid.getInt();//Присваиваем переменной полученное от телефона значение
}
...
void fo(byte flag, byte numOfValues)
{
wzat = 1000*meetAndroid.getInt();//Присваиваем значение переменной
IR_Sony();//Запускаем функцию спуска затвора
} void fp(byte flag, byte numOfValues)
{
int fp = meetAndroid.getInt();//Принимаем от телефона угол поворота
mstepyd = 250*fp/9+1;
napry = -1;
motor2.step(mstepyd, FORWARD, DOUBLE);//Поворачиваем на заданный угол
motor2.release();
SendUgolV();//Передаем данные об угле телефону
}
...
void ft(byte flag, byte numOfValues)// Запуск подпрограммы съемки панорамы
{
wzat = 1000*meetAndroid.getInt();
Pano_Motor();
}
void SendUgolG()//Передаем данные об горизонтальном угле телефону
{
ugolG = ugolG+naprx*9*mstepxd/35;
if (ugolG > 360){
ugolG = ugolG - 360;}
if (ugolG < 0){
ugolG = 360 + ugolG;}
meetAndroid.send("A"); //Передаем идентификатор переменной которая будет передана следующей
delay(200);
meetAndroid.send(ugolG);//Передаем значение
}
void SendUgolV()//Передаем данные об вертикальном угле телефону
{
ugolV = ugolV+napry*9*mstepyd/250;
meetAndroid.send("B");
delay(200);
meetAndroid.send(ugolV);
}
Включаем установку на телефоне, запускаем Amarino 2.0, нажимаем + и добавляем наше устройство, нажимаем на кнопку Connect, дожидаемся пока не зажжется зеленая метка и светодиод на установке перестанет мигать. Нажимаем на кнопку Monitoring. В открывшемся окне, например, для спуска затвора выбираем для Flag маленькую букву o и в строке рядом вводим желаемую задержку. Нажимаем Send, и аппарат делает снимок.
![]() | ![]() |
А разобравшись с двумя предлагаемыми в проекте Amarino примерами, можно написать и собственную программу для устройств, работающих под управлением ОС Android. Мой вариант с архивом для Eclipse можно скачать здесь. Для ее запуска в Eclipse открываем меню File > New > Android Project. Отмечаем пункт create from existing source и выбираем папку PanoAmarino. Для работы понадобится также библиотека AmarinoLibrary_v0_55.jar. Скачиваем ее, нажимаем правой кнопкой мыши на папку PanoAmarino в левой колонке и выбираем пункт build path > configure build path > libraries > add external jar >. Далее в Eclipse открываем файл PanoAmarino.java и в строке private static final String DEVICE_ADDRESS = "00:11:09:09:02:51"; изменяем имеющийся адрес на адрес используемого Bluetooth-модуля. Адрес вашего модуля можно увидеть, например, при запуске на телефоне программы Amarino 2.0. Подключаем телефон к компьютеру через USB, помечаем галочкой в установках телефона в графе Приложения пункт Неизвестные источники и в подпункте Разработка - Отладка USB. Нажимаем правой кнопкой мыши на папку PanoAmarino в левой колонке и выбираем пункт Run As > Android Application, нажимаем на него, и программа загружается в телефон.
![]() | ![]() |
Окно программы управления съемкой сферических панорам PanoAmarino. |
Программа PanoAmarino позволяет выбрать два режима съемки. Если галочка в графе Конвертер отсутствует, то предполагается, что установлен объектив с фокусным расстоянием 16 мм, и при нажатии кнопки Пуск телефон передает команду плате Freeduino Nano начать съемку панорамы в 3 ряда по 10 кадров в каждом. При наличии галочки производится съемка объективом с конвертером в два ряда по пять кадров в каждом. В процессе съемки Freeduino Nano передает телефону информацию о положении камеры, которое отображается телефоном. Слева горизонтальный угол в градусах, справа — вертикальный. Следующая группа кнопок позволяет поворачивать камеру на заданный угол. Нижняя кнопка Затвор посылает команду на спуск затвора с заданной паузой перед съемкой и задержкой после спуска затвора.
Телефон буквально напичкан датчиками, и если его использовать не как пульт дистанционного управления, а прикрепить к установке, то можно воспользоваться датчиком ускорения для предотвращения съемки до того, как камера перестанет колебаться после поворота, и точно сориентировать первый кадр на север.
![]() | ![]() |
Меню подключения сенсоров в программе AmarinoPluginBundle. |
Последнее может оказаться полезным, если панорамы привязываются к карте. Прикрепив телефон к установке, мы на самом деле не лишаемся возможности дистанционного управления, поскольку можем задействовать одну из множества программ по дистанционному управлению телефоном с компьютера по WiFi. Я успешно пользуюсь Remote Control Add-on или PicMe. После их запуска на экране большого компьютера возникает изображение экрана телефона с возможностью нажимать мышью на кнопки.