В этой статье мы рассмотрим создание суперкрутой радиоуправляемой гусеничной машины/роботизированной платформы, или, можно сказать, танка на основе платы Arduino. Я спроектировал эту штуку с нуля, чтобы ее можно было полностью распечатать на 3D-принтере, так что вы можете легко распечатать все ее компоненты и построить ее самостоятельно.
Обзор проекта
Моей целью в этом проекте было создание универсальной платформы, которая может пересекать многие типы местности и может использоваться для различных целей. Лучшим вариантом для этого было использование системы непрерывных гусениц. Гусеницы распределяют вес транспортного средства на большую площадь поверхности, что обеспечивает отличное сцепление и снижает вероятность застревания в мягкой земле, грязи или снегу.
Платформа робота достаточно хорошо ездит по грязи, и жаль, что у меня не было возможности протестировать ее на снегу. Надеюсь, я сделаю это в некоторых из моих будущих видео, где я планирую установить на нее роботизированную руку или башню. С помощью роботизированной руки на платформе мы можем выполнять различные задачи, например, хватать и перемещать что-либо, или мы можем прикрепить к ней камеру и использовать ее для визуального осмотра и так далее. Подобный проект роботизированной руки, только на колесной платформе, мы уже рассматривали на нашем сайте.
Или, например, мы можем сделать башню, которая может стрелять дротиками NERF, и в сочетании с простым, но классным светодиодным освещением, которое я уже установил на этой платформе, мы можем получить массу удовольствия, играя с ней.
Что касается подвески, я использовал систему подвески Christie, которая используется в танках уже много лет. При такой установке каждое опорное колесо имеет индивидуальную подвеску или пружину и амортизатор.
Это позволяет транспортному средству плавно передвигаться по неровной местности и преодолевать препятствия, сохраняя при этом хорошую поверхность контакта между гусеницами и грунтом.
Для управления танком, напечатанным на 3D-принтере, я использую дешевый коммерческий радиоуправляемый передатчик, который посылает команды на платформу.
На платформе у меня есть подходящий RC-приемник, который получает команды и отправляет их на микроконтроллер. Мозгом этой платформы является плата на базе микроконтроллера Atmega2560, и для простого соединения всего вместе я сделал специальную печатную плату, которую можно просто прикрепить сверху платы.
Тем не менее, пристегните ремни, поскольку я проведу вас через весь процесс создания этой роботизированной платформы, начиная с проектирования, 3D-печати, сборки, подключения электронных компонентов и программирования микроконтроллера.
Проектирование платформы робота
Я спроектировал эту роботизированную платформу с помощью SOLIDWORKS.
Позвольте мне объяснить, как я придумал дизайн платформы робота. Первыми входными параметрами для дизайна были эти RC-амортизаторы, которые у меня были, и их размеры.
У меня их было 8, что означало, что с каждой стороны будет по 4 опорных катка, и они были 41 мм в длину в выдвинутом состоянии с ходом 11 мм. Согласно этим размерам, я хотел получить немного большее расстояние вертикального хода для опорных катков, поэтому я придумал этот механизм, который дал мне вертикальный ход для опорных катков в 16 мм.
Я имею в виду, что я могу получить еще большее расстояние хода, если перемещу соединение амортизатора и тяги опорного катка ближе к точке поворота тяги опорного катка, но тогда я потеряю силу пружины, или мне понадобится более сильная пружина, чтобы должным образом удерживать платформу.
Я провел несколько простых симуляций в SOLIDWORKS, чтобы проверить силы реакции пружин с различными механизмами, и поэтому выбрал этот механизм, который также обеспечивает хорошую общую компактность.
Если мы внимательно посмотрим на переднее опорное колесо, то увидим, как оно связано с направляющим колесом, которое обеспечивает динамическое натяжение гусеницы. Когда опорное колесо поднимается, окружности гусеницы уменьшаются, и натяжение ослабевает.
С этим соединением здесь, когда это происходит, направляющее колесо выдвигается вперед, чтобы натянуть гусеницу. С этим соединением мы также можем натянуть гусеницу статически, регулируя этот болт и дистанционную гайку.
Сзади у нас есть звездочка, которая состоит из трех частей. Она имеет соединительную муфту вала и левую и правую часть звездочки, соединенные вместе тремя болтами М3.
Ключевым размером здесь на звездочке является шаг, поскольку он должен соответствовать шагу гусеницы. Шаг здесь составляет 11 мм, и я выбрал звездочку с 12 зубьями, что дало мне диаметр шага звездочки около 42 мм.
Шаг в 11 мм был фактически определен конструкцией звена трака. Моей целью для звена трака было сделать его максимально компактным и соединять со следующим звеном всего одной дополнительной деталью или штифтом, при этом достаточно прочным, чтобы его можно было изготовить на 3D-принтере.
Кроме того, при 3D-печати я хотел избежать использования какого-либо вспомогательного материала для детали, чего мне и удалось добиться в данной конструкции.
Для соединения звеньев гусеницы между собой я планировал использовать штифты диаметром 2 мм, поэтому одну сторону я сделал толщиной 2 мм, чтобы обеспечить плотную посадку, а другую — 2,3 мм, чтобы обеспечить свободную посадку и чтобы звенья гусеницы могли свободно вращаться.
Зубья звездочки входят в это отверстие, где штифты звена гусеницы выполнены диаметром 8,8 мм, тогда как диаметр звездочки составляет 9,1 мм, чтобы обеспечить свободную посадку для правильной работы.
После того, как все эти детали были определены, я нарисовал эскиз в среде сборки — замкнутый контур вокруг звездочки, натяжного колеса и опорных катков.
Затем я использовал этот эскиз с функцией SOLIDWORKS Chain Component Pattern для создания всех звеньев пути вдоль этого контура.
Я спроектировал остальную часть платформы робота, основание, где все соединено, стороны, которые вмещают несколько светодиодов, и верхние крышки, в том, что я считал современным и круто выглядящим стилем. Поскольку общие размеры платформы больше, чем у большинства 3D-принтеров, около 400 мм на 300 мм, я разделил все части на две секции, чтобы мы могли напечатать их практически на любом 3D-принтере. Они соединены вместе с помощью нескольких кронштейнов и болтов M3.
Для сборки всей платформы робота нам понадобятся различные болты и гайки М3 и М4, а также некоторые резьбовые вставки и подшипники. Полный список всех компонентов, необходимых для этого проекта, вы можете найти ниже в разделе сборки.
Файлы для загрузки 3D-моделей и STL
Вы можете получить 3D-модель этой радиоуправляемой платформы танка/робота, а также файлы STL для 3D-печати на сайте Cults3D.
3D-печать танка
При 3D-печати, чтобы получить точные по размерам 3D-печатные детали, мы должны использовать настройки Горизонтальное расширение (Horizontal Expansion) и Горизонтальное расширение отверстий (Hole Horizontal Expansion) в нашем программном обеспечении для нарезки. Если мы оставим эти настройки по умолчанию, внешние размеры отпечатков, а также отверстия, как правило, будут меньше, чем у исходной модели.
Я установил Горизонтальное расширение на 0,02 мм, а Горизонтальное расширение отверстия на 0,04 мм. Конечно, вам следует сделать несколько тестовых распечаток, чтобы увидеть, какие значения дадут вам наилучшие результаты на вашем 3D-принтере. Нам нужны точные размеры деталей, чтобы легко собрать их друг с другом и с другими компонентами, такими как подшипники и болты.
При 3D-печати звеньев траков я использовал плот (raft) в качестве адгезии к рабочей пластине, поскольку их контактная поверхность с рабочей пластиной немного мала и может плохо прилипнуть, если адгезия к рабочей пластине на вашем принтере не очень хорошая. Особенно при печати больших партий безопаснее использовать плот.
Сборка гусеничной роботизированной платформы (танка)
Хорошо, вот у меня есть все 3D-печатные детали для платформы робота. Честно говоря, на печать всех деталей ушло достаточно много времени.
Например, на печать каждой из базовых секций ушло около 22 часов, а на печать всех 156 траков ушло около 96 часов. Примерно 200 часов нам нужно, чтобы напечатать все. К счастью, у меня было два 3D-принтера, так что мне потребовалось около 100 часов.
Список деталей
Вот список компонентов, необходимых для сборки этого проекта танка, напечатанного на 3D-принтере – платформы робота. Список электронных компонентов можно найти ниже в разделе схемы.
- 8x RC Амортизаторы
- 8x Пружины
- 40x Шариковые подшипники 624 – 4x13x5 мм
- Резьбовые вставки M3
- Болты и гайки M3 и M4
Болты:
M4x40 мм – 8 шт; M4x35 мм – 2 шт; M4x30 мм – 8 шт; M4x25 мм – 2 шт; M3x25 мм – 16 шт; M3x20 мм – 8 шт; M3x16 мм – 10 шт; M3x12/14 мм – 32 шт; M3x10 мм – 8 шт; M3x8 мм – 14 шт
Гайки:
M4 – 25 шт; M3 – 30 шт
Шайбы:
M4 – 30 шт
Я начал со сборки основания. Как я уже сказал, оно состоит из двух секций, которые будут соединяться друг с другом с помощью кронштейнов и болтов М3 и гаек.
Для крепления боковых кронштейнов я использую резьбовые вставки M3 длиной 5 мм, которые входят в боковую стенку основания. Таким образом, внешняя сторона стены будет чистой без болтов и гаек, чтобы рельсы могли проходить рядом.
Затем я закрепил кронштейны для крепления амортизаторов на месте с помощью нескольких болтов М3.
Далее я устанавливаю подшипники там, где будет вращаться рычаг колес. Подшипники имеют наружный диаметр 13 мм и внутренний 4 мм, и нам нужно по два на каждое колесо.
В качестве штифта я использую болт М4 длиной 30 мм. Нам нужно поместить шайбу между подшипником и рычагом и закрепить их на месте изнутри самостопорящейся гайкой. Мы должны быть осторожны, насколько сильно мы затягиваем это соединение, не слишком туго, но и не слишком слабо.
Далее мы можем установить амортизатор. Закрепляем его на месте с помощью болта М1.4, который идет в комплекте.
У меня не было этой маленькой отвертки, поэтому я использовал плоскогубцы для закручивания болта. Пока что, похоже, механизм работает идеально.
Далее мы можем установить колесо на нижнем конце рычага. Колесо сделано из двух секций, чтобы избежать печати с поддерживающим материалом. Возможно, его можно было бы напечатать как одну деталь, но я не пробовал, что из этого получится.
Таким образом, нам нужно соединить две секции, и я решил использовать для этой цели 2-миллиметровые стальные стержни, те же самые, которые я буду использовать для соединения звеньев трака. На самом деле это латунный стержень, используемый для сварки, который довольно мягкий и его можно легко разрезать по размеру с помощью просто плоскогубцев.
Я вставил три стержня длиной около 23 мм для каждого колеса, а затем также установил два таких же подшипника, которые я использовал ранее, с обеих сторон колеса. Опять же, как и ранее, с помощью болта М4, шайбы и самоконтрящейся гайки я закрепил колесо на месте.
Колесо должно свободно вращаться, не имея люфта на валу.
Теперь нам просто нужно повторить этот процесс для других колес. Что касается переднего колеса, у нас немного другой рычаг, который имеет рычаг, который будет обеспечивать динамическое натяжение гусеницы, но установка та же самая.
Далее мы можем собрать механизм для холостого колеса. Он состоит из трех 3D-печатных деталей, нескольких болтов и дистанционной гайки.
Прежде чем закрепить первое звено, нам следует добавить самоконтрящуюся гайку М4 с задней стороны, на которую мы позже прикрепим натяжное колесо.
Я использую те же 2-миллиметровые медные стержни в качестве штифтов для этих соединений. Теперь на втором звене со стороны натяжного колеса мы можем закрепить одну 15-миллиметровую гайку M3 с помощью болта M3.
С другой стороны мы устанавливаем болт M3 длиной 20 мм и гайку, которая войдет в гайку расстояния. С этой настройкой теперь мы можем регулировать расстояние между направляющим колесом и рычагом ходового колеса, и таким образом мы можем натягивать гусеницу как статически, так и динамически. Затем мы можем просто закрепить направляющее колесо на месте болтом M4, и таким образом у нас есть эта система натяжения, а также вся система подвески.
Хорошо, теперь мы можем собрать звездочку, а для этого сначала нужно установить двигатель. Я спроектировал базовую платформу для двигателей диаметром 37 мм с центральной или смещенной осью.
Мы можем установить любой двигатель постоянного тока 12 В с частотой вращения от 20 до 1000 об/мин, в зависимости от применения платформы робота, конечно, но об этом мы поговорим немного позже в видео. Двигатель закреплен на месте шестью болтами М3.
Чтобы прикрепить звездочку к валу двигателя, сначала необходимо подготовить соединительную муфту вала или установить в нее резьбовые вставки.
Затем мы можем вставить муфту на место и закрепить ее с помощью установочного винта M3.
Затем две секции звездочки вставляются и закрепляются тремя болтами М3.
Итак, вот мы закончили привод платформы, и теперь пришло время немного повеселиться, собирая трек. Это правда, мне было довольно весело собирать трек.
Вот более подробный взгляд на звенья гусеницы, из которого видно, насколько они просты и понятны.
Они готовы к использованию сразу после 3D-принтера, поскольку мы не используем никаких опор при их 3D-печати. Нам нужны только 2-миллиметровые штифты для их соединения. Как я уже сказал, мы можем легко получить их из 2-миллиметровых латунных сварочных прутков.
Внешние отверстия на звеньях плотно прилегают, поэтому нам нужно приложить некоторое усилие, чтобы вставить их, но это гарантирует, что они не выпадут. Внутренние отверстия на звеньях имеют свободную посадку, что обеспечивает свободное вращение между звеньями гусеницы.
Теперь нам просто нужно сделать чашку чая или кофе и наслаждаться сборкой в течение пары часов. Вы понимаете, насколько это весело, когда соединяете несколько из них и видите, какой классный трек получается. Для сборки одного трека нам нужно в общей сложности 78 звеньев трака. Что касается длины стержня, нам нужно около 3,5 м для каждого трека, так как каждый штифт должен быть около 43 мм длиной.
Как только гусеница будет готова, мы можем просто обернуть ее вокруг звездочки, опорных катков и направляющего колеса и закрыть петлю еще одним 2-миллиметровым штифтом на месте. Здесь мы можем отметить, что при 78 звеньях гусеницы натяжение гусеницы как раз подходящее, хотя последнее опорное колесо немного поднимается.
На самом деле это так, потому что пружина недостаточно сильная. Мы можем немного отрегулировать натяжение пружины, отрегулировав эту гайку на амортизаторе, хотя этого снова оказалось недостаточно. Поэтому я решил заменить оригинальную пружину, которая шла с амортизатором, на более мощную.
Замена пружины достаточно проста, так как нам нужно просто открутить один конец амортизатора, вставить более мощную пружину и снова закрутить шток. Пружина, которая у меня была, была немного шире оригинальной, поэтому мне пришлось использовать шайбу M4 на нижней стороне. Теперь эта пружина имела достаточно силы, чтобы удерживать опорное колесо на месте при установке гусениц с 78 звеньями.
В итоге я поменял пружины на всех амортизаторах, потому что понял, что они не будут достаточно прочными, чтобы выдержать вес всей платформы. Это завершает всю систему привода платформы, которая, как мне кажется, получилась довольно хорошей.
При необходимости теперь мы можем отрегулировать натяжение гусеницы с помощью гайки расстояния на натяжном колесе. Конечно, это нормально, если гусеница немного ослаблена, чтобы она работала правильно. Ослабленная верхняя часть гусениц поддерживается кронштейнами амортизатора.
Я подключил мотор к источнику питания, чтобы проверить, как он будет работать. Мне он показался идеальным. Это действительно замечательное чувство — видеть в действии то, что ты создал из такого количества деталей, напечатанных на 3D-принтере.
Очевидно, нам придется повторить ту же процедуру, чтобы собрать другую сторону. После этого платформа робота будет готова на 80%. Далее я собираюсь установить боковые панели, которые в основном здесь для визуального оформления.
Мы закрепляем их на месте с помощью нескольких кронштейнов и болтов M3. Сверху переходим к крышкам, которые будут закрывать платформу. Для этого видео я спроектировал это таким образом только для визуального вида.
Как я уже упоминал ранее, в некоторых из моих будущих видео я планирую добавить роботизированную руку или башню на вершину этой платформы, а это значит, что мне придется соответствующим образом спроектировать верхние части.
Схема проекта
Теперь мы можем перейти к электронике этого проекта. Как я уже сказал, я буду использовать плату на базе микроконтроллера ATmega2560.
Для управления двумя двигателями я буду использовать два драйвера двигателей постоянного тока DRV8871, которые поддерживают управление ШИМ и пиковый ток до 3,6 А. Рабочее напряжение двигателей постоянного тока составляет 12 В, и мы будем питать все от батареи 3S LiPo, которая дает около 12 В. Я также включил регулятор напряжения 5 В, LM350 IC, чтобы иметь выделенный источник питания 5 В для других будущих применений, например, для подключения к нему серводвигателей. В этом проекте мы будем использовать эти 5 В для питания RC-приемника и некоторых светодиодов.
Светодиоды, которые я использую для этого проекта, — простые 5-миллиметровые светодиоды белого и красного цвета. Я расположил их следующим образом:
Сзади у нас есть два красных светодиода с каждой стороны в качестве задних фонарей, а спереди три белых светодиода с каждой стороны в качестве фар. Кроме того, на верхней крышке есть шесть светодиодов в качестве дальнего света. Для того, чтобы эти светодиоды загорались должным образом, нам нужна подходящая схема, которая включает резисторы для ограничения тока. Я объединил их соединения как параллельно, так и последовательно.
Например, для передних фар я использую две параллельные линии с 12 В для питания 6 светодиодов, по 3 с каждой стороны слева и справа, которые соединены последовательно. В соответствии с прямым напряжением и током светодиодов я рассчитал необходимое значение резистора для каждой линии, и в данном случае оно составило 150 Ом. Для активации светодиодов я использую несколько универсальных NPN-транзисторов, рассчитанных на 200 мА.
Наконец, я сделал простой делитель напряжения, который буду использовать для контроля напряжения батареи. Проще говоря, 12 В от батареи понижаются до 5 В, чтобы они могли поступить на аналоговый вход в микроконтроллере. В программе мы можем преобразовать значение обратно в реальное значение напряжения и отправить его с RC-приемника на RC-передатчик, где мы можем увидеть значение на дисплее.
Необходимые компоненты
- Плата Arduino Mega 2560 (купить на AliExpress).
- Драйвер двигателя постоянного тока DRV8871.
- Двигатели 2x 12 В постоянного тока – от 50 до 500 об/мин.
- 3S LiPo аккумулятор.
- Разъем XT60.
- Передатчик FLYSKY RC.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Индивидуальный дизайн печатной платы
На самом деле у меня получилось довольно много соединений, поэтому, чтобы избежать беспорядка, мне пришлось разработать специальную печатную плату для этого проекта.
Печатная плата будет совместима с платой на базе микроконтроллера ATmega2560 и может быть непосредственно установлена на нее.
Я включил регулятор напряжения 3,3 В и соединение для приемопередающего модуля NRF24L01 на случай, если мы захотим управлять платформой с помощью этого модуля. Также я включил шину 12 В, а также шины 5 В и 6 В с цифровыми штыревыми соединениями, предназначенными для подключения к ним серводвигателей. Шина 6 В может питаться от внешнего понижающего преобразователя.
Вы можете скачать файл Gerber для изготовления этой печатной платы здесь: 3D-печатная гусеничная роботизированная платформа Gerber.
На следующем рисунке показан внешний вид этой изготовленной печатной платы.
Сборка печатной платы довольно проста, так как все промаркировано. Я начал с пайки штыревых разъемов в нижней части печатной платы для подключения ATmega2560, а затем продолжил с верхней стороны. Для удобства сначала следует припаять более мелкие компоненты, такие как резисторы и транзисторы, а затем более крупные, такие как светодиоды и разъемы питания.
Я использовал штыревые разъемы для всех соединений, потому что это дает гибкость для внесения изменений, если что-то не работает должным образом. Я не припаивал разъемы для внешнего понижающего преобразователя и его рельсов, а также регулятора напряжения 3,3 В, так как я все равно не собирался их сейчас использовать. Мне очень нравится, насколько красивой и чистой получилась эта печатная плата с этим белым цветом.
Завершение сборки 3D-печатного танка
Итак, сначала мы закрепляем плату микроконтроллера на месте с помощью нескольких болтов М3, а затем поверх нее устанавливаем специальную печатную плату.
Теперь пришло время установить светодиоды. Они будут установлены на боковой панели с помощью этих держателей, которые вмещают 5-миллиметровые светодиоды. Как описано в схемах, мы должны спаять каждую линию светодиодов последовательно.
На катоде идет черный провод, а на аноде идет красный провод. Мы пропускаем эти провода через небольшое отверстие в боковых панелях, которые ведут к печатной плате.
Деталь держателя светодиода разработана таким образом, чтобы плотно прилегать к боковой панели, поэтому после установки на место мы получаем красивый и аккуратный вид.
Светодиоды дальнего света расположены непосредственно на верхней передней крышке.
Для подключения светодиодов я припаял к плате разъемы XH2.54mm dupont male, поэтому мне пришлось установить на провода подходящий разъем dupont female. Для этого нам понадобятся обжимные клещи, но на момент создания этого проекта у меня их не было.
Я использовал обычные маленькие плоскогубцы, чтобы сделать эту работу, и соединения вышли просто отлично. Каждая светодиодная линия должна входить в соответствующий разъем, который обозначен на печатной плате.
Что касается моторов, у меня не было подходящих разъемов, поэтому я припаял провода напрямую к ним.
Подключение мотора идет в плату драйвера DRV8871, а затем в печатную плату.
Для радиосвязи я использую передатчик и приемник FLYSKY RC, которые действительно доступны по цене и отлично работают.
Для подключения приемника к микроконтроллеру мы можем использовать соединительные провода. Приемник взаимодействует с микроконтроллером через I-BUS и последовательный порт, поэтому нам нужно всего три провода: VCC, GND и сигнальный контакт.
Если мы хотим отправлять данные обратно с приемника на передатчик, в нашем случае для контроля напряжения батареи, нам также необходимо подключить датчик I-BUS приемника к другому последовательному порту.
Наконец, мы можем подключить LiPo-батарею. В зависимости от батареи нам понадобится подходящий разъем. Он подключается к разъему 12 В, а прямо рядом с ним у нас есть разъем ВКЛ/ВЫКЛ, к которому будет подключен переключатель для включения и выключения питания платформы.
Обратите внимание, что перед включением платы необходимо сначала отключить питание RC-приемника и с помощью подстроечного резистора отрегулировать переменное напряжение микросхемы LM350 до 5 В.
Теперь нам осталось только установить верхнюю заднюю крышку на место, и мы завершим этот проект.
Программирование платформы робота
Теперь нам нужно запрограммировать 3D-печатную платформу танка/робота. Вот код Arduino для этой платформы робота.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
/* 3D Printed Tracked Robot Platform - Arduino Code by Dejan, www.HowToMechatronics.com Libraries: IBusBM: https://github.com/bmellink/IBusBM */ #include <IBusBM.h> #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); // add voltage sensor // DC motors control - set them stationary // Left track digitalWrite(motorLeft_IN1, LOW); // PWM value digitalWrite(motorLeft_IN2, LOW); // Forward // Right track digitalWrite(motorRight_IN1, LOW); // PWM value digitalWrite(motorRight_IN2, LOW); // Forward digitalWrite(46, LOW); digitalWrite(47, LOW); digitalWrite(48, LOW); } void loop() { // Reading the data comming from the RC Transmitter IBus.loop(); // ch0 - left and right; ch1 - forward and backward; ch0 = IBus.readChannel(0); // ch0 - left and right; ch1 = IBus.readChannel(1); // ch1 - forward and backward; ch6 = IBus.readChannel(6); // ch6 - Headlights ch8 = IBus.readChannel(8); // ch8 - High beam // convert the incoming date into suitable PWM value steeringValue = map(ch0, 1000, 2000, -185, 185); // 0 to 185 range because then I add +70 in order to avoid low PWM values as to motors won't start if so motorSpeed = map(ch1, 1000, 2000, -185, 185); motorSpeed = abs(motorSpeed); leftMotorSpeed = 70 + motorSpeed + steeringValue; // 70 + (0-185) + (0 - 185 ) = 70 - 255 so this range from 70 to 255 is used as PWM value rightMotorSpeed = 70 + motorSpeed - steeringValue; leftMotorSpeed = constrain(leftMotorSpeed, 0, 255); // constrain the PWM value from 0 to 255 rightMotorSpeed = constrain(rightMotorSpeed, 0, 255); // if PWM is lower than 72, set PWM value to 0 if (leftMotorSpeed < 72) { leftMotorSpeed = 0; } if (rightMotorSpeed < 72) { rightMotorSpeed = 0; } // if right joystick goes up > move forward if (ch1 > 1510 && ch1 < 2000) { analogWrite(motorLeft_IN1, leftMotorSpeed); // PWM input digitalWrite(motorLeft_IN2, LOW); // Direction - Forward analogWrite(motorRight_IN1, rightMotorSpeed); // PWM input digitalWrite(motorRight_IN2, LOW); // Direction - Forward } // if right joystick goes down > move backward if (ch1 > 1000 && ch1 < 1420) { digitalWrite(motorLeft_IN1, LOW); // Direction - Backward analogWrite(motorLeft_IN2, leftMotorSpeed); // PWM input digitalWrite(motorRight_IN1, LOW); // Direction - Backward analogWrite(motorRight_IN2, rightMotorSpeed); // PWM input } // if right joystick is in the middle, don't move if (ch1 > 1420 && ch1 < 1520) { if (leftMotorSpeed < 75 && rightMotorSpeed < 75) { digitalWrite(motorLeft_IN1, LOW); digitalWrite(motorLeft_IN2, LOW); digitalWrite(motorRight_IN1, LOW); digitalWrite(motorRight_IN2, LOW); } // if right joystick move just left or right, without going up or down, move the tank left or right (only 1 motor move) else { analogWrite(motorLeft_IN1, leftMotorSpeed); // PWM input digitalWrite(motorLeft_IN2, LOW); // Direction - Forward analogWrite(motorRight_IN1, rightMotorSpeed); // PWM input digitalWrite(motorRight_IN2, LOW); // Direction - Forward } } // LEDs control // Headlights and Taillights LEDs control if (ch6 > 1500) { digitalWrite(47, HIGH); digitalWrite(48, HIGH); } else { digitalWrite(47, LOW); digitalWrite(48, LOW); } // High beam LEDs control if (ch8 == 1500) { digitalWrite(46, HIGH); } // If rocker switch in position 3 (2ooo value) - flasing with the high beam LEDs else if (ch8 == 2000) { if (millis() >= time_now + ledBlinkPeriod) { time_now += ledBlinkPeriod; if (isOn == HIGH) { isOn = LOW; } else { isOn = HIGH; } digitalWrite(46, isOn); } } else { digitalWrite(46, LOW); } // Monitor the battery voltage int sensorValue = analogRead(A0); float voltage = sensorValue * (5.00 / 1023.00) * 3.02; // Convert the reading values from 5v to suitable 12V // Send battery voltage value to transmitter IBusSensor.loop(); IBusSensor.setSensorMeasurement(1, voltage * 100); } |
Объяснение работы кода
Итак, используя библиотеку IBusBM мы считываем входящие данные с RC-передатчика.
1 2 3 4 5 6 7 |
// Reading the data comming from the RC Transmitter IBus.loop(); // ch0 - left and right; ch1 - forward and backward; ch0 = IBus.readChannel(0); // ch0 - left and right; ch1 = IBus.readChannel(1); // ch1 - forward and backward; ch6 = IBus.readChannel(6); // ch6 - Headlights ch8 = IBus.readChannel(8); // ch8 - High beam |
Правый джойстик, каналы 0 и 1 используются для управления движением платформы, два тумблера, каналы 6 и 8, — для управления светодиодами.
Мы преобразуем входящие данные в значения, пригодные для ШИМ-управления двигателями постоянного тока, то есть от 0 до 255.
1 2 3 4 5 6 7 8 9 10 |
// convert the incoming date into suitable PWM value steeringValue = map(ch0, 1000, 2000, -185, 185); // 0 to 185 range because then I add +70 in order to avoid low PWM values as to motors won't start if so motorSpeed = map(ch1, 1000, 2000, -185, 185); motorSpeed = abs(motorSpeed); leftMotorSpeed = 70 + motorSpeed + steeringValue; // 70 + (0-185) + (0 - 185 ) = 70 - 255 so this range from 70 to 255 is used as PWM value rightMotorSpeed = 70 + motorSpeed - steeringValue; leftMotorSpeed = constrain(leftMotorSpeed, 0, 255); // constrain the PWM value from 0 to 255 rightMotorSpeed = constrain(rightMotorSpeed, 0, 255); |
Мы отправляем значения ШИМ на драйверы и двигатели, используя функцию analogWrite() соответствующим образом.
1 2 3 4 5 6 7 8 |
// if right joystick goes up > move forward if (ch1 > 1510 && ch1 < 2000) { analogWrite(motorLeft_IN1, leftMotorSpeed); // PWM input digitalWrite(motorLeft_IN2, LOW); // Direction - Forward analogWrite(motorRight_IN1, rightMotorSpeed); // PWM input digitalWrite(motorRight_IN2, LOW); // Direction - Forward } |
В целом код не так уж и сложен, поскольку сама платформа робота не имеет сложных функций.
Тестирование 3D-печатного робота – танка
После загрузки кода мы можем включить платформу робота и передатчик RC для его тестирования. На дисплее передатчика мы можем заметить напряжение батареи LiPo, а также напряжение приемника и передатчика.
И вот что у нас есть. Используя правый джойстик, мы можем управлять движением платформы. С помощью левого кулисного переключателя мы управляем фарами и светодиодами задних фонарей, а с помощью правого 3-позиционного кулисного переключателя — светодиодами дальнего света. Светодиоды дальнего света имеют два режима: постоянно включенный и мигающий.
Здесь можно отметить, что установленные мной двигатели на самом деле немного недостаточно мощные для этой платформы.
Мы видим, что для того, чтобы гусеницы начали двигаться, джойстик должен быть почти наверху. Плюс, я могу очень легко остановить гусеницу рукой. Система подвески и сами гусеницы создают большое напряжение и сопротивление двигателям. Эти двигатели имеют скорость 888 об/мин, что хорошо с точки зрения скорости, но это двигатели меньшего размера, номиналом чуть менее 500 мА.
Итак, я заменил их на другие более крупные двигатели, которые у меня были, но на самом деле я получил почти те же результаты. Хотя это были более мощные двигатели, их снижение скорости было меньше, или у них были более высокие обороты в минуту 1280, и поэтому я получил те же результаты.
На самом деле они не так уж и плохи. Роботизированная платформа с ними работает вполне хорошо.
Честно говоря, ездить на этой штуковине очень весело, особенно когда светодиоды мигают и выгорают или зависают.
Однако веселье длилось недолго, так как как только я вынес его на улицу, он очень быстро перестал работать. Проблема в недостаточно мощных двигателях, это верно, но также и в конструкции звеньев гусениц. Грязь легко забивается в них, где ходят зубья звездочек.
Поэтому я переделал их так, чтобы с другой стороны было отверстие, через которое могла проходить грязь. Я также сделал звездочку немного меньше, сместив ее на 0,2 мм, чтобы она более свободно прилегала к гусенице.
Я собрал все заново с этими обновлениями, и платформа теперь могла ездить на улице. Хотя маломощные двигатели снова стали проблемой. Платформа время от времени заваливалась и не могла ехать в гору. Поэтому я бы посоветовал взять двигатель не более 500 об/мин и помощнее с номинальным током не менее 1 А или 2 А.
Я на самом деле попробовал платформу с более мощными моторами. Они были всего на 20 об/мин, что было явно слишком медленно для веселья и пончиков, но платформа теперь была как настоящий танк. Она могла буквально ехать куда угодно.
Двигатели на 20 об/мин были достаточно мощными, чтобы преодолеть любое препятствие. Они были действительно медленными, но, возможно, они хороши для некоторых конкретных применений. Я бы посоветовал, если нам нужны более низкие скорости, выбирать двигатели с примерно 50 об/мин, а для более высоких скоростей — около 500 об/мин.