Регулировка скорости ШагоДвига в чужой схеме

serzzzh
Offline
Зарегистрирован: 01.12.2018

Добрый!
Если лазерный гравер, работает по плоской поверхности, надо переделать на сферические поверхности.
Оставляю ось Y как есть, вместо оси Х подключаю шаговый Nema 17 (биполярный, 4х-проводной). Все ок, работает.

Но т.к. длина окружности предметов для гравировки разная - нужна подстройка пройденного растояния - меньше, чем проходит лазер через мой привод с шестеренкой.
Я так понимаю нужно подключить схему через Ардуину, на вход Ардуины втыкаю все 4 выхода на двиг с лазера, на выход подключаю Nema 17. Драйвер нужен или напрямую втыкать?

 

b707
Offline
Зарегистрирован: 26.05.2017

serzzzh пишет:

Я так понимаю нужно подключить схему через Ардуину, на вход Ардуины втыкаю все 4 выхода на двиг с лазера, на выход подключаю Nema 17. Драйвер нужен или напрямую втыкать?

Не затрагивая саму идею преобразования шагов сначала в логику, а потом обратно в шаги(бредом попахивает), отвечу только на последний вопрос - нужен ли драйвер??

Ну а сами-то как думаете? - потянет ардуина шаговый мотор без дравйвера?

Кроме того, если ваш Nema17 на напряжение более 5в - нужно еще согласование и на входе.

sadman41
Offline
Зарегистрирован: 19.10.2016

Работает же у людей фантазия...

serzzzh
Offline
Зарегистрирован: 01.12.2018

Нашел такой скетч, но при прямом подключении одну ардуину спалил.

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

Насчет бреда - ну пардоньте, я специализируюсь в другой области.

Цитата:

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

Пины 5-7 ардуины -- это входы, 9-11 выходы. Коэффициент уширения задается в дифайне WIDTH_MUL. Остальное работает автоматически.

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

Одна клетка -- это пять вольт и одна миллисекунда.

Коэффициент "уширения" задан 0.3, т.е. импульсы на выходах длятся на треть дольше, чем на входах.

 

/* Main.ino file generated by New Project wizard
 *
 * Processor: ATmega328P
 * Compiler:  Arduino AVR
 */

#define WIDTH_MUL	0.3 
 
#define IN_1_PIN	5
#define IN_2_PIN	6
#define IN_3_PIN	7

#define IN_MASK 	((1 << IN_1_PIN) | (1 << IN_2_PIN) | (1 << IN_3_PIN))

#define IS_PIN_LOW(PIN) ((PIND & PIN) != PIN)

#define OUT_1_PIN	9
#define OUT_2_PIN	10
#define OUT_3_PIN	11

#define OUT_1_PORT	PORTB1
#define OUT_2_PORT	PORTB2
#define OUT_3_PORT	PORTB3

#define OUT_MASK	((1 << OUT_1_PORT) | (1 << OUT_2_PORT) | (1 << OUT_3_PORT))

#define FORCE_PIN_LOW(PIN) PORTB &= ~(1 << PIN)

 
void setup() {
      // инициализируем входы
  for (int i = IN_1_PIN; i < IN_3_PIN + 1; i++) {
    pinMode(i, INPUT);
  }
      // инициализируем выходы
  for (int i = OUT_1_PIN; i < OUT_3_PIN + 1; i++) {
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
  }
}

uint32_t p_start, p_stop, p_width;
uint8_t in_state;

void loop(){
  in_state = PIND & IN_MASK;                // берем состояние всех 3-х входов
  if ((in_state & IN_MASK) != IN_MASK) {    // есть ли хоть один вход в LOW
    p_start = micros();                     // запомнили время прихода имп.
      // состояние входов точно зеркалим на выходы
    in_state ^= IN_MASK;        
    PORTB &= ~(in_state >> 4);
    
    while((PIND & IN_MASK) != IN_MASK);     // ждем, пока имульс закончится
    p_stop = micros();                      // фиксируем время окончания
    p_width = p_stop - p_start;             // вычисляем сколько длился вх. имп.
    delayMicroseconds(p_width * WIDTH_MUL); // добавляем к длит. вых. имп.
    PORTB |= OUT_MASK;                      // закончили, все выходы в HIGH
  }
}


sadman41
Offline
Зарегистрирован: 19.10.2016

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

serzzzh
Offline
Зарегистрирован: 01.12.2018

Так-то движок реагирует, но как-то криво.

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

 

sadman41
Offline
Зарегистрирован: 19.10.2016

serzzzh пишет:

Так-то движок реагирует, но как-то криво.

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

Овчинка выделки не стоит, если есть доступ ко входам драйвера, который этот движок крутит.

serzzzh
Offline
Зарегистрирован: 01.12.2018

там чужая схема, ее спалить не хочется.. ))
Кто-нибудь сможет помочь платно?
Мозги гравера сфотаю, все покажу

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

0.3 это заузили импульс

serzzzh
Offline
Зарегистрирован: 01.12.2018

ua6em пишет:

0.3 это заузили импульс


да, я залил скетч с     #define WIDTH_MUL   1

но движок как-то дергается, вместо вращения 1:1

sadman41
Offline
Зарегистрирован: 19.10.2016

serzzzh пишет:

там чужая схема, ее спалить не хочется.. ))
Кто-нибудь сможет помочь платно?
Мозги гравера сфотаю, все покажу

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

Все равно на своем будете экспериментировать. Посмотреть картинки могу... а там уже думать - выйдет или нет.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

наверное не ширину импульса надо регулировать а их количество?

serzzzh
Offline
Зарегистрирован: 01.12.2018

ua6em пишет:

наверное не ширину импульса надо регулировать а их количество?

Проблема 1: при  WIDTH_MUL = 1 (в скетче выше) импульсы 1 к 1 не проходят, т.е. без ардуины вращает ок, через ардуину - непонятные подергивания. Если бы получилось, тогда бы и количеством поигрался.

Проблема 2: я входы в ардуине спалил получается? :)

ну ок, вечером пришлю схему, если работа с исходящими импульсами не вариант

 

bwn
Offline
Зарегистрирован: 25.08.2014

Наверно, все-таки в аппартаные вопросы.

b707
Offline
Зарегистрирован: 26.05.2017

serzzzh пишет:

Проблема 2: я входы в ардуине спалил получается? :)

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

serzzzh
Offline
Зарегистрирован: 01.12.2018

Вот фото схемы лазера. Коннектор на 4 провода справа - ось, на которой надо регулировать скорость движка.

Чего делать?

sadman41
Offline
Зарегистрирован: 19.10.2016

И какой провод куда идет? Питание - понятно, остальные как скоммутированны с драйверами?

serzzzh
Offline
Зарегистрирован: 01.12.2018

коннектор справа, на 4 провода - идет на шаговый движок (биполярный NEMA17), подключен в этом же порядке (если перевернуть штекер - работает зеркально). Левый коннектор, 3 провода - на лазер, 4х2 коннектора, 8 проводов - на 2 движка оси Y (работают парой)

Не совсем понимаю что именно еще могу рассказатЬ, если можно - спрашивайте плз

sadman41
Offline
Зарегистрирован: 19.10.2016

А... так это лазер, а не питание...

И какому из двигателей надо траекторию менять - к которому 4 провода идет с правого коннектора?

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

Потом эту разрезанную дорожку и заводить на Arduino - слушать одним входом и давать на другом выходе импульсы 1:1, 1:2, 2:1... или по какой там формуле корректировка производится.

ВН
Offline
Зарегистрирован: 25.02.2016

ua6em пишет:
наверное не ширину импульса надо регулировать а их количество?

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

serzzzh
Offline
Зарегистрирован: 01.12.2018

sadman41 пишет:
И какому из двигателей надо траекторию менять - к которому 4 провода идет с правого коннектора?

Верно

sadman41
Offline
Зарегистрирован: 19.10.2016

serzzzh пишет:

sadman41 пишет:
И какому из двигателей надо траекторию менять - к которому 4 провода идет с правого коннектора?

Верно

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

Гриша
Offline
Зарегистрирован: 27.04.2014

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

Может я и не прав, но алгоритма я не понял...

 

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Гриша
Offline
Зарегистрирован: 27.04.2014

sadman41 пишет:

... но человек спрашивает, как ему управление перехватить. ..

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

тут обсуждается перехват сигналов ШД - ну его можно обсудить... но это даже близко не управление...

sadman41
Offline
Зарегистрирован: 19.10.2016

Исходя из предварительным попыток получения управляющих импульсов через коннектор мотора, я сделал вывод, что ТС хочет каким-то образом производить пересчет кол-ва шагов, приходящих из штатной прошивки в кол-во шагов, которые должен пройти его двигатель. Перехват STEP-а - самое близкое к его желанию действие, которое можно относительно легко проделать ардуиной. 

Однако, дальнейший смысл действий от меня пока ускользает. Впрочем, он не просил решить задачу целиком. На заданный вопрос я ответил.

serzzzh
Offline
Зарегистрирован: 01.12.2018

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

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

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

Вижу 2 варианта:

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

2. Собрать некий вариатор, которым механически делать тож самое (по типу такого)

ata3d
Offline
Зарегистрирован: 24.05.2017

Можно посмотреть как это сделано для устройства Eggbot (еще ссылка с похожими функциями).

 

serzzzh
Offline
Зарегистрирован: 01.12.2018

Да, 3й вариант - снять и отложить в сторону кетайскую плату и найти ее аналог, либо сделать на ардуине

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

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

согласен. Вообще, задачка вроде не должна быть сложной.

sadman41
Offline
Зарегистрирован: 19.10.2016

serzzzh пишет:

Да, 3й вариант - снять и отложить в сторону кетайскую плату и найти ее аналог, либо сделать на ардуине

Я же вам написал, что делать - рвать STEP, ардуиной пересчитывать - на каждый входящий давать два исходящих. Или наоборот.

serzzzh
Offline
Зарегистрирован: 01.12.2018

sadman41 пишет:

serzzzh пишет:

Да, 3й вариант - снять и отложить в сторону кетайскую плату и найти ее аналог, либо сделать на ардуине

Я же вам написал, что делать - рвать STEP, ардуиной пересчитывать - на каждый входящий давать два исходящих. Или наоборот.


Спасибо, соберусь с мыслями, осмотрю внимательно и попробую, опыта особо нет в этих делах, не спалить бы )

wowscheg
Offline
Зарегистрирован: 14.02.2012

Здравствуйте, не хочу новую тему создавать, напишу здесь.

Суть такова, есть шаговый двигатель, драйвер 4988, библиотека StepperDriver, потенциомерт и кнопки.

Задача, нажав на кнопку начать вращать двигателем, на другую остановить а потенциометром, регулировать скорость вращения.

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

Вот код:


int analogPin = 1;     // номер порта к которому подключен потенциометр
int val = 0;           // переменная для хранения считываемого значения

#include <Arduino.h>

#define STOPPER_PIN 4
#define START_R_PIN 2
#define DIR 8
#define STEP 9
#define SLEEP 13

#define MOTOR_STEPS 200
#define RPM  val
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
#define MICROSTEPS 16

 #include "A4988.h"
 #define MS1 10
 #define MS2 11
 #define MS3 12
 A4988 stepper(MOTOR_STEPS, DIR, STEP, SLEEP, MS1, MS2, MS3);

void setup() {
    Serial.begin(115200);

        //Конфигурация стартовой кнопки
    pinMode(START_L_PIN, INPUT_PULLUP);

    // Конфигурация стоповой кнопки
    pinMode(STOPPER_PIN, INPUT_PULLUP);


}

void loop(){
{
  
  val = analogRead(analogPin);     // считываем значение с АЦП потенциометра
  Serial.println(val / 4);             // выводим полученное значение
}

 
    // Старт по кнопке
    if (digitalRead(START_R_PIN) == LOW){   //проверяем состояние кнопки, если нажата выполняем код:
        Serial.println("RUN_R");            //отправляем в порт сообщение
        delay(500);                         //ждем половину секунды
        stepper.enable();                   //активируем степпер
        stepper.startRotate(50 * 360);    //запускаем вращение
;
            }


    // Стоп по кнопке
    if (digitalRead(STOPPER_PIN) == LOW){    //проверяем состояние кнопки, если нажата выполняем код:
        Serial.println("STOPPER REACHED");   //отправляем в порт сообщение
        delay(500);                          //ждем половину секунды
        stepper.stop();                      //останавливаем степпер
            }

  
}

Вот хочу для RPM брать значение с val.

Подскажите пожалуйста, как правильно это сделать?

Спасибо.

vvadim
Offline
Зарегистрирован: 23.05.2012

во первых в чужую тему лезть это некрасиво и не правильно.

во вторых с кнопками вы нифига не разобрались и обрабатываете вы их не верно.

 

 

 

wowscheg
Offline
Зарегистрирован: 14.02.2012

Извините, я не хотел никого обидеть.

А что не так с кнопками? Работают же, ровно так как мне нужно, вкл и выкл.

Гриша
Offline
Зарегистрирован: 27.04.2014

wowscheg пишет:

Извините, я не хотел никого обидеть.

А что не так с кнопками? Работают же, ровно так как мне нужно, вкл и выкл.

вы никого не обидели, просто начните новую тему, а у кнопок есть дребезг, подробнее тут и тут

svm
Offline
Зарегистрирован: 06.11.2016

serzzzh пишет:

Добрый!
Если лазерный гравер, работает по плоской поверхности, надо переделать на сферические поверхности.
Оставляю ось Y как есть, вместо оси Х подключаю шаговый Nema 17 (биполярный, 4х-проводной). Все ок, работает.

Но т.к. длина окружности предметов для гравировки разная - нужна подстройка пройденного растояния

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