Чистящие роботы различных конструкций стали достаточно популярны в настоящее. Одна они пока достаточно дорого стоят. В этой статье мы рассмотрим создание робота для очистки пола на основе Arduino и ультразвукового датчика, который обойдется вам очень дешево. Данный робот способен обнаруживать препятствия на своем пути и объезжать их, убирая таким образом всю комнату. Для очистки пола у него снизу прикреплена небольшая щетка. Также на нашем сайте вы можете прочитать статью про чистящий робот пылесос на основе Arduino.
Необходимые компоненты
- Плата Arduino Uno R3 (купить на AliExpress).
- Ультразвуковой датчик (купить на AliExpress).
- Шилд (плата расширения) драйвера двигателей для Arduino (купить на AliExpress).
- Колесное шасси робота.
- Компьютер (для загрузки программы в плату Arduino).
- Батарея для двигателей.
- Источник питания (Power Bank) для Arduino.
- Обувная щетка.
Принцип работы ультразвукового датчика HC-SR04
Ультразвуковой датчик HC-SR04 в нашем проекте используется для измерения расстояний в диапазоне 2-400 см с точностью 3 мм. Датчик состоит из ультразвукового передатчика, ультразвукового приемника и схемы управления. Основные принципы работы ультразвукового датчика состоят в следующем:
- Вначале с формируется сигнал высокого уровня длительностью 10 мкс, который запускает в работу ультразвуковой датчик.
- Затем модуль автоматически посылает 8 импульсов с частотой 40 кГц, а затем проверяет приняты они или нет.
- Если эти излученные сигналы принимаются, то вычисляется время между временем передачи этих импульсов и их приемом.
Расстояние затем можно рассчитать по следующей формуле:
Distance= (Time x Speed of Sound in Air (340 m/s))/2
где Time – измеренное датчиком время;
Speed of Sound in Air – скорость звука в воздухе, равная 340 м/с.
На нашем сайте вы также можете посмотреть следующие проекты, в которых был использован ультразвуковой датчик:
- измерение расстояний с помощью Arduino и ультразвукового датчика;
- сигнализация на дверь с помощью Arduino;
- мониторинг наполненности контейнера с помощью Arduino;
- измерение уровня воды в баке с помощью Arduino;
- автоматический диспенсер дезинфицирующего средства с трекером коронавируса.
Сборка робота для очистки пола
Смонтируйте плату Arduino на шасси робота. Убедитесь в том, что она не касается никаких металлических деталей. Хорошей идеей будет установка платы Arduino и шилда драйвера двигателей в отдельную коробку. Зафиксируйте двигатели и колеса на шасси робота с помощью болтов. Также для этой цели можно использовать эпоксидный клей или другие способы. Закрепите приспособление для сбора мусора (не знаю как точно перевести, но в оригинале оно называется Scotch Brite scrub pad) позади щетки. Чтобы закрепить все это мы использовали ось, идущую вдоль шасси робота. Также отдельно смонтируйте батареи на шасси робота – для их крепления можно использовать отдельную коробку или специальный контейнер.
Работа схемы
Схема устройства представлена на следующем рисунке. Соедините ультразвуковой датчик с платой Arduino как показано на схеме и установите сверху платы Arduino шилд драйвера двигателей (Motor Driver shield).
Шилд драйвера мотора должен иметь, по крайней мере, два выхода, которые необходимо подсоединить к вашим двигателям. Обычно они промаркированы метками “M1” и “M2” или “Motor 1” и “Motor 2”. Соедините ваши батареи с шилдом драйвера мотора и платой Arduino соответственно. Драйвер мотора также должен иметь входной канал (входные линии), который необходимо соединить с платой Arduino.
Исходный код программы
Откройте Arduino IDE и скопируйте в нее код программы, приведенный в конце статьи. Загрузите программу в плату Arduino. Протестируйте работу робота. Если он поворачивает слишком много или слишком мало во время своей работы поэкспериментируйте с задержками в программе.
Но перед загрузкой кода сначала скачать библиотеку для работы с драйвером мотора (Adafruit Motor Shield Library) чтобы у нас была возможность в программе управлять двигателями постоянного тока. Добавьте ее в папку библиотек Arduino IDE. Убедитесь что эта папка называется AFMotor. Более подробно об установке библиотек от Adafruit можно узнать по этой ссылке.
Рассмотрим наиболее важные фрагменты кода программы. Сначала в программе мы должны подключить библиотеку от Adafruit для управления шилдом драйвера мотора. Также мы должны инициализировать контакты Trig pin и Echo pin и двигатели. Еще необходимо установить режим работы для контакта Trig pin на вывод данных, а для контакта Echo pin – на ввод данных.
1 2 3 4 5 6 7 8 9 10 |
#include <AFMotor.h> #define trigPin 12 #define echoPin 13 AF_DCMotor motor1(1,MOTOR12_64KHZ); AF_DCMotor motor2(2, MOTOR12_8KHZ); void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } |
Далее следуют команды, выполняемые в цикле (в функции loop). Они содержат команды для управления ультразвуковым датчиком (запуска его в работу и считывание времени распространения звуковой волны, расчета расстояния до препятствия и на основании этого расстояния выдача команд на управление двигателями.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; if (distance < 20) { motor1.setSpeed(255); motor2.setSpeed(0); motor1.run(BACKWARD); motor2.run(BACKWARD); delay(2000); //измените эту задержку на основании того как поворачивает ваш робот |
Если робот обнаруживает на своем пути препятствие, то он останавливает одно колесо и таким образом осуществляет поворот.
Следующий фрагмент кода заставляет вращаться оба мотора в результате чего робот движется вперед до тех пока не обнаружит препятствие впереди себя.
1 2 3 4 5 6 |
else { motor1.setSpeed(160); //измените это число в зависимости от того какая скорость робота вам необходима motor2.setSpeed(160); //измените это число в зависимости от того какая скорость робота вам необходима motor1.run(FORWARD); motor2.run(FORWARD); } |
Далее приведен полный код программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <AFMotor.h> //библиотека для работы с двигателями #define trigPin 12 #define echoPin 13 AF_DCMotor motor1(1,MOTOR12_64KHZ); AF_DCMotor motor2(2, MOTOR12_8KHZ); void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; // расчет расстояния до препятствия if (distance < 20) { motor1.setSpeed(255); motor2.setSpeed(0); motor1.run(BACKWARD); motor2.run(BACKWARD); delay(2000); // измените эту задержку на основании того как поворачивает ваш робот } else { motor1.setSpeed(160); // измените это число в зависимости от того какая скорость робота вам необходима motor2.setSpeed(160); // измените это число в зависимости от того какая скорость робота вам необходима motor1.run(FORWARD); motor2.run(FORWARD); } } |