Простая Bluetooth машинка на Arduino. Машинка с пропорциональным управлением по Bluetooth из-под Android Arduino машинка на управлении

После приобретения недорогого 7" китайского планшета и экспериментами с взаимодействием с Arduino по USB и Bluetooth захотелось сделать что-то более серьезное и полезное для своих детей. Так родилась идея сделать машинку с управлением от акселерометра Android-устройства и связи по Bluetooth каналу. До этого я никогда не увлекался робототехникой или РУ управлением, но желание было. Были поставлены три цели:

1. Сделать максимально простое для повторяемости устройство, которое сможет повторить любой начинающий радиолюбитель, айтишник, программист, домохозяйка. Т.е. минимум пайки, и (да простят меня радиолюбители), а основной упор сделать на готовые, дешевые и главное доступные модули, которые без проблем можно приобрести. Хотя конечно ничто не мешает спаять собственную отладочную плату или драйвер двигателей.
2. Проект полностью должен быть Open Source и мультиплатформенным. В качестве железной части использовать все популярные и современные аппаратно-программные платформы: Arduino (Processing), STM32, MSP430, PIC, AVR, и может быть даже .
3. Алгоритм управления полностью разработать самому с нуля, не читая при этом заумных книг по роботостроительству, а также сделать его максимально простым. Ну а в дальнейшем, уже можно будет повысить свой скил читая специализированную литературу и сделать более совершенное управление.

Управление машинкой (или гусеничной платформой) осуществляется путем наклона Android-устройства. Т.е. наклонили вперед - машинка едет вперед, наклонили влево - машинка поворачивает на лево, назад - машинка едет назад. Причем скорость движения или поворота зависит от степени наклона устройства. Чувствительность и величина наклона устанавливается в настройках Android-приложения. Данный способ управления достигается за счет доступа из программы к встроенному акселерометру (который сейчас имеется во всех современных Android смартфонах и планшетах).

Реализован также гибридный способ управления: газ - при помощи ползунка на экране, а поворот модельки - при помощи поворота Android-устройства (как виртуальный руль). Для заднего хода - отдельная кнопка.
Предусмотрен и обычный способ управления от кнопок на экране, но он менее функционален и в основном служит для отладки и проверки работоспособности.
В дополнении ко всему, я ради спортивного интереса реализовал и тач управление, т.е. на экране отображается круг, и чем выше двигаете в нем маркер, тем быстрее едет машинка, чуть повели пальцем влево - машинка поворачивает.

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

Компоненты

Итак, первое что прежде всего потребуется - это любое Android устройство: смартфон, планшет, часы и т.п., желательно с датчиком наклона (акселерометром) и Bluetooth (или возможностью подключения внешнего модуля через USB OTG). Я использовал китайский Ainol Aurora с внешней USB Bluetooth флэшкой. Цена такого устройства на сегодняшний день составляет менее 100$.

2. Шасси для машинки

Также понадобится любое шасси с 2-мя или 4-мя моторчиками. Это может быть как шасси для DIY проектов, так и шасси от старой б/у радиоуправляемой машинки.
Я купил готовое шасси на eBay. Кто еще не знаком с интернет-аукционом eBay, рекомендую для прочтения эту статью: . Гарантирую, что сэкономите немало денег покупая там, а не здесь у перекупов. Также, можно воспользоваться и другими китайскими магазинами: www.aliexpress.com, dx.com и др. Найти шасси довольно легко, достаточно в поисковую строку вбить одно из словосочетаний: Robot chassis, Robot platform, DIY Car chassis и др. Стоимость варьируется от 20$ до 60$.

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

Для принципа управления описанного в данном проекте, больше всего подходит гусеничная платформа, но т.к. у меня пока что ее нет, я реализовал проект на основе 4WD платформы.

3. Контроллер машинки

Как я уже говорил, проект планируется сделать мультиплатформенным. На текущий момент проект CxemCAR реализован для следующих аппаратных платформ:

  1. STM32
  2. Arduino
  3. .NET Micro Framework

"Мозги" робота не требовательны к быстродействию МК и количеству периферии, необходимый минимум, который должен поддерживать микроконтроллер: 2 ШИМ и UART.

Если вы никогда не имели дело с микроконтроллерами, то я советую вам для начала собрать этот проект на платах Arduino, т.к. во первых они достаточно дешевы (10-15$), а во вторых в сети и на этом сайте полно примеров, мануалов и т.п. Контроллеры STM32 и MSP430 более функциональны, но для новичка будут сложнее в освоении. Ну а для программистов, понравится один из вариантов данного проекта на с.NET Micro Framework, где в качестве среды программирования используется Microsoft Visual C# Express. Но нужно учесть, что сами платы FEZ не сильно распространены и купить их проблематично, хотя существует.NET вариант под Arduino форм-фактор под названием Netduino.

4. Bluetooth модуль

В качестве Bluetooth модуля использован дешевый китайский UART модуль HC-06. Подойдут модули вида HC-03, HC-04, HC-05, HC-06, да и вообще любые Serial Bluetooth. Лучше брать с готовыми штыревыми выводами, чтобы не пришлось паять, т.к. расстояние между выводами очень маленькое (см. 1-ой на фото внизу). Стоимость такого модуля на eBay составляет в среднем 5-10$.

Bluetooth модули и работа с ними применительно к Arduino, неплохо описаны в . Для других контроллеров все практически тоже самое, с описанием связи по Bluetooth между STM32 и Android.

5. Драйвер двигателя

В качестве драйвера я использовал специализированную микросхему L298N, которая представляет собой сдвоенный мостовой драйвер двигателей и предназначена для управления DC и шаговыми двигателями. На eBay продаются готовые платы со всей необходимой обвязкой, цена платы составляет 4-5$ и выглядит она приблизительно так:

Подключение к Arduino достаточно подробно описано в . В нашем проекте для плавного изменения скорости вращения двигателей, мы будем использовать ШИМ (широтно-импульсную модуляцию).

6. Остальные комплектующие

Помимо вышеперечисленных компонентов понадобятся:
- батарейный отсек (4-5 батареек АА) или аккумуляторы, можно использовать к примеру готовые блоки Li-Po аккумуляторов на 7.4В
- соединительные провода
- выключатель питания
- термоусадочная трубка, хомуты и др.

Все это конечно опционально и можно заменить тем, что есть под рукой, к примеру вместо термоусадки использовать изоленту и т.д.

Как видите, себестоимость машинки не так уж и велика, если использовать свое шасси с моторчиками, то выходит около 20-25$ на все, если покупать и шасси, то выйдет уже 45-60$ в зависимости от типа шасси (т.к. диапазон цен на них очень широк).

Вот, что получилось у меня:


Принцип работы

В Android устройстве формируются команды перемещения машинки в зависимости от наклона смартфона/планшета, либо от нажатой кнопки. Все расчеты производятся в Android-приложении, и сразу же вычисляются значения ШИМ для левого и правого двигателей. Приложение обладает гибкими настройками, такими как диапазон ШИМ, чувствительность наклона, минимальный порог ШИМ и др. По Bluetooth передаются команды вида:
L-255\rR-120\r
L - команда для левого двигателя, R - для правого
минус обозначает вращение двигателя для движения назад
255 - число ШИМ, для Arduino это максимальная скорость вращения
\r - конец команды.
По данной команде машинка будет двигаться назад и немного поворачивать в правую сторону, т.к. правый двигатель будет вращаться медленнее левого.

L255\rR-255\r
По данной команде левый двигатель будет вращаться вперед, а правый назад, что заставит машинку вращаться вокруг своей оси против часовой стрелки.

H1\r
Команда включения дополнительного канала, к которому например можно подключить фары, звуковой сигнал и т.п. В качестве примера, приведен только один дополнитльный канал, однако ПО легко модифицировать, чтобы задействовать большее количество дополнительных каналов.

Символы команд L, R и H можно задавать в настройках Android-приложения.

В программе контроллера предусмотрен таймер, который отключает двигатели, если последняя команда была получена более, чем n-секунд назад. Настройка количества секунд хранится в EEPROM памяти контроллера и может быть изменена с Android устройства. Диапазон данной настройки составляет от 0.1 сек до 99.9 секунд. Также, настройку можно совсем отключить. Но тогда, при потере связи машинка будет ехать, пока не будет выключено питание.
Для работы с памятью микроконтроллера предусмотрены команды Fr - чтение значений и Fw - запись значений.

Электронная начинка

Структурная схема CxemCAR представлена ниже:

Как видим, к контроллеру (Arduino, STM32 и др. неважно какой) подключается Bluetooth модуль и драйвер двигателей, к которому в свою очередь подключается 2 или 4 моторчика Bluetooth-управляемой модели. На схеме изображен один выход дополнительного канала (включение звукового сигнала, фар и т.п.), но путем небольшой правки программы число дополнительных каналов может быть легко увеличено.

Работа с Android приложением

Приложение под Android писалось в среде Eclipse. Все исходники проекта и проект для Eclipse вы можете скачать ниже. Я не специалист в Java программировании и это мое первое приложение под Android поэтому кое-где код не совсем удачен. Именно на разработку Android приложения ушло основное время при разработке данного проекта. Версия Android должна быть не ниже 3.0, я все писал и тестировал под планшет с версией 4.0.3.

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

Предусмотрено 3 режима управления Bluetooth-моделью:

Управление от акселерометра - основной способ управления. Управление движением Bluetooth-модели осуществляется за счет наклона Android-устройства (планшет, телефон и др.)
Виртуальный руль - гибридное управление. Газ - при помощи ползунка, повороты - при помощи поворота устройства. Задний ход - отдельной экранной кнопкой.
Управление от кнопок - на экране приложения выводятся 4 кнопки управления: вперед, назад, влево и вправо. При нажатии кнопки "вперед" машина едет вперед пока держите кнопку, при нажатии "назад" тоже самое, но едет назад. При нажатии кнопок "влево" или "вправо" машинка крутится вокруг своей оси в одну или в другую сторону. При этом значение скорости фиксировано (по умолчанию стоит максимальная скорость), но в настройках можно изменить данный параметр.
Управление от touch - данный способ управления я подсмотрел в игре DeathRally и ради спортивного интереса решил повторить. Честно сказать поучилось не очень удобно, но может кому-нибудь пригодится. На экране рисуется круг, внутри которого и происходит процесс управления. Повели пальцем вверх относительно центра - машинка едет вперед, чуть левее - машинка начинает поворачивать влево. Насчет этого способа управления, есть в дальнейшем идея усовершенствования с помощью компаса, т.е. использовать круг не как задатчик скорости и поворота, а задавать с помощью него направление движения.

Настройки приложения

Скриншот настроек Android приложения CxemCar версии 1.0:

К каждой настройке внизу есть небольшое пояснение, поэтому с их предназначением думаю не должно возникнуть вопросов. Однако на некоторых из них хотелось бы остановиться более подробно.

Точка разворота для мотора (ось X)

При наклоне Android-устройства влево или вправо программа притормаживает тот двигатель, в сторону которого наклонено устройство, т.о. осуществляется поворот. Однако, когда значение наклона доходит до заданной в настройках точки разворота, то двигатель начинает вращаться в другую сторону. Если наклонить устройство максимально вбок, то один двигатель будет вращаться с максимальной скоростью в одну сторону, а другой в другую и соответственно машинка будет крутиться вокруг своей оси на месте.

MAC адрес

Для установления связи с Bluetooth модулем машинки, в настройках приложения необходимо задать MAC-адрес. Предварительно необходимо настроить сопряжение устройств в настройках вашего Android-устройства. Для этого переходим в Настройки -> Bluetooth и нажимаем "Поиск устройств", телефон находит наш Bluetooh-модуль, нажимаем по нему и вводим пароль (как правило 1234).

Узнать Bluetooth адрес модуля можно из какого-нибудь приложения, к примеру Bluetooth Terminal . Для этого внизу нажимаем "Connect a device - Secure" и в появившемся окошке нажимаем кнопку "Scan for devices". ПО сканирует Bluetooth устройства и отобразит их MAC-адреса:

Этот MAC-адрес и необходимо прописать в настройках приложения CxemCAR.

Само ПО под Android я не буду расписывать, т.к. оно довольно таки громоздкое и поэтому если у вас возникнут какие-либо вопросы по нему, то обращайтесь тему поддержки данного проекта на форуме.

Сборка платформы

Как я уже говорил выше, в качестве платформы я выбрал шасси Pirate-4WD от производителя DFRobot (SKU:ROB0003). Это одно из самых популярных шасси, вот его описание и видео по сборке . Хотя там все интуитивно понятно и сборка очень проста.

После того, как была собрана основа шасси с моторами, припаиваем провода и на всякий случай маркируем моторчики:

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

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

Следующим этапом является установка колес. На вал они налезают очень туго, кое-где даже пришлось подпилить каттэром.

Провода от 4-х моторов подключаем к плате драйвера двигателей L298N, левые 2 мотора просто запаралеленны, тоже самое и правые.

Для того, чтобы можно было видеть состояние Bluetooth соединения, у модуля HC-06 (да и у других тоже) присутствует возможность подключения светодиода состояния. Я решил его также подключить и вывести на видное место. Для этого, я использовал токоограничительный резистор номиналом 470 Ом и термоусадочную трубку.

К модулю Bluetooth подключаем или подпаиваем все необходимые провода, помимо светодиода это питание, GND, TX и RX. Смотрите документацию на ваш Bluetooth модуль. Чтобы не мучаться с пайкой, я вам советую сразу взять модуль с подпаянными штыревыми выводами (см. фото выше). И лучше брать модули HC-03/HC-05.

Я же использовал модуль HC-06, который у меня был до этого. Схема распайки следующая:

В распаянном виде модуль выглядит так:

Его я также разместил в термоусадочной трубке большого диаметра.

Для питания двигателей я использовал батарейный отсек на 5 элементов типа АА, т.е. напряжение питания двигателей составило 7.5 Вольт. Можно использовать LiPo и другие аккумуляторы. Для крепления батарейного отсека в крышке шасси просверлил два отверстия и закрепил при помощи двух болтов.

История изменений ПО для Android:
Версия 1.1 (от 28.01.2013) - в классе cBluetooth изменения для более стабильного подключения по Bluetooth. Теперь не нужно вводить код для pairing (связывания устройств)
Версия 1.2 (от 15.02.2013) - дополнен класс cBluetooth на предмет установки соединения с устройством (полезно при отладке). Изменения в классе Handler (исправлены все ошибки с static). Реализован новый вид управления - "виртуальный руль".
Версия 1.3 (от 20.07.2013) - мелкие правки в активити. Исправление ошибки с инверсией координат на смартфонах


В этом материале предлагаем узнать, как можно сделать радиоуправляемую машинку в домашних условиях.

Для изготовления машинки, нам понадобится:
- игрушечная машинка;
- две карты Arduino Uno;
- две платы радио модуля NRF24;
- конденсатор на 470 мф, 25 вольт;
- плата драйвера двигателя L298N;
- двигатель;
- сервопривод;
- аналоговый джойстик;
- аккумуляторные батарейки;
- батарейка крона;
- две кнопки включения и выключения;
- корпус.

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

Необходимо позаботиться о поворотной системе автомобиля. Для этого вырезаем часть, предназначенную для крепления передних колес.

Теперь необходимо проделать отверстия диаметром 4 мм в нижней части корпуса машинки и колесах.

Собираем все. Просовываем винт в колесо, и фиксируем двумя гайками.

Просовываем еще один винт в отверстие на корпусе, фиксируем гайками.

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

Теперь необходимо соединить сервопривод к поворотной системе.

Также в двигателе есть специальные крепежные отверстия, в которые нужно вставить два винтика, чтобы закрепить двигатель на корпусе машинки.

Теперь необходимо залить код на плату Arduino. В конце статьи будет представлен код для приемника, а также код для передатчика.

Представляем схему сборки джойстика или передатчика.

Ниже вы можете увидеть схему сборки приемника.

В конце остается собрать электронику и механику самодельного радиоуправляемого автомобиля. При включении надо сначала включить пульт управления, после чего саму машинку.

Как и обещали, ниже даем ссылки на коды, необходимые для программирования платы
Код для приемника: (скачиваний: 3609)
Код для передатчика: (скачиваний: 2617)

Также представим короткую инструкцию по прошивке плат Arduino Uno. Плату нужно подключить к компьютеру через USB кабель. Далее с официального сайта () нужно скачать бесплатную программу, установить ее, установить драйверы платы и прошить ее при помощи этой программы.

Если же вы используете китайскую плату , то ее драйвер можете скачать по этой ссылке:

Машинка на arduino и Bluetooth без редактирования кода. Мы будем использовать специализированный бесплатный софт для составления скетча. Кроме того не надо покупать шасси для нашей поделки, подойдет практически любая неисправная радиоуправляемая модель автомобиля или танка.

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

Итак, давайте разберем на живом примере как сделать своими руками дистанционно управляемую по bluetooth c android планшета или смартфона машинку. Статья, как ни странно, рассчитана на начальный уровень знаний. Здесь нет руководства по редактированию кода в Arduino IDE, да и мы использовать его будем только для заливки нашего кода. А составлять алгоритм управления будем в программе под названием FLProg. Программа управления со смартфона — HmiKaskada_free. Но сначала о железе, которое нам понадобится.

Машинка на arduino и Bluetooth — аппаратная часть.

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

Для управления электродвигателями нашего будущего творения понадобится Н-мост на микросхеме L298N Ссылка на Али, я брал у именно этот. Картинка кликабельна.

Н-мост для arduino

Может управлять двумя двигателями в диапазоне напряжений 5 — 35 вольт. Поддерживает ШИМ, то есть можно регулировать обороты двигателей. На плате есть вывод стабилизированного напряжения 5 вольт для питания ардуино.

Схема подключения проста и незатейлива:

Следующей неотъемлемой частью электронной начинки нашего проекта является bluetooth модуль HC-06 . Самый обычный модуль для ардуино, настолько популярен что в дополнительном описании не нуждается.

HC-06 bluetooth for arduino

Основным элементом и мозгом в моем случае выступает arduino nano , тут даже фото выкладывать не буду ибо все о ней знают и умеют с ней работать. Кстати подойдет любая плата ардуино, лишь бы в корпус поместилась 😀

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

Машинка на arduino и Bluetooth — составление скетча.

Повторюсь — никакого копания в коде тут не будет. Мы будем использовать популярную программу FLProg. Скачать ее последнюю версию можно на официальном сайте . Интерфейс проги прост и незатейлив, но имеется огромный функционал и поддержка практически всех популярных модулей. Как ей пользоваться писать не буду так как это потянет на пару статей. Скажу только что я не встречал более удобной и доступной программы для составления скетчей для arduino и ее клонов. Скрин интерфейса:

Интерфейс FLProg

На сайте полно текстовых и видео мануалов, думаю разберетесь.

Мой проект для дистанционно-управляемой машины можно скачать с яндекс-диска.

Машинка на arduino и Bluetooth — интерфейс управления на планшете android.

По многочисленным просьбам написал подробную инструкцию по разработке интерфейса управления на базе HmiKaskada android в статье . Ссылка кликабельна.

Для устройств под управлением android существует программа HmiKaskada (ссылка на ЯндексДиск) . Изначально она разрабатывалась как альтернатива дорогим промышленным HMI панелям. Но пытливые умы быстро смекнули что управлять она может чем угодно. В нашем случае машинкой. Поддерживает беспроводные интерфейсы Wi-Fi и Bluetooth, кроме того можно девайс подключить напрямую через USB.

Есть платная и бесплатная версии программы. У меня есть обе но я принципиально сделал проект в бесплатной версии что бы показать вам и в очередной раз убедиться в абсолютной работоспособности free версии. Основное отличие free от PRO версий это работа только по блютуз.

На форуме FLProg есть гигантская ветка по вопросу совместимости с КаСкадой, да и разработчик активен и общителен. Скрин панели управления выкладывать не вижу смысла — он есть в видеоролике.

В данной статье будет подробно расписано создание небольшого приложения для мобильной операционной системы 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 xmlns:tools = android:layout_width ="match_parent" android:layout_height ="match_parent" android:paddingBottom = android:paddingLeft = android:paddingRight ="@dimen/activity_horizontal_margin" android:paddingTop ="@dimen/activity_vertical_margin" tools:context =".MainActivity" > android:id ="@+id/toggleButton1" android:layout_alignParentLeft ="true" android:layout_alignParentTop ="true" android:text ="ToggleButton" /> android:id ="@+id/toggleButton2" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:layout_above ="@+id/textView1" android:layout_alignParentRight ="true" android:text ="ToggleButton" /> >

Это ни что иное, как наша Activity, которая отображается не в виде графики, а описанная в формате XML.

Сделаем имена компонентов более понятными. Изменим поля android:id следующим образом.

android:id ="@+id/toggleRedLed" ... android:id ="@+id/toggleGreenLed" ...

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

activity_main.xml "http://schemas.android.com/apk/res/android" xmlns:tools ="http://schemas.android.com/tools" android:layout_width ="fill_parent" android:paddingBottom ="@dimen/activity_vertical_margin" android:paddingLeft ="@dimen/activity_horizontal_margin" android:paddingRight ="@dimen/activity_horizontal_margin" android:paddingTop ="@dimen/activity_vertical_margin" tools:context =".MainActivity" android:weightSum ="2" android:orientation ="horizontal" > android:id ="@+id/toggleRedLed" android:layout_width ="wrap_content" android:layout_height ="fill_parent" android:layout_weight ="1" android:background ="#FF0000" android:textOff ="OFF" android:textOn ="ON" android:textSize ="30dp" /> android:id ="@+id/toggleGreenLed" android:layout_width ="wrap_content" android:layout_height ="fill_parent" android:layout_weight ="1" android:background ="#00FF00" android:textOff ="OFF" android:textSize ="30dp" android:textOn ="ON" /> >

Эти же изменения можно сделать и в графическом режиме, воспользовавшись вкладкой «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 "http://schemas.android.com/apk/res/android" package ="ru.amperka.arduinobtled" android:versionCode ="1" android:versionName ="1.0" > android:minSdkVersion ="10" android:targetSdkVersion ="10" /> "android.permission.BLUETOOTH" /> "android.permission.BLUETOOTH_ADMIN" />
android:allowBackup ="true" android:icon ="@drawable/ic_launcher" android:label ="@string/app_name" android:theme ="@style/AppTheme" > android:name ="ru.amperka.arduinobtled.MainActivity" android:label ="@string/app_name" > > "android.intent.category.LAUNCHER" /> > > > >

Добавляем основной код

Пришла пора вдохнуть жизнь в наше приложение. Открываем файл 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 и ещё много-много всего интересного!