CUSTOMELECTRONICS.RU
Информационно-учебный блог о разработке электроники
Эл. почта: info@customelectronics.ru

Strela от Амперки или простой Bluetooth-бот своими руками

Недавно мы получили подарок для нашей мастерской от одного из ведущих производителей учебных наборов по электронике — Амперки. В этой статье мы расскажем об их готовом решении, которое позволяет быстро собрать робота под управлением Android-смартфона через bluetooth.
Вот как выглядит наш робот:

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

Strela

Платформа Strela — это Arduino-совместимая плата, полностью подготовленная для строительства роботов. Она разработана компанией Амперка и совмещает в себе практически все, что может понадобиться для быстрой постройки робота. Приехала она нам вот в такой коробочке:

Strela в заводской упаковке

Strela в заводской упаковке

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

Задняя сторона коробочки

Задняя сторона коробочки

В коробке сама плата:

Распаковка

Распаковка

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

Strela, вид сверху

Strela, вид сверху

Strela, вид снизу

Strela, вид снизу

Вот основные характеристики платы:

  1. Питание
    • Входное напряжение: 7-24В. От этого же напряжения питается драйвер двигателя
    • Встроенный импульсный стабилизатор на 5В, 3А. Сама плата потребляет очень мало, то есть все это можно использовать для питания подключаемых элементов (датчиков, сервоприводов и т.д.)
    • Линейный стабилизатор на 3,3В для питания модулей связи
    • Питание от USB. На Стреле установлен компаратор, который при отключении основного питания автоматически переключается на питание от USB-порта. Нагрузочная способность по 5-ти вольтовому каналу при этом упадет до 500мА, а силовые выходы на двигатели перестанут работать
  2. Периферия, установленная на плате
    • Пьезоизлучатель без встроенного генератора. Может быть использован для воспроизведения произвольной мелодии
    • Переключатель RESET. То есть именно переключатель. Он, по сути, служит выключателем платы. То есть можно отключить плату если поставить внешний тумблер на питание, а можно просто "выключить" микроконтроллер переключателем RESET
    • Четыре пользовательских кнопки без фиксации
    • Четыре пользовательских светодиода, которые могут быть включены и выключены из программы
    • Десять индикаторных светодиодов для индикации состояния двигателей, питания и линий передачи
  3. Разъемы для подключения внешних элементов
    • Две клеммные колодки для подключения двух моторов постоянного тока по 2А, либо одного мощного на 4А, либо одного шагового двигателя
    • 12 стандартных трехконтактных PLS-разъемов (GND, 5V, SIG). К ним можно подключать разнообразные датчики, сервоприводы и т.д. Восемь из них могут работать, как аналоговые входы и 4 как PWM-выходы
    • Разъем для установки модулей связи. Вся необходимая обвязка уже есть на плате — остается только установить нужный модуль формата XBee
    • Разъем для подключения ИК-приемника для управления с пульта по оптическому каналу
    • Разъем для подключения жидкокристаллических дисплеев
    • Интерфейсы TWI/I2C, SPI, UART

Более подробно технические характеристики изложены в вики.
На сегодняшний день роботостроители чаще всего используют модульный принцип. То есть им приходится покупать по отдельности практически все эти функции, а потом соединять их вместе. Strela фактически включается в себя несколько устройств, которые обычно покупают отдельно — Arduino, шилд с драйвером двигателей, преобразователь напряжения и breadboard для прототипирования.
Трудно перечислить достоинства и недостатки этой платы. Я бы назвал это аппаратными особенностями:

  • Плата относительно большая — 100х80мм. Но с другой стороны может для юных пользователей это даже облегчит работу с ней
  • Отсутствие совместимости со стандартными шилдами для Arduino. Хотя для начинающих роботостроителей ее возможностей хватит очень надолго
  • Белая маска. Лично мне не нравится, из-за того, что не видно дорожек на плате, но я понимаю что такой выбор сделан в пользу эстетики
  • Продуманная схемотехника. Некоторые решения не имеют запаса прочности, но в целом все продумано очень добротно и удобно для использования. Чувствуется большой опыт разработчиков и понимание ожиданий пользователей
  • Крепежные отверстия на плате повторяют расположение отверстий на Arduino Uno, плюс есть дополнительные четыре отверстия
  • Подробнейшая документация с огромным количеством примеров
  • Библиотека для работы с платой. О ней мы позже поговорим отдельно

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

Шасси для робота

Также нам подарили удобную двухколесную платформу Turtle.

Turtle в разобранном виде

Turtle в разобранном виде

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

Bluetooth-модуль, датчики и индикатор

Помимо контроллера и платформы нам подарили еще много приятных мелочей:

Bluetooth-модуль, датчики и индикатор

Bluetooth-модуль, датчики и индикатор

  1. Модуль Bluetooth Bee, совместимый с платформой и очень простой в использовании. К контроллеру он подключается через UART, а операционные системы видят его как COM-порт. Наверное, самый простой способ подключить что-то к ПК/смартфону без проводов
  2. Текстовый экран 8х2. Очень удобно, если робот может показывать какие-то статусные сообщения, тем более, что этот дисплей поддерживает еще и русский алфавит
  3. Два аналоговых датчика линии для постройки line-tracer’а. В комплекте с ними есть обычные трехжильные кабели для подключения
  4. Инфракрасный дальномер 10-80см с креплением. На выходе у него напряжение, величина которого зависит от измеренного расстояния
  5. Два инфракрасных датчика препятствий. На его выходе либо ноль, либо единица в зависимости от выставленного порога срабатывания и измеренного расстояния

Сборка bluetooth-бота

Для быстрой проверки возможностей системы мы решили собрать робота, управляемого через bluetooth. За основу мы взяли пример из вики по Стреле.
Для этого будет достаточно самой платформы Strela, как контроллера, модуля связи, колесной платформы и аккумулятора. Мы решили не использовать батарейный отсек. Вместо этого мы подключили LiPo-аккумулятор на 11,1В, 3А/ч. Дополнительно мы подключили еще и индикатор.
Вот, что у нас получилось в итоге:

Робот, управляемый по bluetooth, в сборе

Робот, управляемый по bluetooth, в сборе

Подключение двигателей

Подключение двигателей

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

Программирование робота

О программирование платформы Strela можно написать отдельную статью, но мы постараемся изложить только основные моменты.
Внимательный читатель мог заметить, что количество "ног", которыми управляет Strela, значительно больше чем у Arduino Leonardo. Для одного только ЖК-индикатора их нужно восемь штук. Все это реализовано благодаря использованию расширителей портов, управляемых через I2C. Использовать возможности этих расширителей было бы довольно трудно, если бы не готовая библиотека Strela.
Разработчики электроники очень часто небрежно относятся к вопросам упаковки, документирования и программного обеспечения. Но это не относится к Амперке. Для платы Strela есть масса готовых примеров и отличная библиотека. В ней всего несколько функций для работы с цифровыми выводами. Они такие же простые, как стандартные функции Arduino. Их использование позволяет не вдаваться в тонкости использования шины I2C, иначе для начала работы с ней потребовалось гораздо больше времени.
Если вы планируете использовать ЖК-дисплей, то лучше скачать библиотеку из вики по Стреле. И там же вы найдете примеры работы с ней.
Для управления с телефона, как и в примере, мы использовали готовое приложение Bluetooth RC car из Play Market.
Я, основной автор этого блога, Грищенко Сергей, помимо прочего преподаю в колледже и занимаюсь с ребятами дополнительно в рамках кружка. Программированием и сборкой самого робота занимался один из моих студентов. До этого у него уже был небольшой опыт программирования микроконтроллеров на С и под операционные системы. Его код я приведу именно в том виде, в котором он мне его передал:

#include <Wire.h> // Библиотека для работы с I2C
#include <Strela.h> // Библиотека для работы со Стрелой
#include <LiquidCrystal_I2C.h>
 
int velocity = 0;  //Здесь будет храниться значение скорости
int defaultSpeed = 100; // это число мы будем использовать в логике поворотов
int start = 1;
LiquidCrystal_I2C lcd(LC_ADDR, LCEN, LCRW, LCRS, LC4, LC5, LC6, LC7);
 
void setup()
{
  Serial1.begin(9600);     //Bluetooth Bee по умолчанию использует эту скорость
  //motorConnection(1, 0);   // Я неправильно прикрутил один мотор
  //поэтому, чтобы их не перекручивать
  //можно воспользоваться этой функцией.
  //Направление вращения мотора 1 будет изменено.
  uDigitalWrite(L2, HIGH);
  uDigitalWrite(L3, HIGH);
  drive(0, 0);
  
  lcd.begin(8, 2);
  lcd.home();
  lcd.print("Hello");
  delay(2000);
  lcd.setCursor(0, 1);
  lcd.print("Load");
  delay(1000);
  lcd.print(".");
  delay(1000);
  lcd.print(".");
  delay(1000);
  lcd.print(".");
  delay(1000);
  lcd.clear();
  lcd.home();
  lcd.print("Connect");
  lcd.home();
}
 
void loop()
{
  
  if (Serial1.available() > 0)    //Если появились новые команды
  {
    if (start==1)
    {
      lcd.print("Conected");
      delay(1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Speed");
      lcd.setCursor(0, 1);
      start = 0;
    }   //вызываем функцию управления
    control(); 
  }
  //Здесь можно написать ещё много своего кода
}
 
void control()  // функция управления
{
  
  
  char dataIn = Serial1.read();  //Считаем значение пришедшей команды
 
  if (dataIn == 'F')         //Если пришла команда "F"
    drive(velocity, velocity);   //едем вперёд
 
  else if (dataIn == 'B')    //или если пришла команда "B"
    drive(-velocity, -velocity); //едем назад
 
  else if (dataIn == 'R')    //или если пришла команда "L"
    drive(-velocity, velocity);  //поворачиваем налево на месте
 
  else if (dataIn == 'L')    //или если пришла команда "R"
    drive(velocity, -velocity);  //поворачиваем направо на месте
 
  else if (dataIn == 'G')    //или если пришла команда "I", едем вперёд и направо
    drive(defaultSpeed+velocity, defaultSpeed-velocity);
 
  else if (dataIn == 'H')    //или если пришла команда "J", едем назад и направо
    drive(-defaultSpeed-velocity, -defaultSpeed+velocity);
 
  else if (dataIn == 'I')   //или если пришла команда "I", едем вперёд и налево
    drive(defaultSpeed-velocity, defaultSpeed+velocity);
 
  else if (dataIn == 'J')   //или если пришла команда "H", едем назад и налево
    drive(-defaultSpeed+velocity, -defaultSpeed-velocity);
 
  else if (dataIn == 'S')   //или если пришла команда "S", стоим
    drive(0, 0);
 
  else if (dataIn == 'U')   //или если "U", зажигаем "передние фары"
  {
    uDigitalWrite(L2, HIGH);
    uDigitalWrite(L3, HIGH);
  }
  else if (dataIn == 'u')   //или если "u", гасим "передние фары"
  {
    uDigitalWrite(L2, LOW);
    uDigitalWrite(L3, LOW);
  }
  else if (dataIn == 'W')   //или если "W", зажигаем "задние фары"
  {
    uDigitalWrite(L1, HIGH);
    uDigitalWrite(L4, HIGH);
  }
  else if (dataIn == 'w')   ////или если "w", гасим "задние фары"
  {
    uDigitalWrite(L1, LOW);
    uDigitalWrite(L4, LOW);
  }
 
  // если к нам пришло значение от 0 до 9
  else if (((dataIn - '0') >= 0) && ((dataIn - '0') <= 9))
  { 
    velocity = (dataIn - '0') * 25; //сохраняем новое значение скорости
    lcd.setCursor(0, 1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print(velocity);
    lcd.setCursor(0, 1);
  }
 
  else if (dataIn == 'q') //если "q" - полный газ!
  {
    velocity = 255;
    lcd.print(velocity);
    lcd.setCursor(0, 1);
  }
}

Я специально не стал ничего вычесывать. Во время работы молодой человек ни разу не обращался ко мне со вопросами. Все что ему было нужно очень подробно на русском языке описано в вики.
Основная часть кода скопирована из готового примера. ЖК-индикатор мой студент добавил исключительно по своей собственной инициативе. На индикатор выводится установленная скорость.
Из-за того, что напряжение аккумулятора достаточно велико, на максимальной скорости робот двигается очень быстро. Обычно мы не выставляем скорость больше чем на 100 из 255 условных единиц. Если бы под рукой был подходящий сломанный RC-автомобиль, то его легко бы можно было переделать на управление с Android-смартфона.

Итоги

Strela — довольно удобная платформа для применения в различных робототехнических проектах. У нас родилось много идей по ее использованию. В ближайшее время мы хотим перепечатать раму для него, установить датчик линии и сделать робота, двигающегося по линии, с возможностью ручного управления через bluetooth. Ребята уже начали работать над ним:
WorkInProgress

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Метки: , , , , , Просмотров: 6080