Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Управление роботом Roomba с помощью Arduino и устройства Android

Компоненты и расходные материалы

Roomba Create2
× 1
Arduino UNO
× 1
Кнопочный переключатель SparkFun, 12 мм
× 1

Приложения и онлайн-сервисы

MJRoBot BT Remote Control - приложение для Android

Об этом проекте

Как один из победителей конкурса Instructables Robotics Contest 2016, я получил в качестве приза iRobot Roomba Create2. Это отличная и очень доступная платформа для разработки робототехники, стоимость которой составляет около 200 долларов США. Create 2 позволяет использовать различные методы программирования. Для начала я использовал его с Arduino и Android-приложением, чтобы перемещать робота. В этом первом руководстве я расскажу, как подключить Arduino к Roomba через последовательный порт и как управлять его двигателями, светодиодами и звуком. В будущих проектах я исследую его датчики, а также буду использовать Raspberry Pi для подключения Roomba к Интернету.

Беллоу, видео, показывающее мои первые результаты программирования робота Roomba:

Шаг 1. Спецификация

  • iRobot Create2
  • Arduino UNO
  • Модуль Bluetooth HC-06
  • Кнопка

Шаг 2. Roomba Create2

Roomba - это робот с дифференциальным приводом, с двумя колесами и передним колесом. Его скорость достигает 500 мм / с, и ему можно дать команду двигаться вверх или назад.

Для сигнализации мы можем рассчитывать с помощью четырех 7-сегментных дисплеев и 5 светодиодов (см. Рисунок):

  • Чисто
  • Пятно
  • Док
  • Предупреждение / проверка
  • Грязь / мусор

В качестве внутренних датчиков мы, среди прочего, имеем:

  • Детектор обрыва (4 спереди)
  • Детекторы ударов (2 спереди)
  • Колесные энкодеры

Для программирования следует использовать документ:iRobot® Create® 2 Open Interface (OI). Roomba можно запрограммировать в 3-х режимах:

Пассивный режим:

  • После отправки команды «Пуск» или любой из команд режима очистки (например, «Обнаружение», «Очистка», «Поиск стыковки») OI переходит в пассивный режим. Когда OI находится в пассивном режиме, вы можете запрашивать и получать данные датчика с помощью любой из команд датчика, но вы не можете изменить текущие параметры команд для исполнительных механизмов (двигатели, динамик, освещение, драйверы нижнего уровня, цифровые выходы) на что-то другое. .

Безопасный режим:дает вам полный контроль над Roomba, за исключением следующих условий безопасности:

  • Зарядное устройство подключено и запитано.
  • Обнаружение падения колеса (на любое колесо).
  • Обнаружение обрыва при движении вперед (или движении назад с небольшим радиусом поворота, менее одного радиуса робота).
  • Если одно из вышеуказанных условий безопасности возникает, когда OI находится в безопасном режиме, Roomba останавливает все двигатели и возвращается в пассивный режим.

Полный режим:

  • Предоставляет вам полный контроль над Roomba, всеми его приводами и всеми связанными с безопасностью условиями, которые ограничиваются, когда OI находится в безопасном режиме, поскольку в полном режиме отключаются функции безопасности обрыва, падения колеса и внутреннего зарядного устройства. .

Шаг 3. Последовательное соединение

Для связи между Roomba и Arduino будет использоваться последовательный порт. По умолчанию Roomba обменивается данными на скорости 115 200 бод, но для связи с Arduino мы переключим ее на 19 200 бод.

Установить скорость передачи данных Roomba можно двумя способами:

  • При выключении Roomba продолжайте удерживать кнопку «Очистка / Питание» после того, как погаснет свет. Примерно через 10 секунд Roomba воспроизведет мелодию с понижением высоты тона. Roomba будет обмениваться данными со скоростью 19 200 бод до тех пор, пока процессор не отключится от батареи или скорость передачи данных не будет явно изменена с помощью OI.
  • Используйте контакт изменения скорости передачи данных (контакт 5 на разъеме Mini-DIN), чтобы изменить скорость передачи данных Roomba. После включения Roomba подождите 2 секунды, а затем трижды подайте низкий уровень изменения скорости передачи данных. Каждый импульс должен длиться от 50 до 500 миллисекунд. Roomba будет обмениваться данными на скорости 19200 бод до тех пор, пока процессор не отключится от батареи или пока скорость передачи не будет явно изменена с помощью OI.

На приведенной выше диаграмме показано, как Arduino должен быть подключен к разъему Roomba Mini-DIN

Шаг 4. Запуск Roomba

Первое, что необходимо сделать при программировании Roomba, - это:

  • «Разбуди» робота
  • Определите режим (безопасный или полный)

Мы можем "разбудить" его, послав низкий импульс на вывод 5 Mini-DIN (обнаружение входа устройства), как показано в функции ниже:

  void wakeUp (void) {setWarningLED (ON); digitalWrite (ddPin, HIGH); задержка (100); digitalWrite (ddPin, LOW); задержка (500); digitalWrite (ddPin, HIGH); задержка (2000);}  

Для запуска Roomba всегда необходимо отправлять 2 кода:«СТАРТ» [128] и режим, в нашем случае «БЕЗОПАСНЫЙ РЕЖИМ» [131]. Если вам нужен «ПОЛНЫЙ РЕЖИМ», вместо него следует послать код [132].

  void startSafe () {Roomba.write (128); // Запускаем Roomba.write (131); // Задержка безопасного режима (1000);}  

Шаг 5. Включение светодиодов и дисплея

Включение светодиодов

Как описано во введении, Roomba имеет 5 светодиодов:

  • Питание / Очистка (двухцветный красный / зеленый и регулировка интенсивности)
  • Точечный (зеленый, фиксированная интенсивность)
  • Док (зеленый, фиксированная интенсивность)
  • Предупреждение / проверка (оранжевый, постоянная интенсивность)
  • Грязь / мусор (синий, фиксированная интенсивность)

Все светодиоды можно управлять с помощью кода [139]. Для управления индикатором питания вы должны отправить в Roomba два байта данных:«цвет» и «интенсивность».

Цвет:

  • Зеленый =0
  • Оранжевый =128
  • красный =255

Интенсивность:

  • Низкий =0
  • Макс. =255

Функция setPowerLED (byte setColor, byte setIntensity) делает это:

  void setDigitLEDs (байтовая цифра1, байтовая цифра2, байтовая цифра3, байтовая цифра4) {Roomba.write (163); Roomba.write (цифра1); Roomba.write (цифра2); Roomba.write (цифра 3); Roomba.write (digit4);}  

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

  setPowerLED (128, 128);  

Чтобы включить остальные 4 светодиода, необходимо использовать следующие функции:

  setDebrisLED (ВКЛ); setDockLED (ВКЛ); setSpotLED (ВКЛ); setWarningLED (ВКЛ);  

Все вышеперечисленные функции имеют код, похожий на этот:

  void setDebrisLED (bool enable) {debrisLED =enable; Roomba.write (139); Roomba.write ((debrisLED? 1:0) + (spotLED? 2:0) + (dockLED? 4:0) + (warningLED? 8:0)); Roomba.write ((байтовый) цвет); Roomba.write ((байт) интенсивность);}  

В основном разница будет в строке:

  debrisLED =enable;  

которые необходимо изменить, включив каждый из других светодиодов ( spotLED, dockLED, warningLED ).

Отправка сообщений на дисплей

Roomba имеет четыре 7-сегментных дисплея, которые можно использовать для отправки сообщений двумя разными способами:

  • Код [163]:цифровые индикаторы необработанные (числовые)
  • Код [164]:цифровые индикаторы ASCII (приближение букв и специальных кодов).

Отображать числа очень легко. Вы должны отправить код [163] после 4 цифр, которые будут отображаться. Функция: setDigitLEDs (байтовая цифра1, байтовая цифра2, байтовая цифра3, байтовая цифра4) сделает это за вас:

  void setDigitLEDs (байтовая цифра1, байтовая цифра2, байтовая цифра3, байтовая цифра4) {Roomba.write (163); Roomba.write (цифра1); Roomba.write (цифра2); Roomba.write (цифра 3); Roomba.write (digit4);}  

Например, чтобы отобразить «1, 2, 3, 4», вы должны вызвать функцию:

  setDigitLEDs (1, 2, 3, 4);  

С кодом [164] можно отправить приближение ASCII. Функция setDigitLEDFromASCII (байтовая цифра, символьная буква) делает это с нами:

  void setDigitLEDFromASCII (байтовая цифра, символьная буква) {переключатель (цифра) {case 1:digit1 =letter; ломать; случай 2:цифра2 =буква; ломать; случай 3:цифра 3 =буква; ломать; случай 4:цифра 4 =буква; ломать; } Roomba.write (164); Roomba.write (цифра1); Roomba.write (цифра2); Roomba.write (цифра 3); Roomba.write (digit4);}  

Для упрощения я создаю новую функцию для одновременной отправки 4 цифр:

  void writeLED (char a, char b, char c, char d) {setDigitLEDFromASCII (1, a); setDigitLEDFromASCII (2, б); setDigitLEDFromASCII (3, c); setDigitLEDFromASCII (4, d);}  

Например, чтобы отобразить «СТОП», необходимо вызвать функцию:

  светодиоды write ('s', 't', 'o', 'p');  

Шаг 6. Перемещение Roomba

Для мобильности Roomba имеет 2 независимых двигателя постоянного тока, которые можно запрограммировать на работу со скоростью до 500 мм / с. Есть несколько команд, которые можно использовать для управления роботом. Основные из них:

  • Код [137]:Drive ==> Необходимо отправлять +/- скорость в мм / с и +/- радиус в мм.
  • Код [145]:Drive Direct ==> Необходимо передавать скорость влево / вправо в мм / с (+ для прямого и - для обратного)
  • Код [146]:Drive PWM ==> Необходимо отправлять данные +/- PWM для левого и правого колеса.

Ниже приведен код для этих трех вариантов:

  void drive (int velocity, int radius) {зажим (скорость, -500, 500); // определение максимальной и минимальной скорости в мм / с зажим (радиус, -2000, 2000); // определение максимального и минимального радиусов в мм Roomba.write (137); Roomba.write (скорость>> 8); Roomba.write (скорость); Roomba.write (радиус>> 8); Roomba.write (radius);} // ---------------------------------------- ----------------------- void driveWheels (int right, int left) {зажим (правый, -500, 500); зажим (левый, -500, 500); Roomba.write (145); Roomba.write (справа>> 8); Roomba.write (справа); Roomba.write (слева>> 8); Roomba.write (слева); } // ----------------------------------------------- ---------------- void driveWheelsPWM (int rightPWM, int leftPWM) {зажим (rightPWM, -255, 255); зажим (leftPWM, -255, 255); Roomba.write (146); Roomba.write (правая ШИМ>> 8); Roomba.write (правая ШИМ); Roomba.write (leftPWM>> 8); Roomba.write (leftPWM);}  

Обратите внимание, что функция «фиксатора» определяет максимальное и минимальное значения, которые разрешено вводить. Эта функция определена в файле rombaDefines.h:

  #define clamp (value, min, max) (value  max? max:value)  

Используя приведенный выше код, можно создать более простые функции для управления Roomba:

  / ------------------------------------------- -------------------- void turnCW (беззнаковая короткая скорость, беззнаковая короткая скорость) {drive (velocity, -1); зажим (скорость, 0, 500); задержка (6600); drive (0,0);} // ---------------------------------------- ----------------------- void turnCCW (беззнаковая короткая скорость, беззнаковая короткая скорость) {drive (velocity, 1); зажим (скорость, 0, 500); задержка (6600); drive (0,0);} // ---------------------------------------- ----------------------- void driveStop (void) {drive (0,0);} // ----------- -------------------------------------------------- --void driveLeft (int left) {driveWheels (left, 0);} // ------------------------------- -------------------------------- void driveRight (int right) {driveWheels (0, right);}  

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

  turnCW (40, 180); // вращаемся по часовой стрелке на 180 градусов и останавливаемсяdriveWheels (20, -20); // вращаем driveLeft (20); // поворот налево  

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

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

  #include "roombaDefines.h" #include  // Подключение Roomba Create2 int rxPin =10; int txPin =11; SoftwareSerial Roomba (rxPin, txPin); // ------ --------------------------------------- void setup () {Roomba.begin (19200); pinMode (ddPin, ВЫХОД); pinMode (buttonPin, INPUT_PULLUP); // подключен к пину 12 Arduino и используется для "стартовой" задержки (2000); Проснись (); // Пробуждение Roomba startSafe (); // Запуск Roomba в безопасном режиме while (digitalRead (buttonPin)) {} // ожидание нажатия кнопки для непрерывного запуска code turnCW (40, 180); // проверяем вращение Roomba на 180 градусов по часовой стрелке и останавливаемся} // ----------------------------------- ---------- void loop () {}  

Шаг 7. Управление Roomba через Bluetooth

Чтобы завершить нашу первую часть проекта, давайте установим модуль Bluetooth (HC-06) в нашу Arduino. На приведенной выше диаграмме показано, как это сделать. Обычно HC-06 устанавливается на заводе со скоростью 9600 бод. Важно изменить его на 19 200, чтобы обеспечить совместимость со скоростью связи Arduino-Roomba. Вы можете сделать это, отправив AT-команду модулю (AT + BAUD5, где «5» - это код для 19 200).

Если у вас есть какие-либо сомнения по поводу того, как работает HC-06, ознакомьтесь с моим руководством:Подключение "вещей" через Bluetooth / Android / Arduino.

Для управления Roomba мы будем использовать разработанное мной стандартное приложение для управления мобильными роботами с помощью MIT AppInventor 2:«MJRoBot BT Remote Control». Приложение можно бесплатно скачать в магазине Google по ссылке:Приложение:MJRoBot BT Remote Control.

Приложение имеет простой интерфейс, позволяющий отправлять команды модулю BT как в режиме ТЕКСТА, так и напрямую с помощью предварительно запрограммированных кнопок (при каждом нажатии кнопки отправляется символ):

  • w:вперед
  • s:назад
  • d:справа
  • a:слева
  • f:Стоп
  • p:ON / OFF (не используется в этой первой части)
  • m:ручной / автоматический (используется для перезапуска Roomba, если в безопасном режиме обнаружено препятствие в виде обрыва)
  • +:скорость +
  • -:Скорость -

При необходимости вы также можете отправлять другие команды в виде текста. Также есть текстовое окно для сообщений, полученных от модуля BT. Эта функция очень важна на этапе тестирования, ее можно использовать так же, как «Serial Monitor».

loop () часть кода будет "прослушивать" устройство bluetooth и в зависимости от полученной команды предпринимать действия:

  void loop () {checkBTcmd (); // проверяем, получена ли команда от пульта дистанционного управления BT manualCmd ();}  

Функция checkBTcmd () показано ниже:

  void checkBTcmd () // проверяем, получена ли команда от дистанционного управления BT {if (BT1.available ()) {command =BT1.read (); BT1.flush (); }}  

После получения команды функция manualCmd () примет соответствующее действие:

  void manualCmd () {переключатель (команда) {case 'm':startSafe (); Serial.print («Roomba в безопасном режиме»); BT1.print («Roomba BT Ctrl OK - Безопасный режим»); BT1.println ('\ п'); команда ='е'; playSound (3); ломать; case 'f':driveStop (); // выключаем оба двигателя writeLED ('s', 't', 'o', 'p'); состояние =команда; ломать; case 'w':drive (motorSpeed, 0); writeLEDs ('', 'g', 'o', ''); светодиоды ('', 'g', 'o', ''); состояние =команда; ломать; case 'd':driveRight (motorSpeed); светодиоды write ('r', 'i', 'g', 'h'); ломать; case 'a':driveLeft (motorSpeed); светодиоды write ('l', 'e', ​​'f', 't'); ломать; case 's':drive (-motorSpeed, 0); светодиоды write ('b', 'a', 'c', 'k'); состояние =команда; ломать; case '+':if (state =='w') {motorSpeed ​​=motorSpeed ​​+ 10; если (скорость двигателя> MAX_SPEED) {скорость двигателя =MAX_SPEED; } команда ='ш'; } else {команда =состояние;} перерыв; case '-':if (state =='w') {motorSpeed ​​=motorSpeed ​​- 10; } если (motorSpeed ​​ 

Шаг 8:Заключение

Полный код Arduino, используемый здесь, и связанные с ним документы можно найти на моем GITHUB:Roomba_BT_Ctrl.

Обратите внимание, что не все приводы Roomba были прокомментированы в этом руководстве. Есть другие двигатели, используемые для очистки, другие светодиоды, используемые для расписания, кнопки, датчики и т. Д.

Некоторые из функций, которые я создал в своей программе, были основаны на библиотеке Create 2, разработанной Домом Амато. Вы можете загрузить полную библиотеку по адресу: https://github.com/brinnLabs/Create2 .

Мое намерение здесь было простое и дать вам стартовую платформу, чтобы начать играть с Roomba. В будущем я собираюсь публиковать другие руководства, используя Raspberry-Pi, подключаю Roomba к Интернету, считываю данные с его датчиков и т. Д.

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

Чтобы узнать о других проектах, посетите мой блог (на португальском языке):

MJRoBot.org

Салудо с юга мира!

Увидимся на моем следующем уроке!

Спасибо

Марсело

Код

Github
https://github.com/Mjrovai/Roomba_BT_Ctrl

Производственный процесс

  1. Управление эффектом с помощью реальных датчиков
  2. Создайте пожарный извещатель за считанные минуты с помощью Samsung SAMIIO, Arduino UNO и Raspberry Pi
  3. Создайте своего робота для видеостриминга, управляемого через Интернет, с помощью Arduino и Raspberry Pi
  4. Универсальный пульт дистанционного управления с использованием Arduino, 1Sheeld и Android
  5. Робот с сервомотором избегает препятствий
  6. Портативный термометр с устройством Android
  7. Управление серводвигателем с помощью Arduino и MPU6050
  8. Управление яркостью светодиода с помощью Bolt и Arduino
  9. u-blox LEA-6H 02 GPS-модуль с Arduino и Python
  10. Распознавание и синтез речи с помощью Arduino