Регулировка RPM шагового двигателя.

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){   //проверяем состояние кнопки, если нажата выполняем код:
        delay(500);                         //ждем половину секунды
        Serial.println("RUN_R");            //отправляем в порт сообщение
        stepper.enable();                   //активируем степпер
        stepper.startRotate(50 * 360);    //запускаем вращение
;
            }


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

  
}

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

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

Железо уже собрано и макет работает, осталось доло за софтом.

Спасибо.

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

Не видно. где вы в программе пытались менять скорость?  - в строчках 13 и 15 вы определили дефайны для скорости и микрошага - но потом их нигде не используете. Кроме того, дефайн в строке 13 неправильный, от того, что вы в дефайне определили замену RPM на va - скорость от значения val зависеть не станет.

lСмотрите библиотеку - там есть метод stepper.begin(), который принимает и устанавливает эти параметры.

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

почитайте про кнопки, а то у вас както не кошерно кнопки обрабатываются.

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

 

.

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

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

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

Спасибо.

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

wowscheg, эта задача решается за полчаса переделкой скетча "Blink без delay". Попробуйте с помощью одной кнопки заставлять светодиод моргать, по другой останавливать процесс, а переменником регулировать интервал.

strarbit
strarbit аватар
Offline
Зарегистрирован: 12.06.2016

StepperDriver/examples/NonBlocking/NonBlocking.ino
stepper.begin(RPM, MICROSTEPS);
so see
IDE examples->Stepper->stepper_speedControl

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

Парни, похоже я сдаюсь. Не выходит каменный цветок.

Пробовал по всякому... Сочинил вот такое:

  // read the sensor value:
  int sensorReading = analogRead(A0);
  // map it to a range from 0 to 300:
  int motorSpeed = map(sensorReading, 0, 1023, 0, 300);
  stepper.begin(motorSpeed, MICROSTEPS);

И почему это не работает, не могу понять. Просто пищит двигатель и не работает.

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

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

wowscheg пишет:

Не выходит каменный цветок.

А неча засовывать куда попало.))) Вы из #4 пробовали?

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

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

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

wowscheg пишет:

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

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

strarbit
strarbit аватар
Offline
Зарегистрирован: 12.06.2016

/*
* Set target motor RPM (1-200 is a reasonable range)
*/
// read the sensor value:
int sensorValue = analogRead(A0);
if (sensorValue != prevsensorValue) {
  prevsensorValue = sensorValue;     
  // map it to a range from 1 to 200:
  int motorSpeed = map(sensorReading, 0, 1023, 1, 200);
  stepper.setRPM(motorSpeed);    
}

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

strarbit

Ваш код не компилировался, переделал вот так:

  // read the sensor value:
int sensorValue = analogRead(A0);
int prevsensorValue = 0;
 if (sensorValue != prevsensorValue) {
   prevsensorValue = sensorValue;
    // map it to a range from 1 to 200:
   int motorSpeed = map(sensorValue, 0, 1023, 1, 200);
  stepper.setRPM(motorSpeed);
  }

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

А вот когда в прописать в define RPM 30, ну или любую другую скорость, мотор ведет себя тихо, как и хотелось бы.

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

В библиотеке есть такая штука:

stepper.begin(RPM, MICROSTEPS);

Так вот, если вместо RPM вписать число, то таким образом можно регулировать обороты, вот только как на этот RPM завести показания с потенциометра?

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

Попробовал вот такую конструкцию:

int sensorValue = analogRead(A0);
int prevsensorValue = 0;
 if (sensorValue != prevsensorValue) {
   prevsensorValue = sensorValue;
    // map it to a range from 1 to 200:
   int motorSpeed = map(sensorValue, 0, 1023, 1, 200);
 // stepper.setRPM(motorSpeed);
   stepper.begin(motorSpeed, MICROSTEPS);
   Serial.println(motorSpeed);
  }

Начинает работать потенциометр, но есть одна проблема. При значении АЦП - 1 мотор начинает потихоньку вращатся, но как только поднимаю значение на АЦП, меняется тон писка и мотор останавливается. Ничего не понимаю...

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

Покажите, как вы модифицировали "blink без delay" под мотор.

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

Менял значение long interval = 1000

Кнопок не делал, так как изначально понимал, что будет грохотать двигатель.

 

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

wowscheg пишет:

Попробовал вот такую конструкцию:

int sensorValue = analogRead(A0);
int prevsensorValue = 0;
 if (sensorValue != prevsensorValue) {
   prevsensorValue = sensorValue;
    // map it to a range from 1 to 200:
   int motorSpeed = map(sensorValue, 0, 1023, 1, 200);
 // stepper.setRPM(motorSpeed);
   stepper.begin(motorSpeed, MICROSTEPS);
   Serial.println(motorSpeed);
  }

Начинает работать потенциометр, но есть одна проблема. При значении АЦП - 1 мотор начинает потихоньку вращатся, но как только поднимаю значение на АЦП, меняется тон писка и мотор останавливается. Ничего не понимаю...

неправильно,

int prevsensorValue = 0; надо вытащить вверх до setup
wowscheg
Offline
Зарегистрирован: 14.02.2012

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

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

wowscheg пишет:

Менял значение long interval = 1000

Кнопок не делал, так как изначально понимал, что будет грохотать двигатель.

Сделайте с кнопками и потенц. Затем нужно будет один фокус провернуть и грохота не будет.

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

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

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

Виктор, настройка тока здесь не при чем, потому как при жестко прописаном RPM мотор крутится хорошо.

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


  // read the sensor value:
int sensorValue = analogRead(A0);
//int prevsensorValue = 0;
 if (sensorValue != prevsensorValue) {
   prevsensorValue = sensorValue;
    // map it to a range from 1 to 200:
   int motorSpeed = map(sensorValue, 0, 1023, 1, 200);
 // stepper.setRPM(motorSpeed);
   stepper.begin(motorSpeed, MICROSTEPS);
   Serial.println(motorSpeed);
   delay(500);
  }

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

Вот код целиком:

/*
   Example using non-blocking mode to move until a switch is triggered.

   Copyright (C)2015-2017 Laurentiu Badea

   This file may be redistributed under the terms of the MIT license.
   A copy of this license has been included with this distribution in the file LICENSE.
*/
//int analogPin = 1;     // номер порта к которому подключен потенциометр
//int val = 0;           // переменная для хранения считываемого значения

#include <Arduino.h>

// this pin should connect to Ground when want to stop the motor
#define STOPPER_PIN 4
#define START_L_PIN 3
#define START_R_PIN 2

// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200
//#define RPM motorSpeed
int prevsensorValue = 0;
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
#define MICROSTEPS 16

#define DIR 8
#define STEP 9
#define SLEEP 13 // optional (just delete SLEEP from everywhere if not used)


#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(START_R_PIN, INPUT_PULLUP);

  // Configure stopper pin to read HIGH unless grounded
  pinMode(STOPPER_PIN, INPUT_PULLUP);



}

void loop() {

 ///*
   // Set target motor RPM (1-200 is a reasonable range)

  // read the sensor value:
int sensorValue = analogRead(A0);
//int prevsensorValue = 0;
 if (sensorValue != prevsensorValue) {
   prevsensorValue = sensorValue;
    // map it to a range from 1 to 200:
   int motorSpeed = map(sensorValue, 0, 1023, 1, 200);
 // stepper.setRPM(motorSpeed);
   stepper.begin(motorSpeed, MICROSTEPS);
   Serial.println(motorSpeed);
   delay(500);
  }
 // */



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

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

  }


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

  //motor control loop - send pulse and return how long to wait until next pulse
  unsigned wait_time_micros = stepper.nextAction();

  // 0 wait time indicates the motor has stopped
  if (wait_time_micros <= 0) {
    stepper.disable();       // comment out to keep motor powered
    delay(500);
  }

  // (optional) execute other code if we have enough time
  if (wait_time_micros > 100) {
    // other code here
  }
}

(R2AJI)

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

Намоточный станок что ли?

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

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

Вот рабочий код:


#include <Arduino.h>
#define STOPPER_PIN 4
#define START_L_PIN 3
#define START_R_PIN 2
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200
//#define RPM motorSpeed
int prevsensorValue = 0;
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
#define MICROSTEPS 16

#define DIR 8
#define STEP 9
#define SLEEP 13 // optional (just delete SLEEP from everywhere if not used)

#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(START_R_PIN, INPUT_PULLUP);

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



}

void loop() {


  // Старт по кнопке на право
  if (digitalRead(START_R_PIN) == LOW) {      //проверяем состояние кнопки, если нажата выполняем код:
    delay(50);                                //ждем половину секунды
    int sensorValue = analogRead(A0);
    if (sensorValue != prevsensorValue)
      prevsensorValue = sensorValue;
    int motorSpeed = map(sensorValue, 0, 1023, 1, 200);  // map it to a range from 1 to 200:
    stepper.begin(motorSpeed, MICROSTEPS);
    Serial.println(motorSpeed);
    Serial.println("RUN_R"); 
    Serial.println(motorSpeed);  //отправляем в порт сообщение
    stepper.enable();                          //активируем степпер
    stepper.startRotate(-50 * 360);            //запускаем вращение
  }

  // Старт по кнопке на лево
  if (digitalRead(START_L_PIN) == LOW) {      //проверяем состояние кнопки, если нажата выполняем код:
    Serial.println("RUN_L");                  //отправляем в порт сообщение
    delay(50);                                //ждем половину секунды
    int sensorValue = analogRead(A0);
    if (sensorValue != prevsensorValue)
      prevsensorValue = sensorValue;
    int motorSpeed = map(sensorValue, 0, 1023, 1, 200);   // map it to a range from 1 to 200:
    stepper.begin(motorSpeed, MICROSTEPS);
    Serial.println(motorSpeed);
    stepper.enable();                       //активируем степпер
    stepper.startRotate(50 * 360);          //запускаем вращение в нужную сторону

  }


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

  //motor control loop - send pulse and return how long to wait until next pulse
  unsigned wait_time_micros = stepper.nextAction();

  // 0 wait time indicates the motor has stopped
  if (wait_time_micros <= 0) {
    stepper.disable();       // comment out to keep motor powered
    delay(50);
  }

}

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

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

Значит проблема в потенциометре/АЦП - болтает их. Соответственно - шаг переменный, что вызывает ощущение неравномерности звукового фона от мотора. А если его держать, то, скорее всего и микроудары почувствовать можно. Опять же - на шаговике при определенной скорости можно словить резонанс. Дорогие лидшайны имеют регулировку по фазам переключения (вроде так называется), что позволяет получить близкий к сайленту звук при работе.

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

wowscheg пишет:

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

Вот рабочий код:


#include <Arduino.h>
#define STOPPER_PIN 4
#define START_L_PIN 3
#define START_R_PIN 2
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200
//#define RPM motorSpeed
int prevsensorValue = 0;
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
#define MICROSTEPS 16

#define DIR 8
#define STEP 9
#define SLEEP 13 // optional (just delete SLEEP from everywhere if not used)

#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(START_R_PIN, INPUT_PULLUP);

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



}

void loop() {


  // Старт по кнопке на право
  if (digitalRead(START_R_PIN) == LOW) {      //проверяем состояние кнопки, если нажата выполняем код:
    delay(50);                                //ждем половину секунды
    int sensorValue = analogRead(A0);
    if (sensorValue != prevsensorValue)
      prevsensorValue = sensorValue;
    int motorSpeed = map(sensorValue, 0, 1023, 1, 200);  // map it to a range from 1 to 200:
    stepper.begin(motorSpeed, MICROSTEPS);
    Serial.println(motorSpeed);
    Serial.println("RUN_R"); 
    Serial.println(motorSpeed);  //отправляем в порт сообщение
    stepper.enable();                          //активируем степпер
    stepper.startRotate(-50 * 360);            //запускаем вращение
  }

  // Старт по кнопке на лево
  if (digitalRead(START_L_PIN) == LOW) {      //проверяем состояние кнопки, если нажата выполняем код:
    Serial.println("RUN_L");                  //отправляем в порт сообщение
    delay(50);                                //ждем половину секунды
    int sensorValue = analogRead(A0);
    if (sensorValue != prevsensorValue)
      prevsensorValue = sensorValue;
    int motorSpeed = map(sensorValue, 0, 1023, 1, 200);   // map it to a range from 1 to 200:
    stepper.begin(motorSpeed, MICROSTEPS);
    Serial.println(motorSpeed);
    stepper.enable();                       //активируем степпер
    stepper.startRotate(50 * 360);          //запускаем вращение в нужную сторону

  }


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

  //motor control loop - send pulse and return how long to wait until next pulse
  unsigned wait_time_micros = stepper.nextAction();

  // 0 wait time indicates the motor has stopped
  if (wait_time_micros <= 0) {
    stepper.disable();       // comment out to keep motor powered
    delay(50);
  }

}

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

можно попробовать ввести флаги на кнопки

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

Владимир, вот так попробуй, сам не компилировал на ошибки не проверял )))

Ежели что, поправим )))
PS кстати подписан на твой канал на Ютубе, респект и уважуха, хочу себе кое-что из оборудования как и у тебя
 

#include <Arduino.h>
#define STOPPER_PIN 4
#define START_L_PIN 3
#define START_R_PIN 2
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200
//#define RPM motorSpeed
int prevsensorValue = 0;
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
#define MICROSTEPS 16

#define DIR 8
#define STEP 9
#define SLEEP 13 // optional (just delete SLEEP from everywhere if not used)

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

int motorSpeed;
byte flag_R = 0;
byte flag_L = 0;
byte flag_Speed = 0;

void setup() {
  Serial.begin(115200);
  //Конфигурация стартовых кнопкок
  pinMode(START_L_PIN, INPUT_PULLUP);
  pinMode(START_R_PIN, INPUT_PULLUP);
  //Конфигурация стоповой кнопки
  pinMode(STOPPER_PIN, INPUT_PULLUP);
}

void readSpeed(){
  int sensorValue = analogRead(A0);
  if (sensorValue != prevsensorValue){
  prevsensorValue = sensorValue;
  flag_Speed = 1;
  }
  motorSpeed = map(sensorValue, 0, 1023, 1, 200);  // map it to a range from 1 to 200:
 }


void loop() {
  readSpeed();  //Читаем потенциометр скорости 

  // Старт по кнопке на право
  if (digitalRead(START_R_PIN) == LOW || (flag_R == 1 && flag_Speed ==1)){  //проверяем состояние кнопки
    delay(50); //ждем 
    flag_L = 0;
    flag_R = 1; //
    stepper.begin(motorSpeed, MICROSTEPS);
    Serial.println(motorSpeed);
    Serial.println("RUN_R"); 
    Serial.println(motorSpeed);  //отправляем в порт сообщение
    stepper.enable();                          //активируем степпер
    stepper.startRotate(-50 * 360);            //запускаем вращение
    flag_Speed = 0;
  }

  // Старт по кнопке на лево
  if (digitalRead(START_L_PIN) == LOW || (flag_L == 1 && flag_Speed == 1)) {  //проверяем состояние 
    Serial.println("RUN_L");                  //отправляем в порт сообщение
    delay(50); //ждем 
    flag_L = 1;
    flag_R = 0; //
    stepper.begin(motorSpeed, MICROSTEPS);
    Serial.println(motorSpeed);
    stepper.enable();                       //активируем степпер
    stepper.startRotate(50 * 360);          //запускаем вращение в нужную сторону
    flag_Speed = 0;
  }


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

  //motor control loop - send pulse and return how long to wait until next pulse
  unsigned wait_time_micros = stepper.nextAction();

  // 0 wait time indicates the motor has stopped
  if (wait_time_micros <= 0) {
    stepper.disable();       // comment out to keep motor powered
    delay(50);
  }
}

 

Onkel
Offline
Зарегистрирован: 22.02.2016

монитором посмотрите, непрыгает ли MotorSpeed. Хороший электролит по питанию часто помогает.

 

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

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

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

Виктор, Ваш код компилируется, но не работает.

Мотор дергается но не крутится, на потенциометр откликается, частота и тональность дергания меняется.

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

wowscheg пишет:

Виктор, Ваш код компилируется, но не работает.

Мотор дергается но не крутится, на потенциометр откликается, частота и тональность дергания меняется.

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

попробуй
 

#include <Arduino.h>
#define STOPPER_PIN 4
#define START_L_PIN 3
#define START_R_PIN 2
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200
//#define RPM motorSpeed
int prevsensorValue = 0;
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
#define MICROSTEPS 16

#define DIR 8
#define STEP 9
#define SLEEP 13 // optional (just delete SLEEP from everywhere if not used)

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

int motorSpeed;
byte flag_R = 0;
byte flag_L = 0;
byte flag_Speed = 0;

void setup() {
  Serial.begin(115200);
  //Конфигурация стартовых кнопкок
  pinMode(START_L_PIN, INPUT_PULLUP);
  pinMode(START_R_PIN, INPUT_PULLUP);
  //Конфигурация стоповой кнопки
  pinMode(STOPPER_PIN, INPUT_PULLUP);
}

void readSpeed(){
  int sensorValue = analogRead(A0);
  if (sensorValue != prevsensorValue){
  prevsensorValue = sensorValue;
  flag_Speed = 1;
  }
  motorSpeed = map(sensorValue, 0, 1023, 1, 200);  // map it to a range from 1 to 200:
 }


void loop() {
  readSpeed();  //Читаем потенциометр скорости 

  // Старт по кнопке на право
  if (digitalRead(START_R_PIN) == LOW /*|| (flag_R == 1 && flag_Speed ==1)*/){  //проверяем состояние кнопки
    delay(50); //ждем 
    flag_L = 0;
    flag_R = 1; //
    stepper.begin(motorSpeed, MICROSTEPS);
    Serial.println(motorSpeed);
    Serial.println("RUN_R"); 
    Serial.println(motorSpeed);  //отправляем в порт сообщение
    stepper.enable();                          //активируем степпер
    stepper.startRotate(-50 * 360);            //запускаем вращение
    flag_Speed = 0;
  }

  // Старт по кнопке на лево
  if (digitalRead(START_L_PIN) == LOW /* || (flag_L == 1 && flag_Speed == 1)*/) {  //проверяем состояние 
    Serial.println("RUN_L");                  //отправляем в порт сообщение
    delay(50); //ждем 
    flag_L = 1;
    flag_R = 0; //
    stepper.begin(motorSpeed, MICROSTEPS);
    Serial.println(motorSpeed);
    stepper.enable();                       //активируем степпер
    stepper.startRotate(50 * 360);          //запускаем вращение в нужную сторону
    flag_Speed = 0;
  }


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

  //motor control loop - send pulse and return how long to wait until next pulse
  unsigned wait_time_micros = stepper.nextAction();

  // 0 wait time indicates the motor has stopped
  if (wait_time_micros <= 0) {
    stepper.disable();       // comment out to keep motor powered
    delay(50);
  }
}
      
sadman41
Offline
Зарегистрирован: 19.10.2016

Мотор-то киловаттный, поди?

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

sadman41 пишет:

Мотор-то киловаттный, поди?

ты так больше не делай, ночью приснилось, что по прежнему скетчу при нажатии на кнопку цикл запуска проходил многократно (16-32) раза пока двигатель не выйдет в рабочий режим...)))
Опыт общения с шаговиками ровно нулевой...
PS эксплуатировал следящие электроприводы станков чпу, с шаговиками сталкивался разве, что в кассах, принтерах да дисководах, но только как юзер, они там не ломаются

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

вот эти костыли попробуй:
 

#include <Arduino.h>
#define STOPPER_PIN 4
#define START_L_PIN 3
#define START_R_PIN 2
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200
//#define RPM motorSpeed
int prevsensorValue = 0;
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
#define MICROSTEPS 16

#define DIR 8
#define STEP 9
#define SLEEP 13 // optional (just delete SLEEP from everywhere if not used)

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

int motorSpeed;
byte flag_R = 0;
byte flag_L = 0;
byte flag_Speed = 0;
int i = 32;     // количество микрошагов при старте

void setup() {
  Serial.begin(115200);
  //Конфигурация стартовых кнопкок
  pinMode(START_L_PIN, INPUT_PULLUP);
  pinMode(START_R_PIN, INPUT_PULLUP);
  //Конфигурация стоповой кнопки
  pinMode(STOPPER_PIN, INPUT_PULLUP);
}

void readSpeed(){
  int sensorValue = analogRead(A0);
  if (sensorValue != prevsensorValue){
  prevsensorValue = sensorValue;
  flag_Speed = 1;
  }
  motorSpeed = map(sensorValue, 0, 1023, 1, 200);  // map it to a range from 1 to 200:
 }


void loop() {
  readSpeed();  //Читаем потенциометр скорости 

  // Старт по кнопке на право
  if (digitalRead(START_R_PIN) == LOW || (flag_R == 1 && flag_Speed ==1)){  //проверяем состояние кнопки
    delay(50); //ждем 
    i--;
    if(i<=0){
    flag_L = 0;
    flag_R = 1; //
    i=32;
    flag_Speed = 0;
    }
    stepper.begin(motorSpeed, MICROSTEPS);
    Serial.println(motorSpeed);
    Serial.println("RUN_R"); 
    Serial.println(motorSpeed);  //отправляем в порт сообщение
    stepper.enable();                          //активируем степпер
    stepper.startRotate(-50 * 360);            //запускаем вращение
    
      }

  // Старт по кнопке на лево
  if (digitalRead(START_L_PIN) == LOW || (flag_L == 1 && flag_Speed == 1)) {  //проверяем состояние 
    Serial.println("RUN_L");                  //отправляем в порт сообщение
    delay(50); //ждем 
     i--;
    if(i<=0){
    flag_L = 1;
    flag_R = 0; //
    i=32;
    flag_Speed = 0;
    }
   
    stepper.begin(motorSpeed, MICROSTEPS);
    Serial.println(motorSpeed);
    stepper.enable();                       //активируем степпер
    stepper.startRotate(50 * 360);          //запускаем вращение в нужную сторону
    flag_Speed = 0;
  }


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

  //motor control loop - send pulse and return how long to wait until next pulse
  unsigned wait_time_micros = stepper.nextAction();

  // 0 wait time indicates the motor has stopped
  if (wait_time_micros <= 0) {
    stepper.disable();       // comment out to keep motor powered
    delay(50);
  }
}

 

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

можно сделать очень просто - пока мотор двигается - потенциометр не опрашивать

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

b707 пишет:

можно сделать очень просто - пока мотор двигается - потенциометр не опрашивать

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

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

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

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

sadman41 пишет:

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

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

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

Громче - тише... крайне субъективное понятие.

Дешёвые драйверы в реальной конструкции всё равно будут вызывать вибрацию, скрежет и пр. В ютубах достаточно роликов типа "A4988 vs TMC2100", в которых наглядно показывается разница в звуке между агрегатами с простыми и продвинутыми драйверами.

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

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

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

sadman41 пишет:

однако человеку хочется "через библиотеку". Что ж, это его выбор.

блин, зачем на драйвере 4988 библиотека? - знай себе STEP дергай - вот и все управление

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

sadman41 пишет:

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

Он больше по харду ...
Давай, я ему попробую помочь, а ты подскажешь то волшебство )))

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

b707 пишет:

sadman41 пишет:

однако человеку хочется "через библиотеку". Что ж, это его выбор.

блин, зачем на драйвере 4988 библиотека? - знай себе STEP дергай - вот и все управление

Дак и я о том же. На блинке отладится, потом только вместо светодиода STEP пробивать быстрым HIGH-LOW. Если станок не с нанометровыми допусками - вполне себе тянет. Даже таймеров заводить не требуется.

Дел на полчаса.

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

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

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

Изобретать велосипед не стоит, если есть возможность поправить существующий РАБОЧИЙ и ТИХИЙ скетч, что бы регулировка оборотов была онлайном, то есть прямо на ходу, то я не против. Если нужно переписать все заново, то не стоит оно того.

Виктор, я сейчас на работе, твой скетч попробую вечером, после 21:00 по мск.

 

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

Владимир, напиши на почту НИК на яндексе

PS если работа мешает хобби ну её эту работу )))
 

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

Я, кстати, понял, почему на блинке было "громко" - микрошаг не был установлен. Если на скетче из первопоста фуллстеп врубить, то будет такая же песня.

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

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

 

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

wowscheg пишет:

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

 

какой именно, тот что с костылём?

попробовать уменьшать переменную i до 9

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

Да, который из поста #32

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

wowscheg пишет:

Да, который из поста #32

для начало подобрать delay - он у тебя равен 50, уменьшать до тех пор, пока не перестанет запускаться от кнопки, тогда посмотрим, что еще подкорректировать, просто сейчас любое изменение откликнется через 50 миллисекунд умножить на переменную i

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

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

Да ладно, не стоит оно того, реально ведь костыли...

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

wowscheg пишет:

Да ладно, не стоит оно того, реально ведь костыли...

обязано работать )))

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

strarbit
strarbit аватар
Offline
Зарегистрирован: 12.06.2016

3anic Bideo ot meก oH{\iHe ycTaHoBka ckopocT.