Управление шаговым двигателем (несколько условий)

Тема в разделе "Arduino & Shields", создана пользователем makc014, 25 ноя 2014.

  1. makc014

    makc014 Нуб

    Добрый день!
    Подскажите как написать скетч для Arduino UNO
    Хочу реализовать такой алгоритм:
    При считывании показаний с внешнего источника, должно выполняться определенное условие
    как надо.jpg
    Сейчас смог реализовать
    реализовал.jpg
    Столкнулся с проблемами:
    1)не получается разбить участок больше 3-х частей
    2) не получается заставить двигатель однократно выполнеть дествие при определенном условии и перейти в другие режимы (пробывал использовать for и while)

    Подскажите в каком направлении двигаться?
    Скетч:
    Код (Text):
    #include <Stepper.h>
    const int stepsPerRevolution = 200; //количество шагов на 360 градусов
    Stepper myStepper(stepsPerRevolution, 8,9,10,11);  //выходы
    int Poti=0;
    int x=0;

    void setup()
    {
    }

    void loop()

    {
    x=analogRead(Poti);

    if (x<300 || x>800)
    {
    myStepper.setSpeed(1);
    myStepper.step(10); //открывать
    }
    else
    {
    myStepper.setSpeed(1);
    myStepper.step(-10); //закрывать
    }
    }
     
  2. if (x>0 || x<299) { //Условие }
    if (x>300 || x<799) { //Условие }
    if (x>800 || x<1022) { //Условие }

    Можно switch и кейсом еще.

    Кстати сколько вольт на движке? Энкодер 12 вольт хочу подключить. И задача кстати такая же как у вас. C программирование беды нету. Вот с подключением проблемы у меня...
     
  3. makc014

    makc014 Нуб

    switch и case - я использовал. Проблема еще, чтобы двигатель сделал +10шагов в дапазоне 0...299 и -10 шагов в диапазоне 300...800.
    Шаговый двигатель работает через драйвер, не помню на какое напряжение расчитан
     
  4. vvr

    vvr Инженерище

    if (x>0 && x<299) {
    myStepper.setSpeed(1);
    myStepper.step(10); }
    if (x>300 && x<799) {
    myStepper.setSpeed(1);
    myStepper.step(-10);
    }
     
  5. makc014

    makc014 Нуб

    это код будет постоянно крутить двигатель по 10 шагов. Можно сделать чтобы в определенном диапазоне он сделал всего 10 шагов и остановился.
     
    Последнее редактирование: 25 ноя 2014
  6. makc014

    makc014 Нуб

    нашел код:
    x=0;
    While (x<1)
    {
    x=x+1;
    }
     
  7. А для чего ты этот код хочешь?
     
  8. if (x>0 && x<299) {

    myStepper.setSpeed(1);
    myStepper.step(10);

    //Вот так нельзя остановить двигатель, если он находится в диапазоне от 0 до 300
    myStepper.stop();

    }
     
  9. rav_75

    rav_75 Гик

    Так не получится, ибо программа бежит по кругу. мне так кажется, надо ввести флаг.
    Код (Text):
    bool stepLeft = true; // допустим так обзовем наш флаг
    ......
    void loop(){
      ...
      if(x>0 && x<299){
          if(stepLeft){
            myStepper.setSpeed(1);
            myStepper.step(10);
            stepLeft=false;
          }
      }else{
          stepLeft=true;
      }
    ...
    }
    как-то так должно заработать
     
  10. makc014

    makc014 Нуб

    Вот так я реализовал и все работает.

    Основной код программы:

    Код (Text):

    #include <Stepper.h>  //двигатель
    const int stepsPerRevolution = 200; //количество шагов на 360 градусов
    Stepper myStepper(stepsPerRevolution, 8,9,10,11);

    int x=0;
    int y=0;
    int z=0;
    int Poti=0;
    float raw=0;

    void setup() {
      pinMode(13, OUTPUT);
    }
    void loop() {
    raw=analogRead(Poti);

    if (raw>0 && raw<100)  {
    x=0; y=0; z=0;}

    if (raw>100 && raw<200)  {
        y=0;  z=0;
            while (x<1)
          { myStepper.setSpeed(50);
            myStepper.step(-100);    
            x=x+1;}
          }
    if (raw>200 && raw<300)  {
    x=0; z=0;
            while (y<1)
            {  myStepper.setSpeed(50);
              myStepper.step(150);    
              y=y+1;}  
            }

    if (raw>300 && raw<400)  {
    x=0; y=0; z=0;
          myStepper.setSpeed(150);
          myStepper.step(2); }

    if (raw>500 && raw<600) {
    x=0; y=0;
      while (z<1){
            myStepper.setSpeed(150);
            myStepper.step(-150);
    z=z+1;}
    }
    }
     
     
    Последнее редактирование: 26 ноя 2014
  11. Крутбл... Сегодня тоже самое буду делать с энкодером.
     
  12. Vik

    Vik Нуб

    А у меня другая проблема, нужно чтоб двигатель неостанавливался, а он делает четверть оборота и останавливается...
    вот отрывок действия при нажатии кнопки RIGHT/

    Код (C++):
    void   rightMenu(int x) {
       switch (x) {
          case 1:
            clearPrintTitle();
            lcd.print ("0.01 >>");
           myStepper.setSpeed(200);
            myStepper.step(stepsPerRevolution );
          break;
    а это вся программа:
    Код (C++):
    #include <LiquidCrystal.h>
    #include <Stepper.h>
    //Подключение шагового двигателя
    const int stepsPerRevolution = 3200; // кол-во импульсов на оборот
    Stepper myStepper(stepsPerRevolution, 19, 21); // Подключение ШД
    // Initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    //States for the menu.
    int currentMenuItem = 0;
    int lastState = 0;
    int motor=0;


    void setup() {
       //Set the characters and column numbers.
       lcd.begin(16, 2);
       //Print default title.
       clearPrintTitle();
       //Параметры шагового двигателя
    //   pinMode(pul, OUTPUT);  
    // pinMode(dir, OUTPUT);

    }
    void loop()
    /*
    //********************Режим работы шагового двигателя

             if (motor==1)
          {
         myStepper.setSpeed(200);
        // step 1/100 of a revolution:
        myStepper.step(-stepsPerRevolution );
          }
             if (motor==2)
          {
        myStepper.setSpeed(200);
        // step 1/100 of a revolution:
        myStepper.step(-stepsPerRevolution );
         }
    */



    {
      //Call the main menu.
      mainMenu();
    }
    void mainMenu() {
      //State = 0 every loop cycle.
      int state = 0;
      //Refresh the button pressed.
      int x = analogRead (0);
      //Set the Row 0, Col 0 position.
      lcd.setCursor(0,0);
      //Check analog values from LCD Keypad Shield
      if (x < 100) {
        //Right
        state = 4;
      } else if (x < 200) {
       //Up
        state = 1;
      } else if (x < 400){
       //Down
        state = 2;
      } else if (x < 600){
        //Left
        state = 5;
      } else if (x < 800){
        //Select
        state = 3;
      }
      //If we are out of bounds on th menu then reset it.
      if (currentMenuItem < 0 || currentMenuItem > 13) {
       currentMenuItem = 0;

      }
       //If we have changed Index, saves re-draws.
       if (state != lastState) {
          if (state == 1) {
             //If Up
              currentMenuItem = currentMenuItem - 1;
              displayMenu(currentMenuItem);
          } else if (state == 2) {
             //If Down
              currentMenuItem = currentMenuItem + 1;
              displayMenu(currentMenuItem);
          } else if (state == 3) {
             //If Selected
             motor=0;
            //selectMenu(currentMenuItem);
          } else if (state == 4) {
             //If RIGHT
            rightMenu(currentMenuItem);
          } else if (state == 5) {
             //If LEFT
            leftMenu(currentMenuItem);
          }


       
          //Save the last State to compare.
          lastState = state;
       }
       //Small delay
      delay(5);
    }
    //Display Menu Option based on Index.
    void displayMenu(int x) {
         switch (x) {
          case 1:
            clearPrintTitle();
            lcd.print ("0.01");
            break;
          case 2:
            clearPrintTitle();
            lcd.print ("0.015");
            break;
           case 3:
            clearPrintTitle();
            lcd.print ("0.02");
            break;
          case 4:
            clearPrintTitle();
            lcd.print ("0.03");
            break;
           case 5:
            clearPrintTitle();
            lcd.print ("0.04");
            break;
           case 6:
            clearPrintTitle();
            lcd.print ("0.06");
            break;
           case 7:
            clearPrintTitle();
            lcd.print ("0.08");
            break;
           case 8:
            clearPrintTitle();
            lcd.print ("0.1");
            break;
           case 9:
            clearPrintTitle();
            lcd.print ("0.13");
            break;
           case 10:
            clearPrintTitle();
            lcd.print ("0.15");
            break;
            case 11:
            clearPrintTitle();
            lcd.print ("0.18");
            break;
            case 12:
            clearPrintTitle();
            lcd.print ("0.20");
            break;
            case 13:
            clearPrintTitle();
            lcd.print ("0.22");
            break;
        }
    }
    //Print a basic header on Row 1.
    void clearPrintTitle() {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(" Podacha mm/ob ");
      lcd.setCursor(0,1);
    }
    //Show the rightMenu on Screen.
    void   rightMenu(int x) {
       switch (x) {
          case 1:
            clearPrintTitle();
            lcd.print ("0.01 >>");
           myStepper.setSpeed(200);
            myStepper.step(stepsPerRevolution );
          break;

            //Call the function that belongs to Option 1
         
          case 2:
            clearPrintTitle();
            lcd.print ("0.015 >>");
            //digitalWrite(dir, HIGH);
             // motor=2;
            //Call the function that belongs to Option 2
            break;
           case 3:
            clearPrintTitle();
            lcd.print ("0.02 >>");
            //Call the function that belongs to Option 3
            break;
          case 4:
            clearPrintTitle();
            lcd.print ("0.03 >>");
            //Call the function that belongs to Option 4
            break;
            case 5:
            clearPrintTitle();
            lcd.print ("0.04 >>");
            //Call the function that belongs to Option 5
            break;
            case 6:
            clearPrintTitle();
            lcd.print ("0.06 >>");
            //Call the function that belongs to Option 6
            break;
            case 7:
            clearPrintTitle();
            lcd.print ("0.08 >>");
            //Call the function that belongs to Option 7
            break;
            case 8:
            clearPrintTitle();
            lcd.print ("0.1 >>");
            //Call the function that belongs to Option 8
            break;
            case 9:
            clearPrintTitle();
            lcd.print ("0.13 >>");
            //Call the function that belongs to Option 9
            break;
            case 10:
            clearPrintTitle();
            lcd.print ("0.15 >>");
            //Call the function that belongs to Option 10
            break;
            case 11:
            clearPrintTitle();
            lcd.print ("0.18 >>");
            //Call the function that belongs to Option 11
            break;
            case 12:
            clearPrintTitle();
            lcd.print ("0.2 >>");
            //Call the function that belongs to Option 12
            break;
            case 13:
            clearPrintTitle();
            lcd.print ("0.22 >>");
            //Call the function that belongs to Option 13
            break;
        }
    }
        //Show the leftMenu on Screen.
    void   leftMenu(int x) {
       switch (x) {
          case 1:
            clearPrintTitle();
            lcd.print ("0.01 <<");
             myStepper.setSpeed(200);
            myStepper.step(-stepsPerRevolution );
      break;
          case 2:
            clearPrintTitle();
            lcd.print ("0.015 <<");
            //digitalWrite(dir, LOW);
             // motor=2;
            //Call the function that belongs to Option 2
            break;
           case 3:
            clearPrintTitle();
            lcd.print ("0.02 <<");
            //Call the function that belongs to Option 3
            break;
          case 4:
            clearPrintTitle();
            lcd.print ("0.03 <<");
            //Call the function that belongs to Option 4
            break;
            case 5:
            clearPrintTitle();
            lcd.print ("0.04 <<");
            //Call the function that belongs to Option 5
            break;
            case 6:
            clearPrintTitle();
            lcd.print ("0.06 <<");
            //Call the function that belongs to Option 6
            break;
            case 7:
            clearPrintTitle();
            lcd.print ("0.08 <<");
            //Call the function that belongs to Option 7
            break;
            case 8:
            clearPrintTitle();
            lcd.print ("0.1 <<");
            //Call the function that belongs to Option 8
            break;
            case 9:
            clearPrintTitle();
            lcd.print ("0.13 <<");
            //Call the function that belongs to Option 9
            break;
            case 10:
            clearPrintTitle();
            lcd.print ("0.15 <<");
            //Call the function that belongs to Option 10
            break;
            case 11:
            clearPrintTitle();
            lcd.print ("0.18 <<");
            //Call the function that belongs to Option 11
            break;
            case 12:
            clearPrintTitle();
            lcd.print ("0.2 <<");
            //Call the function that belongs to Option 12
            break;
            case 13:
            clearPrintTitle();
            lcd.print ("0.22 <<");
            //Call the function that belongs to Option 13
            break;
           }
    }
     
    Подскажите что нетак?