Два ШД от джойстика

project37
Offline
Зарегистрирован: 25.07.2015

Написал код для управления двумя ШД от джойстика ардуино шилд(черный на 2 оси и кнопка).

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

#include <AccelStepper.h>


AccelStepper X (1, 7, 8);
AccelStepper Y (1, 9, 10);

int JoistPinX = 0;
int JoistPinY = 1;
int JoistPinK = 3;


void setup() {
X.setMaxSpeed(2000);
Y.setMaxSpeed(2000);


}

void loop() {
  // 
  
  int levelX = analogRead(JoistPinX);
  int levelY = analogRead(JoistPinY);
///////////////////////////////////////////////////////////////////////////////////
  X.runSpeed();
  if(levelX >= 0 || levelX < 490)
      {X.moveTo(map(-levelX, 490, 0, 0, 2000));
       X.setSpeed(map(levelX, 490, 0, 0, 2000));}
       
 
  if(levelX > 510 || levelX <= 1023) 
          {X.moveTo(map(levelX, 510, 0, 0, 2000));
           X.setSpeed(map(levelX, 510, 1023, 0, 2000));}
         
///////////////////////////////////////////////////////////////////////////////////
  Y.runSpeed();
  if(levelY >= 0 || levelY < 490)
      {Y.moveTo(map(-levelY, 490, 0, 0, 2000));
       Y.setSpeed(map(levelX, 510, 1023, 0, 2000));}

  if(levelY > 510 || levelY <= 1023) 
          {Y.moveTo(map(levelY, 510, 0, 0, 2000));
           Y.setSpeed(map(levelY, 510, 1023, 0, 2000));}
      
}  

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

У вас вращение моторов напрямую завязаны на значения выдаваемые аналоговыми выходами. Эти значения "плавают" - "плавают" и моторы - все очевидно.

project37
Offline
Зарегистрирован: 25.07.2015

просматривал analogRead через монитор порта, джостик меняет значения по осям от 500 до 507(в неотклоненном положении), в операторе if я эти значения исключил!

Gippopotam, можно по-подробнее, что нужно делать?

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

а зачем вы moveTo() привязываете к значениям джойстика, это нафиг не нужно.

задайте сразу большое значение и всё.

вам только скорость нужно с джойстиком увязать.

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

project37
Offline
Зарегистрирован: 25.07.2015

Gippopotam пишет:

У вас вращение моторов напрямую завязаны на значения выдаваемые аналоговыми выходами. Эти значения "плавают" - "плавают" и моторы - все очевидно.

Вот пример из библиотеки AccelStepper, здесь прямо с аналогового входа берут значения и их присваивают функциям двигателей

// ProportionalControl.pde
// -*- mode: C++ -*-
//
// Make a single stepper follow the analog value read from a pot or whatever
// The stepper will move at a constant speed to each newly set posiiton, 
// depending on the value of the pot.
//
// Copyright (C) 2012 Mike McCauley
// $Id: ProportionalControl.pde,v 1.1 2011/01/05 01:51:01 mikem Exp mikem $

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5

// This defines the analog input pin for reading the control voltage
// Tested with a 10k linear pot between 5v and GND
#define ANALOG_IN A0

void setup()
{  
  stepper.setMaxSpeed(1000);
}

void loop()
{
  // Read new position
  int analog_in = analogRead(ANALOG_IN);
  stepper.moveTo(analog_in);
  stepper.setSpeed(100);
  stepper.runSpeedToPosition();
}

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Какие у вас шаговики?

Если есть возможность отказаться от библиотеки - сделайте это.

Зачем вам прямая связь между положением джойстика и скоростью мотора - непонятно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
project37,
 
а что написано в Ваших условиях?
 
Строка 26: if(levelX >= 0 || levelX < 490)
 
Это верно всегда, т.к. абсолютно любое число либо больше или равно 0, либо меньше 490 - абсолютно любое. Т.е. условие всегда истинно и строки 27-28 выполняются всегда!
 
Тоже самое про строки 31, 37 и 41. Условия в них истинны всегда!
 
Потому у Вас моторы и едут куда-то постоянно - все условия инстинны. чего не ехать-то?
 

 

project37
Offline
Зарегистрирован: 25.07.2015

ЕвгенийП пишет:

project37,
 
а что написано в Ваших условиях?
 
Строка 26: if(levelX >= 0 || levelX < 490)
 
Это верно всегда, т.к. абсолютно любое число либо больше или равно 0, либо меньше 490 - абсолютно любое. Т.е. условие всегда истинно и строки 27-28 выполняются всегда!
 
Тоже самое про строки 31, 37 и 41. Условия в них истинны всегда!
 
Потому у Вас моторы и едут куда-то постоянно - все условия инстинны. чего не ехать-то?
 
 
 
 
 
ЕвгенийП, спасибо за конструктив! Но как выполняется всегда, если в мониторе, я смотрел, значения при стоящем прямо джойстике 501-507. Я имею в виду, что у джойстика значение от 0 до 1023 разбито пополам. Когда он прямо значение 501-507, когда влево от 501 до 0, когда вправо от 508 до 1023. Как может быть всегда? Ткните носом!

 

project37
Offline
Зарегистрирован: 25.07.2015

Gippopotam пишет:

Какие у вас шаговики?

Если есть возможность отказаться от библиотеки - сделайте это.

Зачем вам прямая связь между положением джойстика и скоростью мотора - непонятно.

Шаговики биполярные NEMA17. Думаю поробовать тоже самое кнопками. Пробовал убрать зависимость скорости от положения, еще хуже становится...Он еще быстрее начинает ехать при "прямом" джойстике

vvadim
Offline
Зарегистрирован: 23.05.2012
void setup()
{
  stepper.setMaxSpeed(1000);
}

void loop()
{
  if (joyX > 544)
  {  
    stepper.setSpeed(SpeedX);
    stepper.setAcceleration(AccelX);
    stepper.move(64000L);
  }
  else if (joyX < 480)
  { 
    stepper.setSpeed(SpeedX);
    stepper.setAcceleration(AccelX);
    stepper.move(-64000L);
  }
  else if (joyX <=544 && joyX >= 480)
  { 
    stepper.stop();
  }
  stepper.run();
}

 

project37
Offline
Зарегистрирован: 25.07.2015

vvadim пишет:

void setup()
{
  stepper.setMaxSpeed(1000);
}

void loop()
{
  if (joyX > 544)
  {  
    stepper.setSpeed(SpeedX);
    stepper.setAcceleration(AccelX);
    stepper.move(64000L);
  }
  else if (joyX < 480)
  { 
    stepper.setSpeed(SpeedX);
    stepper.setAcceleration(AccelX);
    stepper.move(-64000L);
  }
  else if (joyX <=544 && joyX >= 480)
  { 
    stepper.stop();
  }
  stepper.run();
}

 

vvadim, так тоже едет) еще быстрее и не реагирует на отклонения джойстика!  В 20 строке поменял && на || стал реагировать, но все равно едет(((

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

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

project37 пишет:

Шаговики биполярные NEMA17. Думаю поробовать тоже самое кнопками. Пробовал убрать зависимость скорости от положения, еще хуже становится...Он еще быстрее начинает ехать при "прямом" джойстике

А драйверы какие?

Вы уверены, что используемая библиотека вообще подходит под ваше обоорудование?

 

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

вопрос на засыпку - а что вы собираете на шаговых двигателях?

может проще использовать dc моторы, и управлять проще и гемора меньше

project37
Offline
Зарегистрирован: 25.07.2015

Gippopotam пишет:

project37 пишет:

Шаговики биполярные NEMA17. Думаю поробовать тоже самое кнопками. Пробовал убрать зависимость скорости от положения, еще хуже становится...Он еще быстрее начинает ехать при "прямом" джойстике

А драйверы какие?

Вы уверены, что используемая библиотека вообще подходит под ваше обоорудование?

 

 

Драйверы TB6560 3A. Хммм...про библиотеку - она может управлять  двигателями 

AccelStepper mystepper(1, pinStep, pinDirection); 

AccelStepper mystepper(2, pinA, pinB); 

AccelStepper mystepper(4, pinA1, pinA2, pinB1, pinB2);

у меня по первому варианту

project37
Offline
Зарегистрирован: 25.07.2015

vvadim пишет:

вопрос на засыпку - а что вы собираете на шаговых двигателях?

может проще использовать dc моторы, и управлять проще и гемора меньше

Хочу сделать козловой кран по перемещению предметов с ручным управлением...Работаю на производстве...

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

это похвально, но зачем там шаговые моторы

да и скорость чаще всего  не регулируется 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

А просто вращать моторами (тестовый скетч) получается?

Давайте сначала.

Вы хотите с помощью джойстика менять скорость вращения каждого мотора? По мотору на ось? То есть мотор не должен вращаться, пока вы не отклоните джойстик выше какого-то порога? Затем, в зависимости от степени отклонения должна меняться скорость мотора?

 

P.S. Красивые буковки. А большего размера можете?

project37
Offline
Зарегистрирован: 25.07.2015

Gippopotam пишет:

А просто вращать моторами (тестовый скетч) получается?

Давайте сначала.

Вы хотите с помощью джойстика менять скорость вращения каждого мотора? По мотору на ось? То есть мотор не должен вращаться, пока вы не отклоните джойстик выше какого-то порога? Затем, в зависимости от степени отклонения должна меняться скорость мотора?

 

P.S. Красивые буковки. А большего размера можете?

Верно задумка такая!!! Он ими вращает вперед и назад при отклонении, и скорость регулирует в зависим от положения джойс, но какой-то лаг - когда джойс на месте ардуино очень медленно, мелкой дрожью их оба двигает в одну сторону. 

Про буковки простите, не знаю как здесь шрифт поменчть

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

vvadim пишет:

вопрос на засыпку - а что вы собираете на шаговых двигателях?

может проще использовать dc моторы, и управлять проще и гемора меньше

Управлять проще? А в чем, собственно разница, если параметры изывестны, а и там и там используются драйверы?

Зато шаговик дает неоспоримые преимущества по точности управления.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

project37 пишет:

Верно задумка такая!!! Он ими вращает вперед и назад при отклонении, и скорость регулирует в зависим от положения джойс, но какой-то лаг - когда джойс на месте ардуино очень медленно, мелкой дрожью их оба двигает в одну сторону. 

Если бы я делал - сделал бы без этой библиотеки, ибо сомневаюсь, что она вообще аутентичная.

Если никакой другой работы микроконтроллер не выполняет - задача вообще не сложная.

 

Цитата:

Про буковки простите, не знаю как здесь шрифт поменчть

а зачем?

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

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Error

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

кстати, в вашем коде step пин для мотора Х указан 7, это только для меги. на уне там нет шима

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

vvadim пишет:

кстати, в вашем коде step пин для мотора Х указан 7, это только для меги. на уне там нет шима

зачем ШИМ для step?

я чего-то не знаю?

project37
Offline
Зарегистрирован: 25.07.2015

Gippopotam пишет:

vvadim пишет:

кстати, в вашем коде step пин для мотора Х указан 7, это только для меги. на уне там нет шима

зачем ШИМ для step?

я чего-то не знаю?

Вопрос аналогичный! И потом все цифровые пины PWM поддерживают!?Да?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

project37 пишет:

Но как выполняется всегда, если в мониторе, я смотрел, значения при стоящем прямо джойстике 501-507. Я имею в виду, что у джойстика значение от 0 до 1023 разбито пополам. Когда он прямо значение 501-507, когда влево от 501 до 0, когда вправо от 508 до 1023. Как может быть всегда? Ткните носом!

Да вот так и волняется всегда. Вот смотрите, что у Вас написано:

Строка 26: if(levelX >= 0 || levelX < 490)

Это означает ЕСЛИ levelX>=0 ИЛИ levelX <400

т.е. достаточно, чтобы верно было что-то одно. Абсолютно любое число сюда подойдёт, т.к. под первое условие подходит всё, что нетроицательно, а всё, что отрицательно подойдёт под второе условие.

Если Вы хотели сказать "между 0 и 490", то нужно было использовать не ИЛИ, а И (не ||, а &&).

И так во всех Ваших условиях (номера строк я давал в прошлом посте)

project37
Offline
Зарегистрирован: 25.07.2015

ЕвгенийП пишет:

project37 пишет:

Но как выполняется всегда, если в мониторе, я смотрел, значения при стоящем прямо джойстике 501-507. Я имею в виду, что у джойстика значение от 0 до 1023 разбито пополам. Когда он прямо значение 501-507, когда влево от 501 до 0, когда вправо от 508 до 1023. Как может быть всегда? Ткните носом!

Да вот так и волняется всегда. Вот смотрите, что у Вас написано:

Строка 26: if(levelX >= 0 || levelX < 490)

Это означает ЕСЛИ levelX>=0 ИЛИ levelX <400

т.е. достаточно, чтобы верно было что-то одно. Абсолютно любое число сюда подойдёт, т.к. под первое условие подходит всё, что нетроицательно, а всё, что отрицательно подойдёт под второе условие.

Если Вы хотели сказать "между 0 и 490", то нужно было использовать не ИЛИ, а И (не ||, а &&).

И так во всех Ваших условиях (номера строк я давал в прошлом посте)

ЕвгенийП, я тоже сначала так думал, и первый скетч написал с && - результата не было, движки стояли!!!! четыре часа мучился, не мог понять в чем дело. Пробовал уже все что только можно, и только с ИЛИ они закрутились, но с меской дрожью когда стоят. vvadim, предлагал скетч. Можно уйти от И и ИЛИ - разбить на два IF, но результата нет. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, как знаете. Все Ваши условия с ИЛИ выполняются для всех чисел, т.е. Вы можете их смело выбросить и всё будет работать также, как сейчас.

Чем пробовать методом тыка "и" или "или" лучше сядьте и внимательно пропишите логику.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

project37 пишет:

ЕвгенийП, я тоже сначала так думал, и первый скетч написал с && - результата не было, движки стояли!!!! четыре часа мучился, не мог понять в чем дело. Пробовал уже все что только можно, и только с ИЛИ они закрутились, но с меской дрожью когда стоят. vvadim, предлагал скетч. Можно уйти от И и ИЛИ - разбить на два IF, но результата нет. 

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

Вы тестовые скетчи пробовали? Движки вообще с этой библиотекой корректно работают?

project37
Offline
Зарегистрирован: 25.07.2015

Gippopotam пишет:

project37 пишет:

ЕвгенийП, я тоже сначала так думал, и первый скетч написал с && - результата не было, движки стояли!!!! четыре часа мучился, не мог понять в чем дело. Пробовал уже все что только можно, и только с ИЛИ они закрутились, но с меской дрожью когда стоят. vvadim, предлагал скетч. Можно уйти от И и ИЛИ - разбить на два IF, но результата нет. 

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

Вы тестовые скетчи пробовали? Движки вообще с этой библиотекой корректно работают?

Gippopotam, я же сообщения пишу не просто так, чтобы Вы их игнорировали. Если пытаетесь помочь, то пробегитесь по теме...я уже пробовал и без map и с И - не работает!!! Подключал тестовые скетчи, на них двигатель дрожит... А про суть, все что Вы говорите я уже перепробовал, прохавал и вы**рал. Не хочу кого-то обидеть! С Уважением

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

ну если на примерах из библиотеки моторы не работают то надо сначала с их подключением разобраться

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

project37 пишет:

Gippopotam, я же сообщения пишу не просто так, чтобы Вы их игнорировали. Если пытаетесь помочь, то пробегитесь по теме...я уже пробовал и без map и с И - не работает!!! Подключал тестовые скетчи, на них двигатель дрожит... А про суть, все что Вы говорите я уже перепробовал, прохавал и вы**рал. Не хочу кого-то обидеть! С Уважением

Вы напрасно со мною так разговариваете, повода я не давал.

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

project37
Offline
Зарегистрирован: 25.07.2015

Други! Немного переписал. Что имеем:

1. ШД стоят, их не трясет, никуда не тянет при ровном джойстике

2. Отводишь джойстик - едет, отпускаешь - останавливается

3.Регулировка скорости от отклонения джойстика пропала (ну да пес с ней)

НО ПРОПАЛ ЗАДНИЙ ХОД!!! Как так-то?

void loop() {
  /////////////////////////////////////////////////////////////////////////////////////
  
  X.runSpeed();
  if(int levelX = analogRead(JoistPinX) < 450)
      {X.moveTo(map(-levelX, 450, 0, 0, 2000));
       X.setSpeed(map(levelX, 450, 0, 0, 2000));}
  
  else {X.moveTo(0); X.setSpeed(0);}
       
  if(int levelX = analogRead(JoistPinX) > 550) 
          {X.moveTo(map(levelX, 550, 0, 0, 2000));
           X.setSpeed(map(levelX, 550, 1023, 0, 2000));}
  
  else {X.moveTo(0); X.setSpeed(0);}

 

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

почитайте описание библиотеки.

http://www.airspayce.com/mikem/arduino/AccelStepper/functions.html

setSpeed() для постоянной скорости

и в moveTo() уберите зависимость от положения джойстика

m-zzz
Offline
Зарегистрирован: 30.05.2015

Я премного извиняюсь, но не проще и логичней ли было бы использовать для управления NEMA-17 стандартные драйверы для ШД? Заодно отказавшись от внезапно ставшей нафиг не нужной бибилотеки?.

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

 

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

Рулят практически любыми шаговиками, от Nema-8 до Nema-42...

Как правило сразу же обеспечивают опторазвязку цепей управления от силовой части схемы.

Управляются двумя (или тремя, кому как надо) линиями Step, Dir (и возможно еще Enable)