Полностью 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 ч.
Список комплектующих (механика)
- 8× RC-амортизаторы — Amazon / AliExpress
- 8× Пружины — Amazon / AliExpress
- 40× Подшипники 624 (4×13×5 мм) — Amazon / AliExpress
- Резьбовые вставки M3 — Amazon / AliExpress
- Болты/гайки M3, M4 — Amazon / AliExpress
Болты: M4×40 (8); M4×35 (2); M4×30 (8); M4×25 (2); M3×25 (16); M3×20 (8); M3×16 (10); M3×12/14 (32); M3×10 (8); M3×8 (14)
Гайки: M4 (25); M3 (30)
Шайбы: M4 (30)
Партнёрские ссылки.
Начинаю с базы: две секции, соединяются кронштейнами и болтами 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.
- 2× 12V DC мотор 50–500 RPM — Amazon / AliExpress
- DRV8871 драйвер DC — Amazon / AliExpress
- Arduino MEGA — Amazon / AliExpress
- 3S LiPo — Amazon / AliExpress
- XT60 разъём — Amazon / AliExpress
- FLYSKY RC передатчик — Amazon / AliExpress
Партнёрские ссылки.
Два 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-проектов.
Производственный процесс
- Концентрированный суп: от инновации Дорранса 1899 года к мировым рынкам
- Отладка двухъядерной системы Arduino Portenta H7 с Segger J-Link
- Задувка доменной печи: ключевые этапы и технические аспекты
- Разновидности ключей: типы, назначение и ключевые особенности
- Экспертные услуги по ремонту огнеупоров коксовых печей для оптимальной производительности
- Термическое напыление: виды, процессы и применение в промышленности
- 6 проверенных методов бесшовного импорта чертежей CAD
- AM-передатчик на Arduino Nano: передача звука по радиочастоте
- Метеостанция на Arduino и ThingSpeak: температура и влажность в облаке
- Создание ультразвукового левитатора на Arduino: пошаговое руководство