помогите новичку с управлением шаговиками
- Войдите на сайт для отправки комментариев
Ср, 03/01/2018 - 22:05
Господа, простите нуба, но я никак не могу разобраться с одной проблеммкой. Необходимо сделать так, чтобы два шаговика управлялись джойстиком. В наличии ардуинон нано, шилд на три драйвера и собственно джойстик. Уже три дня ковыряюсь никак не могу запустить, может есть у кого готовый скетчик или пару советов, буду премного благодарен.
А у Вас есть "готовый скетчик"? Пусть не совсем правильно работающий? Публикуйте, посмотрим.
Это элементарно,Zibn, вам надо не только три дня ковырятся,но и хотя бы один раз написать скетч.
int step_pin = 2; // Pin 9 connected to Steps pin on EasyDriver int dir_pin = 5; // Pin 8 connected to Direction pin int X_pin =A7; // Pin A0 connected to joystick x axis int Joy_switch = 12; // Pin 4 connected to joystick switch int step_speed = 1; // Speed of Stepper motor (higher = slower) void setup() { pinMode(dir_pin, OUTPUT); pinMode(step_pin, OUTPUT); Serial.begin(9600); } void loop() { int x = (analogRead(X_pin)); int xm = map (x,0,1023,1,10); Serial.println(xm); if (xm = 1) { digitalWrite(dir_pin, LOW); // (HIGH = anti-clockwise / LOW = clockwise) digitalWrite(step_pin, HIGH); delay(step_speed); digitalWrite(step_pin, LOW); delay(step_speed); } if (1<xm<10) { digitalWrite(dir_pin, LOW); // (HIGH = anti-clockwise / LOW = clockwise) digitalWrite(step_pin, LOW); delay(step_speed); digitalWrite(step_pin, LOW); delay(step_speed); } if (xm = 10) { digitalWrite(dir_pin, HIGH); // (HIGH = anti-clockwise / LOW = clockwise) digitalWrite(step_pin, HIGH); delay(step_speed); digitalWrite(step_pin, LOW); delay(step_speed); } }пробовал так, не работает.
#define EN 8 // stepper motor enable, low level effective #define X_DIR 5 //X axis, stepper motor direction control #define Y_DIR 6 //y axis, stepper motor direction control #define Z_DIR 7 //zaxis, stepper motor direction control #define X_STP 2 //x axis, stepper motor control #define Y_STP 3 //y axis, stepper motor control #define Z_STP 4 //z axis, stepper motor control int X_pin =A7; /* // Function: step -control the direction and number of steps of the stepper motor // Parameter: dir -direction control, dirPin corresponds to DIR pin, stepperPin correspomds to step pin, steps is the number of steps. // no return value */ void step(boolean dir, byte dirPin, byte stepperPin, int steps) { digitalWrite(dirPin, dir); delay(0.1); for (int i = 0; i < steps; i++) { digitalWrite(stepperPin, HIGH); delayMicroseconds(0.1); digitalWrite(stepperPin, LOW); delayMicroseconds(0.1); } } void setup(){// set the IO pins for the stepper motors as output pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT); //pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT); //pinMode(Z_DIR, OUTPUT); pinMode(Z_STP, OUTPUT); pinMode(EN, OUTPUT); digitalWrite(EN, LOW); Serial.begin(9600); } void loop(){ int x = (analogRead(X_pin)); int xm = map (x,0,1023,1,10); Serial.println(xm); if (xm = 1) { step(false, X_DIR, X_STP, 200); //step(false, Y_DIR, Y_STP, 200); //step(false, Z_DIR, Z_STP, 200); delay(0.1); } if (xm = 10) { step(true, X_DIR, X_STP, 200); // step(true, Y_DIR, Y_STP, 200); //step(true, Z_DIR, Z_STP, 200); delay(0.1); } }пробовал так, не работает.... всю голову сломал...
#include <Stepper.h> const int stepsPerRevolution = 800; Stepper myStepper(stepsPerRevolution, 2, 5); int X_pin =A7; void setup() { myStepper.setSpeed(90); Serial.begin(9600); int x = (analogRead(X_pin)); } void loop() { int x = (analogRead(X_pin)); int xm = map (x,0,1023,1,10); Serial.println(xm); if (xm = 1) { Serial.println("clockwise"); myStepper.step(stepsPerRevolution); delay(1); } else if (1<xm<10) { myStepper.step(0); } else if (xm = 10) { Serial.println("counterclockwise"); myStepper.step(-stepsPerRevolution); delay(1); } }пробовал так - не работает....
не могу понять в чём проблемма, во всех вариантах мотор крутится, но на джойстик не реагирует никак.
блин , в сети тыщщи примеров с кодами да ещё с видео))))
я не нашёл, ссылку в студию
А "не работает" это как? Можете внятно описать проблему? А от хрустальные шары тут запрещены.
"не работает" - это при подаче питания на щилд мотор начинает вращаться по часовой стрелке, при этом никак не реагируя на положение джойстика подключеного к А7
"не работает" - это при подаче питания на щилд мотор начинает вращаться по часовой стрелке, при этом никак не реагируя на положение джойстика подключеного к А7
Вы, по-моему, вместо того, чтобы за пять минут локализовать проблему, задались целью перепробовать все скетчи из интернета, где упоминается шаговый двигатель. И все подробности из Вас клещами тянуть нужно.
Вот в последнем скетче у Вас есть вывод значений в сериал. Что Вы там видите-то, значения меняются так как Вы ожидаете? Работает ли Ваш джойстик вообще? Какие из Ваших отладочных строк Вы видите?
Если с джойстиком всё хорошо, то разбирайтесь с моторами. Выкинте всё лишнее из скетча. Оставьте только инициализацию и какую-нибудь одну команду - один оборот по часовой, например. Так работает? А против часовой?
Если и джойстик и двигатель по отдельности работают, собирайте всё вместе и остаётся в целом тщательно проверить качество сборки Вашей схемы, особенно если присутствуют макетки и прочие сопли.
локализовать проблему за 5 минут мне не удалось, и за 30 мин. и за час тоже. Все элементы проверены отдельно и работают. Качество сборки проверено не единожды, собирал на макете, собирал без него - результат тот-же. В окне мониторинга ком порта отображаются результаты введённые в цикле последовательно: положение джойстика, затем "clockwise", затем "counterclockwise"
#include <AccelStepper.h> AccelStepper X (8, 2, 5); AccelStepper Y (8, 3, 6); int JoistPinX = A6; int JoistPinY = A7; int JoistPinK = 12; void setup() { X.setMaxSpeed(2000); Y.setMaxSpeed(2000); } void loop() { int levelX = analogRead(JoistPinX); int levelY = analogRead(JoistPinY); /////////////////////////////////////////////////////////////////////////////////// X.runSpeed(); if(levelX >= 0 || levelX < 390) {X.moveTo(map(-levelX, 390, 0, 0, 2000)); X.setSpeed(map(levelX, 390, 0, 0, 2000));} if(levelX >= 390 || levelX < 610) {X.moveTo(0); X.setSpeed(0);} if(levelX > 610 || levelX <= 1023) {X.moveTo(map(levelX, 610, 1023, 0, 2000)); X.setSpeed(map(levelX, 610, 1023, 0, 2000));} /////////////////////////////////////////////////////////////////////////////////// Y.runSpeed(); if(levelY >= 0 || levelY < 390) {Y.moveTo(map(-levelY, 390, 0, 0, 2000)); Y.setSpeed(map(levelY, 390, 0, 0, 2000));} if(levelY >= 390 || levelX < 610) {Y.moveTo(0); Y.setSpeed(0);} if(levelY > 610 || levelY <= 1023) {Y.moveTo(map(levelY, 610, 1023, 0, 2000)); Y.setSpeed(map(levelY, 610, 1023, 0, 2000));} }Нашёл скетч на этом форуме, подправил, не работает. Подскажите формат команды "AccelStepper X (8, 2, 5); " я так понимаю первое значение вывод reset, второе вывод step, третье dir? Или где это посмотреть?
Может у меня и правда с подключением проблема? Но по отдельности всё работает...
при подаче питания на шилд двигатель начинает вращаться, при нажатии на джойстик влево или в право происходят какието изменения, такое ощущение что на двигатель подаются одновременно два сигнала которые направлены в разные стороны, двигатель начинает метаться в разные стороны и вибрировать.
есть мысли что это может быть?
#include <AccelStepper.h> #include <MultiStepper.h> AccelStepper X (1, 2, 5); AccelStepper Y (1, 3, 6); int JoistPinX = A6; int JoistPinY = A7; int JoistPinK = 12; int EN = 8; void setup() { pinMode(EN, OUTPUT); digitalWrite(EN, LOW); X.setMaxSpeed(2000); Y.setMaxSpeed(2000); } void loop() { int levelX = analogRead(JoistPinX); int levelY = analogRead(JoistPinY); /////////////////////////////////////////////////////////////////////////////////// X.runSpeed(); if(levelX >= 0 || levelX < 390) {X.moveTo(map(-levelX, 390, 0, 0, 2000)); X.setSpeed(map(levelX, 390, 0, 0, 2000));} if(levelX >= 390 || levelX < 610) {X.moveTo(0); X.setSpeed(0);} if(levelX > 610 || levelX <= 1023) {X.moveTo(map(levelX, 610, 1023, 0, 2000)); X.setSpeed(map(levelX, 610, 1023, 0, 2000));} ///////////////////////////////////////////////////////////////////////////////// Y.runSpeed(); if(levelY >= 0 || levelY < 390) {Y.moveTo(map(-levelY, 390, 0, 0, 2000)); Y.setSpeed(map(levelY, 390, 0, 0, 2000));} if(levelY >= 390 || levelX < 610) {Y.moveTo(0); Y.setSpeed(0);} if(levelY > 610 || levelY <= 1023) {Y.moveTo(map(levelY, 610, 1023, 0, 2000)); Y.setSpeed(map(levelY, 610, 1023, 0, 2000));} }При выполнении этого скетча мотор двигается на один шаг при отклонении джойстика. Да что не так то....?
При выполнении этого скетча мотор двигается на один шаг при отклонении джойстика. Да что не так то....?
Не хотите Вы спокойно и методично всё сделать... Опять новые библиотеки, новые скетчи, новые косяки. Даже если кто-то захочет что-нибудь подсказать, какой из них обсуждать-то? Остановитесь уж на чём-нибудь!
В последних скетчах у Вас условия какие-то странные. Скорее всего везде вместо || (ИЛИ) должно && (И) быть.
В строках 26 30 34 40 45 49 заменить || на &&.
В строках 30 34 45 49 заменить if на else if.
Voodoo Doll спасибо
#include <AccelStepper.h> #include <MultiStepper.h> AccelStepper X (2, 5); AccelStepper Y (3, 6); int JoistPinX = A6; int JoistPinY = A7; int JoistPinK = 12; int EN = 8; void setup() { pinMode(EN, OUTPUT); digitalWrite(EN, LOW); X.setMaxSpeed(2000); Y.setMaxSpeed(2000); } void loop() { int levelX = analogRead(JoistPinX); int levelY = analogRead(JoistPinY); /////////////////////////////////////////////////////////////////////////////////// X.runSpeed(); if(levelX >= 0 && levelX < 390) {X.moveTo(-100000); X.setSpeed(map(levelX, 390, 0, 0, 2000));} else if(levelX >= 390 && levelX < 610) {X.moveTo(0); X.setSpeed(0);} else if(levelX > 610 && levelX <= 1023) {X.moveTo(100000); X.setSpeed(map(levelX, 610, 1023, 0, 2000));} ///////////////////////////////////////////////////////////////////////////////// Y.runSpeed(); if(levelY >= 0 && levelY < 390) {Y.moveTo(map(levelY, 390, 0, 0, -2000)); Y.setSpeed(map(levelY, 390, 0, 0, 2000));} else if(levelY >= 390 && levelX < 610) {Y.moveTo(0); Y.setSpeed(0);} else if(levelY > 610 && levelY <= 1023) {Y.moveTo(map(levelY, 610, 1023, 0, 2000)); Y.setSpeed(map(levelY, 610, 1023, 0, 2000));} }изменил строку 4, 5. исправил указаные ошибки. Заработало на половину. при изменении положения джойстика шаговик начинает крутиться, но, собака, в одну сторону. Тоесть отклоняешь в право крутится против часовой, отклоняешь влево, тоже против часовой, в центральном положении стоит как и положено.
Проверяйте тип аргумента X.moveTo();
Да, не, нормальный у него тип.