Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Полностью 3D-печатаемый танк: универсальная гусеничная роботная платформа

В этом туториале покажу, как построил крутой радиоуправляемый гусеничный робот / платформу / танк — называйте как хотите. Проектировал с нуля полностью 3D-печатаемым, чтобы любой мог напечатать и собрать свой.

Смотрите видео или читайте текст ниже.

Обзор

Цель — универсальная платформа для разного рельефа и задач. Лучший выбор — гусеницы: распределяют вес на большую площадь, отличное сцепление, меньше застреваем в мягком грунте, грязи, снегу.

Платформа хорошо ездит по грязи (жалею, снега не было — проверю в будущих видео с манипулятором или турелью). С манипулятором сверху — захват/перемещение объектов, камера для визуального контроля. Или турель Nerf + классная LED-подсветка — веселая игрушка.

Подвеска — система Кристи (Christie suspension), применяемая в танках десятилетиями. У каждого опорного ролика своя пружина и амортизатор. Плавный ход по неровностям, преодоление препятствий с сохранением контакта гусениц.

Управление — дешёвым RC-передатчиком. На платформе приёмник → микроконтроллер ATmega2560. Кастомная PCB надевается на плату микроконтроллера для чистой разводки.

Поехали: проектирование, печать, сборка, электроника, прошивка.

Проектирование роботной платформы

Спроектировал в SOLIDWORKS (спонсор видео).

— Спонсорский блок —

«Индустриальные профессиональные инструменты теперь доступны всем мейкерам за $99/год или $9.99/мес. 3DEXPERIENCE SOLIDWORKS for Makers — отлично для обучения, DIY и больше. Включает 3DEXPERIENCE SOLIDWORKS Professional (самый востребованный CAD в пакете), работает локально на ПК. Файлы локально или в облаке на платформе 3DEXPERIENCE. «xDesign» — браузерный CAD, вместе с SOLIDWORKS или отдельно. «xShape» — браузерный свободный CAD для поверхностного моделирования. «Visualize Connected» — фотореалистичные рендеры, анимации, веб-контент. «NC Shop Floor Programmer» — CAM для 3-фрезеровки и ЭРО. Спец. скидка 20% по ссылке: https://www.solidworks.com/makers20. Подробнее: https://discover.solidworks.com/3dexperience-solidworks-makers. Большое спасибо SOLIDWORKS за поддержку образовательного контента!»

— Вернулись к теме —

Как пришёл к дизайну. Входные параметры — RC-амортизаторы, которые были у меня, и их размеры. 8 штук → 4 опорных ролика с каждой стороны. Длина в вытянутом виде 41 мм, ход 11 мм. Хотел больший вертикальный ход роликов — придумал механизм, дающий 16 мм хода.

Можно увеличить ход, сдвинув шарнир амортизатора ближе к опоре рычага ролика, но теряем силу пружины или нужна жёстче пружина. Делал простые симуляции в SOLIDWORKS — реакции пружин при разных схемах — выбрал этот механизм: хороший компактный баланс.

Передний опорной ролик связан с айдлером (натяжным колесом) для динамического натяжения гусеницы. Ролик поднимается → длина гусеницы уменьшается → натяжение ослабевает → айдлер поддавивается вперёд, натягивая гусеницу. Тот же узел даёт статическое натяжение — регулировка болтом и дистанционной гайкой.

Сзади — ведущая звёздочка из трёх частей: втулка вала + левая/правая секции звёздочки на 3 болтах M3. Ключевой размер — шаг (pitch), должен совпадать с шагом гусеницы. Шаг 11 мм, 12 зубьев → делительный диаметр ~42 мм.

Шаг 11 мм задан дизайном звена гусеницы. Цель — максимально компактное звено, соединяемое со следующим одним штифтом, достаточно прочное для 3D-печати. Без саппортов при печати — удалось.

Штифты связи — 2 мм. Одна сторона отверстия 2 мм (натяжка), другая 2.3 мм (зазор для свободного вращения). Зубья звёздочки вступают в отверстие звена, где штифты сформированы с диаметром 8.8 мм, звёздочка 9.1 мм (зазор).

Когда все части определены, нарисовал эскиз в сборке — замкнутый контур вокруг звёздочки, айдлера, опорных роликов. Использовал фичу SOLIDWORKS Chain Component Pattern — сгенерировал все звенья гусеницы по контуру.

Остальное — база, борта с LED, верхние крышки — в современном крутом стиле. Габариты ~400×300 мм > большинство принтеров → все детали разделены на две секции, соединяются кронштейнами и болтами M3. Для принтеров 220 мм — версия на 4 секции.

Сборка: болты/гайки M3, M4, резьбовые вставки, подшипники. Полный список ниже в разделе сборки.

3D-модель и STL

3D-модель RC-танка/платформы и STL для печати — на Cults3D.

3D-печать

Для точных размеров используйте Horizontal Expansion и Hole Horizontal Expansion в слайсере. По умолчанию габариты и отверстия меньше модели.

Horizontal Expansion = 0.02 мм, Hole Horizontal Expansion = 0.04 мм. Подбирайте тестами под свой принтер. Точные размеры критичны для сборки с подшипниками и болтами.

Звенья гусеницы печатал с рафтом — малое пятно контакта со столом, особенно большие партии — безопаснее с рафтом.

Сборка 3D-печатаемого танка — гусеничной роботной платформы

Все детали напечатаны. Честно: печати много. База в две секции — по ~22 ч каждая. 156 звеньев гусеницы — ~96 ч. Итого ~200 ч печати. У меня два принтера — ~100 ч.

Список комплектующих (механика)

Партнёрские ссылки.

Начинаю с базы: две секции, соединяются кронштейнами и болтами M3. Боковые кронштейны — резьбовые вставки M3×5 в стенку базы (снаружи чисто — гусеницы рядом). Кронштейны амортизаторов — болты M3.

Подшипники опор рычагов роликов: 13/4 мм, по 2 на ролик. Ось — болт M4×30. Шайба между подшипником и рычагом, самоконтрящаяся гайка изнутри. Не перетягивать — свободное вращение без люфта.

Амортизатор — в комплекте болт M1.4 (пришлось зажимать плоскогубцами). Механизм работает идеально.

Опорной ролик: две секции (чтобы без саппортов). Соединяю 2-мм стальными стержнями (те же, что для звеньев гусеницы) — латунный сварочный пруток, мягкий, режется кусачками. 3 стержня ~23 мм на колесо + 2 подшипника 13/4 мм по бокам. Болт M4, шайба, самоконтрящаяся гайка. Колесо вращается свободно, без биения.

Повторяем для остальных роликов. Передний ролик — немного другой рычаг с рычагом натяжения айдлера, монтаж тот же.

Сборка айдлера: 3 детали, болты, дистанционная гайка. Перед фиксацией первой звеньевки — гайка M4 самоконтрящаяся сзади (под айдлер). Штифты — те же 2-мм медные стержни. На втором звене — дистанционная гайка M3×15 на болте M3. Другая сторона — болт M3×20 и гайка в дистанционку. Теперь можно регулировать расстояние айдлер-ролик → статическое и динамическое натяжение. Айдлер на болт M4 — система натяжения и вся подвеска готовы.

Сборка звёздочки: сначала двигатель. База принимает двигатели 37 мм (центральный или смещённый вал). Любой 12V DC 20–1000 RPM (по задаче). 6 болтов M3. Втулка вала: вставки, вставляем, прижимной винт M3. Две секции звёздочки — 3 болта M3. Приводная часть готова.

Сборка гусеницы — увлекательно. Звенья чистые, без саппортов, готовые. Нужны 2-мм штифты (латунный пруток). Наружные отверстия — натяжка (усилием вставляем, не выпадают). Внутренние — зазор (свободное вращение). Чашок чая/кофе и пару часов сборки. Весело, когда визуально выстраивается гусеница. 78 звеньев на борту. Стержень ~3.5 м на гусеницу (штифт ~43 мм). Надеваем на звёздочку, ролики, айдлер, замыкаем штифтом. Натяжение при 78 звеньях нормальное, последний ролик чуть поднимается — пружина слабая. Подкрутил гайку на амортизаторе — не помогло. Заменил оригинальную пружину на жёстче. Раскручиваем один конец амортизатора, ставим жёсткую пружину, закручиваем. Пружина чуть шире — шайба M4 снизу. Теперь держит ролик на месте. Заменил пружины на всех амортизаторах — исходные не вытянули бы вес платформы. Приводная система готова, выглядит отлично.

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

Подключил мотор к питанию — работает идеально. Классное чувство — твоё творение с сотнями 3D-деталей в движении.

Повторяем для второй стороны. Платформа ~80% готова. Боковые панели (в основном эстетика) — кронштейны и болты M3. Верхние крышки закрывают платформу. Для видео так, но в будущем — манипулятор или турель сверху → переделаю верхушки.

Электроника — схема роботной платформы

ATmega2560.

Партнёрские ссылки.

Два DRV8871 (PWM, до 3.6 А пик) для двух моторов. Моторы 12V, питание 3S LiPo (~12V). Добавлен стабилизатор LM350 5V для будущих нужд (сервоприводы) — здесь питание RC-приёмника и LED.

LED: обычные 5 мм белые/красные. Сзади — по 2 красных (габариты), спереди — по 3 белых (фары). На верхней крышке — 6 белых (дальний свет). Схема с резисторами для ограничения тока, комбинация параллельно/последовательно. Фары: 2 параллельные линии 12V, по 3 LED последовательно на сторону. Расчёт резистора → 150 Ом. Включение — через NPN-транзисторы 200 мА. Делитель напряжения для мониторинга заряда LiPo: 12V → <5V на АЦП микроконтроллера. В прошивке пересчёт в реальные вольты и отправка на пульт (на дисплей).

Кастомная PCB

Много связей → кастомная PCB под ATmega2560 (надевается сверху). Добавлен 3.3V стабилизатор и разъём NRF24L01 (на случай управления по радиомодулю). Шины 12V, 5V, 6V с пинами для серв. 6V может питаться от внешнего buck converter.

Заказ у PCBWay: Gerber, параметры, цена ок. Только цвет — белый. Gerber в сообществе PCBWay (там же заказ). Скачать Gerber: [ссылка].

PCB пришла — качество отлично, всё как в проекте. Сборка простая — всё подписано. Сначала pin headers снизу (под ATmega2560), потом верх. Удобно: мелкие компоненты (резисторы, транзисторы) → крупные (LED, клеммы питания). Pin headers везде — гибкость правок. Не паял разъёмы внешнего buck converter и 3.3V стабилизатор — не использовал. Очень чисто и аккуратно в белом цвете.

Финальная сборка 3D-печатаемого танка

Микроконтроллер на место (болты M3), сверху кастомная PCB. Установка LED: в боковые панели — держатели под 5 мм LED. Паяем каждую линию последовательно (по схеме). Катод — чёрный провод, анод — красный. Провода через отверстия в панелях к PCB. Держатель — натяжка в панели, чистый вид. Дальний свет — прямо на передней верхней крышке. Соединители XH2.54 на PCB → нужны соответствующие dupont female на проводах. Кремп-плазами не было — обычными плоскогубцами, вышло нормально. Каждая линия в свой разъём (подписаны на PCB). Моторы: подходящих разъёмов не было — паял прямо к моторам. Мотор → DRV8871 → PCB. Радио: FlySky (доступные, отличные). Приёмник → микроконтроллер: перемычки, 3 провода (VCC, GND, Signal) — I-BUS по Serial. Обратная связь (напряжение батареи) — Sensor I-BUS приёмника на другой Serial. LiPo: разъём под батарею → 12V разъём, рядом ON/OFF разъём для выключателя. Важно: перед включением снять приёмник с питания и подстроечником LM350 выставить 5V. Верхняя задняя крышка на место — проект готов.

Программирование роботной платформы

Arduino код для 3D-печатаемого танка / платформы:

/* 3D Printed Tracked Robot Platform - Arduino Code by Dejan, www.HowToMechatronics.com
   Libraries: IBusBM: https://github.com/bmellink/IBusBM */
#include 
#define motorLeft_IN1 4
#define motorLeft_IN2 5
#define motorRight_IN1 6
#define motorRight_IN2 7
IBusBM IBus;
IBusBM IBusSensor;
int ch0, ch1, ch6, ch8 = 0;
int motorSpeed, steeringValue, leftMotorSpeed, rightMotorSpeed = 0;
int ledBlinkPeriod = 50;
int isOn = LOW;
unsigned long time_now = 0;

void setup() {
  Serial.begin(115200);
  IBus.begin(Serial1, IBUSBM_NOTIMER); // Servo iBUS
  IBusSensor.begin(Serial2, IBUSBM_NOTIMER); // Sensor iBUS
  IBusSensor.addSensor(IBUSS_INTV); // voltage sensor
  // DC motors stop
  digitalWrite(motorLeft_IN1, LOW); digitalWrite(motorLeft_IN2, LOW);
  digitalWrite(motorRight_IN1, LOW); digitalWrite(motorRight_IN2, LOW);
  digitalWrite(46, LOW); digitalWrite(47, LOW); digitalWrite(48, LOW);
}

void loop() {
  IBus.loop();
  ch0 = IBus.readChannel(0); // left/right
  ch1 = IBus.readChannel(1); // forward/backward
  ch6 = IBus.readChannel(6); // headlights
  ch8 = IBus.readChannel(8); // high beam

  steeringValue = map(ch0, 1000, 2000, -185, 185);
  motorSpeed = map(ch1, 1000, 2000, -185, 185);
  motorSpeed = abs(motorSpeed);
  leftMotorSpeed = 70 + motorSpeed + steeringValue; // 70-255
  rightMotorSpeed = 70 + motorSpeed - steeringValue;
  leftMotorSpeed = constrain(leftMotorSpeed, 0, 255);
  rightMotorSpeed = constrain(rightMotorSpeed, 0, 255);
  if (leftMotorSpeed < 72) leftMotorSpeed = 0;
  if (rightMotorSpeed < 72) rightMotorSpeed = 0;

  if (ch1 > 1510 && ch1 < 2000) { // forward
    analogWrite(motorLeft_IN1, leftMotorSpeed); digitalWrite(motorLeft_IN2, LOW);
    analogWrite(motorRight_IN1, rightMotorSpeed); digitalWrite(motorRight_IN2, LOW);
  }
  if (ch1 > 1000 && ch1 < 1420) { // backward
    digitalWrite(motorLeft_IN1, LOW); analogWrite(motorLeft_IN2, leftMotorSpeed);
    digitalWrite(motorRight_IN1, LOW); analogWrite(motorRight_IN2, rightMotorSpeed);
  }
  if (ch1 > 1420 && ch1 < 1520) { // dead zone
    if (leftMotorSpeed < 75 && rightMotorSpeed < 75) {
      digitalWrite(motorLeft_IN1, LOW); digitalWrite(motorLeft_IN2, LOW);
      digitalWrite(motorRight_IN1, LOW); digitalWrite(motorRight_IN2, LOW);
    } else { // turn in place
      analogWrite(motorLeft_IN1, leftMotorSpeed); digitalWrite(motorLeft_IN2, LOW);
      analogWrite(motorRight_IN1, rightMotorSpeed); digitalWrite(motorRight_IN2, LOW);
    }
  }

  // LED control
  if (ch6 > 1500) { digitalWrite(47, HIGH); digitalWrite(48, HIGH); }
  else { digitalWrite(47, LOW); digitalWrite(48, LOW); }
  if (ch8 == 1500) { digitalWrite(46, HIGH); }
  else if (ch8 == 2000) { // flash high beam
    if (millis() >= time_now + ledBlinkPeriod) {
      time_now += ledBlinkPeriod;
      isOn = (isOn == HIGH) ? LOW : HIGH;
      digitalWrite(46, isOn);
    }
  } else { digitalWrite(46, LOW); }

  // Battery voltage monitor
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.00 / 1023.00) * 3.02; // 5V ADC → 12V real
  IBusSensor.loop();
  IBusSensor.setSensorMeasurement(1, voltage * 100); // to transmitter display
}

Разбор кода

IBusBM читает данные от пульта.

IBus.loop();
ch0 = IBus.readChannel(0); // left/right
ch1 = IBus.readChannel(1); // forward/backward
ch6 = IBus.readChannel(6); // headlights
ch8 = IBus.readChannel(8); // high beam

Правый джойстик (ch0, ch1) — движение. Рокеры ch6, ch8 — свет.

Преобразование в PWM 0–255:

steeringValue = map(ch0, 1000, 2000, -185, 185);
motorSpeed = map(ch1, 1000, 2000, -185, 185);
motorSpeed = abs(motorSpeed);
leftMotorSpeed = 70 + motorSpeed + steeringValue;
rightMotorSpeed = 70 + motorSpeed - steeringValue;
leftMotorSpeed = constrain(leftMotorSpeed, 0, 255);
rightMotorSpeed = constrain(rightMotorSpeed, 0, 255);

analogWrite() на драйверы. Логика вперёд/назад/поворот — в коде выше. Код не сложен — платформа простая.

Тестирование 3D-печатаемого робота — гусеничной платформы

После прошивки включаем. На дисплее пульта — напряжение LiPo, приёмника, передатчика.

Правый джойстик — движение. Левый рокер — фары/габариты. Правый 3-положенческий — дальний свет: постоянно или стробоскоп.

Двигатели оказались слабыми для этой платформы. Джойстик почти вверх — гусеницы начинают крутиться. Рукой легко останавливаю гусеницу. Подвеска и гусеницы создают большое сопротивление. Моторы 888 RPM — нормальная скорость, но малые, <500 мА. Поставил крупнее — почти тот же результат: они 1280 RPM, меньше редукция, итог аналогичен.

Не так уж плохо — платформа ездит хорошо. Весело кататься, особенно с мигающими LED, делать «бурноуты» и «донаты».

Но веселье закончилось быстро: на улице перестало работать. Проблема — слабые моторы + дизайн звеньев гусеницы: грязь забивается туда, где вступают зубья звёздочки.

Переделал звенья: отверстие с обратной стороны — грязь проходит сквозь. Звёздочку чуть уменьшил (сместил на 0.2 мм) — зазор увеличил. Пересобрал — ездит по улице. Но слабые моторы снова проблема: застревает, не едет в гору. Совет: моторы не выше 500 RPM, и посильнее — ≥1–2 А номинальный ток.

Пробовал с сильными моторами 20 RPM — очень медленно для фана, но как настоящий танк: лезет везде. 20 RPM достаточно для любых препятствий. Медленно, но для специфических задач ок. Мой совет: если нужны низкие скорости — ~50 RPM; для скорости — ~500 RPM.

Надеюсь, понравилось и научило новому. Вопросы в комментариях, подписывайтесь на обновления, смотрите коллекцию Arduino-проектов.

Производственный процесс

  1. Концентрированный суп: от инновации Дорранса 1899 года к мировым рынкам
  2. Отладка двухъядерной системы Arduino Portenta H7 с Segger J-Link
  3. Задувка доменной печи: ключевые этапы и технические аспекты
  4. Разновидности ключей: типы, назначение и ключевые особенности
  5. Экспертные услуги по ремонту огнеупоров коксовых печей для оптимальной производительности
  6. Термическое напыление: виды, процессы и применение в промышленности
  7. 6 проверенных методов бесшовного импорта чертежей CAD
  8. AM-передатчик на Arduino Nano: передача звука по радиочастоте
  9. Метеостанция на Arduino и ThingSpeak: температура и влажность в облаке
  10. Создание ультразвукового левитатора на Arduino: пошаговое руководство