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

Тема в разделе "Глядите, что я сделал", создана пользователем nitrior, 3 фев 2015.

  1. nitrior

    nitrior Нерд

    [​IMG]
    Диаметр робота 30 сантиметров, высота 9 сантиметров. Корпус сделал из вспененного ПВХ толщиной 6 мм. ПВХ легко режется ножом, гнется над паром, или феном, клеится обычным суперклеем намертво.
    [​IMG]
    В бампере у робота установил 4 инфракрасных датчика препятствия и два переключателя на случай столкновения, а так-же наклеил резиновые утеплители для окон, чтобы при столкновении с углами мебели, не превратил ее в труху.
    [​IMG]
    Контейнер для пыли и мусора сделан из 4 мм. ПВХ. Фильтр из двух слоев тряпичной салфетки (продается в любом магазине, где торгуют чистящими средствами для дома) и вклеил их в рамку из плотного картона. Крышка контейнера держится на магнитах.
    Турбина склеена из тонкого пластика, компакт-дисков и ПВХ.
    [​IMG]
    Контейнер со снятым фильтром. Видны лопасти турбины. Турбину сделал неразборной поэтому не смогу показать ее внутренности.
    [​IMG]
    Верхняя крышка склеена супер-клеем.
    [​IMG]
    Сердце, кишки и прочие внутренности робота-пылесоса.
    [​IMG]
    Контроллер инфракрасных датчиков с регуляторами расстояния до препятствия. Имеет 4 выхода для подключения к Ардуино. В обычном режиме выдает на выходе логическую единицу, если срабатывает любой из четырех датчиков, выдает ноль.
    [​IMG]
    Выключатели столкновения были безжалостно вырваны из старой микроволновки. Когда пылесос упирается в препятствие (не срабатывают инфракрасные датчики) то бампер нажимает выключатель и пылесос отъезжает на несколько сантиметров назад, поворачивает и продолжает уборку. Выключатели поставил мощные, чтобы они возвращали бампер в исходное положение.
    [​IMG]
    Мотор для передней щетки выдрал из старого принтера и подключил к Ардуино через Мосфет. Когда пылесос движется щетка крутится медленно, чтобы не разбрасывала мусор, а направляла его прямо к жерлу. Когда пылесос подъезжает к стене, или мебели щетка вращается быстро, чтобы хорошо смести мусор, который обычно скапливается вдоль стен и в углах.
    Инфракрасные датчики заклеил сзади черным картоном и покрасил черным маркером, а то они иногда срабатывали от мигания светодиодов на драйвере мотора.
    [​IMG]
    Турбину вращает высокооборотистый моторчик. Маркировки на нем нет и откуда вытащил не помню.
    [​IMG]
    Питается все это хозяйство от четырех литий-ионных аккумуляторов формата 18650, через понижающий DC-DC преобразователь. Подключены две пары последовательно.
    [​IMG]
    В белой трубке находится контроллер заряда - разряда аккумуляторов. Когда АКБ подходит к минимально допустимому разряду, контроллер отключает пылесос, когда заряжается и достигает полной зарядки, то отключает зарядное устройство.
    [​IMG]
    Колеса и мотор-редукторы всем знакомы. Пришлось их немного подшаманить. Разобрал редукторы, промыл от силиконовой смазки, обильно намазал солидолом и собрал обратно. Мне показалось, что на пластмассовых осях выглядит это не надежно и как-то совсем по китайски. Пришлось укреплять.
    [​IMG]
    Основание робота сделал из водостойкой фанеры, а точнее из разделочной доски.
    [​IMG]
    Третье колесико пришлось углублять на 2,5 сантиметра. Надо было сразу заказывать шариковое колесико. Но как говорится, если бы бабушке бороду, то она будет дедушкой.
    [​IMG]
    Щетку сделал из лески.

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

    А главное иметь желание и кучу нервов :)




     
    NikitOS, sdfg, alp69 и 10 другим нравится это.
  2. nitrior

    nitrior Нерд

    Вот код:
    Код (Text):
    #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() {
      //  digitalWrite(11, LOW); //медленное вращение веника
      analogWrite(11, 90); // скорость вращения веника

    }

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


     
     
    sdfg, sharp и Megakoteyka нравится это.
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    Отличный робот получился!
     
    NikitOS, sdfg и nitrior нравится это.
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Отлично!
    Сколько времени нужно роботу для полного покрытия комнаты с учетом рандомных поворотов?
     
    NikitOS, sdfg и nitrior нравится это.
  5. nitrior

    nitrior Нерд

    Минут за 40 убирает комнату и балкон.
     
    NikitOS и sdfg нравится это.
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    Бывает так, что остаются не пройденные участки? Или за 40 минут хоть раз, но попадает в каждую точку?
    Следующим шагом можно снизу валики присобачить как у румбы и можно выходить на рынок :)
     
    NikitOS и sdfg нравится это.
  7. nitrior

    nitrior Нерд

    На первом видео видно, что пылесос прошел полностью весь балкон за 15 минут и все подобрал.
    А зачем валики, если он и без валиков нормально убирает.
     
    sdfg нравится это.
  8. ROSHENKA

    ROSHENKA Нуб

    обалдеть))) суперский робот и очень полезная вещь в хозяйстве)))
     
    sdfg нравится это.
  9. Класс! Хочу тоже собрать! А какое кодовое слово к товарам(КРОМЕ: jeremy, MTT14 , YT-B113)?
     
    sdfg нравится это.
  10. armani

    armani Нерд

    Если к ним на книгулицо зайти, можно код на блокнот получить.
     
    sdfg нравится это.
  11. armani, это слово BOOKHACK... Он у меня уже есть...
     
    sdfg нравится это.