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

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

d0a6f1be5a57422485840ebcaa654fbd.jpg
Итак начнем пожалуй с конструкции и принципа работы пылесоса.
e034fc1b64124528a2630bbfd2326cc8.jpg
Из схемы видно, что пылесос оборудован 6 инфракрасными датчиками. Они срабатывают при приближении пылесоса к препятствию, давая комманду остановиться и развернуться не врезаясь в него. Если же ни один из 6 датчиков не сработал и робот пылесос сталкивается с препятствием, то тогда срабатывает один из 2 выключателей, которые соединяют бампер (в котором находятся ИК датчики) и корпус робота.
Внимательные читатели заметили, что на схеме не показано питание робота. Тут решение вполне стандартное, использованы 4 аккумулятора формата 18650, подключенных последовательно две пары, через контроллер заряда-разряда АКБ. Далее с контроллера через выключатель подсоединены повышающий и понижающий DC-DC преобразователи. + 12 вольт питает моторы колес и моторы передних щеток. +5 вольт питает всю остальную электронику. Турбина питается от 7 — 8 вольт, так что для нее преобразователь не нужен. Выглядит это так:
c713c762c1f24223a5c34e5adfcd4cea.jpg
В итоге список основных компонентов выглядит так:
ардуино про мини
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 тыс. руб. плюс два месяца работы»
-Что было самым сложным в процессе постройки?
«Самое сложное сделать корпус и турбину, подогнать все детали»
-Есть планы продолжать совершенствование робота?
«В планах покрасить корпус, сделать несколько режимов уборки, подключить блютус модуль и написать программу для телефона на андроиде (управление режимами, ручное управление, отображение заряда АКБ). Ну и сделать под пылесосом синюю подсветку для красоты»
На этом оптимистичном моменте думаю закончим рассказ про эту версию робота-пылесоса, хотя осталось много неосвещенных интересных моментов на эту тему. И поэтому завершаем вопросом:

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

© Geektimes