Игрушки на блютуз управлении

Обновлено: 09.05.2024

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

Немного об уровне, авторе и предостережения

Я, автор, пацан 16-17 лет с подмосковной деревни, специализируюсь на написании android-приложений (а там сложнее что-то сжечь), поэтому ответственность за оптимальный подход к решению задач с себя снимаю.

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

Задача


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

Понадобится

  1. Arduino
  2. Motor Shield (в моем случае две)
  3. Bluetooth
  4. Android
  5. Провода обычные

Основа конструкции

image

За основу была взята машина Lego Outdoor Challenger (в реальности выглядит менее пафосно). Все, что от нее осталось: корпус (все элементы украшения сняты) и три двигателя.

У машинки была своя плата, но одна из задач подразумевала универсальность: это сделал я, это смогут повторить другие. Мозги вынул, поставил Arduino Uno.

Установка Arduino

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


Поверх платы сразу поставил две motor shiled, так надо. Чтобы управлять второй, придется прокинуть один провод с любого digital порта на H1 (направление) и второй с пина с поддержкой шима (помечены знаком «~», обычно 10, 11) на E1 (скорость).


Определение угла поворота

За поворот машинки отвечает на удивление не сервопривод, а обычный двигатель. Встает проблема: хорошо бы было его не сжечь, ведь угол поворота ограничен, а крутиться двигатель может сколько угодно.

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

Решение проблемы: отслеживать угол через замыкание. На фото продемонстрирована небольшая штучка, которая крепится недалеко от поворотного механизма. На часть, которая крутится вместе с колесами влево/вправо двигателем, прикрепляется гребешок с железными контактами.



Принцип работы: к каждой линии припаивается провод (всего их четыре), нижний подключается к плюсу (он зажат гребешком всегда, см. картинку), остальные провода уходят на минус. Когда зубик гребешка попадает и на нижний ряд, и на, допустим, третий, происходит замыкание, ток течет, это замечает Arduino.


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


Подключение угла и код

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


Схема подключения показана на рисунке. Плюс тянем к зеленому, остальные протягиваем к минусу. Через резистор, установленный для устранения помех и отсутствия КЗ, подключаем провода к выходам A0-A2. Выбраны они просто из экономии остальных портов.


Код дан с комментариями. Подключаем пины и опрашиваем их через digitarRead(). Если напряжение есть, вернется значение true. Далее смотрим, если результат означает, что колеса в крайних положениях, запрещаем дальнейший поворот в эту сторону.

Небольшая хитрость: поскольку выходы на 5В и 3.3В понадобятся в будущем, можно поставить плюс на один из digital-пинов. Перед каждой проверкой угла выдавать ток через digitalWrite(whitePin), потом проверять угол и убирать ток.

Распараллеливание ходовых колес

Изначально два ходовых двигателя соединены вместе. Их рассоединил по двум причинам: поворот эффективней, если колеса крутятся в разные стороны, и два мощных двигателя одна плата не вытянет.

Проблема: у motor shield два выхода, каждый из которых выдает до 2 ампер. Каждый двигатель ест по 0,7А. Вроде меньше, но не при максимальных нагрузках. Допустим, машинка застряла в песке или уперлась, ток возрастает выше ампера. Не критично, но потенциально опасно.

А вот критичным оказалось то, что плата греется. Через минуты полторы после заезда, motor shield нагревалась и начинала работать безобразно: токи подаются не те, колеса не крутятся и прочее.

Решение обоих проблем: один двигатель подключил к одной motor shield, второй – к другой. Как ни странно, помогло. Температура упала, перегрев отсутствует. Можно было поставить радиатор, но крепить тяжело.


Подключение Bluetooth

Я использовал модель HC-05, что сыграло роковую шутку. Подключаются все блютузы одинаково: один провод на 3.3В (иногда начинал работать только от 5В), второй на минус, еще два на порт 0 и 1 (чтение и отправка соответственно). Провод, подписанный RXD на bluetooth, втыкается в TXD ардуино, а TXD в RXD (если перепутаете, то данных не увидите).

Есть оговорка: порты 0 и 1 по умолчанию используются Serial, через который заливает скетч. То есть, пока воткнут блютуз, скетч не зальется. Есть два выхода: вынимать блютуз на время заливки или переназначить входы и выходы блютуза. Второй вариант осуществляется двумя строчками


Подводный камень, съевший у меня трое суток работы – скорость общения. По привычке установил 9600 и пошел пробовать. То данные не приходили, то была каша символов. И в конце концов ответ – модель HC-05 общается на 38400! Очень сильно обратите внимание на то, что в Setup() я выполню BTSerial.begin(39400), хотя Serial.begin(9600).

Система отправки команд

Статья становится слишком длинной, поэтому рассмотрение кода Arduino и Android вынесу в отдельную вторую часть, а сейчас опишу принцип.

На андроид устройстве есть джойстик (круг, о реализации которого также во второй части). Андроид считывает показания с него и конвертирует их в подходящие для ардуино числа: скорость из пикселей превращает в значение от -255 до 255 (отрицательные – задний ход), а также определяет угол. Я сознательно отдал эту задачу телефону, так как он куда мощнее и спокойно справится с подсчетом нескольких сотен значений в секунду.


Алгоритм приема данных подробно описан в коде скетча. Он не раз переписывался и, как по мне, работает идеально.

Заключение первой части

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

Но самое интересное, как по мне, осталось на второе – программа Arduino и приложение на Android, там творится настоящая магия, по крайней мере, для молодого меня.

Будь в курсе последних новостей из мира гаджетов и технологий


Лучшие игрушки, которыми можно управлять со смартфона

Ольга Акукина

Хотите чем-то порадовать ребенка в честь начала учебного года? А, может, своего внутреннего ребенка?) У меня есть два вас интересная тема. Оставим в стороне RC-машинки, вертолетики и даже дроны. Есть гораздо более интересные штуки, управляемые со смартфона.

Brookstone Rover 2.0

Это - ни больше ни меньше - танк-шпион. У него есть камера с опцией ночного видения, фары, микрофон и Wi-Fi (дальность управления до 80 метров). А еще динамики, так что вы можете даже пообщаться с кем-то при помощи этой игрушки. У девайса большие колеса и он круто ездит. Стоит танк около 10 тысяч рублей.

50fbee1b3d77a873c0f69267b6e071e8.jpg

Обратите внимание на эту игрушку, если вам хочется что-то более полезное. Mebo тоже умеет снимать фото/видео и “говорить”, а еще у него 6 вездеходных колес как у трактора и крутая рука-захват. Кроме того, он понимает речевые команды, умеет следовать за хозяином и машет в знак приветствия.

295b557f126c91f00c26c793bd91ed69.jpg

А вот о таком, наверное, не все еще слышали. Речь про управляемую со смартфона подводную лодку с камерой! С ней вы можете почувствовать себя прямо как Жак Ив Кусто (помните его “подводную одиссею”?).

ad4e801c52f2081960b0618ac9751ba6.jpg

Имейте в виду, это не такая уж и “игрушка”. Девайс весит 4,5 кг и работает до 2-х часов от одного заряда.

Под водой W-Fi ловится не слишком хорошо, так что лодка соединяется проводом со специальным модулем. А вы уже передаете команды на этот модуль со смартфона. В комплекте идет 15-метровый кабель, дополнительно можно купить и 23-метровый. А вообще устройство выдержит погружение и на 45 м без проблем.

Отличная вещица для тех, кто любит отдыхать на море, но по каким-то причинам не желает плавать с маской и камерой. Можно греться на солнышке и смотреть на подводные глубины в разрешении HD. Субмарина развивает скорость до 9 км/ч.

Одна проблема - AquaBotix HydroView стоит 5 с лишним тысяч долларов (около 330000 руб.). Но не пугайтесь, профессиональные решения от этого бренда еще дороже.

Без машинок все же никуда. Anki Overdrive это как видеоигра (например, Mario Kart) живьем.

В комплекте изначально две роботизированные машинки, но можно докупить и больше. А еще имеется трек, который можно перестраивать в восьми разных вариантах.
У каждой машинки есть свои особенности и даже “суперсила”. Их можно детально настраивать со смартфона. Одерживая победы на трассе, можно получать баллы и тратить их на обновление возможностей машинки. Играть вдвоем не обязательно - у игры отличный AI.

6f42d628882faca8c5a93319f4bb0fa2.jpg

Гоночная трасса с машинками стоит около 12-13 тысяч рублей.

Есть у компании Anki еще одна крутая игрушка. Этот миниатюрный робот - почти что домашнее животное. Он выражает десятки эмоций - когда ему скучно, грустно, если он злится, устал или наоборот хочет повеселиться и поиграть. Еще робот умеет узнавать людей и радуется им (система на основе искусственного интеллекта). Со временем начинаешь воспринимать девайс как члена семьи!

a5e3c4bc264d8297c6f588eef4f8ae25.jpg

“Лицо” Cozmo - это LCD-панель, а изображение для нее создано профессиональными аниматорами. А еще он круто озвучен (не говорит словами, издает разные звуки). Сразу вспоминается знаменитый мультик про WALL-E.

2ce96d9e15cd7618369f940845dc0b79.jpg

Робот передвигается на гусеничном ходу и имеет своего рода “руки” (как погрузчик), так что он может трогать/двигать предметы. Благодаря системе датчиков, он “видит” препятствия и объезжает их.

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

Все любят лего! И, что радует, в этом сезоне к существовавшим ранее робо-сериям типа Mindstorms добавилась более простая и яркая версия - BOOST. В коллекции доступны робот Верни, кот Фрэнки, сборочная линия, гитара и вездеход. Что немаловажно, всех их можно собрать из набора в 843 стандартных детали LEGO. А можно добавить свои кубики и придумать что-то еще!

d25988b77a03cfa5435714ab59c0db7b.jpg

Еще в комплект входят датчики цвета и расстояния, а также моторчик. Построив конструкцию, ее можно запрограммировать с помощью одноименного приложения от LEGO. Чтобы робот ездил, ходил, танцевал и так далее. Верни, например, умеет даже трясти маракасами и стрелять из пушки по мишени. А кот мурлыкает и играет на гармошке.
Набор LEGO BOOST стоит 160 долларов (в России это превратится в 10-12 тысяч).

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

Итак, топ-5 игрушек, которыми можно управлять со смартфона.

Это игрушка в виде цилиндра с закруглёнными концами и резиновыми накладками для плавного передвижения. Она может маневрировать с помощью специального приложения для телефона.


Максимальная скорость передвижения до 22 км/ч. Прочный корпус имеет встроенные светодиоды, которые указывают на уровень заряда батареи. Радиус действия 30 метров.



Умный самолёт

Smart Plane позиционируется как игрушка для детей, но и для взрослых. Это медленно летающий самолёт, который может летать как в помещении, так и на улице. Приложение, которое необходимо для управления, имитирует на экране смартфона кабину и датчики управления по технологии Flight Assist. Ионно-литиевые аккумулятор позволяет автономно летать до 30 минут, затеи требуется подзарядка.



Танк шпион

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


· микрофон и динамики;

Управляемый жук

Своеобразная игрушка в виде насекомого, которым можно управлять с помощью смартфона. Дизайн довольно реалистичный и хотя имеет большие размеры по отношению к настоящим жукам. Передвигать можно на протяжении 6 метров, с помощью специального передатчика, который вставляется в разъём для наушников. Эта игрушка двигается довольно быстро и может показаться настоящим насекомым.


Внедорожник Brookstone

Это улучшенная версия классической машины на радиоуправлении, которая контролируется с помощью смартфона на расстоянии до 45 метров. Она может не только преодолевать препятствия с помощью шипованных колёс, но и плавать в водоёме. Встроенная камера передаёт изображение в приложение на телефоне.


Интересный факт! Первые радиоуправляемые модели появились еще в 40-е годы прошлого века в Японии.

Стоимость Достоинства Недостатки
13 000 рублей · многофункциональный вездеход;

· лёгкость в управлении;


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

Персональный боевой робот, управляемый смартфоном (1 видео)

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


Выбираем компоненты

В прошлом мы с приятелями написали собственную прошивку для роботов Lego Mindstorms NXT, поддерживающую удалённое управление роботом по bluetooth с Android-коммуникатора. Для экспериментов тогда была приобретена отладочная плата Olimex SAM7 с ARM7 на борту, которую в этот раз можно использовать в качестве управляющего контроллера.

В качестве шасси используем корпус игрушечной машинки.

Нужен bluetooth-модуль. Результат хотелось получить быстро, поэтому модуль был выбран из единственного доступного в магазине на тот момент BTM-112, хотя он оказался сравнительно дорогим.

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

  • Машинка
  • Управляющий контроллер Olimex SAM7
  • Bluetooth-модуль BTM-112
  • Контроллер для управления моторами L298N

Соединяем bluetooth с управляющей платой

Для начала настроим доставку команд управляющему блоку. Схема соединения bluetooth-модуля и контроллера простая: по сути дела это UART с некоторыми управляющими ножками, то есть надо лишь присоединить модуль к интегрированному UART-контроллеру.

Удалённое управление

Как было обещано, удаленное управление осуществляется с помощью Android-коммуникатора.

Наше прошлое приложение для Android (которое управляло Lego Mindstorms NXT, тоже посредством bluetooth) с помощью акселерометра отслеживало наклон коммуникатора и посылало соответствующие команды управления на NXT. Так что наиболее простым решением стало добавление протокола управления машинкой в уже существующее приложение. Сам протокол достаточно примитивен: фиксированная длина команды, фиксированный заголовок, после чего управление по осям X и Y.

Итак, на данном этапе мы можем “порулить” нашей платкой, правда моторы пока не подключены, так что индикация движений производится встроенными светодиодами (видео, к сожалению, нет, в этот момент снял только фотку), но всё равно прогресс есть, он виден, и это греет душу.


Соединяем управляющую плату с моторами

Изначально я думал, что смогу использовать управление со старой платы (зашитой в саму машинку), но оказалось, что использовать её в чистом виде нельзя, поскольку управление моторами было крепко сцеплено с радиочастью. Управлять моторами напрямую с ног головного контроллера тоже не получится из-за малой выходной мощности микросхемы. К сожалению, опыта в этой области у меня нет никакого (все-таки я программист, а не схемотехник), поэтому пришлось прибегнуть к помощи знакомых. По совету я взял микросхему усилителя L298N (избыточную для моих нужд, зато работающую из коробки) и собрал референсную схему.

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

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

forward reverse off
PIN1 1 0 0 1
PIN2 0 1 0 1
Так как Android-приложение передает плавное управление, состояние моторов изменяется по преодолению заданного порога.
Код получился очень простой, я не буду приводить его здесь, но в конце поста есть ссылки на исходники всего проекта.

  • Дискретное управление лево/право, вперед/назад. Сейчас управление моторами осуществляется с помощью GPIO, но выбранные для управления линии могут быть переназначены под PWM контроллер. Таким образом, повороты и ускорение будут плавным.
  • Дорогой усилитель. Тут всё просто, заменить на более дешёвую микросхему или схему на нескольких транзисторах.
  • Скромные возможности. Раз управление осуществляется с помощью смартфона, то можно как-либо расширить функциональность по сравнению с просто пультом управления.

Где посмотреть


Весь код есть в открытом доступе.
Прошивка для платы Olimex — тут.
Код Android приложения тут, собранная версия на Android Market.

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

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

Android-приложение

Программа для андроида разбита на две части: первая — подключение устройства по Bluetooth, вторая — джойстик управления.

Предупреждаю — дизайн приложения совсем не прорабатывался и делался на тяп-ляп, лишь бы работало. Адаптивности и UX не ждите, но вылезать за пределы экрана не должно.

Верстка

Стартовая активность держится на верстке, элементы: кнопки и layout для списка устройств. Кнопка запускает процесс нахождения устройств с активным Bluetooth. В ListView отображаются найденные устройства.


Экран управления опирается на верстку, в которой есть только кнопка, которая в будущем станет джойстиком. К кнопки, через атрибут background, прикреплен стиль, делающий ее круглой.
TextView в финальной версии не используется, но изначально он был добавлен для отладки: выводились цифры, отправляемые по блютузу. На начальном этапе советую использовать. Но потом цифры начнут высчитываться в отдельном потоке, из которого сложно получить доступ к TextView.


Файл button_control_circle.xml (стиль), его нужно поместить в папку drawable:


Также нужно создать файл item_device.xml, он нужен для каждого элемента списка:

Манифест

На всякий случай приведу полный код манифеста. Нужно получить полный доступ к блютузу через uses-permission и не забыть обозначить вторую активность через тег activity.

Основная активность, сопряжение Arduino и Android

Наследуем класс от AppCompatActivity и объявляем переменные:


Метод onCreate() опишу построчно:


Нижеприведенные функции проверяют, получено ли разрешение на использование блютуза (без разрешение пользователя мы не сможем передавать данные) и включен ли блютуз:


Если все проверки пройдены, начинается поиск устройства. Если одно из условий не выполнено, то высветится уведомление, мол, «разрешите\включите?», и это будет повторяться, пока проверка не будет пройдена.

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


Когда Bluetooth-модуль, повешенный на Arduino (подробнее об этом далее), будет найден, он появится в списке. Нажав на него, вы начнете создание socket (возможно, после клика придется подождать 3-5 секунд или нажать еще раз). Вы поймете, что соединение установлено, по светодиодам на Bluetooth-модуле: без соединения они мигают быстро, при наличии соединения заметно частота уменьшается.



Управление и отправка команд

После того как соединение установлено, можно переходить ко второй активности — ActivityControl. На экране будет только синий кружок — джойстик. Сделан он из обычной Button, разметка приведена выше.


В методе onCreate() происходит все основное действо:


Обратите внимание (!) — мы узнаем, сколько пикселей занимает кнопка. Благодаря этому получаем адаптивность: размер кнопки будет зависеть от разрешения экрана, но весь остальной код легко под это подстроится, потому что мы не фиксируем размеры заранее. Позже научим приложение узнавать, в каком месте было касание, а после переводить это в понятные для ардуинки значения от 0 до 255 (ведь касание может быть в 456 пикселях от центра, а МК с таким числом работать не будет).

Далее приведен код ControlDriveInputListener(), данный класс располагается в классе самой активности, после метода onCreate(). Находясь в файле ActivityControl, класс ControlDriveInputListener становится дочерним, а значит имеет доступ ко всем переменным основного класса.

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

Обратите внимание, использую класс java.util.Timer: он позволяет создать новый поток, который может иметь задержку и повторятся бесконечное число раз через каждое энное число секунд. Его нужно использовать для следующей ситуации: человек поставил палец, сработал метод ACTION_DOWN, информация пошла на ардуинку, а после этого человек решил не сдвигать палец, потому что скорость его устраивает. Второй раз метод ACTION_DOWN не сработает, так как сначала нужно вызвать ACTION_UP (отодрать палец от экрана).

Чтож, мы запускаем цикл класса Timer() и начинаем каждые 10 миллисекунд отправлять те же самые данные. Когда же палец будет сдвинут (сработает ACTION_MOVE) или поднят (ACTION_UP), цикл Timer надо убить, чтобы данные от старого нажатия не начали отправляться снова.


Обратите еще раз внимание: отсчет x и y метод onTouch() ведет от верхнего левого угла View. В нашем случае точка (0; 0) находится у Button тут:


Теперь, когда мы узнали, как получить актуальное расположение пальца на кнопки, разберемся, как преобразовать пиксели (ведь x и y — именно расстояние в пикселях) в рабочие значения. Для этого использую метод calculateAndSendCommand(x, y), который нужно разместить в классе ControlDriveInputListener. Также понадобятся некоторые вспомогательные методы, их пишем в этот же класс после calculateAndSendCommand(x, y).


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

Класс ConnectedThread также располагаем в классе ActivityControl.

Подводим итоги Андроид-приложения

Коротко обобщу все громоздкое вышеописанное.

  1. В ActivityMain настраиваем блютуз, устанавливаем соединение.
  2. В ActivityControl привязываем кнопку и получаем данные о ней.
  3. Вешаем на кнопку OnTouchListener, он отлавливает касание, передвижение и подъем пальца.
  4. Полученные данные (точку с координатами x и y) преобразуем в угол поворота и скорость
  5. Отправляем данные, разделяя их специальными знаками

Скетч Arduino


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

Переменные

Для начала рассмотрим константы и переменные, которые понадобятся.

Метод setup()

В методе setup() мы устанавливаем параметры пинов: будут работать они на вход или выход. Также установим скорость общения компьютера с ардуинкой, блютуза с ардуинкой.

Метод loop() и дополнительные функции

В постоянно повторяющемся методе loop() происходит считывание данных. Сначала рассмотрим основной алгоритм, а потом функции, задействованные в нем.

Все задержки через команду delay(), которые вы увидите далее, подобраны не через физико-математические вычисления, а опытным путем. Благодаря всем выставленным задрежам, машинка едет плавно, и у всех команд есть время на отработку (токи успевают пробежаться).

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


Поворачивать, когда андроид отправляет данные о том, что пользователь зажал угол 60, 90, 120, не стоит, иначе не сможете ехать прямо. Да, возможно сразу не стоило отправлять с андроида команду на поворот, если угол слишком мал, но это как-то коряво на мой взгляд.

Итоги скетча

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

В конце концов

Полноценная опись нескольких месяцев работы окончена. Физическая часть разобрана, программная тем более. Принцип остается тот же — обращайтесь по непонятным явлениям, будем разбираться вместе.

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

Читайте также: