Панорамная головка на Arduino

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
adil
Сообщения: 3
Зарегистрирован: 08 фев 2015, 15:54

Re: Панорамная головка на Arduino

Сообщение adil »

мы можем в личке по общаться? Можете вашу почту
arthurilyuts
Сообщения: 30
Зарегистрирован: 07 дек 2014, 22:57

Re: Панорамная головка на Arduino

Сообщение arthurilyuts »

Приветствую Вас Mr.Kubikus !!!

Спустя долгое время, снова нуждаюсь в Вашем совете.
А именно, пытаюсь немного переделать скетч-код из данной ветки. К стати говоря, о данных изменениях, Вас уже спрашивали и другие, но судя по последним "коментам", до практики это так и не дошло наверное.

Итак, нужда в следуйшем:
1 - Сделать джойстик чуствительным к нажатию. То есть, чем больше жмешь, тем больше скорость мотора. (Вы уже кому то советовали в строчке "stpMotor1.setSpeed(nMotor1MV);" , значение "nMotor1MV" поменять на "nMotor1SP" , однако желаемого результата это не дало. Вернее сказать, результат получился не совсем тот, что нужно.
Во первых, максимальная скорость мотора в целом упала где-то, на 50% и во вторых, даже при центральном положении джойстика, моторы начали медленно шагать, как секундная стрелка часов. Думая, что проблема с зоной нечувствительности, пробовал изменять значение "if (nMotor1SP > 100)" от 5 до 500, однако данные изменения никакой разницы не дало.)

2 - Сохранить функцию переменного резистора, для выставления порога максимальной скорости мотора.

3 - Добавить еще один переменный резистор, для выставления порога плавного старта и торможения мотора, так называемый RAMP. (Читал, что Вы советовали кому-то посмотреть в самой библиотеке, однако уровень моего знания (незнания), да и многих других читателей данной ветки, вынуждает просить Вас помочь и в этом тоже, тем более, что эту функцию еще и нужно привязать к потенциометру.)

Ну и несколько вопросов так, из любопытства:
- В строке "#define MOTOR2_SPR 200" Пробовал менять значение 200, даже "0" ставил, а разницы не заметил. Почему?
- Какое максимальное значение можно ставить в строчке "#define MOTOR1_MAX_SPEED 5000.0"? или как ускорить шаговики?
- "#define MOTOR1_INIT_SPEED 100.0" Что это значение обозначает?
- "stpMotor1.setAcceleration(10.0);" Что это значение обозначает?

Да, к стати, из скетч-кода удалил все, что было связано с концевыми кнопками. Они не нужны.

Код: Выделить всё

#include <AccelStepper.h>

#define MOTOR1_DIR_PIN  8
#define MOTOR2_DIR_PIN  11

#define MOTOR1_STEP_PIN 9
#define MOTOR2_STEP_PIN 10


#define MOTOR1_SPR 200  // Кол-во шагов на 1 оборот вала двигателя
#define MOTOR2_SPR 200  // Пробовал менять данное значение, даже "0" ставил, а разницы не заметил

#define MOTOR1_MAX_SPEED 5000.0 
#define MOTOR2_MAX_SPEED 5000.0

#define MOTOR1_INIT_SPEED 100.0 // что это значение обозначает?
#define MOTOR2_INIT_SPEED 100.0

#define MOTOR1_JOY_IN 0 // Ось Y джойстика
#define MOTOR2_JOY_IN 1 // Ось X джойстика
#define SPEED_KNOB_IN 2 // Задатчик скорости - переменный резистор 1К

AccelStepper stpMotor1(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN);
AccelStepper stpMotor2(AccelStepper::DRIVER, MOTOR2_STEP_PIN, MOTOR2_DIR_PIN);

int nMotor1SP, nMotor2SP;            // Задание направления от джойстика
int nSpeedSP;                        // Задание скорости от задачика
int nMotor1MV, nMotor2MV;            // Задание скорости после ограничителя


void setup() {                
  phInit();
}

void loop() {
  phGetCommand();
  phMotorRun();
}


void phInit()
{
  pinMode(MOTOR1_DIR_PIN, OUTPUT);
  pinMode(MOTOR2_DIR_PIN, OUTPUT);
  pinMode(MOTOR1_STEP_PIN, OUTPUT);
  pinMode(MOTOR2_STEP_PIN, OUTPUT);
 
  
  nMotor1MV = 0;
  nMotor2MV = 0;
  stpMotor1.setMaxSpeed(MOTOR1_MAX_SPEED);
  stpMotor2.setMaxSpeed(MOTOR2_MAX_SPEED);
  stpMotor1.setAcceleration(10.0); // что это значение обозначает? 
  stpMotor2.setAcceleration(10.0);
  stpMotor1.setSpeed(0);
  stpMotor2.setSpeed(0);
  

  
  
  return;
}

void phGetCommand()
{
  nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512;
  nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512;
  nSpeedSP = 1023 - analogRead(SPEED_KNOB_IN);
  
  
///////////////////////////////////////////////// 
// Этот код обеспечивает зону нечувствительности - мотор не реагирует на малые отклонения джойстика от нейтрального положения:
  if (nMotor1SP > 100) {
    nMotor1MV = nSpeedSP;
  } else if (nMotor1SP < -100) {
    nMotor1MV = -nSpeedSP;
  } else {
    nMotor1MV = 0;
  }
  
  nMotor1MV = nMotor1MV; // Стояло: nMotor1MV = nMotor1MV / 5; Зачем в конце стоит "/ 5" ?
  if (nMotor2SP > 100) {
     nMotor2MV = nSpeedSP;
     }
  else if (nMotor2SP < -100) {

nMotor2MV = -nSpeedSP;
  } else {
    nMotor2MV = 0;
}
 nMotor2MV = nMotor2MV; // Стояло: nMotor2MV = nMotor2MV * -1; Зачем в конце стоит "* -1" ?
}
/////////////////////////////////////////////////
/////////////////////////////////////////////////
void phMotorRun() 

{
  stpMotor1.setSpeed(nMotor1MV); // для регултровки скорости от джойстика, "nMotor1MV" менял на "nMotor1SP". Результат, максимальная скорость упала на +-50%, а так же моторы начали тикать как секундная стрелка часов.
  stpMotor2.setSpeed(nMotor2MV); 
  stpMotor1.runSpeed();
  stpMotor2.runSpeed();  
}
Спасибо Вам!!!
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Панорамная головка на Arduino

Сообщение Mr.Kubikus »

Привет!

Макроопределения MOTOR1_SPR и MOTOR2_SPR в строках 10 и 11 нигде в коде не используются. Их можно смело выкинуть. Видимо остались от предыдущего проекта.

С MOTOR1_INIT_SPEED и MOTOR2_INIT_SPEED аналогично - не используются.
С уважением, Григорий
GitHub FB ВК
arthurilyuts
Сообщения: 30
Зарегистрирован: 07 дек 2014, 22:57

Re: Панорамная головка на Arduino

Сообщение arthurilyuts »

И сново здравствуйте!
На англо-язычных просторах Интернета нашел готовый пример скетч-кода с так называемым RAMP-ом или по ихнему S-Curve.
Попробовал, это то что надо!!!! Мотор плавно стартует, некоторое время вращается на заданной скорости и потом медленно тормозит!
Одним словом, МЕЧТА всех пользователей кино-оператоскими головками, кранами, слайдерами и т.д. и т.п.
Вот только теперь вопрос, как внедрить этот "S-Curve" скетч-код в Ваш скетч "Панорамная головка на Arduino"?
Mr.Kubikus, помогите ПЛИЗЗЗЗ!!! Нужно привязать данный скетч на джойстик.

Знаю, что уже писал это ранее, все же хочу повторится.
- При нажатии на джойстик, мотор плавно стартует.
- Чем больше отклонение джойстика, тем выше скорость мотора.
- Порог максимальной скорости, хочется задавать отдельным потенциометром.
- При отпускании джойстика в исходное положение, мотор плавно тормозит.
- Время плавного СТАРТа и СТОПа хочется задавать отдельным потенциометром.

За ранее СПАСИБО!!!

Код: Выделить всё

/*
=============================================================
=       Project: S curve
=      Language: Arduiino r12
=          Date: January 2008
=        Author: C. Eckert
=============================================================
*/

// Givens
long ta = 3e6;     // acceleration time (microsec)
long td = 3e6;     // decelleration time (microsec)
long Vm = 3200;    // steady state velocity (pulse/sec)
long Pt = 12800;    // total number of pulses for move (1600 steps per rev)

// Other variables
long dly;           // stepper pulse delay (microsec)
long t = td/9;      // current time (microsec)  -  You need to seed the initial time with something > 0
                   //                             so you don't calculate to long of a delay
long t12;           // time during constant velocity (microsec)

int count = 0;      // count the number of pulses
int Perr = 0;       // error in position

// Arduino pins
#define dirPin 3
#define stepPin 12

void setup() {
Serial.begin(9600);
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);

// Calculate the time at constant velocity
t12 = (Pt/(Vm/1e6))-0.5*(ta+td);
Serial.println(); Serial.println();

Serial.println("Setup Done");
}
void loop()
{
digitalWrite(dirPin, LOW);  // Set the stepper direction

// Decide which part of the velocity curve your at
if (t<ta) {                                       // Acceleration
   //Serial.println ("Acceleration Curve");
   dly = (ta)/(2*(Vm/1e6)*t);
}
else if (t>=ta && t<(ta+t12)){                    // Constant velocity
   //Serial.println ("Constant Velocity");
   dly = 1/(2*(Vm/1e6));
}
else if (t>=(ta+t12) && t<(ta+t12+td)){          // Deceleration
   //Serial.println ("Deceleration Curve");
   dly = 1/(2*((Vm/1e6)-(Vm/(1e6*td))*(t-ta-t12)));
}

t = t+2*dly; // update the current time
//Serial.print("dly: "); Serial.print (dly); Serial.println(" microsec");
//Serial.print ("Current time: "); Serial.print(t); Serial.println(" microsec");

// Move stepper one pulse using delay just calculated
digitalWrite(stepPin, HIGH);
delayMicroseconds(dly);
digitalWrite(stepPin, LOW);
delayMicroseconds(dly);
count ++;
   
// The move is finished
if (t>(ta+t12+td)){
   Serial.println ("Move Complete");
   Serial.print ("Total steps indexed: "); Serial.println (count);
   
   // Correct for any position error due to rounding
   Perr = Pt-count;
   if (Perr < 0) {
     digitalWrite(dirPin, 1^digitalRead(dirPin));  // reverse the stepper direction
     delay(50);
     Perr = -1*Perr;
   }
   for (;Perr>0;){
     digitalWrite(stepPin, HIGH);
     delayMicroseconds(dly);
     digitalWrite(stepPin, LOW);
     delayMicroseconds(dly);
     Perr--;
   }
   
   count=0;
   t=td/9;
   
   delay (1000);
}

}
arthurilyuts
Сообщения: 30
Зарегистрирован: 07 дек 2014, 22:57

Re: Панорамная головка на Arduino

Сообщение arthurilyuts »

Неужели ни кто не в состоянии помочь?
Люди, вы же добрые внутри!
LGii
Сообщения: 1
Зарегистрирован: 07 авг 2016, 21:54

Re: Панорамная головка на Arduino

Сообщение LGii »

ребята , а кто то доработал этот скетч ??? если да поделитесь плиз
Ответить