Поворотная видеокамера. ШД noname, драйвер A4988
- Войдите на сайт для отправки комментариев
Вс, 07/02/2016 - 22:36
Видеокамера будет установлена на платформу управляемую 2мя ШД (маркировки нет, достались из неисправный поворотной камеры, 4 вывода) с помощью джойстика. Драйвер а4988. 2шт схема включения стандартная.
2 оси
Горизонталь поворот 360
Вертикаль 90(но возможно до 180)
Прошу помощи от уважаемых форумчан как связать возвращаемое значение analogRead от 0 до 1023 связать с командами для ШД? И также камера в случае покоя должна остаться под заданным углом, (шд должны удерживать заданное положение, т.к. боюсь что от веса под действием центра тяжести она будет опускаться вниз) - мне нужно использование библиотеки Accelstepper для данной задачи?
Благодарю всех откликнувшихся.
#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 шаг в ту же сторону что и первый раз.
Здесь http://pacpac.ru/forum/viewtopic.php?p=919 код рабочий.
Спасибо 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 сек пока я не поменяю направление вращения.
Заранее всем спасибо.
чего-то я не понял, а где указание на направление вращения? обычно в библиотеке это отдельные параметры как и строки 9,10,27 (пост 3) т.е. нехватает еще одного параметра, где пример тестового кода?
Хм, мне сложно объяснить, но опытным путем проверено - джойстик управляет мотором в обе стороны, код составлял брав за основу код и поста выше по ссылке.
Левое положение джойстика вернет 1, 1 - 512 равно -511 ранспид(-511) крутит его в обратную сторону. Вся соль в 13й строке).
Да и для работы ШД нужно задать только макс.скорость и ускорение
///убираем дребезг джойстика, а также создаем слепую зону 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();}Спасибо Вам за помощь, только в тот момент как оптопара будет закрыта, ШД исходя из кода не будет двигаться никуда, т.е. код работает только до момента пока он не встретит оптопару. Видимо нужно вводить еще одно условие при котором stopR ==0(ШД сделал 360 гр и замер в положении с закрытой оптопары) и нужно узнавать что оператор поменял направление джойстика(разностью значений Х в конце программы и Х в новом цикле) и тогда нужно снова запускать ШД, но как это выразить к коде пока не знаю.