Подключение шагового двигателя 28BYJ-48 через ULN2003

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем d00m, 19 фев 2013.

  1. hibiki

    hibiki Гик

    уфф..

    таки мотор какой выбрали? и какой угол поворота нужен?
     
  2. d00m

    d00m Гик

    ну у меня по прежнему пока два 28BYJ-48 + ULN2003
    редуктор там вроде 1 к 64 и угол поворота на один шаг 5,625 градуса если я все правильно понял

    • Speed Variation Ratio : 1/64
    • Stride Angle : 5.625° /64

    таким образом, чтобы повернуть вал редуктора на один оборот нужно 360 делить на 5.625 = 64
    значит 64 шага нужно чтобы провернуть вал на один оборот..
    360 мне много. допустим мне нужно всего 270 для pan плоскости
    значит 270 делим на 5.625 = 48
    значит через 48 шагов от точки старта будет угол в 270 градусов
    вроде так.
    теперь надо понять как ему сообщить сделать именно 48 шагов в коде и главное - как былин научится всегда возвращаться в нолевое положение ?
    это проблема..
    а еще есть такие страшилки как "пропуск шагов", какоето ускорение и микрошаги
    не понимаю совсем этого (
     
  3. pyro

    pyro Гик

    Если это угол поворота вала мотора, то тогда надо не делить, а умножать. На один оборот выходного вала редуктора, нужно в 64 раза больше шагов.

    Вот взято из описания:
    • Rated Voltage: DC5V 4-phase
    • Reduction Ratio: 1/64
    • Step Torque Angle: 5.625/64
    • DC Resistance: 200Ω±7% (25C)
    • Insulation Resistance: >10MΩ (500V)
    • Dielectric Strength: 600V AC / 1mA / 1s
    • Insulation Grade: A
    • No-load Pull in Frequency: >600Hz
    • No-load Pull out Frequency: >1000Hz
    • Pull in Torque: >34.3mN.m(120Hz)
    • Detent Torque: >34.3mN.m
    • Temperature Rise: <40K(120Hz)
    • Noise: <40dB (120Hz, No load, 10cm)
    • Cable length :23.5CM
    • Красным по белому - угол поворота одного шага равен 5,625 деленное на 64
     
  4. d00m

    d00m Гик

    вот я и не знаю угол вала мотора или редуктора это..
    если это данные для вала мотора тогда видимо придется умножать:
    360*5.625 = 2025 шагов для полного оборота вала редуктора
    270*5.625 = 1518,75 ~ 1520 шагов на ~270 градусов

    но остаются прежние вопросы - как это закодировать, чтобы крутило с максимальной скоростью, как потом вернуться в ноль при внезапном выключении питания, как приделать упоры..
    наверное это нерешаемая задача (
     
  5. pyro

    pyro Гик

    Два концевых выключателя, это будет точка отсчета. при включении шаговики сначала идут в ноль, а потом тупо считай импульсы, вместо концевиков можно применить датчик Холлаили оптический.
     
  6. d00m

    d00m Гик

    значит тут учитывается редуктор
    значит все правильно - нужно умножать ?
    1 шаг - это 0.087890625 градусов
    и значит что 270 градусов это 270/0.087890625 = 3072 шага !
    а полный оборот мотор сделает за 4096 шагов.
    чето былин не сходится с моими прошлыми вычислениями.

    я правильно понимаю - нужно на корпусе приколхозить два микрика ?
     
  7. pyro

    pyro Гик

    Все верно 64*64=4096 полный оборот.
    это будет точкой осчета,значение переменной х присваиваете 0, считаете 3072 шага - это ваша другая краиняя точка, 1536 шагов середина, и т. д.
    А кто или что будет управлять этой системой?
     
  8. d00m

    d00m Гик

    это pan-tilt. наверху камера
    в нее смотрит чел и контролами крутит ее - влево вправо вверх вниз
    понятно что с учетом визуального контроля можно будет вернуть камеру "по центру" или в "левый-правый (верхний-нижний) край" просто поворачивая ее вручную..
    но хочется чтобы работала кнопка автоматической центровки, как это сейчас сделано с использованием сервов - там я просто указываю нужный угол по горизонтали и вертикали.
    про переменные и их подсчет во время движения я уже думал, все это очевидно вроде..
    но что делать если допустим камера начала поворот от 0 и через 100 шагов внезапно выключилось питание на устройстве ?
    после включения питания камера находится на месте останова и уже это место для нее является нулем. ведь так ?
    в случае сервов они инициализируются автоматически при подаче питания и я могу при этом указать куда им установиться..
    в принципе мне не так нужен автоинит моторов после подачи питания, как хочется иметь возможность крутить камеру в некие предустановленные положения из любого ее положения. пока не могу придумать как это можно сделать в случае шаговиков..

    и все таки насчет выключаетелей - это вполне физические девайсы должны быть ? и их надо прикрепить на корпусе и чтобы при повороте вала до этого уровня они какимто образом они срабатывали ? разрывали цепь или как дать программе понять что микрик сработал ??
     
  9. pyro

    pyro Гик

    При выключении питания и последующем включении, камера опять идет в ноль, а потом отсчитывает нужное кол-во шагов и становиться в центр или в другое указанное вами место, их может быть сколько угодно.
     
  10. d00m

    d00m Гик

    но как ??
    как только что включившаяся программа узнает что шаговику нужно _вернуться_ на 100 шагов назад ?
     
  11. pyro

    pyro Гик

    А ей и не надо знать на сколько шагов надо вернуться. Просто двигается в датчика, датчик сработал зто 0, записываем 0 в переменные положения, и вперед.
     
  12. d00m

    d00m Гик

    хм.. значит для того чтобы переместится на какое то место после включения питания, вначале нужно будет найти ноль - точку отсчета. и не просто найти, а еще и провернуться в это положение..
    видимо это единственный вариант.
    осталось понять какие датчики прилепить туда и как с них снимать инфу..
     
  13. Витя

    Витя Гик

  14. uussh

    uussh Нерд

    в этом двигателе другая маркировка выходов в стандартной библиотеке выходы идут
    Stepper stepper(STEPS, 8, 9, 10, 11); чтобы заработал этот двигатель нужно так:
    Stepper stepper(STEPS, 8, 10, 9, 11);
    А колличество шагов на оборот у меня получилось 2048
    Код (Text):

     
    #include <Stepper.h>
     
    const int stepsPerRevolution = 2048;  //кол-во шагов на оборот
     
    // initialize the stepper library on pins 2 3 4 5:
    Stepper myStepper(stepsPerRevolution, 2,4,3,5);        
      int previous=0;
    void setup() {
      // set the speed at max 14 rpm:
      myStepper.setSpeed(10);
      // initialize the serial port:
      Serial.begin(9600);
     
    }
     
    void loop()
    {
      // get the sensor value
      int val = analogRead(A0);// sensor reading,
     
    Serial.print("sensor_");
    Serial.println(val);
     
    val = map(val, 0, 1023, 0, 2046);
    Serial.print("map_");
    Serial.println(val);
     
      myStepper.step(val - previous);
      Serial.print("Ugol=val-previous");
      Serial.println(val-previous);
     
      previous = val;
      Serial.print("previous_");
      Serial.println(previous);
      Serial.println("---end---");
      delay(500);
    }
     
     
  15. d00m

    d00m Гик

    да вот тоже непонятки с этими пинами.. работают разные варианты кода - и с прямой нумерацией пинов и с перемешанной.
     
  16. uussh

    uussh Нерд

    лично у меня пока не поменял центральные пины местами (в скетче )
    в одну сторону крутилось а в обратную нет, а когда поменял все стало адекватно
    максимальная скорость составила 14 при дальнейшем увлечении мотор не успевает.
     
  17. uussh

    uussh Нерд

    Для выхода на нулевою позицию думаю надо использовать цикл while
    http://arduino.ru/Reference/While
    пробовал его использовать принципе работал
    Код (Text):
    void loop(){
      buttonState = digitalRead(buttonPin); // проверить датчики
    Serial.println(buttonState);
     
    while (buttonState  == HIGH);
    {
      myStepper.step(1);
      val= val+1;
        Serial.println(val);
      delay(20);          // подождать, пока датчики стабилизируются
     
    }
    но не совсем как надо наверное надо было помещать не в void loop()
    а в void setup()
     
  18. d00m

    d00m Гик

    чето ваш код у меня както странно работает. проворачивает вал немножко и начинает туда-сюда по неск шагов дергаться..


    + такой вот вывод вижу
    Код (Text):
    sensor_274
    map_548
    Ugol=val-previous-8
    previous_548
    ---end---
    sensor_297
    map_594
    Ugol=val-previous46
    previous_594
    ---end---
    sensor_287
    map_574
    Ugol=val-previous-20
    previous_574
    ---end---
    sensor_285
    map_570
    Ugol=val-previous-4
    previous_570
    ---end---
     
  19. uussh

    uussh Нерд

    переменный резистор на A0 подключили?
    код это из примера
    называется MotorKnob
     
  20. d00m

    d00m Гик

    ааа.. нет конечно )