Шаговый двигатель и переменный резистор

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем michaelukolov, 24 сен 2017.

Метки:
  1. michaelukolov

    michaelukolov Нуб

    Доброго времени суток.
    Подскажите, как реализовать управление шагами шагового двигателя с помощью переменного резистора?
    Наброски есть, но как сделать, чтобы резистор опрашивался постоянно, и, если его положение изменилось, то соответственно изменить кол-во шагов двигателя?
    Двигатель - 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);
    }
     
    Последнее редактирование: 24 сен 2017
  2. michaelukolov

    michaelukolov Нуб

    Чашечка чая и все решил. :)
    Возможно ли как-то снизить чувствительность аналогового входа? Достаточно пальцем дотронуться до корпуса резистора, как он воспринимает это как импульс.
    Код (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. rkit

    rkit Гуру

    Можно и даже нужно не трогать пальцами электронные компоненты.
     
  4. michaelukolov

    michaelukolov Нуб

    Не помогает.. Резистор сейчас в пластиковом корпусе всего устройства, на штоке резистора пластиковая ручка. Дотрагиваюсь до ручки - шага 3,4 мотор делает.
     
  5. rkit

    rkit Гуру

    Так это вы ручку качаете, изменяя контакт. Ищите что-то более механически жесткое.
     
  6. DIYMan

    DIYMan Гуру

    Программно уменьшайте чувствительность, как вариант. Т.е. чтобы на один шаг приходилось большее изменение положения резистора. У вас есть 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.
     
  7. michaelukolov

    michaelukolov Нуб

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