Люди добрые помогите прикрутить шаговик в скетч.

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

  1. free_nor

    free_nor Нерд

    Всем привет! Люди может ли кто нить помочь в поправке скетча что бы вместо обычного двигателя работал шаговый вот скетч:
    Заранее благодарен всем кто поможет .... очень надо ....

    Код (Text):
    /*







    #include <AFMotor.h>


    /*
    LCD screen for motorized camera dolly
    Code written by: Philip Sorri
    */

    #include <LiquidCrystal.h> //LCD library
    #include <Bounce.h> //debounce library
    int button3 = A0; //button pins
    int button2 = 7;
    int button1 = 8;
    int startStop = 9;
    int runTime1;
    int show = 1;     //what menu to show
    int dollySpeedNum = 0; //number of the speed
    int delayTime = 100; //delay after pressedbutton (see the functions)
    int delayDolly = 0; //delay before running
    int runTime = 0;    //time to run after delay
    int motorPin = 0;
    int motorPin1 = 1;
    int motorPin2 = 6;
    int motorPin3 = 13;
    int val4;
    int shutter = 1;
    int shutterCount = 0;
    int shutterVal = 0;
    int angle=200*22/360;
    int panstep=1500;
    int IN1=4;
    int IN2=5;
    int IN3=6;
    int IN4=7;

    AF_Stepper motor(200, 1);
    Bounce bouncer1 = Bounce(button1, 15); //deblounce (button, milliseconds)
    Bounce bouncer2 = Bounce(button2, 15);
    Bounce bouncer3 = Bounce(button3, 15);
    Bounce bouncer4 = Bounce(startStop, 15);

    LiquidCrystal lcd(12,11,5,4,3,2); //pins of the LCD to arduino

    void setup() {
      pinMode(button1, INPUT); //button as inputs
      pinMode(button2, INPUT);
      pinMode(button3, INPUT);
      pinMode(startStop, INPUT);
      pinMode(motorPin, OUTPUT);
      pinMode(motorPin1, OUTPUT);
      pinMode(motorPin2, OUTPUT);
      pinMode(motorPin3, OUTPUT);
      pinMode(shutter, OUTPUT);
      motor.setSpeed (4);
      motor.step(angle*2, BACKWARD, INTERLEAVE);
       motor.release();
      lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("DOLLYDUINO V 1.1");
      lcd.setCursor(0,1);
      lcd.print("By ThePhilleBoy");
      delay(3000);
    }

    void loop() {
      motor.step(2, BACKWARD, MICROSTEP);
      if(shutterVal > 1) {
        shutterVal = 0;
      }

      runTime1 = runTime;
      if(runTime == 0) {
        runTime1 = 10;
      }
      else {
        runTime1 = runTime;
      }
      bouncer1.update();  //update the buttons
      bouncer2.update();
      bouncer3.update();
      bouncer4.update();
      int val1 = bouncer1.read(); //reads the value
      int val2 = bouncer2.read(); //and sets the new variables to it
      int val3 = bouncer3.read(); //So if button is pressed value = HIGH
      val4 = bouncer4.read();

      if (show > 4) {              //Number of menus
        show = 1;
      }
      if(val3 == HIGH) {    //scroll through the different menus
        show = show + 1;    //the show number indicates which menu we're in
        delay(delayTime * 5);
      }
      if(show == 1) {      //if show is 1 the dollySpeed function is chosen/shown
        dollySpeed(val1, val2);  //To change values in this menu with same buttons
      }                          //in all the menus
      else if(show == 2) {  //if show is 2 delay function is chosen/shown on LCD
        dollyDelay(val1, val2);
      }
      else if(show == 3) {
        runningTime(val1, val2);
      }
      else if(show == 4) { //shows all the setting that are chosen
        settings();
        if(val1 == HIGH || val2 == HIGH) {
          shutterVal = shutterVal + 1;
          delay(delayTime*3);
        }
      }

      if(val4 == HIGH && shutterVal == 0){
      motorOn();
    }
      if(val4 == LOW){
      analogWrite(motorPin, LOW);
      analogWrite(motorPin1, LOW);
      analogWrite(motorPin2, LOW);
      analogWrite(motorPin3, LOW);
    }
      if(val4 == HIGH && shutterVal == 1) {
      motorOn();
      lcd.setCursor(0,0);
      lcd.print("P:");
      lcd.setCursor(4,0);
      lcd.print(shutterCount);
    }
    }

    void dollySpeed(int num1, int num2) {
      lcd.setCursor(0,0);    //sets the startpoint of the text to (0,0)
      lcd.print("Dolly speed:    "); //Writes "Dolly speed:" to the LCD
      if(num1 == HIGH) { //if num1 which is val1/button1 is pressed the speed
        dollySpeedNum = dollySpeedNum + 1;  //increases with 1
        delay(delayTime);      //delay before next press, otherwise it would
      }                         //scroll fast as hell
      if(num2 == HIGH) {        //if button2 is pressed decrease with 1
        dollySpeedNum = dollySpeedNum - 1;
        delay(delayTime);
      }
      lcd.setCursor(0,1);  //sets the starting point of the print
      lcd.print(dollySpeedNum); //prints to the start point (0,1)
      if(dollySpeedNum < 10) {
        lcd.setCursor(1, 1);
        lcd.print("%             "); //makes a percent sign after the number
      }                      //the space after it is to hide numbers that might
      if(dollySpeedNum >= 10 && dollySpeedNum < 100) { //be shown from the last
        lcd.setCursor(2, 1);            //menu that we scrolled from.
        lcd.print("%      "); //if the speed if over 10 and less than 100 it moves
      }                        //the percentsign one step to the right.
      if(dollySpeedNum == 100) { //same here
        lcd.setCursor(3, 1);
        lcd.print("%      ");
      }
      if(dollySpeedNum > 100) { //I wanted the speed to be in percent so I
        dollySpeedNum = 0;      //have to limit the value of dollySpeedNum.
      }                         //if the value is higher than 100 it makes it to 0
      if(dollySpeedNum < 0) {   //and if it's lower than 0 it goes to 100.
        dollySpeedNum = 100;
      }
    }

    void dollyDelay(int but1, int but2) {
      int decimal;
      decimal = delayDolly%10;
      lcd.setCursor(0,0);
      lcd.print("Delay:          ");
      if(but1 == HIGH) {
        delayDolly = delayDolly + 1;
        delay(delayTime);
      }
      if(but2 == HIGH) {
        delayDolly = delayDolly - 1;
        delay(delayTime);
      }
      lcd.setCursor(0,1);
      lcd.print(delayDolly/10);
      if(delayDolly < 10) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(delayDolly >= 10 && delayDolly < 100) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(delayDolly > 99) {
        lcd.setCursor(2, 1);
        lcd.print(".");
        lcd.setCursor(3,1);
        lcd.print(decimal);
        lcd.setCursor(4,1);
        lcd.print(" s    ");
      }
      if(delayDolly > 999) {
        delayDolly = 0;
      }
      if(delayDolly < 0) {
        delayDolly = 999;
      }
    }

    void runningTime(int num1, int num2) {
      int decimal1;
      decimal1 = runTime%10;
      lcd.setCursor(0,0);
      lcd.print("Run time:       ");
      if(num1 == HIGH) {
        runTime = runTime + 1;
        delay(delayTime);
      }
      if(num2 == HIGH) {
        runTime = runTime - 1;
        delay(delayTime);
      }
      lcd.setCursor(0,1);
      lcd.print(runTime/10);
      if(runTime < 10) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal1);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(runTime >= 10 && runTime < 100) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal1);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(runTime > 99) {
        lcd.setCursor(2, 1);
        lcd.print(".");
        lcd.setCursor(3,1);
        lcd.print(decimal1);
        lcd.setCursor(4,1);
        lcd.print(" s    ");
      }
      if(runTime > 999) {
        runTime = 0;
      }
      if(runTime < 0) {
        runTime = 999;
      }
    }

    void settings() {
      int decimal1;
      int decimal2;
      decimal1 = runTime%10;
      decimal2 = delayTime%10;
      lcd.setCursor(0,0);
      lcd.print("S: ");
      lcd.setCursor(3,0);
      lcd.print(dollySpeedNum);
      if(dollySpeedNum < 10) {
        lcd.setCursor(4,0);
        lcd.print("%   ");
      }
      if(dollySpeedNum >= 10 && dollySpeedNum < 100) {
        lcd.setCursor(5,0);
        lcd.print("%  ");
      }
      if(dollySpeedNum == 100) {
        lcd.setCursor(6,0);
        lcd.print("% ");
      }

      lcd.setCursor(8,0);
      lcd.print("R: ");
      lcd.setCursor(11,0);
      lcd.print(runTime/10);
      if(runTime < 10) {
        lcd.setCursor(12, 0);
        lcd.print(".");
        lcd.setCursor(13,0);
        lcd.print(decimal1);
        lcd.setCursor(14,0);
        lcd.print("s");
      }
      if(runTime >= 10 && runTime < 100) {
        lcd.setCursor(12,0);
        lcd.print(".");
        lcd.setCursor(13,0);
        lcd.print(decimal1);
        lcd.setCursor(14,0);
        lcd.print("s");
      }
      if(runTime > 99) {
        lcd.setCursor(13,0);
        lcd.print(".");
        lcd.setCursor(14,0);
        lcd.print(decimal1);
        lcd.setCursor(15,0);
        lcd.print("s");
    }

    lcd.setCursor(0,1);
      lcd.print("D: ");
      lcd.setCursor(3,1);
      lcd.print(delayDolly/10);
      if(delayDolly < 10) {
        lcd.setCursor(4, 1);
        lcd.print(".");
        lcd.setCursor(5,1);
        lcd.print(decimal1);
        lcd.setCursor(6,1);
        lcd.print("s");
      }
      if(delayDolly >= 10 && delayDolly < 100) {
        lcd.setCursor(4,1);
        lcd.print(".");
        lcd.setCursor(5,1);
        lcd.print(decimal2);
        lcd.setCursor(6,1);
        lcd.print("s");
      }
      if(delayDolly > 99) {
        lcd.setCursor(5, 1);
        lcd.print(".");
        lcd.setCursor(6,1);
        lcd.print(decimal1);
        lcd.setCursor(7,1);
        lcd.print("s");
    }
    if(val4 == LOW) {
    if(shutterVal == 0) {
    lcd.setCursor(10,1);
    lcd.print("I=OFF");
    }
    if(shutterVal == 1) {
      lcd.setCursor(10,1);
      lcd.print("I=ON ");
    }
    }
    }

    void motorOn () {
      int speedValue = map(dollySpeedNum, 200, 100, 50, 4);
      analogWrite(motorPin, speedValue);
      analogWrite(motorPin1, speedValue);
      analogWrite(motorPin2, speedValue);
      analogWrite(motorPin3, speedValue);
        delay(runTime1*100);
        if(delayDolly > 0) {
        analogWrite(motorPin, LOW);
        analogWrite(motorPin1, LOW);
        analogWrite(motorPin2, LOW);
        analogWrite(motorPin3, LOW);
        picture();
        shutterCount = shutterCount + 1;
        delay(delayDolly*100);
      }
    }

    void picture() {
      pinMode(shutter, HIGH);
      delay(50);
      pinMode(shutter, LOW);
    }
    }
     
    Последнее редактирование: 5 апр 2014
  2. free_nor

    free_nor Нерд

    есть motor shield DK ELECTRONICS и биполярный шаговый двигатель от 3d принтера 42BYGH1861A-C
     
  3. free_nor

    free_nor Нерд

    Господи ... я же не прошу вас переписывать весь код ... я прошу подсказать в каком направление двигаться что менять ... неужели ни кто не знает?
     
  4. Unixon

    Unixon Оракул Модератор

    Вы отдельно от этого кода уже пробовали управлять своим шаговиком? Какую библиотеку используете?
     
  5. free_nor

    free_nor Нерд

    Да пробовал , вот эту AFMotor.h но подключал его через motor shield а сейчас ШД на макетной плате поставил через драйвер с мотор шиелд L293D. проблема в том что шаговый двигатель реагирует и работает но не так как надо. когда включаешь его он делает так ... 1 шаг по часовой 1 против .и такое ощущение что не хватает напряжения ему вал не проворачивается .
    У меня проблема в коде на мой взгляд т.к. ШД подключен к каналам (0,1,6,13) и я немогу понять как ему сказать что двигатель подключен к этим выходам(входам) что бы плата поняла что это выходы .Компиляция проходит но он ШД делает то что я описал выше +1 по часовой -1 шаг против.
    Так же менял комбинацию подключения самого шагового двигателя на макетной плате ... ничего не дало .

    Так же пробовал использовать библиотеку #include <Stepper.h> компиляция не проходит выдает ошибку в строке с выходами Steper steper(Steps, 0, 1, 6, 13);
     
  6. Unixon

    Unixon Оракул Модератор

    Библиотека AFMotor рассчитана на шилд Adafruit, там непрямое управлкние, она вам не нужна.

    Какие проблемы с подключением Stepper? Покажите код примера.
     
  7. free_nor

    free_nor Нерд

    Это я пытался изменить код . подключаю Шаговый Двигатель через MotorShield. Сейчас шаговый двигатель выполняет несколько шагов без управления через меню . и потом останавливается.
    Основная проблема в том что я не знаю как прописать в программе что шаговый двигатель подключен через моторшиелд и что управляться он долежен через менб которое уже создано

    Код (Text):
    #include <AFMotor.h>

    /*
    LCD screen for motorized camera dolly
    Code written by: Philip Sorri
    */
    #include <LiquidCrystal.h> //LCD library
    #include <Bounce.h> //debounce library
    int button3 = A3; //button pins
    int button2 = A4;
    int button1 = A5;
    int startStop = A2;
    int runTime1;
    int show = 1;    //what menu to show
    int dollySpeedNum = 0; //number of the speed
    int delayTime = 100; //delay after pressedbutton (see the functions)
    int delayDolly = 0; //delay before running
    int runTime = 0;    //time to run after delay
    int motorPin = 10;
    int val4;
    int shutter = 1;
    int shutterCount = 0;
    int shutterVal = 0;
    Bounce bouncer1 = Bounce(button1, 15); //deblounce (button, milliseconds)
    Bounce bouncer2 = Bounce(button2, 15);
    Bounce bouncer3 = Bounce(button3, 15);
    Bounce bouncer4 = Bounce(startStop, 15);
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13); //pins of the LCD to arduino
    int angle=200*22/360;
    int panstep=1500;
    AF_Stepper motor(200, 1);
    void setup() {
      pinMode(button1, INPUT); //button as inputs
      pinMode(button2, INPUT);
      pinMode(button3, INPUT);
      pinMode(startStop, INPUT);
      pinMode(motorPin, OUTPUT);
      pinMode(shutter, OUTPUT);
      motor.setSpeed (4);
      for(int i=0; i<=panstep; i++);
      motor.step(angle*2, BACKWARD, INTERLEAVE);
      lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("DOLLYDUINO V 1.1");
      lcd.setCursor(0,1);
      lcd.print("By ThePhilleBoy");
      delay(3000);
    }
    void loop() {
      if(shutterVal > 1) {
        shutterVal = 0;
      }
      runTime1 = runTime;
      if(runTime == 0) {
        runTime1 = 10;
      }
      else {
        runTime1 = runTime;
      }
      bouncer1.update();  //update the buttons
      bouncer2.update();
      bouncer3.update();
      bouncer4.update();
      int val1 = bouncer1.read(); //reads the value
      int val2 = bouncer2.read(); //and sets the new variables to it
      int val3 = bouncer3.read(); //So if button is pressed value = HIGH
      val4 = bouncer4.read();
      if (show > 4) {              //Number of menus
        show = 1;
      }
      if(val3 == HIGH) {    //scroll through the different menus
        show = show + 1;    //the show number indicates which menu we're in
        delay(delayTime * 5);
      }
      if(show == 1) {      //if show is 1 the dollySpeed function is chosen/shown
        dollySpeed(val1, val2);  //To change values in this menu with same buttons
      }                          //in all the menus
      else if(show == 2) {  //if show is 2 delay function is chosen/shown on LCD
        dollyDelay(val1, val2);
      }
      else if(show == 3) {
        runningTime(val1, val2);
      }
      else if(show == 4) { //shows all the setting that are chosen
        settings();
        if(val1 == HIGH || val2 == HIGH) {
          shutterVal = shutterVal + 1;
          delay(delayTime*3);
        }
      }
      if(val4 == HIGH && shutterVal == 0){
      motorOn();
    }
      if(val4 == LOW){
      analogWrite(motorPin, LOW);
    }
      if(val4 == HIGH && shutterVal == 1) {
      motorOn();
      lcd.setCursor(0,0);
      lcd.print("P:");
      lcd.setCursor(4,0);
      lcd.print(shutterCount);
    }
    }
    void dollySpeed(int num1, int num2) {
      lcd.setCursor(0,0);    //sets the startpoint of the text to (0,0)
      lcd.print("Dolly speed:    "); //Writes "Dolly speed:" to the LCD
      if(num1 == HIGH) { //if num1 which is val1/button1 is pressed the speed
        dollySpeedNum = dollySpeedNum + 1;  //increases with 1
        delay(delayTime);      //delay before next press, otherwise it would
      }                        //scroll fast as hell
      if(num2 == HIGH) {        //if button2 is pressed decrease with 1
        dollySpeedNum = dollySpeedNum - 1;
        delay(delayTime);
      }
      lcd.setCursor(0,1);  //sets the starting point of the print
      lcd.print(dollySpeedNum); //prints to the start point (0,1)
      if(dollySpeedNum < 10) {
        lcd.setCursor(1, 1);
        lcd.print("%            "); //makes a percent sign after the number
      }                      //the space after it is to hide numbers that might
      if(dollySpeedNum >= 10 && dollySpeedNum < 100) { //be shown from the last
        lcd.setCursor(2, 1);            //menu that we scrolled from.
        lcd.print("%      "); //if the speed if over 10 and less than 100 it moves
      }                        //the percentsign one step to the right.
      if(dollySpeedNum == 100) { //same here
        lcd.setCursor(3, 1);
        lcd.print("%      ");
      }
      if(dollySpeedNum > 100) { //I wanted the speed to be in percent so I
        dollySpeedNum = 0;      //have to limit the value of dollySpeedNum.
      }                        //if the value is higher than 100 it makes it to 0
      if(dollySpeedNum < 0) {  //and if it's lower than 0 it goes to 100.
        dollySpeedNum = 100;
      }
    }
    void dollyDelay(int but1, int but2) {
      int decimal;
      decimal = delayDolly%10;
      lcd.setCursor(0,0);
      lcd.print("Delay:          ");
      if(but1 == HIGH) {
        delayDolly = delayDolly + 1;
        delay(delayTime);
      }
      if(but2 == HIGH) {
        delayDolly = delayDolly - 1;
        delay(delayTime);
      }
      lcd.setCursor(0,1);
      lcd.print(delayDolly/10);
      if(delayDolly < 10) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(delayDolly >= 10 && delayDolly < 100) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(delayDolly > 99) {
        lcd.setCursor(2, 1);
        lcd.print(".");
        lcd.setCursor(3,1);
        lcd.print(decimal);
        lcd.setCursor(4,1);
        lcd.print(" s    ");
      }
      if(delayDolly > 999) {
        delayDolly = 0;
      }
      if(delayDolly < 0) {
        delayDolly = 999;
      }
    }
    void runningTime(int num1, int num2) {
      int decimal1;
      decimal1 = runTime%10;
      lcd.setCursor(0,0);
      lcd.print("Run time:      ");
      if(num1 == HIGH) {
        runTime = runTime + 1;
        delay(delayTime);
      }
      if(num2 == HIGH) {
        runTime = runTime - 1;
        delay(delayTime);
      }
      lcd.setCursor(0,1);
      lcd.print(runTime/10);
      if(runTime < 10) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal1);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(runTime >= 10 && runTime < 100) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal1);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(runTime > 99) {
        lcd.setCursor(2, 1);
        lcd.print(".");
        lcd.setCursor(3,1);
        lcd.print(decimal1);
        lcd.setCursor(4,1);
        lcd.print(" s    ");
      }
      if(runTime > 999) {
        runTime = 0;
      }
      if(runTime < 0) {
        runTime = 999;
      }
    }
    void settings() {
      int decimal1;
      int decimal2;
      decimal1 = runTime%10;
      decimal2 = delayTime%10;
      lcd.setCursor(0,0);
      lcd.print("S: ");
      lcd.setCursor(3,0);
      lcd.print(dollySpeedNum);
      if(dollySpeedNum < 10) {
        lcd.setCursor(4,0);
        lcd.print("%  ");
      }
      if(dollySpeedNum >= 10 && dollySpeedNum < 100) {
        lcd.setCursor(5,0);
        lcd.print("%  ");
      }
      if(dollySpeedNum == 100) {
        lcd.setCursor(6,0);
        lcd.print("% ");
      }
      lcd.setCursor(8,0);
      lcd.print("R: ");
      lcd.setCursor(11,0);
      lcd.print(runTime/10);
      if(runTime < 10) {
        lcd.setCursor(12, 0);
        lcd.print(".");
        lcd.setCursor(13,0);
        lcd.print(decimal1);
        lcd.setCursor(14,0);
        lcd.print("s");
      }
      if(runTime >= 10 && runTime < 100) {
        lcd.setCursor(12,0);
        lcd.print(".");
        lcd.setCursor(13,0);
        lcd.print(decimal1);
        lcd.setCursor(14,0);
        lcd.print("s");
      }
      if(runTime > 99) {
        lcd.setCursor(13,0);
        lcd.print(".");
        lcd.setCursor(14,0);
        lcd.print(decimal1);
        lcd.setCursor(15,0);
        lcd.print("s");
    }
    lcd.setCursor(0,1);
      lcd.print("D: ");
      lcd.setCursor(3,1);
      lcd.print(delayDolly/10);
      if(delayDolly < 10) {
        lcd.setCursor(4, 1);
        lcd.print(".");
        lcd.setCursor(5,1);
        lcd.print(decimal1);
        lcd.setCursor(6,1);
        lcd.print("s");
      }
      if(delayDolly >= 10 && delayDolly < 100) {
        lcd.setCursor(4,1);
        lcd.print(".");
        lcd.setCursor(5,1);
        lcd.print(decimal2);
        lcd.setCursor(6,1);
        lcd.print("s");
      }
      if(delayDolly > 99) {
        lcd.setCursor(5, 1);
        lcd.print(".");
        lcd.setCursor(6,1);
        lcd.print(decimal1);
        lcd.setCursor(7,1);
        lcd.print("s");
    }
    if(val4 == LOW) {
    if(shutterVal == 0) {
    lcd.setCursor(10,1);
    lcd.print("I=OFF");
    }
    if(shutterVal == 1) {
      lcd.setCursor(10,1);
      lcd.print("I=ON ");
    }
    }
    }
    void motorOn () {
      int speedValue = map(dollySpeedNum, 0, 100, 0, 255);
      analogWrite(motorPin, speedValue);
        delay(runTime1*100);
        if(delayDolly > 0) {
        analogWrite(motorPin, LOW);
        picture();
        shutterCount = shutterCount + 1;
        delay(delayDolly*100);
      }
    }
    void picture() {
      pinMode(shutter, HIGH);
      delay(50);
      pinMode(shutter, LOW);
    }
     
  8. free_nor

    free_nor Нерд

    Все немного сделал ... осталось я так понимаю разобраться с логикой ... шаговый стал работать нормально подключил его через мотор шиелд ..... теперь осталось правильно прописать цепочку действий .. и как всегда вопрос :))) как ??? я так полагаю надо правильно указать карту шаговика ... + прописать что бы меню Dolly speed выставлялось количество шагов(количество кадров), а в delayTime какая пауза между шагами ... Run time ненужен:( вот такой код получился.
    Код (Text):
    /*
    LCD screen for motorized camera dolly
    Code written by: Philip Sorri
    */

    #include <AFMotor.h>
    #include <LiquidCrystal.h> //LCD library
    #include <Bounce.h> //debounce library
    int button3 = A5; //button pins
    int button2 =A4;
    int button1 = A3;
    int startStop = A2;
    int runTime1;
    int show = 1;    //what menu to show
    int dollySpeedNum = 0; //number of the speed
    int delayTime = 100; //delay after pressedbutton (see the functions)
    int delayDolly = 0; //delay before running
    int runTime = 0;    //time to run after delay
    int motorPin = 10;
    int angle=200*22/360; //задание числа шагов Ш.двигателя на один кадр, используемый Ш.двигатель совершает 200 шагов на полный оборот
    int panstep=1500; //задание числа снимков
    int shotPin=0; //определение контакта управления съемкой через USB
    int pause=1000; //определение паузы для процесса съемки
    int shot=0; //определение длительности сигнала USB 5В управления съемкой
    AF_Stepper motor(200, 1);
    int val4;
    int shutter = 1;
    int shutterCount = 0;
    int shutterVal = 0;
    Bounce bouncer1 = Bounce(button1, 15); //deblounce (button, milliseconds)
    Bounce bouncer2 = Bounce(button2, 15);
    Bounce bouncer3 = Bounce(button3, 15);
    Bounce bouncer4 = Bounce(startStop, 15);
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13); //pins of the LCD to arduino
    void setup() {
      pinMode(button1, INPUT); //button as inputs
      pinMode(button2, INPUT);
      pinMode(button3, INPUT);
      pinMode(startStop, INPUT);
      pinMode(motorPin, OUTPUT);
      pinMode(shutter, OUTPUT);
      lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print("DOLLYDUINO V 1.1");
      lcd.setCursor(0,1);
      lcd.print("By ThePhilleBoy");
      delay(3000);
    }
    void loop() {
      if(shutterVal > 1) {
        shutterVal = 0;
      }
      runTime1 = runTime;
      if(runTime == 0) {
        runTime1 = 10;
      }
      else {
        runTime1 = runTime;
      }
      bouncer1.update();  //update the buttons
      bouncer2.update();
      bouncer3.update();
      bouncer4.update();
      int val1 = bouncer1.read(); //reads the value
      int val2 = bouncer2.read(); //and sets the new variables to it
      int val3 = bouncer3.read(); //So if button is pressed value = HIGH
      val4 = bouncer4.read();
      if (show > 4) {              //Number of menus
        show = 1;
      }
      if(val3 == HIGH) {    //scroll through the different menus
        show = show + 1;    //the show number indicates which menu we're in
        delay(delayTime * 5);
      }
      if(show == 1) {      //if show is 1 the dollySpeed function is chosen/shown
        dollySpeed(val1, val2);  //To change values in this menu with same buttons
      }                          //in all the menus
      else if(show == 2) {  //if show is 2 delay function is chosen/shown on LCD
        dollyDelay(val1, val2);
      }
      else if(show == 3) {
        runningTime(val1, val2);
      }
      else if(show == 4) { //shows all the setting that are chosen
        settings();
        if(val1 == HIGH || val2 == HIGH) {
          shutterVal = shutterVal + 1;
          delay(delayTime*3);
        }
      }
      if(val4 == HIGH && shutterVal == 0){
      motorOn();
    }
      if(val4 == LOW){
      analogWrite(motorPin, LOW);
    }
      if(val4 == HIGH && shutterVal == 1) {
      motorOn();
      lcd.setCursor(0,0);
      lcd.print("P:");
      lcd.setCursor(4,0);
      lcd.print(shutterCount);
    }
    }
    void dollySpeed(int num1, int num2) {
      lcd.setCursor(0,0);    //sets the startpoint of the text to (0,0)
      lcd.print("Dolly speed:    "); //Writes "Dolly speed:" to the LCD
      if(num1 == HIGH) { //if num1 which is val1/button1 is pressed the speed
        dollySpeedNum = dollySpeedNum + 1;  //increases with 1
        delay(delayTime);      //delay before next press, otherwise it would
      }                        //scroll fast as hell
      if(num2 == HIGH) {        //if button2 is pressed decrease with 1
        dollySpeedNum = dollySpeedNum - 1;
        delay(delayTime);
      }
      lcd.setCursor(0,1);  //sets the starting point of the print
      lcd.print(dollySpeedNum); //prints to the start point (0,1)
      if(dollySpeedNum < 10) {
        lcd.setCursor(1, 1);
        lcd.print("%            "); //makes a percent sign after the number
      }                      //the space after it is to hide numbers that might
      if(dollySpeedNum >= 10 && dollySpeedNum < 100) { //be shown from the last
        lcd.setCursor(2, 1);            //menu that we scrolled from.
        lcd.print("%      "); //if the speed if over 10 and less than 100 it moves
      }                        //the percentsign one step to the right.
      if(dollySpeedNum == 100) { //same here
        lcd.setCursor(3, 1);
        lcd.print("%      ");
      }
      if(dollySpeedNum > 100) { //I wanted the speed to be in percent so I
        dollySpeedNum = 0;      //have to limit the value of dollySpeedNum.
      }                        //if the value is higher than 100 it makes it to 0
      if(dollySpeedNum < 0) {  //and if it's lower than 0 it goes to 100.
        dollySpeedNum = 100;
      }
    }
    void dollyDelay(int but1, int but2) {
      int decimal;
      decimal = delayDolly%10;
      lcd.setCursor(0,0);
      lcd.print("Delay:          ");
      if(but1 == HIGH) {
        delayDolly = delayDolly + 1;
        delay(delayTime);
      }
      if(but2 == HIGH) {
        delayDolly = delayDolly - 1;
        delay(delayTime);
      }
      lcd.setCursor(0,1);
      lcd.print(delayDolly/10);
      if(delayDolly < 10) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(delayDolly >= 10 && delayDolly < 100) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(delayDolly > 99) {
        lcd.setCursor(2, 1);
        lcd.print(".");
        lcd.setCursor(3,1);
        lcd.print(decimal);
        lcd.setCursor(4,1);
        lcd.print(" s    ");
      }
      if(delayDolly > 999) {
        delayDolly = 0;
      }
      if(delayDolly < 0) {
        delayDolly = 999;
      }
    }
    void runningTime(int num1, int num2) {
      int decimal1;
      decimal1 = runTime%10;
      lcd.setCursor(0,0);
      lcd.print("Run time:      ");
      if(num1 == HIGH) {
        runTime = runTime + 1;
        delay(delayTime);
      }
      if(num2 == HIGH) {
        runTime = runTime - 1;
        delay(delayTime);
      }
      lcd.setCursor(0,1);
      lcd.print(runTime/10);
      if(runTime < 10) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal1);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(runTime >= 10 && runTime < 100) {
        lcd.setCursor(1, 1);
        lcd.print(".");
        lcd.setCursor(2,1);
        lcd.print(decimal1);
        lcd.setCursor(3,1);
        lcd.print(" s    ");
      }
      if(runTime > 99) {
        lcd.setCursor(2, 1);
        lcd.print(".");
        lcd.setCursor(3,1);
        lcd.print(decimal1);
        lcd.setCursor(4,1);
        lcd.print(" s    ");
      }
      if(runTime > 999) {
        runTime = 0;
      }
      if(runTime < 0) {
        runTime = 999;
      }
    }
    void settings() {
      int decimal1;
      int decimal2;
      decimal1 = runTime%10;
      decimal2 = delayTime%10;
      lcd.setCursor(0,0);
      lcd.print("S: ");
      lcd.setCursor(3,0);
      lcd.print(dollySpeedNum);
      if(dollySpeedNum < 10) {
        lcd.setCursor(4,0);
        lcd.print("%  ");
      }
      if(dollySpeedNum >= 10 && dollySpeedNum < 100) {
        lcd.setCursor(5,0);
        lcd.print("%  ");
      }
      if(dollySpeedNum == 100) {
        lcd.setCursor(6,0);
        lcd.print("% ");
      }
      lcd.setCursor(8,0);
      lcd.print("R: ");
      lcd.setCursor(11,0);
      lcd.print(runTime/10);
      if(runTime < 10) {
        lcd.setCursor(12, 0);
        lcd.print(".");
        lcd.setCursor(13,0);
        lcd.print(decimal1);
        lcd.setCursor(14,0);
        lcd.print("s");
      }
      if(runTime >= 10 && runTime < 100) {
        lcd.setCursor(12,0);
        lcd.print(".");
        lcd.setCursor(13,0);
        lcd.print(decimal1);
        lcd.setCursor(14,0);
        lcd.print("s");
      }
      if(runTime > 99) {
        lcd.setCursor(13,0);
        lcd.print(".");
        lcd.setCursor(14,0);
        lcd.print(decimal1);
        lcd.setCursor(15,0);
        lcd.print("s");
    }
    lcd.setCursor(0,1);
      lcd.print("D: ");
      lcd.setCursor(3,1);
      lcd.print(delayDolly/10);
      if(delayDolly < 10) {
        lcd.setCursor(4, 1);
        lcd.print(".");
        lcd.setCursor(5,1);
        lcd.print(decimal1);
        lcd.setCursor(6,1);
        lcd.print("s");
      }
      if(delayDolly >= 10 && delayDolly < 100) {
        lcd.setCursor(4,1);
        lcd.print(".");
        lcd.setCursor(5,1);
        lcd.print(decimal2);
        lcd.setCursor(6,1);
        lcd.print("s");
      }
      if(delayDolly > 99) {
        lcd.setCursor(5, 1);
        lcd.print(".");
        lcd.setCursor(6,1);
        lcd.print(decimal1);
        lcd.setCursor(7,1);
        lcd.print("s");
    }
    if(val4 == LOW) {
    if(shutterVal == 0) {
    lcd.setCursor(10,1);
    lcd.print("I=OFF");
    }
    if(shutterVal == 1) {
      lcd.setCursor(10,1);
      lcd.print("I=ON ");
    }
    }
    }
    void motorOn () {
      motor.setSpeed (4); //скорость вращения Ш.двигателя 4 оборота в минуту
      motor.release(); //отключение питания Ш.двигателя для установки ракурса первого снимка

      int speedValue = map(dollySpeedNum,200, 100, 50, 4);
      analogWrite(motorPin, speedValue);
        delay(runTime1*100);
        if(delayDolly > 0) {
        analogWrite(motorPin, LOW);
        motor.step(speedValue, BACKWARD, INTERLEAVE);
        picture();
        shutterCount = shutterCount + 1;
        delay(delayDolly*100);
      }
    }
    void picture() {
      pinMode(shutter, HIGH);
      delay(50);
      pinMode(shutter, LOW);
    }