Простой робот-пылесос DIY на Arduino своими руками
Простой робот-пылесос DIY на Arduino своими руками
В мире с каждым днем все больше растет популярность среди роботов-уборщиков. Благодаря таким маленьким помощникам в доме становится гораздо чище, а усилий на уборку при этом прикладывается гораздо меньше. Существует огромное множество различных модификаций роботов, все они отличаются по функционалу, размерам и другим параметрам.
Конкретно в данной статье будет рассмотрен пример, как своими руками можно сделать простого робота, который сам будет пылесосить помещение, когда это нужно. В качестве «мозга» здесь используется контроллер Arduino.
Материалы и инструменты для изготовления робота:
– плата, контролирующая работу двигателей (Arduino motor shield);
– плата Arduino;
– два моторчика с редукторами (моторчики на 3 вольта и скоростью вращения около 100 об/мин.);
– колеса (можно сделать из алюминиевых банок;
– кулер от компьютерного блока питания (можно как на 5В, так и на 12В);
– источник питания 5В (аккумулятор);
– провода и пластина для установки радиоэлементов;
– чтобы сделать корпус понадобится пластиковый контейнер;
– еще один небольшой контейнер для создания мусоросборника;
– термоклей;
– магниты;
– картон.
Процесс изготовления робота:
Шаг первый. Программная часть робота и скетч:
Сердцем робота является контроллер Arduino. Чтобы его запрограммировать понадобится компьютер и специальное программное обеспечение.
Чтобы загрузить в плату скетч будет нужна программа Arduino IDE. Ниже можно взять программный код робота и увидеть основную схему.
/*
Program for controlling a robot with two motors.
The robot turns when motors changes their speed and direction.
Front bumpers on left and right sides detect obstacles.
Ultrasonic sonars can be connected to analog inputs (tested on LV-MaxSonar-EZ1):
– put pins in array sonarPins in following order: left, right, front, others..
Examples:
1. only left and right sonars connected to pins 2 and 3: sonarPins[] = <2,3>
2. left, right and front sonars connected to pins 2, 3 and 5: sonarPins[] = <2,3,5>
3. only front sonar connected to pin 5: sonarPins[] = <-1,-1,5>
4. only left sonar connected to pin 2: sonarPins[] = <2>
5. only right sonar connected to pins 3: sonarPins[] = <-1,3>
6. 5 sonars connected to pins 1,2,3,4,5: sonarPins[] = <1,2,3,4,5>
Motor shield is used to run motors.
*/
const int Baud = 9600; //UART port speed
//Sonar properties
int sonarPins[] = <1, 2>;//Analog Pin Nums to sonar sensor Pin AN
const long MinLeftDistance = 20; //Minimum allowed left distance
const long MinRightDistance = 20; //Minimum allowed right distance
const long MinFrontDistance = 15; //Minimum allowed front distance
const int SamplesAmount = 15;//more samples – smoother measurement and bigger lag
const int SonarDisplayFrequency = 10; //display only one of these lines – not all
int sonarDisplayFrequencyCount = 0;
const long Factor = 2.54 / 2;
long samples[sizeof(sonarPins)][SamplesAmount];
int sampleIndex[sizeof(sonarPins)];
//right side
const int pinRightMotorDirection = 4; //this can be marked on motor shield as “DIR A”
const int pinRightMotorSpeed = 3; //this can be marked on motor shield as “PWM A”
const int pinRightBumper = 2; //where the right bumper is connected
//left side
const int pinLeftMotorDirection = 7; //this can be marked on motor shield as “DIR B”
const int pinLeftMotorSpeed = 6; //this can be marked on motor shield as “PWM B”
const int pinLeftBumper = 8; //where the right bumper is connected
//uncomment next 2 lines if Motor Shield has breaks
//const int pinRightMotorBreak = PUT_BREAK_PIN_HERE; //this can be marked on motor shield as “BREAKE A”
//const int pinLeftMotorBreak = PUT_BREAK_PIN_HERE; //this can be marked on motor shield as “BREAKE B”
//fields
const int turnRightTimeout = 100;
const int turnLeftTimeout = 150;
//set in counter how long a motor is running back: N/10 (in milliseconds)
int countDownWhileMovingToRight;
int countDownWhileMovingToLeft;
//Initialization
void setup() <
Serial.begin(Baud);
initPins();
//uncomment next 4 lines if Motor Shield has breaks
// pinMode(pinLeftMotorBreak, OUTPUT);
// pinMode(pinRightMotorBreak, OUTPUT);
// digitalWrite(pinLeftMotorBreak, LOW); //turn off breaks
// digitalWrite(pinRightMotorBreak, LOW); //turn off breaks
runRightMotorForward();
runLeftMotorForward();
startMotors();
>
//Main loop
void loop() <
delay(10);//repeat every 10 milliseconds
>
//—————————————————
void initPins() <
pinMode(pinRightMotorDirection, OUTPUT);
pinMode(pinRightMotorSpeed, OUTPUT);
pinMode(pinRightBumper, INPUT);
pinMode(pinLeftMotorDirection, OUTPUT);
pinMode(pinLeftMotorSpeed, OUTPUT);
pinMode(pinLeftBumper, INPUT);
for(int i = 0; i
DIY: Несложный робот пылесос под Arduino своими руками. Пошаговая инструкция по изготовлению
Популярность автоматизированных домашних уборщиков с каждым днем возрастает. Не исключение, роботы-пылесосы для сухой уборки, способные поддерживать чистоту пола без вашего вмешательства. Принцип работы этих устройств очень прост и схож на прицип работы ручного пылесоса, главным отличием является наличие микроконтроллера, набора датчиков для самостоятельной работы, подзарядки и ориентировании в пространстве. Об этом мы ранее описывали в целой статье, специально посвященной роботизированным уборщикам полов.
Если вы хотите узнать, как он устроен и построить его собственными руками, представляем вашему вниманию инструкцию по сборке простейшего робота-пылесоса из подручных средств.
Материалы и компоненты:
Для создания робота-уборщика необходимы:
- плата Arduino;
- плата контроля электромоторов Arduino motor shield;
- два двигателя с коробкой передач (3 вольта, приблизительно 100 оборотов в минуту);
- два колеса или две алюминиевые банки;
- турбина-кулер компьютерного охлаждения (5 В или 12 Вольт);
- аккумулятор для питания 5 вольт;
- пластина для сбора радиоэлементов и провода;
- большой круглый пластиковый контейнер – для корпуса;
- небольшой пластиковый контейнер – для мусоросборника;
- картон;
- термоклей;
- магниты.
Шаг 1: Программный код и скетч:
Для правильной и точной работы в роботе-пылесосе существует “сердце” в виде микроконтроллера Arduino, программируемого с помощью домашнего ПК и необходимого программного обеспечения.
Скетч для работы робота-пылесоса загружается на плату с помощью программы Arduino IDE. Ниже программный код.
/*
Program for controlling a robot with two motors.
The robot turns when motors changes their speed and direction.
Front bumpers on left and right sides detect obstacles.
Ultrasonic sonars can be connected to analog inputs (tested on LV-MaxSonar-EZ1):
– put pins in array sonarPins in following order: left, right, front, others..
Examples:
1. only left and right sonars connected to pins 2 and 3: sonarPins[] = <2,3>
2. left, right and front sonars connected to pins 2, 3 and 5: sonarPins[] = <2,3,5>
3. only front sonar connected to pin 5: sonarPins[] = <-1,-1,5>
4. only left sonar connected to pin 2: sonarPins[] = <2>
5. only right sonar connected to pins 3: sonarPins[] = <-1,3>
6. 5 sonars connected to pins 1,2,3,4,5: sonarPins[] = <1,2,3,4,5>
Motor shield is used to run motors.
*/
const int Baud = 9600; //UART port speed
//Sonar properties
int sonarPins[] = <1, 2>;//Analog Pin Nums to sonar sensor Pin AN
const long MinLeftDistance = 20; //Minimum allowed left distance
const long MinRightDistance = 20; //Minimum allowed right distance
const long MinFrontDistance = 15; //Minimum allowed front distance
const int SamplesAmount = 15;//more samples – smoother measurement and bigger lag
const int SonarDisplayFrequency = 10; //display only one of these lines – not all
int sonarDisplayFrequencyCount = 0;
const long Factor = 2.54 / 2;
long samples[sizeof(sonarPins)][SamplesAmount];
int sampleIndex[sizeof(sonarPins)];
//right side
const int pinRightMotorDirection = 4; //this can be marked on motor shield as “DIR A”
const int pinRightMotorSpeed = 3; //this can be marked on motor shield as “PWM A”
const int pinRightBumper = 2; //where the right bumper is connected
//left side
const int pinLeftMotorDirection = 7; //this can be marked on motor shield as “DIR B”
const int pinLeftMotorSpeed = 6; //this can be marked on motor shield as “PWM B”
const int pinLeftBumper = 8; //where the right bumper is connected
//uncomment next 2 lines if Motor Shield has breaks
//const int pinRightMotorBreak = PUT_BREAK_PIN_HERE; //this can be marked on motor shield as “BREAKE A”
//const int pinLeftMotorBreak = PUT_BREAK_PIN_HERE; //this can be marked on motor shield as “BREAKE B”
//fields
const int turnRightTimeout = 100;
const int turnLeftTimeout = 150;
//set in counter how long a motor is running back: N/10 (in milliseconds)
int countDownWhileMovingToRight;
int countDownWhileMovingToLeft;
//Initialization
void setup() <
Serial.begin(Baud);
initPins();
//uncomment next 4 lines if Motor Shield has breaks
// pinMode(pinLeftMotorBreak, OUTPUT);
// pinMode(pinRightMotorBreak, OUTPUT);
// digitalWrite(pinLeftMotorBreak, LOW); //turn off breaks
// digitalWrite(pinRightMotorBreak, LOW); //turn off breaks
runRightMotorForward();
runLeftMotorForward();
startMotors();
>
//Main loop
void loop() <
delay(10);//repeat every 10 milliseconds
>
//—————————————————
void initPins() <
pinMode(pinRightMotorDirection, OUTPUT);
pinMode(pinRightMotorSpeed, OUTPUT);
pinMode(pinRightBumper, INPUT);
pinMode(pinLeftMotorDirection, OUTPUT);
pinMode(pinLeftMotorSpeed, OUTPUT);
pinMode(pinLeftBumper, INPUT);
for(int i = 0; i MinRightDistance //checks if the minimum allowed right distance is not reached
&& measureDistance(2, ‘F’) > MinFrontDistance)//checks if the minimum allowed front distance is not reached
return;
if(checkCounterIsNotSet(countDownWhileMovingToRight))//if the counter is not yet counting down
runRightMotorBackward();//run the right motor backward
countDownWhileMovingToRight = turnRightTimeout;//set the counter to maximum value to start it counting down
>
void verifyAndSetLeftSide() <
if(checkBumperIsNotPressed(pinLeftBumper) //checks if left bumper has NOT been pressed
&& measureDistance(0, ‘L’) > MinLeftDistance //checks if the minimum allowed left distance is not reached
&& measureDistance(2, ‘F’) > MinFrontDistance)//checks if the minimum allowed front distance is not reached
return;
if(checkCounterIsNotSet(countDownWhileMovingToLeft))//if the counter is not yet counting down
runLeftMotorBackward();//run the right motor backward
countDownWhileMovingToLeft = turnLeftTimeout;//set the counter to maximum value to start it counting down
>
bool checkCounterIsNotSet(int counter) <
return counter = sizeof(sonarPins) – 1 || sonarPins[pinIndex] = SamplesAmount)
sampleIndex[pinIndex] = 0;
samples[pinIndex][sampleIndex[pinIndex]] = value;
return true;
>
long calculateAvarageDistance(int pinIndex) <
long average = 0;
for(int i = 0; i
Шаг 2: Монтирование деталей:
Для крепления сервоприводов с колесами, кулера, плат управления, аккумулятора и другого используется картонная основа. Турбина и пластиковый контейнер (мусоросборник), с проделанным предварительно отверстием, прочно склеивается между собой и крепится на картон. Контейнер имеет отверстие для выдуваемого воздуха, на которое наклеена специальная синтетическая ткань, служащая фильтром.
Последовательно склеиваем кулер с сервоприводами, затем на сервоприводы клеим картонную площадку, на которой располагаются платы Arduino и батарея питания. Чтобы сделать колеса, необходимо отрезать нижнюю и верхнюю часть алюминиевых банок, склеить их между собой, а затем прочно закрепить на валу сервопривода.
В передней части монтируются металлические пластины (функция подвижного бампера), при замыкании которых сигнал поступает в плату управления электродвигателями Arduino motor shield, после чего сервоприводы начинают вращаться в другую сторону, изменяя направление движения робота.
Шаг 3: Установка корпуса:
При установке аккумуляторной батареи и подключении всех элементов конструкции с помощью проводов, необходимо обеспечить устройство прочным корпусом. Как раз таки для этого используется большой круглый контейнер. Для действия контактов, предотвращающих столкновение и застревание, делаем в контейнере специальные надрезы. Чтобы корпус был легкосъемным и прочно держался на механической части, используем восемь магнитов (при желании можно больше), по четыре приклеенных на самом контейнере и на внутренней части пылесоса соответственно.
Прекрасный прототип робота-пылесоса, сделанного своими руками. Не беря во внимание отсутствие дополнительных датчиков навигации и базы автоматической подзарядки, данный аппарат за пол часа работы вполне самостоятельно может собрать мусор, пыль и грязь на вашей кухне или в небольшой комнате. Его конструкция не представляет большой сложности, а стоимость и доступность деталей не вызывает сомнения. Все дело в творческом подходе. Вы можете менять элементы конструкции по вашему усмотрению, добавлять или убирать лишние элементы, модернизируя свой аппарат. Желаем приятно провести время, создавая свой робот для сухой уборки полов у вас дома.
Создание прототипа робота пылесоса на базе Arduino Uno
- Цена: $5.80
- Перейти в магазин
Arduino — это открытая платформа, которая позволяет собирать всевозможные электронные устройства. Arduino будет интересен креативщикам, дизайнерам, программистам …., и желающим собрать собственный гэджет. Устройства могут работать как автономно, так и в связке с компьютером. Всё зависит от идеи.
Платформа состоит из аппаратной и программной частей. Для программирования используется упрощённая версия C++. Разработку можно вести как с использованием бесплатной среды Arduino IDE, так и с помощью произвольного C/C++ инструментария.
Для программирования и общения с компьютером понадобится USB-кабель.
Для постройки прототипа робота — пылесоса заказал плату Arduino Uno. Вместе c Uno заказал: Драйвер двигателей, для управления двигателями, Ик датчики «органы чувств» робота пылесоса, Ну и проводочки, куда без них? Преобразователь DC-DC и аккумуляторы заказывал в других онлайн магазинах.
Составляющие моего устройства:
— Arduino -центральный контроллер
— Драйвер двигателей — устройство, которое преобразовывает управляющие сигналы малой мощности в токи, достаточные для управления моторами
— ИК датчики — датчики препятствий расстояние обнаружения препятствия 3-80см
— ИК датчики — датчики препятствий расстояние обнаружения препятствия 2-20см
— Электродвигатель турбины
— Электродвигатель боковых щеток
— Электродвигатель центральной щетки
— Электродвигатель перемещения
— Аккумуляторы литиевые
Вот, что получилось.
Фотки не все, загружаю, какие остались.
Компоненты устройства:
Вид снизу:
Вид сверху:
Вид сбоку:
Перед первым пуском:
Первый пуск)) без корпуса
#define DriveVector1 2
#define DriveSpeed1 3
#define DriveVector2 4
#define DriveSpeed2 5
#define InSensor1 12
#define InSensor2 11
#define LedLamp 13
int sensorStatus1, sensorStatus2;
int HIGHValue, LOWValue;
void setup()
<
// put your setup code here, to run once:
pinMode(DriveVector1, OUTPUT);
pinMode(DriveVector2, OUTPUT);
pinMode(DriveSpeed1, OUTPUT);
pinMode(DriveSpeed2, OUTPUT);
pinMode(LedLamp, OUTPUT);
pinMode(InSensor1, INPUT);
pinMode(InSensor2, INPUT);
HIGHValue = HIGH div 2;
LOWValue = LOW;
>
sensorStatus1 = digitalRead (InSensor1);
sensorStatus2 = digitalRead (InSensor2);
void BodyForward()
<
digitalWrite(DriveVector1, LOWValue);
digitalWrite(DriveSpeed1, HIGHValue);
digitalWrite(DriveVector2, LOWValue);
digitalWrite(DriveSpeed2, HIGHValue);
>
void BodyBackward()
<
digitalWrite(DriveVector1, HIGHValue);
digitalWrite(DriveSpeed1, LOWValue);
digitalWrite(DriveVector2, HIGHValue);
digitalWrite(DriveSpeed2, LOWValue);
>
void BodyRight()
<
digitalWrite(DriveVector1, HIGHValue);
digitalWrite(DriveSpeed1, LOWValue);
digitalWrite(DriveVector2, LOWValue);
digitalWrite(DriveSpeed2, HIGHValue);
>
void BodyStop()
<
digitalWrite(DriveVector1, 0);
digitalWrite(DriveSpeed1, 0);
digitalWrite(DriveVector2, 0);
digitalWrite(DriveSpeed2, 0);
>
Робот пылесос на ардуино
Показано, как делать робот-пылесос. Он автоматически объезжает препятствия и пылесосит, при этом собирает бумажки, крошки различного происхождения.
Нужен стандартный набор для arduino машинки. Берём одну arduino uno, драйвер двигателя l298n, датчик приближенности, старый вентилятор и системного блока компьютера. Сначала взял толстую гофрокартон, вырвали снимок кружок, установил вентилятор, размер. Начал вырезать. Размер восьмиугольника должен быть несколько меньше вентилятора. Затем взял вентилятор и попробовал вставить туда в отверстие. Думал, что контур немного растянется. Но так не случилось. Немного подрезал и только после этого получилось установить вентилятор. Высота вентилятора над столом должно получиться небольшой, около 0,5 см. Только при этом он будет хорошо всасывать пыль. Затем установил двигатели и приклеил всё с помощью термоклея. В том числе и вентилятор. Его нужно клеить после того, как установлены моторы, чтобы видеть необходимо высоту. Практика показала, что хорошо будет всасываться мусор, если высота над столом от 0,5 до 1 см. Затем занялся установкой еще одного колеса, чтобы это система стояла на трех колесах. Третье колесо вращается не будет.
Все элементы пылесоса присоединяется с помощью термоклея. Для подобного устройства такой прочности предостаточно.
Кашаса всасывание мусор зависит от скорости работы, она не должна быть большой. Необходимо вставить глаза. Используем датчик ультразвуковой для arduino.
Кнопка установил сбоку, но практика показала, что это не совсем правильное решение, потому что робот сам себя несколько раз отключал. Он ударился о стену именно этой кнопкой. В принципе, это не совсем классический пылесос, потому что обычно используется коробка. А здесь стоит прямо на всасывание. Но это не ухудшает характеристик. Обратите внимание, что мастер взял обычный вентилятор, не предназначен для того, чтобы сосать были. Он просто дует воздух. Поэтому, если вы хотите создать пылесос, который будет сосать не только бумагу, то нужно установить двигатель помощнее. И придать лопастями необходимую для пылесоса конфигурацию. Весь процесс создания робота занял около 3 часов. Как видите, ничего сложного нет. Самое сложное в этом деле, это программирование. В этом случае мастер программируют лишь немного. Он взял свою машину, который объезжает препятствия, и чуть-чуть изменил, чтобы ограничить скорость передвижения робота. Для этого применил шим выводы на arduino и подключил их соответствующим выводом на драйвере двигателя. Кстати, он не такой и маленький расчёт радиатора. Но у него есть большой плюс по сравнению с другими драйверами двигателей. А именно, вывод на 50. Им очень удобно, сервоприводы а также arduino. Если вам не нравится большой размер этого драйвера, то можно просто взять и убрать оттуда радиатор. Дело в том, что при использовании этих двух двигателей, он греется не сильно. Температура не поднимается выше 40 градусов. Схема получает питание с аккумулятора с через выключатель и nano драйвер двигателя. Сюда же подключен и вентилятор.