Шаговик + Джойстик + Прерывания

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

Друзья! Задача управлять джойстиком, двумя шаговыми моторами. Решил, что в коде нужно использовать прерывания, т.к. постоянный опрос джостика, процессором, сильно увеличивает загрузку процессора и как следствие ухудшает качество движения ШД и его скорость.

Разрыв мозга происходит когда нужно обработать кодом прерывания с джойстика, касательно режима mode

  • LOW вызывает прерывание, когда на порту LOW
  • CHANGE прерывание вызывается при смене значения на порту, с LOW на HIGH и наоборот
  • RISING прерывание вызывается только при смене значения на порту с LOW на HIGH
  • FALLING прерывание вызывается только при смене значения на порту с HIGH на LOW

все эти режимы, я так полагаю, предназначены для кнопок или еще чего-то, а как быть с джойстиком? Ведь у него не 1 или 0, а значения от 0 до 1023. Гуру, ткните носом, какую конструкцию для этого нужно?????

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Я как то не вижу в хрустальном шаре какой у вас джойстик.

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

Puhlyaviy ))))

Как картинку вставить не вижу и ссылка с гугла корявая

Черный джойстик для ардуино на две оси

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

* дурь удалил

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

project37, а вы попробуйте по таймеру опрашивать, пару (5,10) раз в секунду.

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

Gippopotam, Вы имеете ввиду без прерывания, через delay() ?

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

по вашему коду и не должно работать

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

project37 пишет:

Gippopotam, Вы имеете ввиду без прерывания, через delay() ?

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

вызывайте прерывание несколько раз в секунду, а в обработчике опрашивайте джойстик.

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

Попробовал привести значения с джойстика к LOW и HIGH, ноль реакции. Кто знает, как это реализуется, буду благодарен



#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);
    attachInterrupt(0, swapX, RISING);
    
  }
/////////////////////////////            Прерывания по Х          ///////////////////////////
void swapX()
  {
////////////////////////////////////////// Приведение значения с джойстика к 0 или 1  ///////////
    int levelX = analogRead(JoistPinX);
    if (JoistPinX > 490 || JoistPinX < 510) JoistPinX = LOW;
    else JoistPinX = HIGH;
     
       
  if(levelX >= 0 || levelX < 490)
      {X.moveTo(map(-levelX, 490, 0, 0, 2000));
       X.setSpeed(map(levelX, 490, 0, 0, 2000)); 
       X.runSpeed();}

   if(levelX > 510 || levelX <= 1023) 
          {X.moveTo(map(levelX, 510, 0, 0, 2000));
           X.setSpeed(map(levelX, 510, 1023, 0, 2000)); 
           X.runSpeed();}
  }
/////////////////////////////////////////////////////////////////////////////////
void loop() 
{

}  

 

 

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

Gippopotam пишет:

project37 пишет:

Gippopotam, Вы имеете ввиду без прерывания, через delay() ?

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

вызывайте прерывание несколько раз в секунду, а в обработчике опрашивайте джойстик.

Я думаю, что таким образом процессор тоже будет занят - и легче не станет. 

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

project37, вы как-то вольно с внешними прерываниями обращаетесь...

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

project37 пишет:

Gippopotam пишет:

project37 пишет:

Gippopotam, Вы имеете ввиду без прерывания, через delay() ?

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

вызывайте прерывание несколько раз в секунду, а в обработчике опрашивайте джойстик.

Я думаю, что таким образом процессор тоже будет занят - и легче не станет. 

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

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

Я пробывал делать delay(2000) - двигатель каждые 2сек дергается сам по себе и когда вращается теряет много в скорости за счет этой задержки. Когда второй мотор добавляю, то скорость еще на 2 делится (установлено эксперементально) Я пришел к выводу, чем больше опросов, тем хуще работает двиг. И что для работы с моторами опросы только все портят

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

Gippopotam пишет:

project37, вы как-то вольно с внешними прерываниями обращаетесь...

вполне может быть, сильно не пинайте, только начал разбираться)

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

project37 пишет:

Я пробывал делать delay(2000) - двигатель каждые 2сек дергается сам по себе и когда вращается теряет много в скорости за счет этой задержки. Когда второй мотор добавляю, то скорость еще на 2 делится (установлено эксперементально) Я пришел к выводу, чем больше опросов, тем хуще работает двиг. И что для работы с моторами опросы только все портят

delay(2000) - вы себе даже представить не можете, как это много!

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

Вычитал, что прерывания работают только на цифровых портах 2 и 3 на UNO. Получается что с аналоговых портов не работают прерывания!? Может кто-нибудь, что-то конкретное по коду или по задумке сказать?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

project37, то, что вы хотите невозможно. Но существенно разгрузить контроллер можно переключив ацп в режим автотриггера с прерыванием по окончанию преобразования. Команда analogRead вам такого предложить не может, необходимо напрямую программировать регистры АЦП.