Випробування домашнього робота версія 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
 
Пишіть в коментарях на яку тему написати наступну статтю, зняти відео.
  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.