CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Самодельный робот-пылесос v. 2.0. Часть 2: Электроника, схема, скетч и видео


Видео уборки.

Почти вся электроника прячется впереди робота. Мозгом пылесоса служит Arduino Pro Mini.


Вырезал из ПВХ подложку и прикрутил к ней все платы.


Колеса поставил мощные с оптическими энкодерами внутри. Описание колес и их характеристики есть здесь.

Перед тем как подключать колеса, припаял к ним такой 10-пиновый разъем.


Приделал на 10 жильный шлейф такой штекер. Просто вставил шлейф в штекер и зажал в тисках. Главное сильно не зажимать, я раздавил один :)


Получилось так.


Схема. Моторы от колес подсоединены через модуль L298N. Для работы модуля подключил +5 вольт на логику и +12 вольт для моторов, перед этим снял перемычку. Если перемычку не снимать, то 5 вольт подключать не надо, но тогда модуль ведет себя нестабильно.
Выключатели столкновения подключены к пинам 11 и 12, оптические энкодеры к пинам 2 и 3 (см. схему).


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


Схема питания робота-пылесоса.
Питается все это хозяйство от 4 аккумуляторов формата 18650, подключенных последовательно две пары, через контроллер заряда-разряда АКБ. Далее с контроллера через выключатель подсоединены повышающий и понижающий DC-DC преобразователи. + 12 вольт питает моторы колес и моторы передних щеток. +5 вольт питает всю остальную электронику. Турбина питается от 7 — 8 вольт, так что для нее преобразователь не нужен.


Сам контроллер.



Два робота-пылесоса делают уборку вместе.

Скетч пока самый простой, для хаотичной уборки.

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



В планах:
Покрасить корпус, или обтянуть пленкой.
Сделать несколько режимов уборки.
Подключить блютус модуль.
Написать программу для телефона на андроиде (управление режимами, ручное управление, отображение заряда АКБ.
Сделать под пылесосом синюю подсветку для красоты :)

Комментарии (9)

RSS свернуть / развернуть
+
+1
Здорово!
Сначала, просматривая видео, подумал, что в роботе строится карта грязных и пройденных участков, а потом посмотрел скетч, всё гораздо серьезней — random :)
avatar

Muiota

  • 4 июня 2015, 00:03
+
+1
Это временно, будет несколько алгоритмов уборки :-)
avatar

nitrior

  • 4 июня 2015, 14:01
+
+1
Молодец! Отличная обнова! Было бы хорошо, если бы сделали полную спецификацию по роботу, с ссылками на комплектующие. И чертежи. Хочу повторить Вашу конструкцию. Сделано ООчень круто и продуманно! Получилось ли у Вас реализовать
2. Базовую станцию, для возвращения на подзарядку.3. Ик-барьер.
avatar

Hummerr

  • 12 июня 2015, 11:44
+
0
Спасибо!
Чертежей нет, так как все подгонялось под купленные детали, а чтобы сейчас сделать чертежи это надо полностью разбирать робота.
От базовой станции я отказался, она очень сложная в реализации. Ик барьер пока в планах.
Сделал андроид приложение и три режима уборки: 1. По квадратной спирали. 2. Хаотично. 3. Ручной режим управления со смартфона.
Колеса покупал в магазине Робокрафт.
Датчики, ардуину, драйвер моторов, блютус модуль, аккумуляторы и прочую мелочевку на Али.
С энкодерами пока туговато, ардуина не справляется, или я такой программист :-)
avatar

nitrior

  • 12 июня 2015, 12:10
+
0
Спасибо за быстрый ответ на комментарий. Я тоже сделал робота — пылесоса на защиту диплома. 16 июня защита. Но, что то не продумал в нём много. программу никак не могу настроить. Если Вам не сложно, вы можете скинуть программы хаотичного перемещения и перемещения по квадратной спирали. — почта fullversoft@yandex.ru После защиты планирую делать робота — пылесоса по Вашему примеру. Очень понравилась Ваша конструкция. Спасибо!
avatar

Hummerr

  • 12 июня 2015, 13:07
+
0
Собирался написать пост, но если у Вас горит диплом, то здесь: https://docs.google.com/file/d/0B9iK8nv3lQ08a0RocFgxQURLUDQ/edit?usp=docslist_api лежит архив, в нем программа на андроид, исходники для AppInventor и код для ардуино.
avatar

nitrior

  • 12 июня 2015, 20:04
+
0
Большое СПАСИБО!
avatar

Hummerr

  • 12 июня 2015, 22:18
+
0
Заметил ошибку в схеме питания робота. Сейчас нет доступа к компьютеру, а с планшета не получается отредактировать.
Правильная схема: vk.com/photo309307515_372042660
avatar

nitrior

  • 3 августа 2015, 10:07
+
0
Нужна версия 3.0 :)

Раньше думал — ну как эта игрушка со своими 20Вт может сравниться с большим пылесосом 600Вт?

Как оказалось — секрет во вращающейся щётке, наподобие как у подметающего автомобиля.

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

Можно сделать из кухонного ёршика. Лучше сразу делать съёмной — наматываются волосы.
avatar

hax

  • 26 сентября 2015, 21:35

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