Самодельный робот-пылесос 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);
}
//--------------------------------

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


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

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

    • Это временно, будет несколько алгоритмов уборки 🙂

  2. Молодец! Отличная обнова! Было бы хорошо, если бы сделали полную спецификацию по роботу, с ссылками на комплектующие. И чертежи. Хочу повторить Вашу конструкцию. Сделано ООчень круто и продуманно! Получилось ли у Вас реализовать

    2. Базовую станцию, для возвращения на подзарядку.3. Ик-барьер.

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

  3. Спасибо за быстрый ответ на комментарий. Я тоже сделал робота — пылесоса на защиту диплома. 16 июня защита. Но, что то не продумал в нём много. программу никак не могу настроить. Если Вам не сложно, вы можете скинуть программы хаотичного перемещения и перемещения по квадратной спирали. — почта [email protected] После защиты планирую делать робота — пылесоса по Вашему примеру. Очень понравилась Ваша конструкция. Спасибо!

  4. Нужна версия 3.0 🙂

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

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

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

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

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение