Оглавление:

[WIP] Создание робота-рисовальщика, управляемого повязкой Myo: 11 шагов
[WIP] Создание робота-рисовальщика, управляемого повязкой Myo: 11 шагов

Видео: [WIP] Создание робота-рисовальщика, управляемого повязкой Myo: 11 шагов

Видео: [WIP] Создание робота-рисовальщика, управляемого повязкой Myo: 11 шагов
Видео: Лекция Ирины Кулик «Сол Левитт — Абсалон. Часть 1» 2024, Июль
Anonim
[WIP] Создание робота-рисовальщика, управляемого повязкой Myo
[WIP] Создание робота-рисовальщика, управляемого повязкой Myo

Всем здравствуйте!

Несколько месяцев назад мы решили попытаться реализовать идею создания робота с открытой рамой, который использовал бы только ремешок Myo для управления им. Когда мы впервые приступили к работе над проектом, мы знали, что его нужно разбить на несколько этапов. Нашим первым основным этапом была попытка осмыслить дизайн с открытым фреймом для нашего бота для рисования. Это нестандартная установка, и мы хотели посмотреть, в чем заключаются преимущества этой конструкции.

Во-вторых, мы знали, что создание этого прототипа окажется полезным только для нас. Наш дизайн и план состояли в том, чтобы переместить нашу последнюю раму в металл и с помощью Arduino получить нашу позицию от акселерометра и гироскопа, встроенных в ремешок Myo. Затем эта информация будет отправлена в двигатели и воспроизведет движение пользователя. Мы знали, что это позволит разделить нашу вторую фазу на три основных аспекта:

  1. программирование с Myo на двигатели через Arduino
  2. электрический дизайн, чтобы преобразовать наши данные в движение
  3. механическая конструкция для создания рамы разумного размера, которая облегчит нам движение

Каждый член нашей команды чувствовал себя наиболее комфортно с уникальной частью нашего процесса проектирования, поэтому мы решили разделить нашу работу между каждым человеком. Мы также вели блог на протяжении всего процесса проектирования, чтобы отслеживать наше повседневное мышление, в отличие от более глобального взгляда.

Шаг 1. Что мы планировали делать

Image
Image

Наша цель состояла в том, чтобы объединить эти два продукта таким образом, чтобы ни один из них не использовался ранее. Мы решили создать прямую трансляцию между нашей повязкой Myo и нашей собственной версией дизайна, вдохновленного AxiDraw Evil Mad Scientist.

Шаг 2: Список ингредиентов прототипа

2 деревянные доски 2 x 4 1 ремень или цепь размером> = 65 дюймов 4 гвоздя по дереву 3 шестерни с зубьями, подходящие к ремню или цепи 4 3 x 8 перфорированные пластины 30 ⅜”резиновые прокладки 8 шайбы диаметром 1 дюйм 1 деревянные диаметром 1 дюйм дюбель длиной 1 фут 8 винтов Vex 1 дюйм 8 винтов Vex 8 ½ дюймов 8 Винты Vex 2 дюйма 8 ¼ дюйма Резиновые прокладки 48 гаек Vex 1 Маленькая стяжка

Шаг 3: [Прототип] Обработка дерева и внутренней части оружия и коляски

[Prototype] Деревообработка. Интерьер нашего оружия и коляски
[Prototype] Деревообработка. Интерьер нашего оружия и коляски

Мы взяли два 2х4 и отрезали их до одинаковой длины (33 дюйма).

С помощью настольной пилы мы сделали выемку вдоль узкой части доски”глубиной и ⅛” шириной посередине.

Разрежьте дюбель на 4 части по 2 дюйма и просверлите отверстие в середине дюбеля диаметром около ¼ дюйма, используя сверлильный станок.

Шаг 4: [Прототип] Изготовление тележки

[Прототип] Делаем карету
[Прототип] Делаем карету
[Прототип] Делаем карету
[Прототип] Делаем карету
[Прототип] Делаем карету
[Прототип] Делаем карету

В идеале мы бы использовали два куска перфорированной стали 7x7, но все, что у нас было в наличии, это полосы 2x7, поэтому мы скрепили их болтами в конфигурации «X».

Сложите в стопку 5 резиновых прокладок ⅜”и прикрепите углы пластин vex друг к другу.

Неплотно закрепите деревянные дюбели, как показано на рис. 1, чтобы они свободно вращались с зазором примерно в 2 дюйма между ними. Используйте рисунок, чтобы увидеть, где должны быть расположены шестерни в этот момент. Мы использовали шайбы, но позже обнаружили, что крошечные пластиковые шестеренки работают лучше..

Используя винты с шестигранной головкой, резиновые проставки и шайбы диаметром 1 дюйм, закрепите шайбы в приподнятом положении, как показано на рис. 1 (мы использовали зеленые пластиковые шестерни, потому что не смогли найти нужные шайбы), убедитесь, что шайбы подходят. легко вращаться и вставляться в пазы доски.

Шаг 5. [Прототип] Собираем все вместе

[Прототип] Собираем все вместе
[Прототип] Собираем все вместе
[Прототип] Собираем все вместе
[Прототип] Собираем все вместе
[Прототип] Собираем все вместе
[Прототип] Собираем все вместе
[Прототип] Собираем все вместе
[Прототип] Собираем все вместе

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

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

Теперь ремень нужно закрепить на той стороне доски, на которой нет шестерни. Мы использовали дополнительный гвоздь и галстук-молнию, чтобы застегнуть наш. Но используемый метод не имеет значения, пока ремень закреплен в этом месте.

Шаг 6: [Прототип] Готов и движется

Image
Image

Вот и все, потяните ремень в разных комбинациях и посмотрите, как он по-разному воздействует на руку!

Шаг 7: преобразование нашей модели в готовый дизайн

Преобразование нашей модели в наш готовый дизайн
Преобразование нашей модели в наш готовый дизайн
Преобразование нашей модели в наш готовый дизайн
Преобразование нашей модели в наш готовый дизайн

Когда мы закончили наш прототип, мы были в восторге. Никто из нас не был уверен, как работает система до сборки. Но как только наши части соединились, мы быстро обнаружили, что нам нравится, и как мы могли бы это улучшить при создании окончательного дизайна. Наши основные претензии к системе, которые необходимо разрешить, заключались в следующем:

  1. Шкала

    1. Наш прототип был массивным и громоздким, что делало его склонным к опрокидыванию на краю наших рук.
    2. Каретка была намного больше, чем необходимо, и в ней было много бесполезного места.
    3. Наш пояс (протектор танка vex) был намного больше, чем необходимо, что создавало лишнее пространство между рычагами.
  2. Трение

    1. Наши ступени vex не во всех точках легко проходили по деревянным роликам.
    2. Пластик на дереве во многих случаях приводил к тому, что карета не двигалась.
  3. Моторизация

    Нам нужно было сделать систему энергозависимой

Помня об этом, мы составили планы окончательного дизайна. Мы хотели, чтобы манипулятор управлялся с Myo через Arduino, и мы хотели сделать раму алюминиевой и меньше.

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

Наш прототип также позволил нам всего за несколько минут определить, как вращение двигателя влияет на головку нашего тягового робота. Это привело нас к пониманию того, что дизайн нашего элемента управления будет более простым, чем мы ожидали. При ближайшем рассмотрении мы выяснили, что движение мотора складывается! Это означает, что каждый двигатель оказывает независимое желаемое влияние на наше движение, но когда мы объединяем их вместе, они начинают нейтрализоваться.

Например, если рассматривать его как координатную плоскость, двигатель, лежащий в отрицательной конечной точке x, всегда будет тянуть наш ящик во второй и четвертый квадранты. И наоборот, двигатель, лежащий на положительном конце оси x, всегда будет направлять ящик в первый и третий квадрант. Если мы объединим движение наших двигателей, это отменит части управления этим конфликтом и усилит согласованные части.

Шаг 8: кодирование

Хотя несколько лет назад я довольно много работал на C, у меня не было опыта работы с lua или C ++, а это означало, что мне нужно было потратить значительное количество времени на просмотр документации. Я знал, что основная задача, которую я пытаюсь выполнить, - это получение информации о местоположении пользователя через определенные промежутки времени, а затем передача ее двигателям. Я решил разбить задачу на себя, чтобы лучше переварить те части, которые мне понадобятся.

1. Получение данных от Myo (lua)

Я знал, что мне нужно найти способ получить информацию от Myo. Это была первая часть задачи, к которой я хотел подойти. Для этого я хотел, чтобы пользователь откалибровал размер своего холста перед тем, как начать рисовать. Это позволило бы мне иметь границы для работы. Затем я мог бы нормализовать программу между разными пользователями, просто взяв процент от максимального холста в качестве точек данных для передачи. Я решил создать событие со сценарием, которое будет выполнять проверку getOrientation каждые полсекунды, так как это позволит проверкам никогда не выполнять дикий прыжок, о котором вам нужно было бы догадываться (например, если пользователь сильно качнулся назад и четвертый).

Это стало первым препятствием, на которое я наткнулся. Я обнаружил очень большое ограничение lua, которое не позволяет мне ждать, прежде чем продолжить сценарий. Единственный способ выполнить это действие - либо приостановить работу ЦП (которая остановит его глобально, даже удерживая системные часы), либо использовать команды, специфичные для ОС. В моем примере кода я оставил исходную проверку ОС, которую я выполнил (прокомментировал). Это было сделано после большого исследования документации lua и проверки форматирования системного пути. Именно тогда я решил, что мне нужно посмотреть документацию по проектам, которые были опубликованы ранее. Я сразу понял, сколько времени потратил зря, и сразу перешел к переменной платформы. С его помощью я смог реализовать команды ожидания, специфичные для ОС, почти сразу, в отличие от дней, которые мне потребовались, чтобы собрать свое предыдущее решение.

Примерно в это же время началась работа над электрическим аспектом, и я приостановил работу над этим аспектом кода. Мы хотим узнать, как наши моторы взаимодействуют с Arduino.

2. Работа с Arduino (C ++)

Поскольку работа с нашей макетной платой становилась все более сложной, я узнал, что Arduino не поддерживает многопоточность. Это был большой недостаток в моем первоначальном дизайне кода, и, прочитав больше об ограничениях, представленных с нашим контроллером, я обнаружил, что мне нужно будет запрограммировать, как Arduino будет переключаться между ними. Это стало центром моих усилий по мере приближения нашего крайнего срока. Мне пришлось отказаться от больших частей моего исходного сценария, поскольку они были разработаны для записи данных в файл синхронно с контроллером мотора, читающим файл. Это было сделано для того, чтобы функция очереди была уверена, что даже если пользователь опередит наш ящик, это не разрушит проект.

Я решил, что функцию очереди нужно сохранить, если не реализовывать так же, как раньше. Для этого я создал вектор массивов. Это позволило мне не только сохранить относительно нетронутым дух моего предыдущего дизайна, но и означало, что мне не нужно было отслеживать свое место в файле ни для чтения, ни для записи. Вместо этого теперь все, что мне нужно было сделать, это просто добавить новое значение в мой вектор, если пользователь двигался (предварительное тестирование было менее 1% разницы в размере холста по x и y от последней записанной позиции, что не привело к записи данных). Затем я мог взять самое старое значение в моем векторе и одним махом отправить его в управление двигателем, записать его в наш файл, а затем удалить его из моего вектора. Это избавило меня от многих моих опасений по поводу наличия постоянного потока ввода-вывода.

Шаг 9: Электрооборудование

Image
Image
Электрические
Электрические

Хотя в прошлом я посещал уроки электроники и довольно много работал с Arduinos. Я никогда не углублялся в то, чтобы заставить Arduino получать информацию из внешнего источника (myo), у меня есть только опыт вывода информации через Arduino. Тем не менее, я начал подключать двигатели к нашему рисовому роботу и работал над кодом, чтобы они могли работать с кодом myo.

Материалы, которые я использовал:

2 x шаговых двигателя

1 х макет

1 х Arduino (Uno)

2 x драйвер IC L293DE

40 х перемычек

2 х вентилятора

1. Подключение шаговых двигателей и вентилятора к макетной плате

Следуя принципиальной схеме, мы можем подключить один шаговый двигатель к драйверу на макетной плате. Затем, следуя той же схеме, примените это ко второму драйверу и двигателю, однако перемычки должны быть подключены к другому набору контактов в Arduino (поскольку первый двигатель занимает место четырех других).

Предупреждение / Совет:

Драйверы очень маленькие, а контакты расположены очень близко друг к другу. Было бы разумно разнести два драйвера, чтобы провода не запутались.

Далее нужно подключить вентиляторы. Это довольно просто, вентиляторы, которые у меня были, были вентиляторами базового процессора компьютера, у которых есть положительные стороны и заземление. Подключите эти два разъема к соответствующим контактам +/- на макете и наклоните каждый к каждому драйверу. (Мы обнаружили, что, поскольку шаговые двигатели получают пакеты информации и команд в течение длительного периода времени, драйверы имеют тенденцию к перегреву и запаху. Добавление вентилятора для охлаждения решило эту проблему).

2. Код Arduino

Это легкая часть!

Откройте Arduino IDE, перейдите на вкладку «Файл», затем перейдите на вкладку «Пример», которая упадет еще дальше и покажет вам вкладку «степпер». Затем вы хотите открыть «Stepper_OneStepAtATime»

Это предварительно загрузит пример кода, который практически подключается к проводке Arduino / двигателя. Нам придется внести небольшие изменения, потому что мы будем использовать два двигателя, которые я покажу ниже. Возможно, вам также придется внести незначительные изменения в зависимости от того, какие контакты вы решили использовать, поскольку в Arduino IDE по умолчанию используются контакты 8-11.

Код, который я использовал, чтобы заставить два двигателя двигаться «синхронно», приведен ниже:

//#включают

const int stepsPerRevolution = 200;

Степпер myStepper1 (stepsPerRevolution, 9, 10, 11, 12);

Степпер myStepper2 (stepsPerRevolution, 4, 5, 6, 7);

int stepCount = 0;

void setup () {// инициализируем последовательный порт: Serial.begin (9600); }

void loop () {

myStepper1.step (1);

Serial.print ("шаги:");

Serial.println (stepCount);

stepCount ++;

задержка (0,5);

myStepper2.step (1); задержка (0,5); }

3. Возможные проблемы

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

Убедитесь, что ваш драйвер, который вы используете, может управлять двигателем

Проверьте серийный номер и его характеристики

Я столкнулся с проблемой отсутствия перемычки, из-за которой мои моторы странно вращались

Мне пришлось использовать мультиметр, чтобы проверить каждый провод

И всегда дважды проверяйте свой код на наличие мелких ошибок, таких как отсутствие конца «;» команда

Шаг 10: механический

Механический
Механический
Механический
Механический
Механический
Механический
Механический
Механический

1. Материал

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

Мы использовали алюминиевые листы калибра 032, разрезанные на 9,125 "x 17,5", и проследили узор из чертежа, показанного на предыдущем шаге.

2. Изготовление

Используя кромку (синюю машину), мы добавили кромки, обращенные в противоположные стороны, так что, когда деталь сломана и сложена, две кромки сцепились, образуя единое целое изделие.

Для больших поворотов мы использовали теннисмит из-за его высокой точности.

Теперь для меньших изгибов вам понадобится машина с меньшей опорой, здесь пригодится машина, такая как ротационная матрица. К сожалению, из-за своей меньшей опоры она позволяет делать небольшие перерывы, к сожалению., имеющаяся в нашем распоряжении роторная матрица все еще была слишком большой для нашего рельса и деформировалась.

** В качестве альтернативы, если у вас нет доступа к надлежащему оборудованию или инструментам, можно сделать замену. **

В нашем случае мы вырезали руки из алюминиевых направляющих для солнечных панелей с помощью плазменного резака и отшлифовали концы до гладкости, а затем прикрутили их болтами, образуя двухстороннюю систему направляющих. В идеале мы хотели бы сварить рельсы вместе, однако, не имея доступа к сварочной станции, мы вместо этого скрепили рельсы вместе и просверлили их, а затем скрепили их болтами. Но если выбран этот путь, следует проявлять особую осторожность при использовании стопорной гайки и шайбы, чтобы гарантировать, что деталь имеет как можно меньший изгиб.

3. Пояс

Для ремней мы использовали старые ремни для 3D-принтеров, которые нам удалось вернуть.

Ремни изначально были недостаточно длинными, поэтому, используя термоусадочные трубки, мы соединили две части, чтобы сделать одну достаточно длинной.

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

4. Перевозка

И, наконец, каретка была сделана из листа алюминия 032 размером 5 дюймов на 5 дюймов, с просверленными отверстиями, в которые должны входить соответствующие винты и шайбы. Расстояние будет варьироваться в зависимости от ширины рельса и размера зазора между шайбами.

Шаг 11: размышления

К сожалению, каждая сторона нашего проекта натолкнулась на большую преграду времени, и мы не смогли завершить разработку к намеченному сроку. Каждый член нашей команды в конечном итоге сотрудничал по всем остальным аспектам нашего дизайна, по крайней мере, до некоторой степени, что привело к некоторому сокращению времени обучения. Это, в сочетании с желанием разработать продукт, используя как можно меньше внешних ресурсов (поскольку все мы хотели создавать наши соответствующие части с нуля), привело к огромному количеству изобретенных заново колес.

Все, кто работал над проектом, узнали больше о других аспектах проекта. Одно дело заставить программное обеспечение выполнять определенное действие, а другое - заставить программное обеспечение работать вместе с оборудованием. Я бы сказал, что важно, чтобы тот, кто работает над аспектом кодирования этого проекта, был так же знаком, как и наш программист проекта.

В целом мы не смогли добиться именно того, чего хотели. Однако я чувствую, что мы были на правильном пути, и все мы открыли и изучили новые концепции, которые мы сможем применить в будущих проектах.

Рекомендуемые: