Gnevko

Электронная гитара для Paulimot 190-V (Arduino)

201 повідомлення у цій темі

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

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Є два способа.

Можна поставити ше одну ходову гайку, дві гайки злегка так законтрагаєти, і таким способом вибрати люфт.

Або перевести люфт в кількість імпульсів, потім при реверсі спочатку ту кількість імпульсів подати, а тільки після того починати переміщення.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

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

Змінено користувачем Gnevko
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

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

Змінено користувачем Sebra
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

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

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Ну це вже замах на повноцінний чпу, там з люфтами все строго.

Руцями токарі працюють і не з такими люфтами. Навіть в токарних підручниках вчать як з тими люфтами "жити". Щодо упорів, то в подавляючій більшості випадків важливим є лише один упор, другий то скорше для зручності, щоб само вертало супорт на початок операції.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Але хочу сказати, що ваш досвід є дуже цікавим та корисним.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Спасибо за теплые слова! 

 

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

 

https://github.com/Gnevko/Lathe-Arduino-Assistant

 

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Добавил описание основных возможностей, реализованных на сегодня: https://github.com/Gnevko/Lathe-Arduino-Assistant/wiki/Описание-возможностей

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

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

 

large.5a58d008d8e29_2018-01-1216_09_39.png

Змінено користувачем Gnevko
1

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Немного подправил

large.5a58d21892523_2018-01-1216_19_12.png

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Болт в студию! 

 

large.P1100312.jpglarge.P1100315.jpg

 

Ну или резьба для него, M10. И не было бы моей радости, если бы не пришла мне в голову сравнить его с покупным экземпляром.

large.P1100317.jpglarge.P1100316.jpg

 

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

1) проблема может уходить корнями в расчет скорости;

2) перевод скорости в шаги двигателя;

3) алгоритм исполнения шагов.

 

Хм ...

 

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Думаю таки варто Вам задуматись над використанням "переривання" на датчику обертів.

підпрограма переривання має мати лише одну строку, типу такого:

timeSensor = millis();

а уже в основному циклі робити розрахунок часу між попереднім часом та новим

і оновлювати попередній час:

timeSensorNew = timeSensor;

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

А так, по перериванню швиденько записали час, і процесор одразу повертається до виконання тої задачі яку обробляв до цього, а коли звільнився - обрахував час.

Змінено користувачем Sebra
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

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

 

https://github.com/Gnevko/Lathe-Arduino-Assistant

 

Правда там я за одно и скорость вычисляю, но по идее времени на расчеты там предостаточно ....

Змінено користувачем Gnevko
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Дроблення кроку використовувалось?

На не цілих кроках двигун зовсім не тримає позиції і ділиться той крок не порівну.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Вооружившись измерителем оборотов (пришлось съездить к товарищу за прибором), выяснил следующее:

1) на низких оборотах - показания прибора 168.3 - 168.4 (здесь и далее оборотов в минуту), показания с ардуино - 168.0 - 168.6

2) на "высоких" оборотах - показания прибора 723,1, показания с ардуино - 772.2 - 724.6

3) на сверх низких оборотах - показания прибора 65.4, показания с ардуино 65.4

 

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

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
2 часа назад, Gnevko сказал:

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

 

https://github.com/Gnevko/Lathe-Arduino-Assistant

 

Правда там я за одно и скорость вычисляю, но по идее времени на расчеты там предостаточно ....

 

Ага, бачу:

attachInterrupt(0, callbackSpindle, RISING); //PIN2

Тоді спробуйте виловити це:

3 часа назад, Gnevko сказал:

означает потерю н-го количество шагов

Упріть індікатор в супорт, та прокрутіть оберт в одну сторону, оберт в другу... разів зо 50-100 гвинт подачі

Змінено користувачем Sebra
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
3 часа назад, Gnevko сказал:

Ну или резьба для него, M10. И не было бы моей радости, если бы не пришла мне в голову сравнить его с покупным экземпляром.

large.P1100317.jpglarge.P1100316.jpg

 

 

 

А ви впевнені що покупний гвинт має достатню точність, заміряйте 10-50 витків в обох гвинтах штангеном...

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
3 часа назад, Roma сказал:

Дроблення кроку використовувалось?

На не цілих кроках двигун зовсім не тримає позиції і ділиться той крок не порівну.

 

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

 

1) Первый этап - вычисление скорости вращения шпинделя: 

 - при срабатывании прерывания измеряем текущее время в микросекундах;

 - вычитаем полученный результат из предыдущего, получая тем самым разницу между срабатываниями прерываний

 - вычисляем скорость вращения шпинделя в секунду: 1000000 * 100 / spindleDeltaPhase. Умножение на 100 необходимо, что бы избавиться от чисел с   плавающей точкой. Результат, для примера, 146 (то есть 1.46 оборотов шпинделя в секунду) или 87.6 оборотов в минуту.

- далее идет вычисление миллиметров, которые должен сделать суппорт за одну секунду: _spindleRevolutionsPerSecond * zAutoFeedSyncSpeed, то есть наши 146 (не забываем про умножение ранее на 100) умножаем на заданную скорость, так же умноженную на 100: 146 * 8 (или 1.46 * 0.08) и получаем, 1168, с учетом умножений на 100 двух множителей - реальное значение 0.1168 мм на оборот.

 

2) Второй этап - вычисление промежутков между шагами двигателя

 

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

  speed / 0.000625 тем самым получая количество шагов в секунду времени.

- Затем делим секунду на это количество шагов:

1000000 / (speed / 0.000625), но помня о том, что переменная speed у нас увеличена в 10000 раз, и желая здесь так же избавиться от плавающей точки в итоги получаем формулу:

 _deltaTimeForNextStep = 1000000 / (speed * 100 / 625).

 

На нашем примере это должно было бы быть 1000000 / (1168 * 100 / 625) = 5351, а ардуино говорит там, что 5376, что на 25 микросекунды больше чем нужно ... хм ... если резать резьбу на 30мм, то это займет 48000 шагов двигателя, если на каждом шаге терять по 25 микросекунд, то общие потери составят 1,2 секунды ... вот тебе и раз. Теперь бы понять, с какого испугу теряются здесь по  25 микросекунд!

 

3) Третий этап - собственно алгоритм выполнения шагов выполняется таймером, который тикает каждые 20 микросекунды.

- запоминаем последнее время, когда был сделан шаг

- если при очередном срабатывании таймера прошло больше времени, чем было вычислено на втором этапе - делаем еще один шаг.

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

 

Задача - найти куда теряются 25 микросекунды на шаг!

Змінено користувачем Gnevko
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
52 минуты назад, Sebra сказал:

 

Ага, бачу:


attachInterrupt(0, callbackSpindle, RISING); //PIN2

Тоді спробуйте виловити це:

Упріть індікатор в супорт, та прокрутіть оберт в одну сторону, оберт в другу... разів зо 50-100 гвинт подачі

 

делал, точность до сотки ... но кажется я нашел проблему (см комментарий выше), только не понятно пока как её решить.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Проблема с потерей микросекунд пролечилась заменой формулы

 

_deltaTimeForNextStep = 1000000 / ((speed * 100) / 625);

 

на

 

_deltaTimeForNextStep = 1000000.0 / ((speed * 100.0) / 625.0);

 

Сейчас посмотрим, как это повлияло на конечный результат :)

Змінено користувачем Gnevko
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
3 минуты назад, Gnevko сказал:

Задача - найти куда теряются 25 микросекунды на шаг!

Якшо крок ходового гвинта 2 мм, і кут двигуна 1.8 градуса, то 

200 кроків то 2 мм.

1 крок то 0.01 міліметра.

Виходять дуже гарні і прості цифри.

Якшо різьба М10, крок різьби 1.5 мм, значить за час від мітки до мітки має бути 150 кроків.

Спочатку зробити на повному кроці.

Якшо на повному кроці вийде добре, то можна пробувати дробити крок на два, потім на 4, потім на 8. Але змісту у тому нема. Бо точність 0.01 мм для таких станків дуже добре якби вийшла.

Ловити точність менше 0.01 мм, буде дуже тяжко, і скоріш за все шо не можливо.

Якшо не вийде на повному кроці, значить проблема не в дробленні кроку.

 

1

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Спасибо, дельный совет! 

 

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

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Перед тем как уменьшать кол-во микрошагов, решил проверить формулы расчета от и до, сравнивая промежуточные результаты с Exel, на преобразованиях типов нашлись еще 300 микросекунды на один шаг. После возврата на тип переменных float, разнице между результатами в Exel и Ардуино составила всего лишь 2 микросекунды, вместо 350 ранее.

 

Результат не идеален, но намного лучше чем был раньше.

 

large.P1100319.jpg

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Піві року тому збирав станочок на NEMA 42. 
Код був банально протим, але увесь час втрачалось від 1-5 кроків...
а на мікрокроках взагалі була печаль. В холосту на тесті все працювало, як подавав заготовку - ні.
Возився години 4, поки знайшов причину - втрати в проводці від драйвера до двигуна, та силова до драйвера. Китайська проводка була замінена на 1.5mm^2. Більше кроки не губились.
Іноді враховуєш найменші дрібниці, а робиш таку .... помилку.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Створіть акаунт або увійдіть для коментування

Ви маєте бути користувачем, щоб залишити коментар

Створити акаунт

Зареєструйтеся для отримання акаунта. Це просто!


Зареєструвати акаунт

Увійти

Вже зареєстровані? Увійдіть тут.


Увійти зараз

  • Зараз на сторінці   0 користувачів

    Немає користувачів, які переглядають цю сторінку