Робот-пылесос на ардуино

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





    Итак, начнем, пожалуй, с конструкции и принципа работы пылесоса.



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

    Внимательные читатели заметили, что на схеме не показано питание робота. Тут решение вполне стандартное, использованы 4 аккумулятора формата 18650, подключенных последовательно две пары, через контроллер заряда-разряда АКБ. Далее с контроллера через выключатель подсоединены повышающий и понижающий DC-DC преобразователи. + 12 вольт питает моторы колес и моторы передних щеток. +5 вольт питает всю остальную электронику. Турбина питается от 7 — 8 вольт, так что для нее преобразователь не нужен. Выглядит это так:



    В итоге список основных компонентов выглядит так:

    ардуино про мини
    L298N Motor Driver Module
    колеса
    повышающий конвертер
    понижающий конвертер
    ИК датчик 6 шт
    контроллер заряда-разряда
    крыльчатка для турбины (около 200 руб)
    ПВХ для изготовления корпуса
    АКБ 18650 4 шт.
    2 моторчика для щеток (модель не сильно важна)
    1 моторчик для турбины
    2 выключателя столкновения.
    Один из вариантов скетча для хаотичной уборки
    тут
    #define mot_ena 9 //пин ШИМа левого мотора
    #define mot_in1 8 //пин левого мотора
    #define mot_in2 7 //пин левого мотора
    #define mot_in3 6 //пин правого мотора
    #define mot_in4 4 //пин правого мотора
    #define mot_enb 10 //пин ШИМа правого мотора

    #define ir_1 A0 //пин 1 ИК-датчика
    #define ir_2 A1 //пин 2 ИК-датчика
    #define ir_3 A2 //пин 3 ИК-датчика
    #define ir_4 A3 //пин 4 ИК-датчика
    #define ir_5 A4 //пин 5 ИК-датчика
    #define ir_6 A5 //пин 6 ИК-датчика

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

    //для выравнивания скорости колес
    byte max_skor_lev = 254;
    byte max_skor_prav = 244;
    //---------------------------------

    byte min_skor = 0;

    void setup() {

    randomSeed(analogRead(A7));
    // пины энкодеров на вход
    pinMode(3, INPUT); // пин левого энкодера на вход
    pinMode(2, INPUT); // пин правого энкодера на вход
    //-------------------------
    // пины для левого и правого моторов на выход
    pinMode(mot_ena, OUTPUT);
    pinMode(mot_in1, OUTPUT);
    pinMode(mot_in2, OUTPUT);
    pinMode(mot_in3, OUTPUT);
    pinMode(mot_in4, OUTPUT);
    pinMode(mot_enb, OUTPUT);
    //-------------------------------------------
    // пины ИК-датчиков на вход
    pinMode(ir_1, INPUT);
    pinMode(ir_2, INPUT);
    pinMode(ir_3, INPUT);
    pinMode(ir_4, INPUT);
    pinMode(ir_5, INPUT);
    pinMode(ir_6, INPUT);
    //-------------------------
    // пины левого и правого выключателей на вход
    pinMode(lev_vik, INPUT);
    pinMode(pra_vik, INPUT);
    //---------------------------
    delay(3000);

    ROB_VPERED();
    }

    void loop() {

    // если срабатывает левый выключатель на бампере
    if (digitalRead(lev_vik) == LOW)
    {
    ROB_STOP();
    delay(200);
    ROB_NAZAD();
    delay(150);
    ROB_STOP();
    delay(200);
    ROB_PRAV();
    delay(random(400, 1500));
    ROB_STOP();
    delay(200);
    ROB_VPERED();
    }
    //-----------------------------------------------
    // если срабатывает правый выключатель на бампере
    if (digitalRead(pra_vik) == LOW)
    {
    ROB_STOP();
    delay(200);
    ROB_NAZAD();
    delay(150);
    ROB_STOP();
    delay(200);
    ROB_LEV();
    delay(random(400, 1500));
    ROB_STOP();
    delay(200);
    ROB_VPERED();
    }
    //-----------------------------------------------
    // если срабатывает 2 ИК-датчик
    if (digitalRead(ir_2) == LOW)
    {
    ROB_STOP();
    delay(200);
    ROB_PRAV();
    delay(random(200, 1100));
    ROB_STOP();
    delay(200);
    ROB_VPERED();
    }
    //-----------------------------------------------
    // если срабатывает 3 ИК-датчик
    if (digitalRead(ir_3) == LOW)
    {
    ROB_STOP();
    delay(200);
    ROB_PRAV();
    delay(random(200, 1100));
    ROB_STOP();
    delay(200);
    ROB_VPERED();
    }
    //-----------------------------------------------
    // если срабатывает 4 ИК-датчик
    if (digitalRead(ir_4) == LOW)
    {
    ROB_STOP();
    delay(200);
    ROB_LEV();
    delay(random(200, 1100));
    ROB_STOP();
    delay(200);
    ROB_VPERED();
    }
    //-----------------------------------------------
    // если срабатывает 5 ИК-датчик
    if (digitalRead(ir_5) == LOW)
    {
    ROB_STOP();
    delay(200);
    ROB_LEV();
    delay(random(200, 1100));
    ROB_STOP();
    delay(200);
    ROB_VPERED();
    }
    //-----------------------------------------------
    // если срабатывает 1 ИК-датчик
    if (digitalRead(ir_1) == LOW)
    {
    ROB_PRAV();
    delay(10);
    ROB_VPERED();
    }
    //-----------------------------------------------
    // если срабатывает 6 ИК-датчик
    if (digitalRead(ir_6) == LOW)
    {
    ROB_LEV();
    delay(10);
    ROB_VPERED();
    }
    //-----------------------------------------------

    }

    // поворот направо на месте
    void ROB_PRAV()
    {
    // левый мотор вперед
    digitalWrite(mot_in1, LOW);
    digitalWrite(mot_in2, HIGH);
    analogWrite(mot_ena, max_skor_lev);
    // правый мотор назад
    digitalWrite(mot_in3, LOW);
    digitalWrite(mot_in4, HIGH);
    analogWrite(mot_enb, max_skor_prav);
    }
    //-----------------
    // поворот налево на месте
    void ROB_LEV()
    {
    // правый мотор вперед
    digitalWrite(mot_in3, HIGH);
    digitalWrite(mot_in4, LOW);
    analogWrite(mot_enb, max_skor_prav);
    // левый мотор назад
    digitalWrite(mot_in1, HIGH);
    digitalWrite(mot_in2, LOW);
    analogWrite(mot_ena, max_skor_lev);
    }
    //---------------------
    // езда вперед
    void ROB_VPERED()
    {
    // левый мотор вперед
    digitalWrite(mot_in1, LOW);
    digitalWrite(mot_in2, HIGH);
    analogWrite(mot_ena, max_skor_lev);
    // правый мотор вперед
    digitalWrite(mot_in3, HIGH);
    digitalWrite(mot_in4, LOW);
    analogWrite(mot_enb, max_skor_prav);
    }
    //-------------------------------------
    // езда назад
    void ROB_NAZAD()
    {
    // левый мотор назад
    digitalWrite(mot_in1, HIGH);
    digitalWrite(mot_in2, LOW);
    analogWrite(mot_ena, max_skor_lev);
    // правый мотор назад
    digitalWrite(mot_in3, LOW);
    digitalWrite(mot_in4, HIGH);
    analogWrite(mot_enb, max_skor_prav);
    }
    //------------------------------------
    // стоп
    void ROB_STOP()
    {
    // левый мотор стоп
    digitalWrite(mot_in1, LOW);
    digitalWrite(mot_in2, LOW);
    analogWrite(mot_ena, min_skor);
    // правый мотор стоп
    digitalWrite(mot_in3, LOW);
    digitalWrite(mot_in4, LOW);
    analogWrite(mot_enb, min_skor);
    }
    //--------------------------------

    Ну и небольшое интервью с автором этого проекта. Автора зовут Дмитрий Иванов, живет в г. Сочи.

    — Дмитрий, как пришла идея сделать робот-пылесос?

    — Увидел на ютубе видео, где робот-пылесос делал уборку, захотел себе купить такой, но когда посмотрел цену, то подумал и решил делать сам. Сначала сделал первую версию робота, у него были слабые моторы на колесах, несъемный контейнер для мусора и пыли, мало датчиков препятствия и я сделал вторую версию, лишенную этих недостатков.

    — Сколько в итоге денег и времени ушло на его изготовление?

    «Примерно 5000 тыс. руб. плюс два месяца работы»

    — Что было самым сложным в процессе постройки?

    Самое сложное сделать корпус и турбину, подогнать все детали.

    — Есть планы продолжать совершенствование робота?

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

    Сборник из более 100 обучающих материалов по ардуино для начинающих и профи можно найти тут.
    P.S. Онлайн курс по ардуино на гиктаймс здесь.На этом оптимистичном моменте, думаю, закончим рассказ про эту версию робота-пылесоса, хотя осталось много неосвещенных интересных моментов. И поэтому завершаем вопросом:

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    Нужны ли еще статьи по этому роботу-пылесосу?
    • +23
    • 43,7k
    • 8
    Поделиться публикацией

    Похожие публикации

    Комментарии 8
      +3
      А где фото турбины? Раз ее было сложно сделать, значит она не очень проста, было бы интересно посмотреть. А еще интересно знать, на сколько хватает 4-х батареек?
        0
        Четырех аккумуляторов емкостью 700 мА каждый, хватает на час уборки. про турбину и корпус возможно будет отдельная статья.
          0
          Подскажите хотя бы что за материал корпуса. Хочу что нибудь такое, чтоб дома мог сам пилить и клеить.
            0
            вспененный ПВХ толщиной 6 мм
        0
        Сейчас работаю с такой платой для управления двигателями и так как мне показалось, что выводов контроллера и так мало, я оформил управление моторами через сдвиговый регистр 74HC595. Получилось на три вывода контроллера повесить драйвер и управление подсветкой на светодиодах.
          0
          А можно ли оптимизировать алгоритм так, чтобы пылесос при движении повторял контуры комнаты, постепенно двигаясь к центру по спирали, а не двигался как отскакивающий от стен мячик?
            +1
            такая функция предусмотрена в следующей версии робота-пылесоса
            0
            Отличная работа — аккуратное исполнение и сбалансированный набор функций.
            Несмотря на то, что на geektimes уже есть несколько статей про роботы-пылесосы
            На робофоруме также не один такой проект, но всегда находится что-то новое в реализации, и что важнее — в обсуждении (например здесь и здесь ).

            Щетка обязательно нужна для чистки ковров и крупного мусора — и довольно мощная, при этом турбина используется только для того, чтобы пыль не поднималась в воздух, а оседала на фильтре (как в Румбе). Для частой уборки обычной (легкой) пыли на жестких полах — может быть достаточно только турбинки (малой или средней мощности).

            Рекомендую в алгоритме кроме движения от препятствия к препятствию периодически включать режим движения по спирали.

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

            Самое читаемое