Самодельный робот-пылесос на базе Arduino



Диаметр робота 30 сантиметров, высота 9 сантиметров. Корпус сделал из вспененного ПВХ толщиной 6 мм. ПВХ легко режется ножом, гнется над паром, или феном, клеится обычным суперклеем намертво.


В бампере у робота установил 4 инфракрасных датчика препятствия и два переключателя на случай столкновения, а так-же наклеил резиновые утеплители для окон, чтобы при столкновении с углами мебели, не превратил ее в труху.


Контейнер для пыли и мусора сделан из 4 мм. ПВХ. Фильтр из двух слоев тряпичной салфетки (продается в любом магазине, где торгуют чистящими средствами для дома) и вклеил их в рамку из плотного картона. Крышка контейнера держится на магнитах.
Турбина склеена из тонкого пластика, компакт-дисков и ПВХ.


Контейнер со снятым фильтром. Видны лопасти турбины. Турбину сделал не разборной поэтому не смогу показать ее внутренности.


Верхняя крышка склеена супер-клеем.


Сердце, кишки и прочие внутренности робота-пылесоса.


Контроллер инфракрасных датчиков с регуляторами расстояния до препятствия. Имеет 4 выхода для подключения к Ардуино. В обычном режиме выдает на выходе логическую единицу, если срабатывает любой из четырех датчиков, выдает ноль.


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


Мотор для передней щетки выдрал из старого принтера и подключил к Ардуино через Мосфет. Когда пылесос движется щетка крутится медленно, чтобы не разбрасывала мусор, а направляла его прямо к жерлу. Когда пылесос подъезжает к стене, или мебели щетка вращается быстро, чтобы хорошо смести мусор, который обычно скапливается вдоль стен и в углах.
Инфракрасные датчики заклеил сзади черным картоном и покрасил черным маркером, а то они иногда срабатывали от мигания светодиодов на драйвере мотора.


Турбину вращает высокооборотный моторчик. Маркировки на нем нет и откуда вытащил не помню.


Питается все это хозяйство от четырех литий-ионных аккумуляторов формата 18650, через понижающий DC-DC преобразователь. Подключены две пары последовательно.


В белой трубке находится контроллер заряда — разряда аккумуляторов. Когда АКБ подходит к минимально допустимому разряду, контроллер отключает пылесос, когда заряжается и достигает полной зарядки, то отключает зарядное устройство.


Колеса и мотор-редукторы всем знакомы. Пришлось их немного подшаманить. Разобрал редукторы, промыл от силиконовой смазки, обильно намазал солидолом и собрал обратно. Мне показалось, что на пластмассовых осях выглядит это не надежно и как-то совсем по китайски. Пришлось укреплять.


Основание робота сделал из водостойкой фанеры, а точнее из разделочной доски.


Третье колесико пришлось углублять на 2,5 сантиметра. Надо было сразу заказывать шариковое колесико. Но как говорится, если бы бабушке бороду, то она будет дедушкой.


Щетку сделал из лески.

Список деталей:
Arduino Pro Mini — мозги.
L298N — драйвер моторов.
Понижающий DC -DC преобразователь.
Модуль с Мосфетом для управления передней щеткой.
4 инфракрасных датчика препятствия с контроллером.
Два переключателя для бампера.
Два колеса с мотор-редукторами.
Третье колесо, лучше шариковое не высокое.
Мотор для щетки.
Высокооборотный мотор для турбины.
4 аккумулятора 18650 и контроллер для них.
Фанера, ПВХ, куча проводов, выключатель, гнездо для зарядки, магнитики, шурупы.

Видео уборки.

Видео робота без корпуса.

#define in1 4 //пин правого мотора
#define in2 5 //пин правого мотора

#define in3 7 //пин левого мотора
#define in4 8 //пин левого мотора

#define lev_vik 2 //пин левого выключателя
#define pra_vik 3 //пин правого выключателя

boolean lev = true; //переменная состояния левого выключателя
boolean pra = true; //переменная состояния правого выключателя

boolean ir1 = true; //переменная состояния первого ик датчика
boolean ir2 = true; //переменная состояния второго ик датчика
boolean ir3 = true; //переменная состояния третьего ик датчика
boolean ir4 = true; //переменная состояния четвертого ик датчика

void setup() {

  randomSeed(analogRead(19));

  // пины для левого и правого моторов на выход

  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);

  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  //---------------------------------------------

  //пин веника на выход
  pinMode(11, OUTPUT);
  //--------------------

  //пины левого и правого выключателя на вход
  pinMode(lev_vik, INPUT);
  pinMode(pra_vik, INPUT);
  //-----------------------------------------------

  //пины ик датчиков на вход
  pinMode(14, INPUT);
  pinMode(15, INPUT);
  pinMode(16, INPUT);
  pinMode(17, INPUT);
  //------------------------------------------
  venikmin(); // медленное вращение веника
  delay(4000);

  vpered(); // езда вперед
}

void loop() {

  lev = digitalRead(lev_vik); //считывание состояния левого выключателя
  if (!lev) {  //если срабатывает левый выключатель то
    stopm();//стоп
    venikmax(); // быстрое вращение веника
    delay(300);
    nazad(); //едем назад
    delay(300);
    stopm();//стоп
    delay(300);
    vpravo(); //поворот на месте вправо
    delay(random(500, 1000));
    stopm();//стоп
    delay(300);
    vpered();  // езда вперед
    venikmin(); // медленное вращение веника
  }

  pra = digitalRead(pra_vik); //считывание состояния правого выключателя
  if (!pra) {  //если срабатывает правый выключатель то
    stopm();//стоп
    venikmax(); // быстрое вращение веника
    delay(300);
    nazad();  //едем назад
    delay(300);
    stopm();//стоп
    delay(300);
    vlevo();  //поворот на месте влево
    delay(random(500, 1000));
    stopm();//стоп
    delay(300);
    vpered();   // езда вперед
    venikmin();   // медленное вращение веника
  }

  //------------------------------
  ir1 = digitalRead(14); // считывание показания первого ик датчика
  if (!ir1) { // если срабатывает первый ик датчик то
    stopm();//стоп
    venikmax(); // быстрое вращение веника
    delay(300);
    vpravo(); //поворот на месте вправо
    delay(random(400, 900));
    stopm();//стоп
    delay(300);
    vpered();   // езда вперед
    venikmin();   // медленное вращение веника
  }
  //-----------------------------

  //------------------------------
  ir2 = digitalRead(15); // считывание показания второго ик датчика
  if (!ir2) { // если срабатывает второй ик датчик то
    stopm();//стоп
    venikmax(); // быстрое вращение веника
    delay(300);
    vpravo(); //поворот на месте вправо
    delay(random(400, 900));
    stopm();//стоп
    delay(300);
    vpered();   // езда вперед
    venikmin();   // медленное вращение веника
  }
  //-----------------------------

  //------------------------------
  ir3 = digitalRead(16); // считывание показания третьего ик датчика
  if (!ir3) { // если срабатывает третий ик датчик то
    stopm();//стоп
    venikmax(); // быстрое вращение веника
    delay(300);
    vlevo(); //поворот на месте влево
    delay(random(400, 900));
    stopm(); //стоп
    delay(300);
    vpered();   // езда вперед
    venikmin();   // медленное вращение веника
  }
  //-----------------------------

  //------------------------------
  ir4 = digitalRead(17); // считывание показания четвертого ик датчика
  if (!ir4) { // если срабатывает четвертый ик датчик то
    stopm(); //стоп
    venikmax(); // быстрое вращение веника
    delay(300);
    vlevo(); //поворот на месте влево
    delay(100);     // ------------------------
    stopm(); //стоп
    delay(300);
    vpered(); // езда вперед
    venikmin();   // медленное вращение веника
  }
  //-----------------------------
}

//функция езды вперед
void vpered() {
  //вращение левого мотора вперед
  digitalWrite(in4, LOW);
  digitalWrite(in3, HIGH);
  //-----------------------------
  //вращение правого мотора вперед
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  //-----------------------------
}

//функция езды назад
void nazad() {
  //вращение левого мотора назад
  digitalWrite(in4, HIGH);
  digitalWrite(in3, LOW);
  //-----------------------------
  //вращение правого мотора назад
  digitalWrite(in2, HIGH);
  digitalWrite(in1, LOW);
  //----------------------------
}

//функция езды на месте влево
void vlevo() {
  //вращение левого мотора назад
  digitalWrite(in4, HIGH);
  digitalWrite(in3, LOW);
  //-----------------------------
  //вращение правого мотора вперед
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  //-----------------------------
}

//функция езды на месте вправо
void vpravo() {
  //вращение правого мотора назад
  digitalWrite(in2, HIGH);
  digitalWrite(in1, LOW);
  //----------------------------
  //вращение левого мотора вперед
  digitalWrite(in4, LOW);
  digitalWrite(in3, HIGH);
  //-----------------------------
}

//функция стоп
void stopm() {
  //стоп правого мотора назад
  digitalWrite(in2, HIGH);
  digitalWrite(in1, HIGH);
  //----------------------------
  //стоп левого мотора вперед
  digitalWrite(in4, HIGH);
  digitalWrite(in3, HIGH);
  //-----------------------------
}

//функция вращения веника медленно
void venikmin() {
  analogWrite(11, 90); // скорость вращения веника

}

//функция вращения веника быстро
void venikmax() {
  analogWrite(11, 220); // скорость вращения веника
}


p. s. Начал делать версию 2.0.
Предполагаемые улучшения:
Колеса будут на независимой подвеске (покупал в Robocraft.ru) со встроенными энкодерами и датчиками отрыва от пола.
Диаметр робота-пылесоса будет 34-35 сантиметров, а высота 8 сантиметров.
Ик-датчики препятствия будут другие и будет их не 4, а 6 штук.
Турбину сделаю мощнее.
Третье колесико будет шариковое, невысокое.
Пульт управления.
Четыре программы уборки: вдоль стен, ёлочка, от центра по спирали, и свободное блуждание.
Вторую щетку с другой стороны.
Более емкие аккумуляторы.

Хотелось бы сделать, но пока не решил нужно, или нет:
1. Щетку снизу.
2. Базовую станцию, для возвращения на подзарядку.
3. Ик-барьер.


0 комментариев на «“Самодельный робот-пылесос на базе Arduino”»

    • Спасибо!
      Сейчас делаю версию 2.0 и не знаю как публиковать проделанную работу.
      Есть несколько вариантов:
      1. Доделать до конца и выложить все в один топик, но это будет месяца через два.
      2. Создать топик и по ходу изготовления пылесоса, добавлять туда фотографии, описание и т. д., редактируя топик.
      3. Создать несколько топиков. Например:
      Корпус.
      Бампер.
      Механика.
      Электроника.
      Скетч.

      Не знаю как лучше сделать.

    • Разумеется — на ваше усмотрение 🙂
      Однако, предпочтительнее — вариант 3 или 1, т.к. больше соответствует блоговому формату сайта.
      Вариант 2 — лучше не использовать.

      Для примера best practice — посмотрите статьи победителей прошлогоднего конкурса.

  1. Мы издаем журнал Шелезяка, и хотели бы разместить у себя в журнале вашу статью «Самодельный робот-пылесос на базе Arduino». Если это возможно, то сообщите пожалуйста свои условия публикации. К сожалению в личные сообщения написать не получается.

    • Размещайте, только ссылку на этот топик разместите.
      Где можно посмотреть Ваш журнал?

    • Боюсь администрации ссылка может не понравится. Но в поисковике по запросу «журнал Шелезяка» мы на первом месте. 🙂

    • Спасибо за разрешение. Боюсь администрации ссылка может не понравится. Но в поисковике по запросу «журнал Шелезяка» мы на первом месте. 🙂

    • Хотел исправить сообщение а получилось копия. Если можете удалите пожалуйста.

    • Я удалить не могу. Напишите админу сайта.

  2. подскажите что за мосфет у вас в движке щетки? где такой покупали?
    и можно так же инфу про инфракрасные датчики, что за платка?
    на какой ардуине это все работает?

    • Называется MOS Module на IRF520N мосфете, покупал на али, но сейчас того продавца уже нет.
      Инфракрасные датчики брал у него же, на плате нет маркировки и на микрухе тоже. Лучше заказывать отдельные датчики, а не с общей платой.
      Мозги на Arduino Pro Mini 5 вольт.

  3. вопрос автору: как реализована зарядка аккумуляторов? У меня используется 4 банки такого же формата последовательно, каждая номинально 3.7В, но выдаёт 4В, для зарядки приходится вынимать их и заряжать по одной.

    • Подключены две параллельных пары последовательно. Напряжение всей батареи 7,4В, после зарядки выдает 8,2В.
      Подключил через контроллер заряда-разряда аккумуляторов. Когда АКБ подходит к минимально допустимому разряду, контроллер отключает пылесос, когда заряжается и достигает полной зарядки, то отключает зарядное устройство.
      Вам нужен контроллер на 4 банки, желательно с балансиром.

    • Спасибо за ответ, но сам вопрос-то не в логике работы, а где взять подходящее устройство зарядки и контроля?

    • Не знаю разрешено ли здесь оставлять ссылку на магазин, где я покупал контроллер, но попробую объяснить:
      Заходим в гугл.
      Вбиваем запрос «запас мощности»
      Первый сайт в поиске и есть тот магазин.
      Там в разделе зарядные устройства, есть подраздел контроллеры заряда-разряда.
      Я заказывал самый дешевый за 200 рублей без балансира, теперь жалею.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение