Намоточный станок на Arduino

Как сделать простой намоточный станок для намотки и перемотки трансформаторов с электронным счетчиком витков считающего обороты вала. Чертеж намоточного станка.

Комплектующие

Список комплектующих для самостоятельной сборки:

  • Arduino Nano
  • Драйвер шагового двигателя A4988
  • Энкодер
  • ЖК-дисплей 16×2 I2C
  • Шаговый двигатель Nema 17
  • Двигатель на 1000 RPM
  • Ремень
  • L293D
  • Алюминиевый профиль 20 × 20
  • Болты/гайки
  • Лист фанеры 12 мм

Метод работы намоточного станка

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


Как работает станок для намотки

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

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

Намоточный станок на механическом приводе позволяет выполнять сложную обмотку:

  • рядовую;
  • тороидальную;
  • перекрестную.

Ручной намоточный станок с механическим счетчиком оборотов
Ручной намоточный станок с механическим счетчиком оборотов

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

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


Современные намоточные станки оснащены специальными счетчиками

DIY 3D гибочный станок проволоки 3D Модель

Как обычно, я начал с создания проекта с помощью программы для 3D-моделирования. Вы можете скачать и 3D модель ниже.

Гибочный станок для проволоки 3DAutomatic 3D Wire Bending Machine 3D

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

Камрад, рассмотри датагорские рекомендации

🌻 Купон до 1000₽ для новичка на Aliexpress

Никогда не затаривался у китайцев? Пришло время начать!
Камрад, регистрируйся на Али по нашей ссылке. Ты получишь скидочный купон на первый заказ. Не тяни, условия акции меняются.

🌼 Полезные и проверенные железяки, можно брать

Куплено и опробовано читателями или в лаборатории редакции.

Капиталим принтер

rednetpro
Идет загрузка

Загрузка

30.05.2021

4217

22

Подпишитесь на автора

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

Отписаться от уведомлений вы всегда сможете в профиле автора.

Подписаться

Приветствую !

время работы принтера превысило пару лет и некоторые начальные к…

Файлы

Схема, печатка, прошивка:

Файловый сервис недоступен. Зарегистрируйтесь или авторизуйтесь на сайте.

Исходники прошивки:

Файловый сервис недоступен. Зарегистрируйтесь или авторизуйтесь на сайте.

Общаемся по статье ?

Подтормаживание

Без подтормаживания подающей бобины, намотка провода на каркасах будет рыхлая и качественной намотки не получится. Войлочная лента «2», тормозит барабан «1». Поворот рычага «3», натягивает пружину «4» — регулировка силы торможения. Для разной толщины провода, настраивается своё притормаживание. Здесь используются готовые детали видеомагнитофона.

Рисунок 3. Подтормаживающий механизм.

Центровка бобины

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

Рисунок 4, 5. Центрирующий механизм.

При намотке катушки, провод с бобины воздействует на шторку «5», выполненной виде “вилки” и шаговый двигатель «3», через редуктор с делением 6 и зубчатый ремень, по роликовым направляющим «4», автоматически сдвигает бобину в нужном направлении. Таким образом, провод всегда находится по центру см. рис 4, рис 5:

Рисунок 6. Датчики, вид сзади.

Состав и устройство датчиков.

19. Оптические датчики механизма центровки бобины. 5. Шторка перекрывающая датчики механизма центровки бобины. 20. Шторки перекрывающие датчики переключения направления позиционера. 21. Оптические датчики переключения направления позиционера.

Подробности сборки

Намоточное кольцо

04d8176c3b1a1b118d95aa4126eee843.jpg

a8adfe74bb599ef6499a94999ee6a0ab.jpg

Кольцо я изготовил из фанеры 12 мм. Внешний диаметр – 145 мм, внутренний – 122 мм. Имеется углубление длиной 43 мм и глубиной 5 мм для катушки.

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

Также у кольца есть углубление по внешней стороне, 8 мм шириной и 4 мм глубиной, в котором размещается ремень шириной 6 мм.

Катушка

fd9c79caa966acd38525ea4459bfa7b8.jpg

Катушка для медного провода, которую я выточил из нейлонового стержня. Все размеры показаны на картинке.

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

Корпус машины

c93868e2dc0e0380203248da904dc570.jpg

a51b83e9475d8a923780b01c03e12d19.jpg

99073da7c2c80c09e26926a8ab7a5d42.jpg

60c487c830a87414328e23717bfee256.jpg

b8123b48706bab25d6eb88f94461cf42.jpg

Корпус также сделан из фанеры 12 мм. На нём закреплены три направляющих ролика, расставленные примерно в 120° друг от друга.

Ролики сделаны из подшипников 626Z, гаек и болтов. На них будет вращаться наше деревянное намоточное кольцо.

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

Ролики-держатели тороида

cf53d79d3d618572641107091b5a5419.jpg

Это ролик, вращающий катушку, и одновременно удерживающий её. Я выточил их из нейлонового стержня на моём токарном

мини-станке

. Все размеры приведены на фото.

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

ca59e0e5ffb173c4b2b7a09d4e2a69b1.jpg

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

Крепление шагового двигателя

4a3bd026f721af60e4c258e365232826.jpg

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

Двигатель постоянного тока

348423b7265026eefe95e758558c5f38.jpg

90c94a7f9fbeaeb9ed4be86ba4d23725.jpg

8f0b65dbe71e2c26ae1acc811175f655.jpg

94911b2c7408261bdcef92a3acaca1c1.jpg

2f72ccd1858527903af8d8a2164a2d25.jpg

Этот мотор вращает намоточное кольцо. Я использовал Orange Jhonson 12v Dc Motor 300 RPM. Вам советую взять мотор на 600 RPM или 1000 RPM.

Ремень имеет 600 мм в длину и 6 мм в ширину. Держатель мотора, крепящийся к алюминиевому профилю, также сделан из фанеры.

Инфракрасный датчик

3fc0cbce1d3642d9391fa116ff1f6845.jpg

576d4b4d9bb01496b5e9e5feb9f0b426.jpg

Your browser does not support HTML5 video.

Я использовал

датчик от SeedStudio

. Он отправляет сигнал на контакт обработки прерываний Arduino – таким образом Arduino может подсчитывать количество оборотов кольца.

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

Данный датчик выдаёт по 2 сигнала за один поворот кольца – когда дерево сменяется металлом, сигнал меняется с низкого напряжения на высокое, а потом наоборот. Обработчик прерываний регистрирует два изменения состояния. Поэтому для подсчёта реального количества поворотов мне пришлось делить количество срабатываний пополам.

Основание аппарата

d501503fff705ef3fd695a5c8ddbe304.jpg

7d9e2ccaf6ecbe91373e20a68a140105.jpg

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

Для установки компонентов я закрепил на основании алюминиевый профиль. Обожаю его за гибкость в использовании. Все компоненты можно легко устанавливать на профиле и двигать вдоль него. Позволяет легко выравнивать компоненты относительно друг друга.

Корпус контроллера

30876391116924278307d2eae1840f4a.jpg

452f8b886c51bcd55684eb1a2353ecd8.jpg

Коробочка распечатана на 3D-принтере, внутрь установлены плата, ЖК-дисплей и энкодер. Корпус придаёт профессиональный вид всему проекту, а также обеспечивает удобную настройку аппарата. Корпус закреплён на основании при помощи металлической скобы.

Схема подключения

95ec724b58bafbafc76c4b88f761f5c8.png

Читательское голосование

Нравится

Статью одобрили 44 читателя.

Для участия в голосовании зарегистрируйтесь и войдите на сайт с вашими логином и паролем.

12.10.20 изменил Datagor. Дополнена статья по запросам камрадов. Опубликованы исходники и готовый hex.

↑ Механика

Смотрю на сканер и вот оно чудо, там лампу перемещает шаговый двигатель, да ещё и редуктор есть. Берём этот редуктор с мотором и крепим на станину от принтера. Пересчитав какое расстояние проделает каретка за 1 шаг двигателя задался константой А = 0,02 мм.

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

Всё, проводоукладчик готов.

Изоляционные прокладки

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

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

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

При намотке надрезанные или загнутые полосы закрывают крайние витки обмотки. Длина полос должна обеспечить перекрытие периметра намотки с нахлестом концов на 2-4 см.

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

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

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

Необходимые материалы и комплектация для изготовления

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

Станина из листового материала, скрепленного сварочным методом. Оптимальная толщина основания – 15 мм, боковых частей – 6 мм. Устойчивость конструкции обеспечивается ее тяжестью:


Схема станины станка

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

Важные составляющие конструкции станка – валы:

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

Самодельный намоточный станок - схема устройства
Самодельный намоточный станок — схема устройства

Втулка укладчика диаметром и длиной по 20 мм. Ее внутренняя резьба совпадает с резьбой нижнего вала.

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

Код Arduino для проекта 3D-гибочной машины

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

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

#include <AccelStepper.h>#include <Servo.h>#define limitSwitch 11// Define the stepper motors and the pins the will useAccelStepper feederStepper(1, 5, 6); // (Type:driver, STEP, DIR)AccelStepper zAxisStepper(1, 7, 8);AccelStepper benderStepper(1, 9, 10);Servo servo01;String dataIn = “”;String manualStatus = “”;int count = 0;int dist;

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

void setup() { Serial.begin(9600); pinMode(limitSwitch, INPUT_PULLUP); servo01.attach(2); servo01.write(40); // Initial position, bending pin up // Stepper motors max speed feederStepper.setMaxSpeed(2000); zAxisStepper.setMaxSpeed(2000); benderStepper.setMaxSpeed(2000); // Homing while (digitalRead(limitSwitch) != 0) { benderStepper.setSpeed(1200); benderStepper.runSpeed(); benderStepper.setCurrentPosition(0); // When limit switch pressed set position to 0 steps } delay(40); // Move 1400 steps from the limit switch to starting position while (benderStepper.currentPosition() != -1400) { benderStepper.setSpeed(-1200); // if negative rotates anti-clockwise benderStepper.run(); } benderStepper.setCurrentPosition(0);}

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

void loop() { String mode = Serial.readString(); if (mode.startsWith(“manual”)) { manual(); } if (mode.startsWith(“star”)) { star(); } if (mode.startsWith(“cube”)) { cube(); } if (mode.startsWith(“stand”)) { stand(); }}

Давайте посмотрим на эту пользовательскую функцию.

void star() { while (count != 5) { int feed = 38; // mm int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // reset the current position to 0 servo01.write(40); // Set the bender pin up delay(200); int angleConst = 18; // angle constant // Bend the wire 52 degrees while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Go back 52 degrees to initial position while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Feed the same distance again while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); servo01.write(130); // Set the bender pin down delay(200); // Set bender to new initial position, for bending in the other direction while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(200); servo01.write(40); // Bender pin up delay(200); while (benderStepper.currentPosition() != 105 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(50); while (benderStepper.currentPosition() != -63 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } delay(100); servo01.write(130); benderStepper.setCurrentPosition(0); count++; }}

Итак, здесь мы вводим цикл while, который выполняется 5 раз, потому что, очевидно, у звезды 5 очков. Мы начинаем с установки значения подачи, то есть того, сколько проволоки будет подано в миллиметрах. Затем это значение умножается на 48, что переводит значение подачи в соответствующие шаги для движения шагового двигателя. Затем с помощью функции run () мы вращаем двигатель питателя со скоростью, установленной функцией setSpeed (). Мы останавливаемся, когда достигается указанное выше значение feedDistance, и сразу после этого мы устанавливаем текущее значение положения нуля шагового двигателя.

int feed = 38; // mm int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // reset the current position to 0

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

// Bend the wire 52 degrees while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Go back 52 degrees to initial position while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100);

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

Таким же образом, как описано выше, мы создаем форму куба или любую другую форму, которую можем придумать. Что касается ручного режима, принцип работы команд такой же, за исключением того, что у нас есть еще несколько строк для чтения команд, поступающих от последовательного монитора. Например, для подачи проволоки нам нужно ввести «f» плюс расстояние в миллиметрах, для сгибания проволоки нам нужно ввести «b», плюс угол в градусах, а для поворота оси Z нам понадобится набрать «z» плюс угол в градусах.

if (dataIn.startsWith(“f”)) { dataInS = dataIn.substring(1, dataIn.length()); // reads the feed value dist = dataInS.toInt(); Serial.print(“Feed “); Serial.print(dist); Serial.println(“mm wire.”); dist = dist * 48; while (feederStepper.currentPosition() != dist) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); }

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

/* Arduino 3D Wire Bending Machine by Dejan Nedelkovski www.HowToMechatronics.com Library – AccelStepper by Mike McCauley: http://www.airspayce.com/mikem/arduino/AccelStepper/index.html*/#include <AccelStepper.h>#include <Servo.h>#define limitSwitch 11// Define the stepper motors and the pins the will useAccelStepper feederStepper(1, 5, 6); // (Type:driver, STEP, DIR)AccelStepper zAxisStepper(1, 7, 8);AccelStepper benderStepper(1, 9, 10);Servo servo01;String dataIn = “”;String manualStatus = “”;int count = 0;int dist;void setup() { Serial.begin(9600); pinMode(limitSwitch, INPUT_PULLUP); servo01.attach(2); servo01.write(40); // Initial position, bending pin up // Stepper motors max speed feederStepper.setMaxSpeed(2000); zAxisStepper.setMaxSpeed(2000); benderStepper.setMaxSpeed(2000); // Homing while (digitalRead(limitSwitch) != 0) { benderStepper.setSpeed(1200); benderStepper.runSpeed(); benderStepper.setCurrentPosition(0); // When limit switch pressed set position to 0 steps } delay(40); // Move 1400 steps from the limit switch to starting position while (benderStepper.currentPosition() != -1400) { benderStepper.setSpeed(-1200); // if negative rotates anti-clockwise benderStepper.run(); } benderStepper.setCurrentPosition(0);}void loop() { String mode = Serial.readString(); if (mode.startsWith(“manual”)) { manual(); } if (mode.startsWith(“star”)) { star(); } if (mode.startsWith(“cube”)) { cube(); } if (mode.startsWith(“stand”)) { stand(); }}void star() { while (count != 5) { int feed = 38; // mm int feedDistance = feed * 48; // 48- constats that map the mm value to number of steps the stepper show move while (feederStepper.currentPosition() != feedDistance) { // run until it reaches the distance value feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // reset the current position to 0 servo01.write(40); // Set the bender pin up delay(200); int angleConst = 18; // angle constant // Bend the wire 52 degrees while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Go back 52 degrees to initial position while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Feed the same distance again while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); servo01.write(130); // Set the bender pin down delay(200); // Set bender to new initial position, for bending in the other direction while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(200); servo01.write(40); // Bender pin up delay(200); while (benderStepper.currentPosition() != 105 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(50); while (benderStepper.currentPosition() != -63 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } delay(100); servo01.write(130); benderStepper.setCurrentPosition(0); count++; }}void cube() { int feed = 40; // mm int feedDistance = feed * 48; int angleConst = 16; // Step 1 while (count != 3) { while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); count++; } count = 0; // Step 2 while (zAxisStepper.currentPosition() != 88 * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); //Step 3 while (count != 2) { while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); count++; } count = 0; // Step 4 while (zAxisStepper.currentPosition() != 85 * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); // Step 5 servo01.write(130); delay(200); while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); while (count != 3) { delay(100); servo01.write(40); delay(200); // Step 6 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); count++; } count = 0;}void stand() { int feed = 20; // mm int feedDistance = feed * 48; int angleConst = 16; // Step 1 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 2 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -70 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 70 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 3 feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); // Step 4 servo01.write(130); delay(200); while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); servo01.write(40); delay(200); while (benderStepper.currentPosition() != 108 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -66 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); //Step 5 servo01.write(130); delay(200); // Step 6 feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); servo01.write(40); delay(200); // Step 7 while (zAxisStepper.currentPosition() != -90 * angleConst) { zAxisStepper.setSpeed(-500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); // Step 8 while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 6 feed = 45; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // Step 10 while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 48 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 11 while (zAxisStepper.currentPosition() != 90 * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); // Step 12 while (benderStepper.currentPosition() != 110 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != -68 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); //Step 13 servo01.write(130); delay(200); feed = 80; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); servo01.write(40); delay(200); // Step 14 while (benderStepper.currentPosition() != -70 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 70 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); //Step 15 feed = 25; // mm feedDistance = feed * 48; while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); // Step 16 while (benderStepper.currentPosition() != -90 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != 90 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); // Step 17 while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0);}void manual() { int sign; String dataInS; int angle; int angleConst; Serial.println(” // MANUAL MODE //”); while (!dataIn.startsWith(“end”)) { servo01.write(130); delay(200); dataIn = Serial.readString(); if (dataIn.startsWith(“f”)) { dataInS = dataIn.substring(1, dataIn.length()); // reads the feed value dist = dataInS.toInt(); Serial.print(“Feed “); Serial.print(dist); Serial.println(“mm wire.”); dist = dist * 48; while (feederStepper.currentPosition() != dist) { feederStepper.setSpeed(1200); feederStepper.run(); } feederStepper.setCurrentPosition(0); delay(100); } if (dataIn.startsWith(“b”)) { if (dataIn.charAt(1) == ‘-‘) { dataInS = dataIn.substring(2, dataIn.length()); ///reads the angle value angle = dataInS.toInt(); Serial.print(“Bend -“); Serial.print(angle); Serial.println(” degrees.”); angleConst = 16; // Set “negative” bending initial position while (benderStepper.currentPosition() != -43 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); servo01.write(40); delay(200); // Bend the wire while (benderStepper.currentPosition() != angle * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != (-1) * angle * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); servo01.write(130); delay(200); // Get back to original “positive” bending initial poistion while (benderStepper.currentPosition() != 43 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); } else { dataInS = dataIn.substring(1, dataIn.length()); angle = dataInS.toInt(); Serial.print(“Bend “); Serial.print(angle); Serial.println(” degrees.”); angleConst = 16; servo01.write(40); delay(200); while (benderStepper.currentPosition() != (-1) *angle * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != angle * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); } dataInS = dataIn.substring(2, dataIn.length()); angle = dataInS.toInt(); angleConst = 16; while (benderStepper.currentPosition() != sign * angle * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); while (benderStepper.currentPosition() != sign * angle * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); } benderStepper.setCurrentPosition(0); delay(100); } // Z-Axis Control if (dataIn.startsWith(“z”)) { if (dataIn.charAt(1) == ‘-‘) { dataInS = dataIn.substring(2, dataIn.length()); angle = dataInS.toInt(); Serial.print(“Move Z-Axis -“); Serial.print(angle); Serial.println(” degrees.”); angleConst = 16; while (zAxisStepper.currentPosition() != angle * angleConst) { zAxisStepper.setSpeed(500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); } else { dataInS = dataIn.substring(1, dataIn.length()); angle = dataInS.toInt(); Serial.print(“Move Z-Axis “); Serial.print(angle); Serial.println(” degrees.”); angleConst = 16; while (zAxisStepper.currentPosition() != (-1) *angle * angleConst) { zAxisStepper.setSpeed(-500); zAxisStepper.run(); } zAxisStepper.setCurrentPosition(0); delay(100); } } manualStatus = dataIn; }}

Навигация в меню

ЖК-дисплей используется для вывода информации, а энкодер – для ввода.

d18f0fe17a862304ca3d516025cd39df.jpg

Первый экран с приветствием.

8913dc56fb545bb8716858211f936109.jpg

На втором экране нужно ввести внешний диаметр катушки – аппарат поддерживает катушки разных диаметров.

6afec276f0158298e38499ea4937b9b8.jpg

На третьем экране нужно ввести количество витков.

c5b0a44a7e9e02c7e604c5f7ce95b3c4.jpg

На четвёртом экране нужно ввести угол покрытия катушки. 360° означает, что катушка будет покрыта проволокой целиком. 720° означает, что катушка будет обмотана проволокой дважды по окружности.

89fbcd40cff0e22648c79bf8adff84f7.jpg

На 5-м экране можно проверить все входные данные пред тем, как запустить машину. Если всё верно, нажимаете на энкодер, и машина стартует.

4dbbe4dc0975d779ac0f102c3fe7c3b1.jpg

6-й экран демонстрирует количество витков в реальном времени.

37bae88fec4735bc7fcb70534f4ee1ab.jpg

7-й экран появляется по окончанию работы.

См. также:

  • «ИТЭР: коммутирующее оборудование»
  • «Как я делал себе АВР для генератора»
  • «Магнитные рекорды»

↑ Электроника

Что касается схемы управления, то были приняты самые простые меры для реализации поставленной задачи. Благо, драйвер для биполярного шагового двигателя это не проблема, в Сети много вариантов. Выбрал простой на микросхемах L297 и L298.


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


Контроллер выбрал АТмега8, таких контроллеров полно и достать не проблема.

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...