управление шаговыми двигателями

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

  1. vvr

    vvr Инженерище

    крутить шаговиком уже научились?
    если да - покажите код, будем дальше помогать:)
     
  2. Serjay

    Serjay Нерд

    Код (Text):

    #define IN1  8
    #define IN2  9
    #define IN3  10
    #define IN4  11
    int Steps = 0;
    boolean Direction = true;
    unsigned long last_time;
    unsigned long currentMillis ;
    int steps_left=4095;
    long time;
    void setup()
    {
    pinMode(IN1, OUTPUT);
    pinMode(IN2, OUTPUT);
    pinMode(IN3, OUTPUT);
    pinMode(IN4, OUTPUT);
    // delay(1000);

    }
    void loop()
    {
      while(steps_left>0){
      currentMillis = micros();
      if(currentMillis-last_time>=1000){
      stepper(1);
      time=time+micros()-last_time;
      last_time=micros();
      steps_left--;
      }
    }
    }
    void stepper(int xw){
      for (int x=0;x<xw;x++){
    switch(Steps){
      case 0:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
      break;
      case 1:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, HIGH);
      break;
      case 2:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
      break;
      case 3:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
      break;
      case 4:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
      break;
      case 5:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
      break;
        case 6:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
      break;
      case 7:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
      break;
      default:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
      break;
    }
    SetDirection();
    }
    }
    void SetDirection(){
    if(Direction==1){ Steps++;}
    if(Direction==0){ Steps--; }
    if(Steps>7){Steps=0;}
    if(Steps<0){Steps=7; }
    }

    Вот в этом коде меня все устраивает. двигатель делает оборот 360 и останавливается. Вставить сюда кнопку, что бы он сделал 1 оборот и остановился меня не получилось((
     
  3. лемира

    лемира Нерд

    У меня всё ясно с этим кодом, а что не то-то? Спрашиваете!
     
  4. лемира

    лемира Нерд

    Но это я про свой код.
     
  5. Serjay

    Serjay Нерд

    Да нужен код, при нажатие на кнопку двигатель делал оборот 360 градусов и останавливался..... Я вот никак не могу этого сделать...
     
  6. извиняюсь что вклиниваюсь в разговор: но подскажите,при добавлении (summ = true;) процесс пропускается только один раз, то есть если я повторно набираю пароль, шаговик не реагирует, 3й раз реагирует.
    Чем воспользоваться, чтоб мой шаговик выполнял действия однократно
    т.е. если набран пароль 5555, то второй раз он уже не набирается: а ждёт 0000, и на оборот
    мой кусочек скетча прилагаю:

    if (summ=="5555"){
    Serial.println("PASS OK");
    summ="";
    keystr="";
    shet=0;
    myStepper.step(stepsPerRevolution);
    summ = true;
    }if(summ=="0000"){
    Serial.println("new");
    summ="";
    keystr="";
    shet=0;
    myStepper.step(-stepsPerRevolution);
    summ = true;
    };