Блютуз машинка своими руками

Простая Bluetooth машинка на Arduino

Широкое распространение и дешевизна платформы Arduino и различных робоплатформ позволило любителям создавать радиоуправляемые машинки на любой вкус. А широкое распространение смартфонов позволило использовать их в качестве контроллеров этих машинок. Главной проблемой для многих любителей Arduino является отсутствие опыта в программировании под Android. Сегодня я расскажу, как легко решить эту проблему, используя среду визуальной разработки android-приложений App Inventor 2.

Постройку любой машинки надо начинать с «железа», поэтому вкратце опишу, что использовал для своей машинки:
arduino nano
bluetooth module HC-05
Z-Mini Motor Sensor Shield L293D
2WD Motor Chassis
Конфигурация «железа» не играет большой роли в этом проекте, поэтому шасси, шилд и саму ардуино можно заменить на любые аналоги.

Теперь перейдем к созданию приложения для Android. App Inventor — среда визуальной разработки android-приложений, работает из браузера. Заходим на сайт, разрешаем доступ к своему аккаунту в Google, нажимаем кнопку «create» и создаем новый проект. В новом проекте методом «Drag and Drop» создаем 4 кнопки для выбора направления движения и одну для подключения к нашему bluetooth модулю. Примерно так:

image

Далее нажимаем на кнопку «Blocks» в правом верхнем углу и все тем же методом перетаскивания элементов создаем логику работы нашего android-приложения примерно вот так:

image

Теперь остается скомпилировать приложение, нажав на кнопку «Build».

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

int val;
int IN1 = 4;
int IN2 = 7;
int EN1 = 6;
int EN2 = 5;

void setup()
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(EN1, OUTPUT);
pinMode(EN2, OUTPUT);

>
void loop()
if (Serial.available())
val = Serial.read();

// Задаём движение вперёд
if (val == ‘W’) // При нажатии клавиши «W»
// Выводы конфигурируются согласно работе Motor Shield’а
// Моторы крутятся вперед
digitalWrite(EN1, HIGH);
digitalWrite(EN2, HIGH);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
>

Читайте также:  Alfa romeo 159 bluetooth

// Задаём движение назад
if ( val == ‘S’)
digitalWrite(EN1, HIGH);
digitalWrite(EN2, HIGH);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
>

// Задаём движение вправо
if ( val == ‘D’)
digitalWrite(EN1, HIGH);
digitalWrite(EN2, HIGH);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
>

// Задаём движение влево
if ( val == ‘A’)
digitalWrite(EN1, HIGH);
digitalWrite(EN2, HIGH);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
>

// Стоп режим
// При отпускании клавиш в программе в порт шлется «T»
if ( val == ‘T’) // При нажатии клавиши «T»
// Выводы ENABLE притянуты к минусу, моторы не работают
digitalWrite(EN1, LOW);
digitalWrite(EN2, LOW);
>
>
>

Итак, вот такая у меня получилась машинка:

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

image

P.S. Для тех, кто не сталкивался с разработкой приложений в App Inventor 2, я сделал более подробный гайд по разработке этого приложения (для просмотра нужно перейти на ютуб).

P.P.S. Сборник из более 100 обучающих материалов по ардуино для начинающих и профи тут.
Онлайн курс по ардуино на гиктаймс здесь.
UPD 1.02.2017: выложил приложение на play market.
Аналогичные проекты с другими шилдами здесь.

Источник

Собираем свою Bluetooth машинку с управлением на Android

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

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

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

Читайте также:  Bluetooth light home assistant

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

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

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

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

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

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

Программная составляющая не сильно сложнее. При соединении модуль пишет строку вида «CONNECT RE:MO:TE:BT:MA:CC xxx \r\n» , а при отсоединении — «DISCONNECT xxx \r\n» . Задача драйвера состоит в наблюдении за потоком символов и, в случае если сейчас активно соединение, передаче потока управляющему приложению. В итоге драйвер представляет собой конечный автомат, у которого переключение состояния означает переключение функции-обработчика.

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

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

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

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

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

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

Читайте также:  Беспроводная bluetooth мышь razer

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

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

forward reverse off
PIN1 1 0 0 1
PIN2 0 1 0 1

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

Итог

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

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

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

Источник

Оцените статью
Adblock
detector