Доброго времени суток. Подскажите, как реализовать управление шагами шагового двигателя с помощью переменного резистора? Наброски есть, но как сделать, чтобы резистор опрашивался постоянно, и, если его положение изменилось, то соответственно изменить кол-во шагов двигателя? Двигатель - 85 шагов на оборот. С таким кодом, что у меня есть, каждые 5 секунд опрашивается переменный резистор и выставляется соответствующее положение шагов. Как доработать, чтобы опрашивался все время? И если новое положение резистора меньше, чем старое, то чтобы двигатель двигался назад на разницу шагов. Спойлер: Код Код (C++): #include <Stepper.h> const int stepsPerRevolution = 85; Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); void setup() { myStepper.setSpeed(60); Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.0); myStepper.step(voltage * 17); delay(5000); }
Чашечка чая и все решил. Возможно ли как-то снизить чувствительность аналогового входа? Достаточно пальцем дотронуться до корпуса резистора, как он воспринимает это как импульс. Спойлер Код (C++): #include <Stepper.h> const int stepsPerRevolution = 85; Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); int currentstep = 0; void setup() { myStepper.setSpeed(60); } void loop() { int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.0); int newstep = voltage * 17; myStepper.step(newstep - currentstep); currentstep = voltage * 17; }
Не помогает.. Резистор сейчас в пластиковом корпусе всего устройства, на штоке резистора пластиковая ручка. Дотрагиваюсь до ручки - шага 3,4 мотор делает.
Программно уменьшайте чувствительность, как вариант. Т.е. чтобы на один шаг приходилось большее изменение положения резистора. У вас есть newstep и currentstep - просто накапливайте между ними разницу, и пока она меньше определённого значения - никуда не шагайте, как только она больше определённого значения - делайте шаг, и вычитайте из этой разницы минимальное значение. Как-то так, навскидку (со знаками там надо посмотреть, чего делать, когда резистор в разные стороны крутится - не стал особо заморачиваться, ещё раз повторюсь - навскидку написал, главное идея): Код (C++): const int stepsPerRevolution = 85; Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); int laststep = 0; int difference = 0; #define MINIMAL_STEP 30 void setup() { myStepper.setSpeed(60); } void loop() { int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.0); int newstep = voltage * 17; difference = laststep - newstep; laststep = newstep; if(abs(difference) >= MINIMAL_STEP) { int neg = difference < 0? -1 : 1; myStepper.step(neg*MINIMAL_STEP); if(difference > 0) difference -= MINIMAL_STEP; else difference += MINIMAL_STEP; } } Ну и, конечно, изменение положения может быть в несколько раз больше, чем MINIMAL_STEP - это тоже надо учитывать, и в цикле делать, заменив if на while.
Все решил. Мотор ходил туда-сюда из-за плохого источника питания (начал разряжаться аккумулятор), а в механизме есть пружина, соответственно она вал мотор в одну сторону, а дуина в другую. Получилось что-то вроде перетягивания каната. Как только подключил хороший ИП - мотор стал отзываться на резистор прекрасно.