Поворотная видеокамера. ШД noname, драйвер A4988

Whynot.
Offline
Зарегистрирован: 19.11.2015

Видеокамера будет установлена на платформу управляемую 2мя ШД (маркировки нет, достались из неисправный поворотной камеры, 4 вывода) с помощью джойстика. Драйвер а4988. 2шт схема включения стандартная.

2 оси

Горизонталь поворот 360

Вертикаль 90(но возможно до 180)

Прошу помощи от уважаемых форумчан как связать возвращаемое значение analogRead от 0 до 1023 связать с командами для ШД? И также камера в случае покоя должна остаться под заданным углом, (шд должны удерживать заданное положение, т.к. боюсь что от веса под действием центра тяжести она будет опускаться вниз) - мне нужно использование библиотеки Accelstepper для данной задачи?

Благодарю всех откликнувшихся.

 

Whynot.
Offline
Зарегистрирован: 19.11.2015
#include <AccelStepper.h>
int sensorX = A0;
int X =0;
AccelStepper Stepper1(1,9,8);
void setup() {
Stepper1.setMaxSpeed(2000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)

Stepper1.setAcceleration(8000); //устанавливаем ускорение (шагов/секунду^2)  
  

}

void loop() {
   X = analogRead(sensorX);  // считывание значения джойстика
   
   if (X > 600)
   {
    //if(Stepper1.distanceToGo()==0){
      Stepper1.run();
      Stepper1.move(400);//
      delay(1000);
   //}
   } 
   if (X < 450)
   {
    //if(Stepper1.distanceToGo()==0){
      Stepper1.run();
      Stepper1.move(-400);//
      delay(1000);
   //}
   }
   } 

Данный код не работает. При отклонении рычага джойстика ШД делает 1 шаг, при отклонении в др сторону делает 1 шаг в ту же сторону что и первый раз. 

vladimir62
vladimir62 аватар
Offline
Зарегистрирован: 10.11.2015

Здесь http://pacpac.ru/forum/viewtopic.php?p=919 код рабочий.

Whynot.
Offline
Зарегистрирован: 19.11.2015

Спасибо vladimir62 за ссылку на код. Изменил под свои нужды.

 

Помогите доработать остановку при достижении двигателем поворота 360 градусов. Используется оптопара, на платформе закреплена заслонка которая управляет оптопарой. 33 открыт 215 закрыт. Код работает но логика глупая, Помогите пожалуйста с логикой

#include <AccelStepper.h>
int sensorX = A0; l; //джойстик ось Х
int KEY = A1; // оптопара, в режиме есть просвет возвращает 33, нет просвета возвращает 215
int X=0; // хранит значения джойстика оси Х
boolean flag =0;
unsigned long new_time = 0;
AccelStepper Stepper1(1,9,6);
void setup() {
Stepper1.setMaxSpeed(1000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
Stepper1.setAcceleration(30000); //устанавливаем ускорение (шагов/секунду^2)  
}
void loop() {
   X = analogRead(sensorX)-512;  // считывание значения джойстика
///убираем дребезж джойстика, а также создаем слепую зону
    if (X > 100) {
    X = X;
  } else if (X < -100) {
    X = X;
  } else {
    X = 0;
  }
///  
   Stepper1.setSpeed(X);// устанавливаем скорость двигателя
   //Stepper1.runSpeed();
   
  if (analogRead(KEY) >100) { // если просвет оптопары закрыт(двигатель хочет пойти на 2й круг)
   Stepper1.stop(); // остановись
   if(!flag){
     flag=1;
     new_time=millis()+500;} // подожди пока пользователь переведет джойстик в др. сторону
   else if(millis() > new_time){
     flag=0;
Stepper1.runSpeed(); //запусти снова двигатель
}
   
   }
   else Stepper1.runSpeed(); // запускаем двигатель
}

Кусок скетча с 26 по 34 останавливает и запускает ШД на 1 шаг каждые 0.5 сек пока я не поменяю направление вращения.

Заранее всем спасибо.

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

чего-то я не понял, а где указание на направление вращения? обычно в библиотеке это отдельные параметры как и строки 9,10,27  (пост 3) т.е. нехватает еще одного параметра, где пример тестового кода?

Whynot.
Offline
Зарегистрирован: 19.11.2015

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

Whynot.
Offline
Зарегистрирован: 19.11.2015

Левое положение джойстика вернет 1, 1 - 512 равно -511 ранспид(-511) крутит его в обратную сторону. Вся соль в 13й строке).
Да и для работы ШД нужно задать только макс.скорость и ускорение

Гриша
Offline
Зарегистрирован: 27.04.2014
///убираем дребезг джойстика, а также создаем слепую зону
    if (X > 100) {
    X = X;
  } else if (X < -100) {
    X = X;
  } else {
    X = 0;
  }

Можно упростить запись

///убираем дребезг джойстика, а также создаем слепую зону
    if   (X < -100 || X > 100) { X = X;}
    else                       { X = 0;  }

|| и && - логические операторы

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

Я бы добавил что-то типа:

int stopR;
…..
 if (analogRead(KEY) >100) { stopR =0;}
 else                      { stopR =1;}

а потом выполнял (где это необходимо) 

if   (stopR !=0 &&  X < 100) { Stepper1.runSpeed();}

 

Whynot.
Offline
Зарегистрирован: 19.11.2015

Спасибо Вам за помощь, только в тот момент как оптопара будет закрыта, ШД исходя из кода не будет двигаться никуда, т.е. код работает только до момента пока он не встретит оптопару. Видимо нужно вводить еще одно условие при котором stopR ==0(ШД сделал 360 гр и замер в положении с закрытой оптопары) и нужно узнавать что оператор поменял направление джойстика(разностью значений Х в конце программы и Х в новом цикле) и тогда нужно снова запускать ШД, но как это выразить к коде пока не знаю.