Accelstepper мелкие вопросы

funnycorn
Offline
Зарегистрирован: 26.10.2017

Всем добрый вечер!

Добрался таки до шаговика 28byj-48 с драйвером ULN2003 и, соответственно, до библиотеки Accelstepper. Решил разобрать ее с нуля, но моей "квалификации" не хватило, чтобы добраться до истины в некоторых вопросах. 

Например, как определяется переменная _targetPos. Как я понял, она измеряется в шагах и определяет то положение, к которому будет стремиться двигатель с максимальной скоростью, ускорением и замедлением. Но до конца не совсем понятно, как она определяется. Т.е. предположим, что ее значение 5000, что будет происходит дальше? Как Ардуино посчитает и определит, что ей нужно делать? Или _currentPos. Где то хранится информация о местоположении двигателя в данный момент? От чего она отсчитывается? Этот момент в библиотеке не прописан и эти переменные просто постулируются.

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

на сайте автора библиотеки всё расписано, ещё раз внимательно почитайте.

currentPos() это положение шаговика в данный момент. подали питание - равно нулю, прошли сто шагов по ч. с.   100, триста против часовой - 200, пятьсот по ч.с. 300.
думаю понятно.

 

 

5N62V
Offline
Зарегистрирован: 25.02.2016

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

Текущее и целевое  положение можно обнулить в любой момент:

    stepper.setCurrentPosition(current);
    stepper.moveTo(stepper.currentPosition());

 

funnycorn
Offline
Зарегистрирован: 26.10.2017

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

Вы можете привести пример расчёта этой переменной?

  

 

funnycorn
Offline
Зарегистрирован: 26.10.2017

Что программа будет делать с введённым значением этой переменной? Как она понимает, что нужно сделать, чтобы выполнить данное условие? 

kalapanga
Offline
Зарегистрирован: 23.10.2016

funnycorn пишет:

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

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

vvadim
Offline
Зарегистрирован: 23.05.2012
AccelStepper::AccelStepper(uint8_t interface, uint8_t pin1, uint8_t pin2, uint8_t pin3, uint8_t pin4)
{
    _interface = interface;
    _currentPos = 0;
    _targetPos = 0;
    _speed = 0.0;
    _maxSpeed = 1.0;
    _acceleration = 1.0;
    _sqrt_twoa = 1.0;
    _stepInterval = 0;
    _minPulseWidth = 1;
    _enablePin = 0xff;
    _lastStepTime = 0;
    _pin[0] = pin1;
    _pin[1] = pin2;
    _pin[2] = pin3;
    _pin[3] = pin4;

    // NEW
    _n = 0;
    _c0 = 0.0;
    _cn = 0.0;
    _cmin = 1.0;
    _direction = DIRECTION_CCW;

    int i;
    for (i = 0; i < 4; i++)
	_pinInverted[i] = 0;
    enableOutputs();
}

 

funnycorn
Offline
Зарегистрирован: 26.10.2017

Бамп темы ещё вопросом. 

После выполнения moveTo() на драйвере шаговика остаётся гореть один светодиод, т.е. ток на одной катушке остаётся, что приводит к дополнительному нагреву обмоток. Есть ли функция в этой библиотеке, которая "полностью" останавливала бы шаговик, приводя все напряжения на выходных пинах в ноль?

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

а это уже не библиотека, это уже работа с драйвером шаговика.

funnycorn
Offline
Зарегистрирован: 26.10.2017

А сам драйвер тут при чем? Если что, речь о uln2003, не уточнил сразу. Это просто сборка из ключей. Сигнал на него идёт с дуины и вся обработка шагов заключена исключительно в дуине и исходит из синтаксиса библиотеки. 

sadman41
Offline
Зарегистрирован: 19.10.2016
Так пойдет?
 
 
/// Disable motor pin outputs by setting them all LOW
/// Depending on the design of your electronics this may turn off
/// the power to the motor coils, saving power.
/// This is useful to support Arduino low power modes: disable the outputs
/// during sleep and then reenable with enableOutputs() before stepping
/// again.
void    disableOutputs();
funnycorn
Offline
Зарегистрирован: 26.10.2017

Должно пойти, спасибо 

funnycorn
Offline
Зарегистрирован: 26.10.2017

По задумке движок должен крутиться 1 секунду и вставать, но 

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

2. Движок делает один шаг и встает, не смотря на то, что цикл продолжает выполняться

Что я делаю не так

#include<AccelStepper.h>
#define HALFSTEP 8 
#define  pin_motor1    2
#define  pin_motor2    3
#define  pin_motor3    4
#define  pin_motor4    5
#define  pin_button    8
uint32_t ms_servo        = 0;
int ms = 0;
AccelStepper StepGo(HALFSTEP, pin_motor1, pin_motor3, pin_motor2, pin_motor4);

void setup() {
  Serial.begin(9600);
  StepGo.setMaxSpeed(5000.0);
  StepGo.setSpeed(500.0);
  StepGo.setAcceleration(1000.0);
}

void loop() {
  if ((ms - ms_servo) < 1000) {
  uint32_t ms        = millis();
  Serial.println(ms - ms_servo);
  StepGo.run();
  }
}

 

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

(0 - 0) < 1000 будет всегда.

funnycorn
Offline
Зарегистрирован: 26.10.2017

нет, значение переменной ms обновляется внутри

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

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

Не обновляется. Вынесите ваш println() из if() {...} и проверьте.

funnycorn
Offline
Зарегистрирован: 26.10.2017

Если я вынесу его из if, то он ничего не покажет, т.к. прога в if зацикливается и не выходит из {...} 

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

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

funnycorn пишет:

Если я вынесу его из if, то он ничего не покажет, т.к. прога в if зацикливается и не выходит из {...} 

Не зацикливается.

funnycorn пишет:

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

С чего вы это взяли?

funnycorn
Offline
Зарегистрирован: 26.10.2017

funnycorn пишет:

Если я вынесу его из if, то он ничего не покажет, т.к. прога в if зацикливается и не выходит из {...} 

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

Сделал, правда не обновлялось значение и вне if {...} ms показывало ноль. Как так? В if {...} одно, а вне другое? Да и millis() должно работать довольно таки однозачно, разве нет?

Тем не менее само условие ms - ms_servo должно работать верно, то есть я вывожу его вне if и оно в течении секунды становится больше 1000, но в if все равно заходит. Почему?

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

funnycorn пишет:

Сделал, правда не обновлялось значение. Но почему?

Потому что, в общем случае, все объявленные внутри блока {} переменные уничтожаются при его завершении.

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

На самом деле вы присваиваете значение millis() переменной, которую сразу же и уничтожаете. 

funnycorn
Offline
Зарегистрирован: 26.10.2017

Ладно, спасибо Вам, допустим я разобрался с if посмотрев как работают  простые примеры

Но Шаговик всё ещё не работает, делает один шаг и встаёт, хотя тело if прогоняется постоянно в течении секунды

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

А вы ему сказали, куда степать-то ? Например через .moveTo(500) в setup()?

funnycorn
Offline
Зарегистрирован: 26.10.2017

Я как раз хотел от этого уйти, чтобы он просто стэпал, грубо говоря пока его не остановит условие (но не приход куда то, а, например как в данном случае, прошествие 1 секунды, или нажатие кнопки). Из описания библиотеки самое подходящее на мой взгляд - run(). Как я понял, один раз вызвали - один шаг. Пока вызываем в цикле - идём, условие нарушилось - встали. Но чтото пошло не так)

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

Ну, возможно вам просто нужно поэкспериментировать с другими функциями: http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html

Я, честно, говоря, степаю сам, без библиотеки - поэтому сильно в аксельстеппере не ориентируюсь.