Вращение шагового двигателя через потенциометр.

voronroman
Offline
Зарегистрирован: 03.06.2019

Всем привет! Данный вопрос много где поднимался, а решения так и не нашёл. В ардуино новичок.

Имеется шаговый двигатель 28byj-48, нужно чтобы при вращении потенциометра поворачивался шаговый двигатель в определенную сторону.

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

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

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

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

И где ваш скетч?

voronroman
Offline
Зарегистрирован: 03.06.2019

Он работал не так как хотелось, я его и не сохранял. Сейчас напишу по новой, и  прикреплю

voronroman
Offline
Зарегистрирован: 03.06.2019

sadman41 пишет:

И где ваш скетч?

Примерно так было

#include <TinyStepper_28BYJ_48.h>

const int MOTOR_IN1_PIN = 8;
const int MOTOR_IN2_PIN = 9;
const int MOTOR_IN3_PIN = 10;
const int MOTOR_IN4_PIN = 11;

#define analogInPin A0           // потенциометр

const byte averageFactor = 10;   // коэффициент сглаживания показаний (0 = не сглаживать)
                                // чем выше, тем больше "инерционность"
int sensorValue = 0;            // считанное значение
const int STEPS_PER_REVOLUTION = 2048;
TinyStepper_28BYJ_48 stepper;

void setup() 
{
  stepper.connectToPins(MOTOR_IN1_PIN, MOTOR_IN2_PIN, MOTOR_IN3_PIN, MOTOR_IN4_PIN);
}

void loop() 
{
    int newSensorValue = analogRead(A5);
  if (averageFactor > 0)        // усреднение показаний для устранения "скачков"
  {      
    sensorValue = (sensorValue * (averageFactor - 1) + newSensorValue) / averageFactor;  
    // <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5 я тут немного поправил
  } 
  else 
  {
    sensorValue=newSensorValue; // не делаем усреднений, что прочитали то и считаем выводом
  
  }
  stepper.setSpeedInStepsPerSecond(500);
  stepper.setAccelerationInStepsPerSecondPerSecond(500);
  stepper.moveToPositionInSteps(sensorValue);
}


 

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

Вроде всё ОК, грубых ошибок нет. В Serial Plotter повыводите sensorValue, увидите как он себя ведёт.

voronroman
Offline
Зарегистрирован: 03.06.2019

sadman41 пишет:

Вроде всё ОК, грубых ошибок нет. В Serial Plotter повыводите sensorValue, увидите как он себя ведёт.

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

 

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

В лупе функции мотора уберите временно.

moveToPositionInSteps(), поди, блокирующая и, пока мотор шагает на позицию, вы накручиваете потенциометр. Так и получается, что скачок происходит.