Управление направлением движения ШД потенциометром

Доброго времени.
есть нужда в управлении ШД с помощью потенциометра (не скорость, а направление), на всю выкрутку потенциометра должно быть 1/4 оборота (90 градусов).
есть nema17, потенциометр B10K, ардуино (нано, уно и мега) и драйвер A4988.
мало что получается,
#include <Stepper.h>

const int stepsPerRevolution = 200;

Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() {

myStepper.setSpeed(60);

Serial.begin(9600);

}

void loop() {

int potReading = analogRead(A0);

int steps = map(potReading, 0, 1023, 0, stepsPerRevolution);

myStepper.step(steps);

delay(15);

}

явно все не очень. может кто помочь?

пишете, что нужно управлять направлением… а сами управляете скоростью:

Похоже, что вы или не можете обьяснить, что нужно, или сами не очень понимаете, что хотите.
У направления только два значения - “туда” и “обратно” или “вправо” - “влево”. Потенциометр для управления направлением не нужен, для этого достаточно двух-позиционного переключателя.

Извиняюсь, что может запутал. В общем это нужно для управления шиберной заслонкой, нужно не только положение открыто/закрыто, но и любой угол открытия от 0 до 90 градусов

Для шибера возьмите серву помощнее и сервотестер.

Дешевле обойдется конструкция.

а может подскажите какой сорво? заслонка из ПВХ и нагрузка минимальная. Усилия почти нет

Используйте калькулятор.)) Оборот Nema17 - 200шагов.
Значит 1/4 оборота - 50 шагов.

Если пальцем в небо, то вот такой примерно: Купить Сервопривод MG946 180° 13 кг

1 лайк

Купил эти серво (MG946R) и теперь как- то странно все работает ) . Использовал скетч:
#include <Servo.h>

Servo test_x;

void setup() {

test_x.attach(2);

Serial.begin(9600);

}

void loop() {

int x = analogRead(0);

Serial.print("X ");Serial.print(x);

x = map(x, 0, 1023, 800, 2200);

test_x.writeMicroseconds(x);

delay(4);

}
Очень прост и его хватало. при выкручивании потенциометра до упора, серво поворачивался на 90 градусов, при выкручивании обратно уходил в 0, (можно остановить на любом углу поворота), а сейчас он просто крутится без остановки.
Может как поправить скетч( голова уже болит)

и этот скетч не работает. крутит как не в себя.
#include <Servo.h>

Servo myservo;

int servoPin = 2;
int potPin = 7;
int potVal;

void setup() {
myservo.attach(servoPin);
}

void loop() {
potVal = analogRead(potPin);
potVal = map(potVal, 0, 1023, 0, 180);
myservo.write(potVal);
delay(15);
}

#include <Servo.h>

Servo myservo;

int servoPin = 2;
int potPin = A0;
int potVal;

void setup() {
myservo.attach(servoPin);
}

void loop() {
potVal = analogRead(potPin);
potVal = map(potVal, 0, 1023, 0, 180);
myservo.write(potVal);
delay(15);
}

здесь видимо ключевое слово - MG946R

Значит он работал нормально, а потом вдруг испортился и серва вместо 180 градусов начала давать 360+?

Посмотрите пины куда он потенциометр ставил, в одном и втором случае.

Но это не объясняет постоянное вращение. Я бы понял, если написано было “дергается туда-сюда”.

Это фигуры речи :slight_smile:
Первое точно про ученика на стуле :slight_smile:

Все вроде работает. только может кто подскажет, как подрагивание серво убрать? может кто поможет дописать?

#include <Servo.h>

Servo test_x;

void setup() {

test_x.attach(2);

Serial.begin(9600);

}

void loop() {

int x = analogRead(7);

Serial.print("X ");Serial.print(x);

x = map(x, 0, 1023, 544, 1520);

test_x.writeMicroseconds(x);

delay(2);

}

Подрагивания от чего?

Ввести “мёртвую зону” или усреднять АЦП. Хотя и сам сервомоторчик может дёргаться, тут уже никак.

И мой вклад. Тоже вроде не сильно читаемо.

#include <Servo.h>

Servo test_x;

void setup() {

test_x.attach(2);

Serial.begin(9600);

}

void loop() {

int x = analogRead(7);

Serial.print("X ");Serial.print(x);

x = map(x, 0, 1023, 544, 1520);

test_x.writeMicroseconds(x);

delay(2);

}