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


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

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

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




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


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


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

<code>#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); }</code>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник: habrahabr.ru/post/222657/


Комментарии