Программа для андроид управление ардуино. Шесть простых способов присоединить Arduino к Android
Хотите послать текстовое сообщение с вашего смартфона с ОС Android на свою плату Arduino? В этой статье написано, как это сделать!
Что потребуется
- смартфон на Android с поддержкой режима USB хоста (т.е. поддержка OTG) - большинство устройств, работающих с Android 3.1 и выше, поддерживают этот режим. Проверьте свой телефон с помощью USB Host Diagnostics App из Play Store;
- Arduino - любая версия. Я буду использовать Uno R3 ;
- USB кабель для Arduino;
- USB OTG кабель - он необходим вам, чтобы подключить USB кабель Arduino к порту micro-USB телефона;
- Android Studio - вам необходимо установить его. Это довольно просто сделать. Android Studio делает разработку приложений проще, благодаря своим предположениям и генерации кода. Это одна из лучших IDE. Вы также можете использовать эту статью в качестве руководства по установке Android IDE.
Основные компоненты приложения для Android
В Android приложении есть три основных файла:
MainActivity.java Здесь находится выполняемый код на Java, который управляет тем, как будет функционировать приложение. activity_main.xml Содержит макет приложения, то есть, компоненты: кнопки, компоненты отображения текста и т.д. AndroidManifest.xml Здесь вы определяете, когда приложение должно запускаться, в какие права ему нужны, и к какому аппаратному обеспечению ему необходимо получить доступ.
Еще есть множество других файлов, но все они связаны друг с другом с помощью этих трех.
Активность может быть охарактеризована, как экран, где пользователь взаимодействует с телефоном. Активности содержат такие виджеты, как кнопки, текстовые поля, изображения и т.д., которые помогают в передаче информации. Данное руководство будет использовать только одну активность, MainActivity , которая будет принимать введенный пользователем текст, чтобы отправить его на Arduino, а также отображать принятый текст.
Макет
Мы будем использовать тот же макет, что и в USB App и Bluetooth App. Он прост и содержит минимум виджетов, необходимых для проверки соединения между устройствами.
Как вы можете видеть, он содержит виджет EditText для получения данных от пользователя, кнопки для запуска соединения, передачи данных, завершения соединения и очистки TextView . Полученные данные отображаются в TextView (пустое пространство под кнопками).
Вот часть XML кода. Поскольку код для кнопок похож, здесь он не приводится. Полный код можно скачать по ссылке в конце статьи.
Я использовал здесь RelativeLayout , а это означает, что каждый виджет расположен относительно виджетов вокруг него. Макет может быть легко воссоздан на вкладке Design Tab , где вы можете перетащить виджеты туда, куда хотите. Нам необходимо описать, что будет происходить при нажатии на кнопку. Для этого используется метод onClick . Укажите имя метода в XML коде для кнопки. Для этого добавьте строку:
Android:onClick="onClickMethod"
Теперь наведите курсор мыши на эту строку, слева должно будет появиться предупреждение, похожее на это:
Нажмите на варианте «Создать onClick...». Это автоматически добавит код метода onClick в MainActivity.java . Вам необходимо выполнить это для каждой кнопки.
Библиотека USB Serial
Настройка последовательного соединения в Android довольно трудоемка, так как требует от вас ручной настройки множества вещей, поэтому я нашел несколько библиотек, которые делают всё это автоматически. Я протестировал несколько из них и, наконец, остановился на библиотеке UsbSerial от Github пользователя felHR85 . Среди подобных библиотек, что я нашел, она единственная до сих пор обновляется. Ее довольно легко настроить и использовать. Чтобы добавить библиотеку в свой проект, скачайте последнюю версию JAR файла на Github. Поместите его в подкаталог libs в каталоге вашего проекта. Затем в файловом проводнике в Android Studio кликните правой кнопкой мыши на JAR файле и выберите « Добавить как библиотеку » (Add as Library). Вот и всё!
Алгоритм выполнения программы
Это краткий план того, как мы будем действовать. Каждая активность имеет метод onCreate() , который запускается при создании активности. Какой бы код вы ни хотели запустить в начале, он должен быть помещен внутрь этого метода. Обратите внимание, что чтение из устройства является асинхронным, то есть оно будет работать в фоновом режиме. Это делается для того, чтобы данные были получены как можно скорее.
Открытие соединения
Во-первых, давайте определим метод onClick для кнопки Begin . При нажатии необходимо выполнить поиск всех подключенных устройств, а затем проверить, совпадает ли VendorID подключенного устройства (ID поставщика) с VendorID Arduino. Если совпадение найдено, то у пользователя должно быть запрошено разрешение. Каждое ведомое USB устройство имеет ID поставщика (Vendor ID) и ID продукта (Product ID), которые могут быть использованы для определения того, какие драйвера должны использоваться для этого устройства. Vendor ID для любой платы Arduino равен 0x2341 или 9025.
Public void onClickStart(View view) { HashMap usbDevices = usbManager.getDeviceList(); if (!usbDevices.isEmpty()) { boolean keep = true; for (Map.Entry entry: usbDevices.entrySet()) { device = entry.getValue(); int deviceVID = device.getVendorId(); if (deviceVID == 0x2341) //Arduino Vendor ID { PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); usbManager.requestPermission(device, pi); keep = false; } else { connection = null; device = null; } if (!keep) break; } } }
Теперь давайте определим BroadcastReceiver для приема широковещательных сообщений, чтобы запросить у пользователя разрешения, а также для автоматического запуска соединения, когда устройство подключено, и закрытия соединения, когда оно отключено.
// Приемник широковещательных сообщений для автоматического запуска и закрытия последовательного соединения. private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ACTION_USB_PERMISSION)) { boolean granted = intent.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED); if (granted) { connection = usbManager.openDevice(device); serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection); if (serialPort != null) { if (serialPort.open()) { //Установить параметры последовательного соедниения. setUiEnabled(true); //Включить кнопки в UI. serialPort.setBaudRate(9600); serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8); serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1); serialPort.setParity(UsbSerialInterface.PARITY_NONE); serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); serialPort.read(mCallback); // tvAppend(textView,"Serial Connection Opened!\n"); } else { Log.d("SERIAL", "PORT NOT OPEN"); } } else { Log.d("SERIAL", "PORT IS NULL"); } } else { Log.d("SERIAL", "PERM NOT GRANTED"); } } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { onClickStart(startButton); } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { onClickStop(stopButton); } }; };
Если первое условие IF выполняется, и если пользователь дал разрешение, то начать соединение с устройством, у которого Vendor ID совпадает с необходимым нам Vendor ID. Кроме того, если принято широковещательное сообщение о подключении или отключении устройства, вручную вызывать методы onClick для кнопок Start и Stop . SerialPort определяется с использованием устройства и соединения в качестве аргументов. В случае успеха открыть SerialPort и установить соответствующие параметры. Значения параметров для Arduino Uno равны: 8 бит данных, 1 стоповый бит, бита четности нет, управление потоком выключено. Скорость передачи данных может быть 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 или 115200 бит/с, но мы будем использовать стандартные 9600 бит/с.
Прием данных от устройства
Во фрагменте кода выше обратите внимание на строку, содержащую serialPort.read(mCallback) . Здесь функции read передается ссылка на объект Callback , который будет автоматически срабатывать при обнаружении входящих данных.
UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() { // Определение метода обратного вызова, который вызывается при приеме данных. @Override public void onReceivedData(byte arg0) { String data = null; try { data = new String(arg0, "UTF-8"); data.concat("/n"); tvAppend(textView, data); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } };
Полученные данные будут в форме необработанных байтов. Нам придется перекодировать их в читаемый формат, например, UTF-8. Затем они добавляются в TextView с помощью специального метода tvAppend() . Это делается так потому, что любые изменения в пользовательском интерфейсе могут выполняться только в потоке пользовательского интерфейса. Так как данный Callback будет запущен, как фоновый поток, то он не может напрямую повлиять на пользовательский интерфейс.
Private void tvAppend(TextView tv, CharSequence text) { final TextView ftv = tv; final CharSequence ftext = text; runOnUiThread(new Runnable() { @Override public void run() { ftv.append(ftext); } }); }
Передача данных на устройство
Передача данных относительно проста по сравнению с чтением данных с устройства. Это простой вызов функции с байтами данных, которые необходимо передать, в качестве аргумента. Это будет реализовано в методе onClick кнопки Send .
SerialPort.write(string.getBytes());
Закрытие соединения
Чтобы закрыть соединение, просто закройте последовательный порт.
SerialPort.close();
Манифест приложения
Манифест объявляет, какие дополнительные разрешения могут потребоваться приложению. Единственное необходимое нам разрешение - это разрешение сделать телефон USB хостом. Добавьте следующую строку в манифест:
Приложение можно заставить запускаться автоматически, добавив фильтр интентов в главную активность MainActivity . Этот фильтр интентов будет срабатывать при подключении любого нового устройства. Вид устройства может быть указан явно с помощью ID поставщика (Vendor ID) и/или ID продукта (Product ID) в XML файле.
Обратите внимание на строку " android:resource="@xml/device_filter ". Она говорит компилятору, что он может найти свойства устройства в файле с именем device_filter в каталоге src/main/res/xml , поэтому создайте подкаталог " xml " в каталоге src/main/res и поместите в него файл со следующим содержанием:
Тестирование приложения
Соберите приложение и запустите его на своем смартфоне. Теперь запустите Arduino IDE и настройте Arduino для простого эхо всего, что плата будет принимать через последовательный порт. Вот очень простой код, помогающий сделать это:
Void setup() { Serial.begin(9600); } void loop() { char c; if(Serial.available()) { c = Serial.read(); Serial.print(c); } }
Теперь подключите Arduino к microUSB порту телефона, используя OTG кабель. Приложение должно запуститься автоматически. Попробуйте послать какой-нибудь текст, и те же данные будут возвращены обратно!
Заключение
Данная статья показывает, как Arduino может общаться с вашим смартфоном. И возможности использования этого бесконечны! В случае, когда необходимы данные с любого датчика, которого нет среди встроенных в смартфон, можно воспользоваться любым микроконтроллером для считывания данных с этого датчика и передачи их на смартфон. В следующей статье будет показано, как подключить смартфон к Arduino, используя популярный bluetooth модуль HC05.
Уже достаточно давно Гугл позволила связывать устройства на Адроиде через usb с различными микроконтроллерами, открыв API. Теперь могут ликовать все, кто занимается созданием разнообразных проектов на Ардуино, ведь теперь значительно проще будет провести отладку системы Аndroid Аrduino и, в принципе, отрегулировать их взаимодействие.
Мы уже начали знакомить читателей с возможностями связки микроконтроллера и смартфона - см. .
Но и до этого различные модули позволяли спокойно взаимодействовать Андроид и Ардуино. Давайте же разберёмся, каким образом можно реализовать проект, который будет управляться со смартфона, и что для этого потребуется.
Где можно применить связь Андроида с Ардуино
В первую очередь, необходимо задуматься о том, как применять возможность передачи сигнала с Андроид на Ардуино. Ведь прежде, чем изучать какие-то материалы, каждый здравый человек должен понимать, к чему это его приведёт в итоге. Даже если речь идёт про хобби. И действительно, возможность управления техникой с вашего смартфона уже давно перестала восприниматься, как нечто неординарное. Сейчас в большинстве телевизоров, холодильников и даже пылесосов, которые приобретаются средним классом, есть возможность передачи данных на смартфон.
Такое решение позволяет значительно упростить жизнь обывателя, ведь для того же телевизора нет необходимости постоянно покупать батарейки в пульт и искать его, если потеряется. Мы всё ближе к заветным умным домам, но некоторые предпочитают не покупать подобную технику, а самостоятельно её сконструировать.
В таком случае, связку Андроид Ардуино стоит расценивать в двух вариациях:
- Удалённое управление каким-либо устройством с помощью смартфона. Ещё его называют связью смартфон-МК. Всё та же техника, например, раздвижные жалюзи или освещение в комнате, которое будет выключаться по одному клику. Если вы захотите сделать последнее, то даже нет необходимости менять проводку или докупать специальные смарт-лампы, которые могут выгореть спустя месяц. Достаточно приобрести небольшой микроконтроллер Ардуино, модуль связи по беспровобному интернету или блютуз и изоленту. После чего достаточно будет спаять простейшую схему, которая замыкается в случае, если подаётся сигнал на МК.
Сигнал этот будет подаваться с вашего телефона, замыкать контакты, и свет начнет гореть. Чтобы не было проблем и для дополнительной безопасности вашего жилища, можно написать скрипт, способный автоматически размыкать цепь, если устройство управления удаляется из поля видимости. Обычные выключатели всё так же будут работать, но только, когда цепь замкнута. - Передача данных для информирования или связь МК-Смартфон. Здесь вы уже не управляете какой-то техникой, а скорее наоборот, различная техника позволяет получить определённые данные на ваш смартфон. Первое, что приходит на ум и простейшее применение, – датчик движения. Данный модуль имеется в стандартных датчиках для МК Ардуино, купить его не составит проблем, как и вмонтировать в проход. Затем останется написать код, подобие которого уже есть на многих англоязычных форумах, отправляющий СМСку или сообщение в социальных сетях, а также специальной утилите, если кто-то пересечет инфракрасный луч.
Можно создать и более сложные и автоматизированные системы, которые будут передавать не только медиа-информацию о вашей квартире, но и сообщать, если в домашней оранжерее созреют овощи или фрукты. Всё зависит исключительно от фантазии самого инженера, но основа технологии всё та же – передача данных с одного устройства на другое.
Вот вы выбрали подходящий проект и взялись за его реализацию. Модули и МК уже заказаны, а пока они идут, можно заняться и разработкой ПО. Ведь голый Андроид не взаимодействует с Ардуино при помощи магии.
Приложения на Андроид для взаимодействия с Ардуино
Разрабатывать утилиту мы будем не с нуля, ведь это не базис по программирования на java. Проще всего воспользоваться готовыми движками и средами с пользовательским интерфейсом, где вам, буквально, останется дописать 1-2 строчки кода, для расположенной кнопки, чтобы та заработала. Естественно, подобный подход значительно ограничивает функционал конечного продукта и неизбежно ущемляет творческий подход, но будет полезен для тех, кто хочет быстро реализовать простой проект без лишних проблем.
Для начала рассмотрим три базовых файла, которые вы встретите при проектировании программы:
- MainActivity.java – это весь код приложения на одноимённом языке, все функции и методы, которые вы записываете, сохраняются сюда.
- Activity_main.xml – макет, как несложно догадаться из расширения файла. Сюда сохраняется расположение кнопок, текста и прочих интерактивных компонентов, которые затем оживляются уже в коде.
- AndroidManifest.xml – этот файл также относится к макетам, но немного в другой сфере. Он определяет основные параметры для запуска приложения и разрешения, которые тому будут необходимы. В нашем случае это необходимость включить Bluetooth, ведь через него мы будем связываться с МК. Если вы делаете датчик, который должен отсылать информацию на большое расстояние, то, соответственно, необходимо включить и проверить работу беспроводного или мобильного интернета.
Основы приема-передачи данных
Чтобы понимать, как ваш будущий проект вообще будет работать, стоило бы изучить базовую физику электромагнитных полей. Но чтобы не перегружать лишней информацией, достаточно усвоить, что на сегодняшний день передача данных происходит тремя основными путями:
- Через usb-кабель, что подходит далеко не везде, но хороший вариант, дабы настроить проект.
- Через блютуз и смежные протоколы, например, в последнее время стало популярным использовать NTFS для управления умными устройствами. Но, так как мы говорим о проекте на МК Ардуино, то остановимся именно на блютуз.
- Через беспроводной интернет. Здесь ничего нового, по сути, ваш мобильный или микроконтроллер выступает сервером, принимающим и обрабатывающим полученные данные, а затем производящим вычисления или действия и отправляющим ответ.
Это основные способы передачи и приёма информации, вам остаётся выбрать подходящий. Для проектов, которые не будут использоваться на больших расстояниях, оптимальным вариантом по объемам кода и простоте настройки является блютуз.
Какие компонеты могут потребоваться для взаимодействия
Выше мы уже упоминали, что для проекта на Ардуино, который предполагает использование одного из методов передачи данных на расстоянии, необходимо приобрести дополнительные модули. Опять же, лучшим выбором будет блютуз. Данный модуль позволяет принимать и отправлять сигналы определённой частоты, которые улавливаются большей частью смартфонов, а соответственно, никаких проблем не должно возникнуть. Вы можете выбрать как одно из устройств, представленных в основной линейке Ардуино, так и китайские аналоги, что будет значительно дешевле.
Один из модулей, который можно взять - это Bluetooth Bee, который можно купить во многих магазинах, от DFRobot.
Всё зависит от конкретной системы и необходимой в ней «Пропускной способности». Ведь если это будет камера видеонаблюдения, то поток данных должен передаваться непрерывно и в большом количестве. А для простого датчика движения достаточно самого дешевого вай-фай модуля. Так же и с автоматизированными устройствами для умного дома.
Отталкивайтесь, при выборе каждого компонента, от своих потребностей и того, что вы собираетесь реализовывать в проекте, и не переплачивайте за те возможности, которые вам не потребуются.
Настройка соединения
Итак, вот вы создали и уже установили на смартфон приложение или его готовый аналог для управления вашим микроконтроллером с Ардуино, далее необходимо:
- Включить сам блютуз модуль в системе, запитав его от сети или аккумулятора.
- Запустить приложение на телефоне и найти нужное устройство.
- Подсоединиться к блютуз модулю с помощью дефоултного пароля или того, что вы задали при перепрошивке Ардуино.
- Отдать первые команды и проследить, как на них отреагирует система.
Здесь стоит сказать, что приложений под Ардуино в Google Play много, в следующем материале мы покажем 7 из них.
Простейший пример
Чтобы вы понимали, как примерно должен функционировать готовый проект, приведём пример с помощью всё той же надстройки на ваш светильник.
- Вы подсоединяетесь к системе через смартфон.
- Нажимаете одну кнопку, и цепь размыкается или замыкается.
- Появляется или исчезает свет.
- Нажимаете кнопку на смартфоне ещё раз, и происходит обратный эффект.
Естественно, для этого необходимо изначально замкнуть цепь, включив лампочку с помощью настенного переключателя. Но это лишь условный пример того, что можно реализовать с помощью данной технологии.
В ближайших уроках мы более подробно остановимся на взаимодействии смартфонов и микроконтроллеров, сделаем вместе с вами несколько полезных уроков.
Очень часто в ваших проектах возникает необходимость в дистанционном управлении или передачи данных с ваших телефонных гаджетов.
Один из самых популярных и распространенных методов обмена данными посредством Bluetooth.
Сегодня мы разберем простые примеры как можно подключить Bluetooth модуль к Arduino и настроить дистанционное управление с телефона.
Нам понадобится:
- Набор проводов ПАПА-МАМА
- HC-06 Bluetooth
Подключать Bluetooth модуль к микроконтроллеру Arduino удобнее всего с помощью проводков ПАПА-МАМА .
Arduino | Bluetooth |
---|---|
Pin 1 (TX) | RXD |
Pin 0 (RX) | TXD |
GND | GND |
5V | VCC |
Будьте внимательны, подключать подключать нужно TX -> RXD ,RX -> TXD .
Теперь необходимо записать пробный код программы:
Во время загрузки скетча необходимо что бы Bluetooth модуль был отключен от микроконтроллера arduino. В противном случае скетч не запишется, потому что связь с Bluetooth модулем происходит по одному и томуже порту RX и TX, что и USB.
Int val; int LED = 13; void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); digitalWrite(LED, HIGH); } void loop() { if (Serial.available()) { val = Serial.read(); // При символе "1" включаем светодиод if (val == "1") { digitalWrite(LED, HIGH); } // При символе "0" выключаем светодиод if (val == "0") { digitalWrite(LED, LOW); } } }
После того как скетч записан и Bluetooth модуль подключен к Arduino, можно перейти к следующему шагу.
Подключение Bluetooth к телефону
Желательно в качестве источника питания для arduino использовать не USB, а внешний Блок питания на 9 В.
- Включаем Bluetooth на телефоне и ищем новые устройства
- Находим в списке расстройств "HC-06" и подключаемся к нему.
- Телефон спросит пин-код. необходимо ввести "1234 " или "0000 "
- Ура. Устройство подключено.
Теперь нужно скачать bluetooth terminal на ваш телефон. Мы рассмотрим на примере платформы Android.
Вы можете установить разные bluetooth терминалы, как правило они отличаются только разными дизайнами, функционал от этого не меняется. Так же можно найти и терминал и для продуктов ios.
После того как мы установили терминал, запускаем его выбираем наш bluetooth модуль HC-06 и подключаемся к нему.
Пришло время попробовать проект в деле. Пишем в терминале цифру "0" и отправляем. Светодиод L который находится на плате arduino рядом с pin 13, должен погаснуть. Теперь отправим через терминал цифру "1" и светодиод L должен зажечься.
Демонстрация работы:
Домашняя работа:
- Изменить скетч так, что бы светодиод зажигался и потухал с помощью одной и той же команды например "G".
- Дописать скетч и научить его преобразовывать текстовые данные приходящие через блютус в цифровые и реализовать димер, зажигать светодиод с помощью ШИМ, на заданную яркость от 0 до 254 приходящую через bluetooth.
Мы рассмотрели установку и настройку необходимого нам программного обеспечения для разработки под ADK и Android. Теперь, когда у нас все готово для работы, мы можем создать наш первый проект. И по традиции - это будет проект со светодиодом.
Проект будет очень простой - на экране Android-устройства будет отображаться кнопка, при нажатии на которую на отладочной плате будет загораться светодиод, а при отпускании - гаснуть.
Программа для Arduino
Создаем новый проект. Наш исходный код будет очень простой:
#include #include Connection * connection; void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data) { if (event == ADB_CONNECTION_RECEIVE) // Если приняли данные { digitalWrite(13, data); // Изменяем состояние LED в зависимости от принятой переменной } } void setup() { pinMode(13,OUTPUT); // Используем встроенный светодиод L платы Seeeduino ADK ADB::init(); connection = ADB::addConnection("tcp:4568", true, adbEventHandler); } void loop() { ADB::poll(); }
Вкратце - мы инициализируем и создаем ADB соединение, а также определяем функцию adbEventHandler() , которая будет вызываться каждый раз, когда будут приниматься данные от Android-устройства. Когда данные приняты, то мы записываем принятый байт при помощи функции digitalWrite() , тем самым зажигая или гася светодиод.
Теперь компилируем скетч и загружаем его в нашу плату.
Программа для Android
Открываем Eclipse IDE и создаем новый проект: New -> Project... Откроется окошко, в котором находим папку Android и выбираем пункт Android Application Project. Нажимаем кнопку Next, и заполняем название проекта и некоторые параметры.
Далее нажимаем Next и формируем иконку приложения и др. После нажатия кнопки Finish ваше приложение готово. Теперь в окне Package Explorer щелкните правой кнопкой на вашем проект и выберите свойства проекта: Properties. Удостовертесь, что в качестве Target Name у вас выбран Google API, а не Android.
Затем открываем файл манифеста AndroidManifest.xml и в нем прописываем строку, для того, чтобы ОС Android дала нам разрешение на доступ к соответствующим службам:
Далее, копируем необходимые библиотеки для обеспечения работы MicroBridge режима: /src/org/microbridge/server и в этой папке 4 файла. Взять их вы можете с архива в конце статьи или с оригинального примера от seeed studio.
Теперь нам необходимо на activity (окно приложения) добавить графические элементы для взаимодействия с пользователем. Пока что у нас будет всего 2 элемента: текст и ToggleButton (кнопка с 2-мя состояниями).
Формировать пользовательский интерфейс можно двумя способами: при помощи графического расположения (простым перетаскиванием и компоновкой) и при помощи XML-файла. Воспользуемся Graphical Layout. Для этого, в окне ресурсов приложения щелкаем по файлу /res/layout/activity_main.xml
. И в появившееся окно перетаскиваем ToggleButton:
Теперь открываем наш основной файл /src/com/example/arduino52/MainActivity.java , все в нем удаляем и копируем следующие строки:
Package com.example.arduino52; import java.io.IOException; import org.microbridge.server.Server; import android.os.Bundle; import android.util.Log; import android.app.Activity; import android.widget.ToggleButton; import android.widget.CompoundButton; public class MainActivity extends Activity implements CompoundButton.OnCheckedChangeListener { Server server = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ToggleButton mButton = (ToggleButton)findViewById(R.id.toggleButton1); mButton.setOnCheckedChangeListener(this); // Создаем TCP сервер (на основе сервера MicroBridge LightWeight) try { server = new Server(4568); //Этот же порт необходимо использовать и на ADK-плате server.start(); } catch (IOException e) { Log.e("arduino52", "Unable to start TCP server", e); System.exit(-1); } } @Override protected void onDestroy (){ super.onDestroy(); server.stop(); } public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { byte data; if(isChecked) // Если кнопка нажата { data = 1; } else { data = 0; } try { //Посылаем данные server.send(new byte {(byte) data}); } catch (IOException e) { Log.e("arduino52", "Problem sending TCP message", e); } } }
Приложение на Android несколько сложнее, всю структуру его я расписывать не буду, для этого есть специализированные сайты и книги. Расскажу лишь основные моменты, которые нужны для нашего проекта.
Итак вначале инициализируется наш MicroBridge сервер, которые вешается на 4568 порт. Точно такой же порт должен стоят в вашем скетче Arduino.
Затем обьявляется обработчик onCheckedChanged ()
, который вызывается каждый раз при изменении состояния нашей кнопки ToggleButton. Далее, в зависимости от состояния кнопки, в переменную data мы сохраняем 1 или 0. И после, происходит попытка отправить эти данные функцией server.send ()
Далее подключаем наше Android устройство к компьютеру, запускаем наш проект Run, выбираем там наше реальное устройство (а не виртуальное) и ждем пока программа скомпилируется и проинсталлируется в ваш телефон или планшет.
В данной статье будет подробно расписано создание небольшого приложения для мобильной операционной системы Android и скетча для Arduino. На Arduino Uno будет стоять Wireless Shield с Bluetooth-модулем. Приложение будет подключаться к Bluetooth-модулю и посылать некую команду. В свою очередь скетч по этой команде будет зажигать или гасить один из подключенных к Arduino светодиодов.
Нам понадобится
Создание приложения для Android
Заготовка
Разработка для ОС Android ведется в среде разработки ADT, Android Development Tools. Которую можно скачать с портала Google для разработчиков. После скачивания и установке ADT, смело его запускаем. Однако, еще рано приступать к разработке приложения. Надо еще скачать Android SDK нужной версии. Для этого необходимо открыть Android SDK Manager «Window → Android SDK Manager». В списке необходимо выбрать нужный нам SDK, в нашем случае Android 2.3.3 (API 10). Если телефона нет, то выбирайте 2.3.3 или выше; а если есть - версию, совпадающую с версией ОС телефона. Затем нажимаем на кнопку «Install Packages», чтобы запустить процесс установки.
После завершения скачивания и установки мы начинаем создавать приложение. Выбираем «File → New → Android Application Project». Заполним содержимое окна так, как показано на рисунке.
Application Name - то имя приложения, которое будет показываться в Google Play Store. Но выкладывать приложение мы не собираемся, поэтому имя нам не особо важно.
Project Name - имя проекта в ADT.
Package Name - идентификатор приложения. Он должен быть составлен следующим образом: название Вашего сайта задом наперед, плюс какое-либо название приложения.
В выпадающих списках «Minimum Required SDK», «Target SDK», «Compile With» выбираем ту версию, которую мы скачали ранее. Более новые версии SDK поддерживают графические темы для приложений, а старые нет. Поэтому в поле «Theme» выбираем «None». Нажимаем «Next».
Снимаем галочку с «Create custom launcher icon»: в рамках данной статьи не будем заострять внимание на создании иконки приложения. Нажимаем «Next».
В появившемся окне можно выбрать вид «Activity»: вид того, что будет на экране, когда будет запущено приложение. Выбираем «Blank activity», что означает, что мы хотим начать всё с чистого листа. Нажимаем «Next».
В нашем приложении будет всего одно Activity, поэтому в появившемся окне можно ничего не менять. Поэтому просто жмем на «Finish».
Все, наше приложение создано.
Настройка эмулятора
Отладка приложений для Android производится на реальном устройстве или, если такового нет, то на эмуляторе. Сконфигурируем свой.
Для этого запустим «Window → Android Virtual Device Manager». В появившемся окне нажмем «New». Заполняем поля появившейся формы. От них зависит сколько и каких ресурсов будет предоставлять эмулятор «телефону». Выберите разумные значения и нажимайте «ОК».
В окне Android Virtual Device Manager нажимаем кнопку «Start». Это запустит эмулятор. Запуск занимает несколько минут. Так что наберитесь терпения.
В результате вы увидите окно эмулятора подобное этому:
Заполнение Activity
Activity - это то, что отображается на экране телефона после запуска приложения. На нем у нас будет две кнопки «Зажечь красный светодиод» и «Зажечь синий светодиод». Добавим их. В панели «Package Explorer» открываем res/layout/activity_main.xml . Его вид будет примерно таким же, как на скриншоте.
Перетаскиваем 2 кнопки «ToggleButton» на экранную форму. Переключаемся во вкладку «activity_main.xml» и видим следующий код:
activity_main_aiutogen.xmlЭто ни что иное, как наша Activity, которая отображается не в виде графики, а описанная в формате XML.
Сделаем имена компонентов более понятными. Изменим поля android:id следующим образом.
А еще добавим им подписи, изменим их цвет и размер текста. Результирующий код разметки будет выглядеть следующим образом.
activity_main.xmlЭти же изменения можно сделать и в графическом режиме, воспользовавшись вкладкой «Outline/Properties».
Пробный запуск
Мы можем запустить только что созданное приложение на эмуляторе. Идем в настройки запуска «Run» → Run Configurations», в левой части нажимаем на «Android Application». Появляется новая конфигурация «New_configuration». В правой части окна выбираем вкладку «Target» и выбираем опцию «Launch on all compatible devices/AVD».
Нажимаем «Apply», а затем «Run». Приложение запустится в эмуляторе.
Можно понажимать кнопки. Но ничего происходить не будет, поскольку обработчики нажатий еще нами не написаны.
Чтобы запустить приложение на реальном устройстве, необходимо включить в его настройках опцию «Отладка USB» и подключить его к компьютеру.
На реальном устройстве приложение выглядит абсолютно аналогично.
Написание кода для Android
Правка манифеста
Каждое Android-приложение должно сообщить системе о том, какие права необходимо ему предоставить. Перечисление прав идет в так называемом файле манифеста AndroidManifest.xml . В нем мы должны указать тот факт, что хотим использовать Bluetooth в своем приложении. Для этого достаточно добавить буквально пару строк:
AndroidManifest.xmlДобавляем основной код
Пришла пора вдохнуть жизнь в наше приложение. Открываем файл MainActivity.java (src → ru.amperka.arduinobtled). Изначально он содержит следующий код:
MainActivityAutogen.java package ru.amperka.arduinobtled ; import android.os.Bundle ; import android.app.Activity ; import android.view.Menu ; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate (savedInstanceState) ; setContentView(R.layout .activity_main ) ; } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater() .inflate (R.menu .main , menu) ; return true ; } }Дополним код в соответствии с тем, что нам нужно:
Будем включать Bluetooth, если он выключен.
Будем обрабатывать нажатия на кнопки
Будем посылать информацию о том, какая кнопка была нажата.
Передавать на Arduino мы будем один байт с двузначным числом. Первая цифра числа - номер пина, к которому подключен тот или иной светодиод, вторая - состояние светодиода: 1 - включен, 0 - выключен.
Число-команда, рассчитывается очень просто: Если нажата красная кнопка, то берется число 60 (для красного светодиода мы выбрали 6-й пин Arduino) и к нему прибавляется 1 или 0 в зависимости от того, должен ли сейчас гореть светодиод или нет. Для зеленой кнопки всё аналогично, только вместо 60 берется 70 (поскольку зеленый светодиод подключен к 7 пину). В итоге, в нашем случае, возможны 4 команды: 60, 61, 70, 71.
Напишем код, который реализует всё сказанное.
MainActivity.java package ru.amperka.arduinobtled ; import java.io.IOException ; import java.io.OutputStream ; import java.lang.reflect.InvocationTargetException ; import java.lang.reflect.Method ; import android.app.Activity ; import android.bluetooth.BluetoothAdapter ; import android.bluetooth.BluetoothDevice ; import android.bluetooth.BluetoothSocket ; import android.content.Intent ; import android.os.Bundle ; import android.util.Log ; import android.view.Menu ; import android.view.View ; import android.view.View.OnClickListener ; import android.widget.Toast ; import android.widget.ToggleButton ; public class MainActivity extends Activity implements View .OnClickListener { //Экземпляры классов наших кнопок ToggleButton redButton; ToggleButton greenButton; //Сокет, с помощью которого мы будем отправлять данные на Arduino BluetoothSocket clientSocket; //Эта функция запускается автоматически при запуске приложения @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate (savedInstanceState) ; setContentView(R.layout .activity_main ) ; //"Соединям" вид кнопки в окне приложения с реализацией redButton = (ToggleButton) findViewById(R.id .toggleRedLed ) ; greenButton = (ToggleButton) findViewById(R.id .toggleGreenLed ) ; //Добавлем "слушатель нажатий" к кнопке redButton.setOnClickListener (this ) ; greenButton.setOnClickListener (this ) ; //Включаем bluetooth. Если он уже включен, то ничего не произойдет String enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE ; startActivityForResult(new Intent(enableBT) , 0 ) ; //Мы хотим использовать тот bluetooth-адаптер, который задается по умолчанию BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter () ; //Пытаемся проделать эти действия try { //Устройство с данным адресом - наш Bluetooth Bee //Адрес опредеяется следующим образом: установите соединение //между ПК и модулем (пин: 1234), а затем посмотрите в настройках //соединения адрес модуля. Скорее всего он будет аналогичным. BluetoothDevice device = bluetooth.getRemoteDevice ("00:13:02:01:00:09" ) ; //Инициируем соединение с устройством Method m = device.getClass () .getMethod ( "createRfcommSocket" , new Class { int .class } ) ; clientSocket = (BluetoothSocket) m.invoke (device, 1 ) ; clientSocket.connect () ; //В случае появления любых ошибок, выводим в лог сообщение } catch (IOException SecurityException e) { Log.d ("BLUETOOTH" , e.getMessage () ) ; } catch (NoSuchMethodException e) { Log.d ("BLUETOOTH" , e.getMessage () ) ; } catch (IllegalArgumentException e) { Log.d ("BLUETOOTH" , e.getMessage () ) ; } catch (IllegalAccessException e) { Log.d ("BLUETOOTH" , e.getMessage () ) ; } catch (InvocationTargetException e) { Log.d ("BLUETOOTH" , e.getMessage () ) ; } //Выводим сообщение об успешном подключении Toast.makeText (getApplicationContext() , "CONNECTED" , Toast.LENGTH_LONG ) .show () ; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater() .inflate (R.menu .main , menu) ; return true ; } //Как раз эта функция и будет вызываться @Override public void onClick(View v) { //Пытаемся послать данные try { //Получаем выходной поток для передачи данных OutputStream outStream = clientSocket.getOutputStream () ; int value = 0 ; //В зависимости от того, какая кнопка была нажата, //изменяем данные для посылки if (v == redButton) { value = (redButton.isChecked () ? 1 : 0 ) + 60 ; } else if (v == greenButton) { value = (greenButton.isChecked () ? 1 : 0 ) + 70 ; } //Пишем данные в выходной поток outStream.write (value) ; } catch (IOException e) { //Если есть ошибки, выводим их в лог Log.d ("BLUETOOTH" , e.getMessage (, OUTPUT) ; pinMode(7 , OUTPUT) ; } void loop() { //Если данные пришли if (Serial.available () > 0 ) { //Считываем пришедший байт byte incomingByte = Serial.read () ; //Получаем номер пина путем целочисленного деления значения принятого байта на 10 //и нужное нам действие за счет получения остатка от деления на 2: //(1 - зажечь, 0 - погасить) digitalWrite(incomingByte / 10 , incomingByte % 2 ) ; } }Особенности заливки скетча
Для связи Bluetooth-Bee с контроллером используются те же пины (0 и 1), что и для прошивки. Поэтому при программировании контроллера переключатель «SERIAL SELECT» на «Wireless Shield» должен быть установлен в положение «USB», а после прошивки его надо вернуть в положение «MICRO».
Результат
Заключение
В данной статье мы научились создавать приложения для операционной системы Android и передавать данные по Bluetooth. Теперь при нажатии на кнопку на экране телефона на базе операционной системы Android, произойдет изменение состояния светодиода на плате.
Вы можете развить мысль и сделать более дружественный интерфейс на Android, управлять с его помощью гораздо более сложными устройствами, публиковать классные приложения в Android Market и ещё много-много всего интересного!