Испытания домашнего робота версия 0.3.1


    Испытание автоматического режима движения домашнего робота на основе данных от инфракрасного, ультразвукового дальномера и энкодеров.

    Эта статья продолжение предыдущей Обзор домашнего робота ver 0.3.
    Идея состоит в том чтобы сделать робота способного самостоятельно перемещаться по дому без участия человека. Про выбранную платформу шасси описано в предыдущей статье. В процессе реализации и испытаний была найдена более менее приемлемая система обнаружения препятствий про которую и расскажу ниже.

    В основе лежит так сказать локатор – вращающиеся на микро серве дальномеры.


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


    Из следующего графика можно примерно понять зависимость сигнала от расстояния.


    Тестовый код для дальномера SHARP GP2Y0A41SKOF.

    #define pin A1
    
    void setup () {
            Serial.begin (9600);
            pinMode(pin, INPUT);
    }
    
    void loop () {
            uint16_t value = analogRead (pin);
            double distance = get_ GP2Y0A41SKOF (value); //вычисление на основе аналогового значения расстояния в сантиметрах
            Serial.println (value);                
            Serial.print (distance);
            Serial.println (" cm");
            Serial.println ();
            delay (500);                           
    }
    
    //return distance (cm)
    double get_ GP2Y0A41SKOF (uint16_t value) {
            if (value < 16)  value = 16;
            return 2076.0 / (value - 11.0);
    }


    Ультразвуковой дальномер HC-SR04, заявлено что измеряет на дистанции от 2 до 450 сантиметров. Сектор измерения большой в зависимости от стороны колеблется от 30 до 60 градусов. Вычисление расстояния линейно, время отраженного звука делится на скорость звука.


    Пример кода для дальномера HC-SR04.
    digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера 
    delayMicroseconds(10); // Удерживаем 10 микросекунд 
    digitalWrite(Trig, LOW); // Затем убираем 
    time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса 
    distance_sm=time_us/58; // Пересчитываем в сантиметры 
    Serial.println(distance_sm); // Выводим на порт
    


    Причем для функции pulseIn можно выставить время максимального ожидания сигнала иначе при отсутствии отраженной звуковой волны он может долго ждать блокируя тем самым выполнение программы, я опытным путем установил следующее значение
    time_us=pulseIn(Echo, HIGH,50000);


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

    Серва вращает дальномеры от 30 до 150 градусов с шагом в 30 градусов, числа взяты опытным путем для быстроты измерений и простоты. Измерения сохраняются в массив и по требованию в любой момент может быть осуществлена проверка на попадания препятствий в прямоугольную область перед роботом.

    Так как часто робот по тем или иным причинам не обнаруживал препятствия, решил определять что робот врезался и не может продолжать движение по данным с энкодеров установленных на вал колеса.

    Энкодеры используются вот такие.




    Механизм их действия прост, там установлен оптически датчик на просвет отверстий в диске. Повесил изменения датчика на прерывания arduino, ниже примерный код:
    void LwheelSpeed()
    {
      coderLeft++;  //count the left wheel encoder interrupts
    }
    void setup()
     {
      attachInterrupt(LEFT, LwheelSpeed, CHANGE);  
    }
    


    Примерно раз в 200 миллисекунд, вычисляется скорость колес. Соответственно если при движении скорость колес сильно падает, то считается что робот столкнулся с препятствием. После этого он отъезжает назад и разворачивается.

    Такой не хитрой системой датчиков достигается практически сто процентная гарантия обнаружения препятствий. На видео можно наблюдать как робот отрабатывает все эти ситуации.

    Сейчас жду микропереключатели и доделываю 3d принтер, сделаю роботу бампер. Тогда думаю будет отрабатывать практически все возможные ситуации.

    Несколько фоток робота с разных ракурсов.










    Открываю опен соурс проект по данному роботу, как доделаю робота до более менее вменяемого состояния выложу схему конструкции и исходный код, если кому то нужно прямо сейчас пишите в личку.

    Больше информации, новостей, фото и видео смотрите в группе вконтакте по этому проекту — vk.com/club23358759

    Пишите в комментариях на какую тему написать следующую статью, снять видео.
    Поделиться публикацией

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

    Комментарии 20
      +1
      Можно поинтересоваться, какую функцию выполняет телефон?
        +1
        Робот звонит с жалобами в организацию по защите роботов когда хозяин с ним плохо обращается (например, когда в коде слишком много багов и приходится бесцельно стучаться головой в ножку стула).
        0
        В видео с него идет управление роботом и запуск автоматического режима. А так я еще сделал чтобы можно было роботом управлять с компьютера по вайфаю, т.е я могу видеть на компьютере то что видит камера телефона, вращать телефоном, управлять роботом.
          +2
          Чтобы робот не был таким шумным, можно поставить сразу 5 дальномеров под разными углами, а не один на сервоприводе :-)
            +1
            Да блин инфракрасные дальномеры дорогие: ( заказал себе пару штук но они еще не пришли. А так у меня есть три ульрозвуковых и два инфракрасных, жду когда мне доделают 3d принтер чтобы на нем распечатать крепление для них.
              +2
              вы роботов делаете, и 3д сами сможете сделать, зачем «их» ждать! [=
                0
                Да я сам и делаю: ) просто механическую часть отец делает. Так то уже печатает но кривовато: )
            +3
            А мне нравится ритм, который задает серва. Как минимум, робот-битбоксер вышел неплохой, пусть и без разнообразия.
              +1
              А от чего питается робот? Блок питания? Какие параметры? В данный момент сам начал делать робота, столкнулся с проблемой, что мощности Ардуино не хватает на вращение 4 колес ) Надо делать отдельное питание для колес похоже. У вас как этот момент устроен?
                0
                О у меня тоже не хватает мощности для вращения колес. Сейчас в роли питания выcтупают две батарейки аккумулятора 18650 3.7 вольт, двигатели питаются через драйвер l298n(проблема в том что он отжирает 1в, купил ему на замену TB6612FNG). Тут несколько вариантов решения проблемы: 1. Те что у меня моторредукторы соотношение шестерен 1:48, момент заявлен 0.8кг на см, взял им на замену моторреддукторы с соотношением 1:120 и моментом 1кг на см. 2. Добавить батарейку и тем самым увеличить напряжение на драйвере двигателей.
                +1
                Подскажите новичку, для чего служит дополнительная верхняя плата? И еще каким образом можно увеличить количество входов/выходов? Просто имеется плата Arduino Uno и при подключении, например, 4х-секционного цифрового блока все цифровые входы заняты, а хочется еще что то подключить.
                  +1
                  Не забывайте ещё про аналоговые входы — они тоже работают как цифровые… по нумерации с 14 или как А0, А1…
                    0
                    Верхняя плата это sensor shield v5 на нее удобно подключать периферию так как с каждым пином рядом разведено питание и к тому же перемычкой можно переключить на внешние 5 вольт от понижающего стабилизатора.
                    Количество входов выходов можно увеличить покупкой arduino mega я так поступил. Еще можно как то с помощью входного сдвигового регистра это решить но мне это показалось сложным и паять не хочется.
                    С LCD я тоже лоханулся взял обычный который все входы закрывает, надо было брать который с i2c.
                      +1
                      С LCD я тоже лоханулся взял обычный который все входы закрывает, надо было брать который с i2c.

                      Тут нужен переходник такой. Сразу i2c с не бывают, если конечно тут речь идет про 2004 или 1602 экранчики…
                        0
                        Я видел в Китае продаются с уже впаянными такими переходниками.
                          0
                          Это все же два разных устройства, продающихся в комплекте и они не всегда могут быть спаяны вместе.
                    +1
                    Никогда, никогда не выпускайте версию 0.3.1 (1).
                    Па этом этапе надо сразу переименовывать проект в 3.1 — это же очевидно.
                      0
                      Да это еще даже не бета версия того что я планирую, вот как придут все новые детали и прикручу ros, вот тогда будет ого го робот: )
                      +1
                      Не планируется ли создание корпуса?
                        0
                        Планируется, как все детали новые придут буду проектировать корпус. Часть наверное из орг стекла или фанеры сделаю, остальное на 3d принтере распечатаю.

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

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