Шаговый двигатель и блютуз

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Frosty, 9 фев 2016.

  1. Frosty

    Frosty Нерд

    Доброго времени. Потребовалось сделать следующую конструкцию: шаговки получает по блютуз с телефона команду и, в зависимости от этой команды, делает определенное количеств шагов в одну или другую сторону.
    Вот скеч, где по блютуз в зависимости от команды загорается один или второй диод. Вроде просто.
    Код (C++):
    //Объявляем переменные
    char incomingbyte; // переменная для приема данных

    //Инициализация переменных
    void setup() {
      Serial.begin(9600);
      pinMode(6,OUTPUT);
      pinMode(7,OUTPUT);


    }

    //Основной цикл программы
    void loop() {
      if (Serial.available() > 0){
        incomingbyte = Serial.read();
          if (incomingbyte == '1'){
            digitalWrite(6,HIGH);
            Serial.println("up");
          }
          if (incomingbyte=='2'){
            digitalWrite(7,HIGH);
            Serial.println("down");
          }
      }
    }
    Работает, да.
    Далее потестил шаговик. (8 10 9 11 - правильная его распиновка. Шаговик 28byj-48). Хорошо крутит туда сюда. Окей, совмещаем.
    Код (C++):
    #include <Stepper.h>

    const int IN1 = 8;
    const int IN2 = 10;
    const int IN3 = 9;
    const int IN4 = 11;

    const int stepsPerRevolution = 320; // шагов за один оборот

    Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);

    void setup() {
      myStepper.setSpeed(50); // скорость 5 об/минуту
    }

    void loop() {
      myStepper.step(stepsPerRevolution); // шаг в одном направлении
      delay(500);
      Serial.println("counterclockwise");
      myStepper.step(-stepsPerRevolution); // шаг в обратную сторону
      delay(500);
    }

    Основной код:
    Код (C++):
    //Объявляем переменные
    char incomingbyte; // переменная для приема данных
    #include <Stepper.h>

    const int IN1 = 8;
    const int IN2 = 10;
    const int IN3 = 9;
    const int IN4 = 11;
    const int stepsPerRevolution = 420; // шагов за один оборот

    Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);

    //Инициализация переменных
    void setup() {
      Serial.begin(9600);
    myStepper.setSpeed(100); // скорость 50 об/минуту

    }

    //Основной цикл программы
    void loop() {
      if (Serial.available() > 0){
        incomingbyte = Serial.read();
          if (incomingbyte == '1'){
            myStepper.step(stepsPerRevolution);
            Serial.println("uup");
            delay(500);
          }
          if (incomingbyte=='2'){
            myStepper.step(-stepsPerRevolution);
            Serial.println("ddown");
            delay(500);
          }
      }
    }
    Вот, собственно, и трудность. При получении команды шаговик жужжит, но никуда не вращается, будто его клинит. В чем я не прав?
     
  2. MXXX

    MXXX Гик

    У Вас в одном месте:
    Код (C++):
    const int stepsPerRevolution = 320; // шагов за один оборот
    а в другом:
    Код (C++):
    const int stepsPerRevolution = 420; // шагов за один оборот
    Так и должно?
     
  3. MXXX

    MXXX Гик

    Да и скорость в одном месте myStepper.setSpeed(100); в другом myStepper.setSpeed(50);
    Вы двигатель то протестируйте сначала в этих режимах. Может он и не будет крутится при
    stepsPerRevolution =420;
    myStepper.setSpeed(100);
     
  4. Frosty

    Frosty Нерд

    Ох, знал что будет такой вопрос. Эти то не имеет значения. С одинаковыми то же самое. Я изменял просто, пытался найти отличия, но разницы никакой.
     
  5. MXXX

    MXXX Гик

    Если у Вас 28byj-48, то вы его неправильно инициализируете. У него другая последовательность управления
    Нужно так:
    Код (C++):
    Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4);
    При вашей схеме он все силы израсходует на противодействие самому себе. Крутить может и будет, но через раз
     
  6. Frosty

    Frosty Нерд

    Разницы никакой. Зато, если приминить Ваше решение для скетча, где двигатель сам по себе вращаться, то схема перестает работать. При
    constint IN1 =8;
    constint IN2 =10;
    constint IN3 =9;
    constint IN4 =11;

    Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);

    Сам по себе отлично крутит. Через блютуз, повторюсь, отличий нет.
     
  7. MXXX

    MXXX Гик

    Проверил. Благо под рукой есть 28byj-48 с контроллером ULN 2003
    Попробовал подключить так:
    Код (C++):
    #include <Stepper.h>

    const int IN1 = 30;
    const int IN2 = 32;
    const int IN3 = 34;
    const int IN4 = 36;

    const int stepsPerRevolution = 2048; // шагов за один оборот

    Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4);

    void setup() {
      myStepper.setSpeed(16);
    }

    void loop() {
      myStepper.step(stepsPerRevolution); // шаг в одном направлении
      delay(500);
      Serial.println("counterclockwise");
      myStepper.step(-stepsPerRevolution); // шаг в обратную сторону
      delay(500);
    }
    Крутит прекрасно

    А если по Вашей схеме:
    Код (C++):
    #include <Stepper.h>

    const int IN1 = 30;
    const int IN2 = 32;
    const int IN3 = 34;
    const int IN4 = 36;

    const int stepsPerRevolution = 2048; // шагов за один оборот

    Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);

    void setup() {
      myStepper.setSpeed(16);
    }

    void loop() {
      myStepper.step(stepsPerRevolution); // шаг в одном направлении
      delay(500);
      Serial.println("counterclockwise");
      myStepper.step(-stepsPerRevolution); // шаг в обратную сторону
      delay(500);
    }
    То 16 оборотов в минуту ну никак. Максимум 7, потом дрожит и не крутит.
     
  8. Frosty

    Frosty Нерд

    Такой же шилд для управления ULN2003, но все наоборот. Могу снять видео. Проблема не в том, что в этом скетче не крутит, в этом то все хорошо. Проблема в том, что получая команду через блютуз, он его не крутит. Там хоть как INы меняй.
     
  9. MXXX

    MXXX Гик

    Ваш скетч у меня тоже не работает. Ведет себя точно так же как Вы описываете. Но после корректировок, которые я писал выше все прекрасно работает

    Вот ваш скетч с моими исправлениями
    Код (C++):
    //Объявляем переменные
    char incomingbyte; // переменная для приема данных
    #include <Stepper.h>

    const int IN1 = 30;
    const int IN2 = 32;
    const int IN3 = 34;
    const int IN4 = 36;
    const int stepsPerRevolution = 2048; // шагов за один оборот

    Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4);

    //Инициализация переменных
    void setup() {
      Serial.begin(9600);
    myStepper.setSpeed(10); // скорость 10 об/минуту

    }

    //Основной цикл программы
    void loop() {
      if (Serial.available() > 0){
        incomingbyte = Serial.read();
          if (incomingbyte == '1'){
            myStepper.step(stepsPerRevolution);
            Serial.println("uup");
            delay(500);
          }
          if (incomingbyte=='2'){
            myStepper.step(-stepsPerRevolution);
            Serial.println("ddown");
            delay(500);
          }
      }
    }
    Посылаю в серийный порт 1 крутит в одну сторону, посылаю 2 крутит в другую.
    Номера PIN только с моих на свои заменить не забудьте
     
    Frosty нравится это.
  10. Frosty

    Frosty Нерд

    Хм, скопировал, изменил пины не 8 10 9 11, а 8 9 10 11, но с измененным Вами In. Так работает, спасибо. Но почему тогда точно такой же код не работает в автоматическом режиме?) Там только 10 и 9 местами менять приходилось, чтобы двигатель на месте не крутил, а ины трогать не помогало?) Писал выше.
    Собственно, проблема решена, огромное спасибо.
     
  11. MXXX

    MXXX Гик

    Не должно быть никакой разницы. Скорее всего Вы что-то другое упустили.
    Я конечно могу проверить, но и так понятно, что будет работать и так:
    Код (C++):
    const int IN1 = 8;
    const int IN2 = 9;
    const int IN3 = 10;
    const int IN4 = 11;
    Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4);
    и так:
    Код (C++):
    const int IN1 = 8;
    const int IN2 = 10;
    const int IN3 = 9;
    const int IN4 = 11;
    Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);
    и так:
    Код (C++):
    Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
    Но второй вариант я бы использовать не стал. Если конечно не хотите никого запутать. IN1, IN2... это же так пины на плате подписаны. Получается распиновка на плате не будет совпадать со скетчем. Программный код это же не только машинная логика, это еще и документация.
     
  12. Frosty

    Frosty Нерд

    Понимаю. Ладно, разбираться тут уже не стоит, раз заработало. Так что спасибо)
     
  13. ildar13

    ildar13 Нуб

    Подскажите начинающему что добавить в последний скетч чтобы проверялась последняя команда. Для ясности: шаговик управляет жалюзи, после завершения команды "1" повторно не принимало "1", а только "2" и наоборот. Заранее спасибо
     
  14. MXXX

    MXXX Гик

    Код (C++):
    //Объявляем переменные
    char incomingbyte; // переменная для приема данных
    #include <Stepper.h>

    const int IN1 = 30;
    const int IN2 = 32;
    const int IN3 = 34;
    const int IN4 = 36;
    const int stepsPerRevolution = 2048; // шагов за один оборот

    Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4);

    //Инициализация переменных
    void setup() {
      Serial.begin(9600);
    myStepper.setSpeed(10); // скорость 10 об/минуту

    }

    // Последняя исполненная команда
    int LastCommand = 0;

    //Основной цикл программы
    void loop() {
      if (Serial.available() > 0){
        incomingbyte = Serial.read();
          if (incomingbyte == '1' && LastCommand != 1){
            myStepper.step(stepsPerRevolution);
            Serial.println("uup");
            delay(500);
            LastCommand = 1;
          }
          if (incomingbyte=='2' && LastCommand != 2){
            myStepper.step(-stepsPerRevolution);
            Serial.println("ddown");
            delay(500);
            LastCommand = 2;
          }
      }
    }
     
    ildar13 нравится это.
  15. ildar13

    ildar13 Нуб

    Оказывается все так просто. Большое спасибо!
     
  16. ildar13

    ildar13 Нуб

    Поигравшись с мотором выяснил, что при подключении к HC-06 с телефона (перестает моргать светодиод и постоянно горит) мотор в состоянии покоя нагревается примерно до 40 гр.С. При сбросе подключения BT такого не наблюдается. Есть смысл искать причину или добавить реле на включение питания двигателя при подаче сигнала с телефона на время подъема/опускания жалюзи?
    Заранее спасибо!!!
     
  17. MXXX

    MXXX Гик

    1. Шаговый двигатель в состоянии покоя находится в режиме удержания, потребляет ток и соответственно нагревается. Если режим удержания не нужен, то необходимо отключать удержание. Реле для этого не нужно. Достаточно установить все порты в LOW состояние.
    2. Шаговики нормально переносят температуру до 80 градусов. Некоторые годами работают при 80-100.
    Код (C++):
    // Отключение удержания
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);