ШД 28byj-48 измененние скорости кнопкой. Поршу помощи.

zodiak2064
Offline
Зарегистрирован: 13.06.2018

Никак не заставлю меняться скорость при нажатии кнопки. Строки 39-45. Двигатель вращается вперед-назад с медленнной скоростью и иногда его нужно поторопить нажатием кннопки. Нажал- ускорился, отпустил - продолжил вращаться на прежней медленнной скорости. Скорость при нажатии не меняется. Можете объяснить бестолковому, что конкретнно не правильно?

 

#include <CustomStepper.h>          // Подключаем библиотеку CustomStepper
CustomStepper stepper(3, 4, 5, 6);  // Указываем пины, к которым подключен драйвер шагового двигателя

boolean rotate1 = false;            // Переменная для смены режимов
boolean rotate2 = false;            // Переменная для смены режимов

unsigned long currentTime;
unsigned long loopTime = currentTime;
char a = 1; //обороты

void setup()

{
  stepper.setRPM(a);            //количество оборотов в минуту
  stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395
  pinMode (9, OUTPUT);          // фокус камеры
  pinMode (10, OUTPUT);         // затвор камеры
  currentTime = millis();       // считываем время, прошедшее с момента запуска программы
  digitalWrite(12, HIGH);
}

void loop()
{
  if (stepper.isDone() &&  rotate1 == false)
  {
    stepper.setDirection(CCW);    // направление вращения (по часовой)
    stepper.rotate(19);           //количество оборотов
    rotate1 = true;
  }
  if (stepper.isDone() && rotate1 == true && rotate2 == false)
  {
    stepper.setDirection(CW);  //направление вращения (против часовой)
    stepper.rotate(19);        //количество оборотов
    rotate2 = true;
  }
  if (stepper.isDone() && rotate2 == true )rotate1 = false;


  if (digitalRead(12) == HIGH) //кнопка не нажата - 1 об.мин
  {
    a = 1;
  }
  else {                       // кнопка нажата - 12 об.мин
    a = 12;
  }


  stepper.run(); // инициия работы двигателя
  camera();
}


void camera() // Фокусировка и затвор
{
  currentTime = millis();
  if (currentTime >= (loopTime + 2500)) // интервал (мс*2)
  { digitalWrite(9, !digitalRead(9));
    loopTime = currentTime;
    if (currentTime >= (loopTime + 500))
    {
      digitalWrite(10, !digitalRead(10));
    }
    loopTime = currentTime;
    digitalWrite(10, !digitalRead(10));
    digitalWrite(9, !digitalRead(9));
  }
}

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Вопрос #1: какой функцией задается скорость?

IVAN222
Offline
Зарегистрирован: 19.04.2017

 кнопка подключена к какому пину? Сделай его как вход. 19 строка  pinMode (12, INPUT); 

zodiak2064
Offline
Зарегистрирован: 13.06.2018

Скорость задается

stepper.setRPM(a);            //количество оборотов в минуту

 

Строку 19 исправил, результат-0. Как был 1 оборот в минуту, так и остается не реагируя на кнопку.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

zodiak2064 пишет:

stepper.setRPM(a);            //количество оборотов в минуту

Вопрос #2: почему не задается скорость при обработке состояния кнопки? 

IVAN222
Offline
Зарегистрирован: 19.04.2017

Можно посмотреть схему подключения кнопки к пину 12.

zodiak2064
Offline
Зарегистрирован: 13.06.2018

Ну по поводу "Вопрос #2", я думал что достаточно будет указать что при нажатии переменная "а" с таким значением, при не нажатой кнопке с другим. Не получилось.

Схема подключения кнопки: 12 пин на землю. digitalWrite(12, INPUT_PULLUP);

zodiak2064
Offline
Зарегистрирован: 13.06.2018

Сильно не ругайте. Ардуино на руках недели 2. Пока все такими дебрями кажется

IVAN222
Offline
Зарегистрирован: 19.04.2017

Переменная а =1, в сетупе у вас   stepper.setRPM(a); количество оборотов , переместите ее в луп.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

zodiak2064 пишет:

Ну по поводу "Вопрос #2", я думал что достаточно будет указать что при нажатии переменная "а" с таким значением, при не нажатой кнопке с другим. Не получилось.

Это тут так не работает.  Хотите изменить что-то - вызывайте функцию.

zodiak2064
Offline
Зарегистрирован: 13.06.2018

строки 7 и 14. Так тоже не работает

void loop()
{
  if (stepper.isDone() &&  rotate1 == false)
  {
    stepper.setDirection(CCW);    // направление вращения (по часовой)
    stepper.rotate(19);           //количество оборотов
    stepper.setRPM(a);
    rotate1 = true;
  }
  if (stepper.isDone() && rotate1 == true && rotate2 == false)
  {
    stepper.setDirection(CW);  //направление вращения (против часовой)
    stepper.rotate(19);        //количество оборотов
    stepper.setRPM(a);
    rotate2 = true;
  }
  if (stepper.isDone() && rotate2 == true )rotate1 = false;


  if (digitalRead(12) == HIGH) //кнопка не нажата - 1 об.мин
  {
    a = 1;
  }
  else {                       // кнопка нажата - 12 об.мин
    a = 12;
  }


  stepper.run(); // инициия работы двигателя
  camera();
}

 

IVAN222
Offline
Зарегистрирован: 19.04.2017

Посмотрите это http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

второй рисунок

sadman41
Онлайн
Зарегистрирован: 19.10.2016

...а обработка нажатия кнопки где происходит?

IVAN222
Offline
Зарегистрирован: 19.04.2017

строка 20

IVAN222
Offline
Зарегистрирован: 19.04.2017

Подключение кнопки как на 2 рисунке.

#include <CustomStepper.h>          // Подключаем библиотеку CustomStepper
CustomStepper stepper(3, 4, 5, 6);  // Указываем пины, к которым подключен драйвер шагового двигателя

boolean rotate1 = false;            // Переменная для смены режимов
boolean rotate2 = false;            // Переменная для смены режимов

unsigned long currentTime;
unsigned long loopTime = currentTime;

void setup()

{
  stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395
  pinMode (9, OUTPUT);          // фокус камеры
  pinMode (10, OUTPUT);         // затвор камеры
  pinMode (12, INPUT);         // кнопка
  currentTime = millis();       // считываем время, прошедшее с момента запуска программы
}

void loop()
{
  if (stepper.isDone() &&  rotate1 == false)
  {
    stepper.setDirection(CCW);    // направление вращения (по часовой)
    stepper.rotate(19);           //количество оборотов
    rotate1 = true;
  }
  if (stepper.isDone() && rotate1 == true && rotate2 == false)
  {
    stepper.setDirection(CW);  //направление вращения (против часовой)
    stepper.rotate(19);        //количество оборотов
    rotate2 = true;
  }


  if (digitalRead(12) == LOW) //кнопка не нажата - 1 об.мин
  {
   stepper.setRPM(1);            //количество оборотов в минуту
  }
  else {                       // кнопка нажата - 12 об.мин
   stepper.setRPM(12);            //количество оборотов в минуту
  }


  stepper.run(); // инициия работы двигателя
  camera();
}


void camera() // Фокусировка и затвор
{
  currentTime = millis();
  if (currentTime >= (loopTime + 2500)) // интервал (мс*2)
  { digitalWrite(9, !digitalRead(9));
    loopTime = currentTime;
    if (currentTime >= (loopTime + 500))
    {
      digitalWrite(10, !digitalRead(10));
    }
    loopTime = currentTime;
    digitalWrite(10, !digitalRead(10));
    digitalWrite(9, !digitalRead(9));
  }
}

 

zodiak2064
Offline
Зарегистрирован: 13.06.2018

Добрый вечер! Дико извиняюсь на поздний ответ. Огромное спасибо всем откликнувшимся. Исправленный скетч работает. Статью по ссылке прочитал и приведеннные примеры вдохнновили на небольшие изменения. Теперь кнопкой несколько скоростей переключать буду.

#include <CustomStepper.h>          // Подключаем библиотеку CustomStepper
CustomStepper stepper(3, 4, 5, 6);  // Указываем пины, к которым подключен драйвер шагового двигателя

boolean rotate1 = false;            // Переменная для смены режимов
boolean rotate2 = false;            // Переменная для смены режимов

unsigned long currentTime;
unsigned long loopTime = currentTime;


int flagSpeed = 0;
int menu = 0;
int Speed [4] = {1, 2, 5, 12}; //скорость вращения об/мин.

void setup()
{
  stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395
  pinMode (9, OUTPUT);          // фокус камеры
  pinMode (10, OUTPUT);         // затвор камеры
  pinMode (12, INPUT);          // кнопка "скорость"
  currentTime = millis();       // считываем время, прошедшее с момента запуска программы
}

void loop()
// Постоянное вращение двигателя по часовой - против часовой
{
  if (stepper.isDone() &&  rotate1 == false)
  {
    stepper.setDirection(CCW);    // направление вращения (по часовой)
    stepper.rotate(19);           //количество оборотов
    rotate1 = true;
  }
  if (stepper.isDone() && rotate1 == true && rotate2 == false)
  {
    stepper.setDirection(CW);  //направление вращения (против часовой)
    stepper.rotate(19);        //количество оборотов
    rotate2 = true;
  }
  if (stepper.isDone() && rotate2 == true )rotate1 = false;

  // Переключение скоростей вращения 1й кнопкой
  if (digitalRead(12) == HIGH && flagSpeed == 0) //если кнопка нажата и перемення flagSpeed равна 0 , то ...
  {
    menu++;
    flagSpeed = 1;    //с каждым нажатием кнопки происходит только одно действие и защита от "дребезга"
    if (menu > 3) //ограничим количество режимов
    {
      menu = 0;   // одна кнопка - переключать режимы будем циклично
    }
  }

  if (digitalRead(12) == LOW && flagSpeed == 1) //если кнопка НЕ нажата и переменная flagSpeed равна - 1 ,то ...
  {
    flagSpeed = 0; //обнуляем переменную "knopka"
  }
  stepper.setRPM(Speed[menu]);

  stepper.run(); // инициия работы двигателя
  camera();
}

void camera() // Фокусировка и затвор
{
  currentTime = millis();
  if (currentTime >= (loopTime + 2500)) // интервал (мс*2)
  { digitalWrite(9, !digitalRead(9));
    loopTime = currentTime;
    if (currentTime >= (loopTime + 500))
    {
      digitalWrite(10, !digitalRead(10));
    }
    loopTime = currentTime;
    digitalWrite(10, !digitalRead(10));
    digitalWrite(9, !digitalRead(9));
  }
}

Дальше доколдую с кнопкой старт-стоп и дисплеем. Еще раз огромное спасибо!

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Дребезг подавляется не совсем корректно. Вам нужно повторно проверять состояние кнопки не только по флагу, а и через некоторое время, когда дребезг успокоится. Начнем с минимума 8 мс.  Способ проверки у вас уже реализован в стр.65. Сделайте по тому же принципу, только условие более правильно изображать как (millis() - lastCheckTime > interval). Инкремент переменной menu и установку скорости более продуктивно делать при повторной проверке состояния кнопки.

А можете просто конденсатор паралелльно контактам подсадить.

zodiak2064
Offline
Зарегистрирован: 13.06.2018

Добрый день. Не получается с дисплеем наколдовать. При выводе текущего значения скорости на дисплей проблемы начинаются. Двигатель останавливается при включении 12 об/мин. Кнопка работает, скорость переключается, на дисплее показания меняются, камера щелкает, а двигатель стоит до сброса платы.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <CustomStepper.h>
CustomStepper stepper(3, 4, 5, 6);  // Пины, к которым подключен драйвер шагового двигателя

boolean rotate1 = false;            // Переменная для смены режимов вращения (по часовой)
boolean rotate2 = false;            // Переменная для смены режимов вращения (против часовой)

LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей

unsigned long currentTime = 0;
unsigned long loopTime = currentTime;

bool button_state = false;           // Состояние кнопки "скорость"
unsigned long ms_button = 0;
byte menu = 0;
byte Speed [4] = {1, 2, 5, 12}; //скорость вращения об/мин.

void setup()
{
  lcd.init();
  lcd.backlight();              // Включаем подсветку дисплея
  lcd.setCursor(0, 0);
  lcd.print("Speed:   prm");
  lcd.setCursor(6, 0);
  lcd.print(Speed[0]);
  stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395
  pinMode (9, OUTPUT);          // фокус камеры
  pinMode (10, OUTPUT);         // затвор камеры
  pinMode (12, INPUT);          // кнопка "скорость"

  currentTime = millis();       // считываем время, прошедшее с момента запуска программы
}

void loop()
// ----------------Постоянное вращение двигателя по часовой - против часовой------------
{
  if (stepper.isDone() &&  rotate1 == false)
  {
    stepper.setDirection(CCW);    // направление вращения (по часовой)
    stepper.rotate(2);            //количество оборотов
    rotate1 = true;
  }
  if (stepper.isDone() && rotate1 == true && rotate2 == false)
  {
    stepper.setDirection(CW);     //направление вращения (против часовой)
    stepper.rotate(2);            //количество оборотов
    rotate2 = true;
  }
  if (stepper.isDone() && rotate2 == true )
  {
    rotate1 = false; rotate2 = false;
  }
  camera();
  stepper.setRPM(Speed[menu]);
  stepper.run(); // инициия работы двигателя

  // ----------------Переключение скоростей вращения 1й кнопкой-------------------------

  unsigned long ms = millis();
  // Фиксируем нажатие кнопки
  if ( digitalRead(12) == HIGH && !button_state && ( ms - ms_button ) > 15 )
  {
    button_state = true;
    ms_button = ms;
    menu++;
    if (menu > 3) //ограничим количество режимов
    {
      menu = 0;
    }
    lcd.setCursor(6, 0);
    lcd.print(Speed[menu]);
    lcd.print(" ");
  }
  // Фиксируем отпускание кнопки
  if ( digitalRead(12) == LOW && button_state && ( ms - ms_button ) > 15  )
  {
    button_state = false;
    ms_button = ms;
  }

}
void camera() // Фокусировка и затвор
{ currentTime = millis();
  if (currentTime >= (loopTime + 2500)) // интервал (мс*2)
  { digitalWrite(9, !digitalRead(9));
    loopTime = currentTime;
    if (currentTime >= (loopTime + 500))
    {
      digitalWrite(10, !digitalRead(10));
    }
    loopTime = currentTime;
    digitalWrite(10, !digitalRead(10));
    digitalWrite(9, !digitalRead(9));
  }
}

Пробовал сделать так:


 unsigned long ms = millis();
  // Фиксируем нажатие кнопки
  if ( digitalRead(12) == HIGH && !button_state && ( ms - ms_button ) > 15 )
  {
    button_state = true;
    ms_button = ms;
    menu++;
    if (menu > 3) //ограничим количество режимов
    {
      menu = 0;
    }
  }
  // Фиксируем отпускание кнопки
  if ( digitalRead(12) == LOW && button_state && ( ms - ms_button ) > 15  )
  {
    button_state = false;
    ms_button = ms;
    lcd.setCursor(6, 0);
    lcd.print(Speed[menu]);
    lcd.print(" ");
  }
Тогда при очередном нажатии начинается вращение на максимальной скорости, но отпустив кнопку - опять остановка. 
Сам сбой в работе периодический. 1 раз нормально с 12 на 1 оборот переключится, а потом несколько раз останавливается. Нужно сброс делать. Если вообще убрать строки вывода информации, то скорость нормально переключается по кругу. 
sadman41
Онлайн
Зарегистрирован: 19.10.2016

Сдается мне, что LSD тут непричем, просто алгоритм написан неправильно и задержка при выводе на дисплей ломает всё.

Поставьте вместо lcd.print-ов loop() скажем что-то типа delay(5);

 

IVAN222
Offline
Зарегистрирован: 19.04.2017

Попробуй с дисплеем перед тем как выводить информацию очищай его.

lcd.clear();  //очистить дисплей
lcd.setCursor(6, 0);
lcd.print(Speed[menu]);
lcd.print(" ");

 

zodiak2064
Offline
Зарегистрирован: 13.06.2018

Очистка дисплея не помогла. Результат то же. Этот же эффект достигается и delay(5) вместо lcd.print-ов в loop(), но уже гораздо чаще (на любом нажатии может остановиться). "Вылечилось" так:

// Фиксируем нажатие кнопки
  if ( digitalRead(12) == HIGH && !button_state && ( ms - ms_button ) > 15 )
  {
    button_state = true;
    ms_button = ms;
    menu++;
    
    if (menu > 3) //ограничим количество режимов
    {
      menu = 0;
    }
   lcd.setCursor(6, 0);
   stepper.run();
   lcd.print(Speed[menu]);
   stepper.run();
   lcd.print(" ");
    }

Перед каждым lcd.print нужно подпинывать двигатель командой run(). Стоит убрать любую из них и опять остановка на последнем положении. Пробовал последнюю скорость задать однозначным числом, менял тип переменной, выносил lcd.print просто в loop() и все равно остановка именнно на последнем значении. С delay(5) останавливатся произвольно.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Значится проблема в алгоритме. Нужно сесть и еще раз подумать, написать все с чистого листа.

zodiak2064
Offline
Зарегистрирован: 13.06.2018

Всем добрый вечер и удачного продолжения выходных!

 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "sav_button.h"
#include <CustomStepper.h>
CustomStepper stepper(3, 4, 5, 6);  // Пины, к которым подключен драйвер шагового двигателя

boolean rotate1 = false;            // Переменная для смены режимов вращения (по часовой)
boolean rotate2 = false;            // Переменная для смены режимов вращения (против часовой)

LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей

byte Start_step = 0;
byte menu_speed = 0;
byte Speed [4] = {1, 2, 5, 10};     //скорость вращения об/мин.

byte Start_shoot = 0;
byte menu_interval = 0;
int Interval [3] = {1000, 2500, 4500}; //интервал съемки


SButton button1(11, 100, 1000, 0, 0); // кнопка №1. (интервал/съемка).
SButton button2(12, 100, 1000, 0, 0); // кнопка №2. (скорость/пуск).


unsigned long previousMillis = 0;

void setup()
{
  lcd.init();
  lcd.backlight();              // Включаем подсветку дисплея
  lcd.setCursor(0, 0);
  lcd.print("Speed:    prm");
  lcd.setCursor(6, 0);
  lcd.print(Speed[0]);
  lcd.setCursor(0, 1);
  lcd.print("Int. :    sec");
  lcd.setCursor(6, 1);
  lcd.print(((Interval[0]) * 2) / 1000);
  

  stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395
  pinMode (9, OUTPUT);          // фокус камеры
  pinMode (10, OUTPUT);         // затвор камеры

  button1.begin(); //инициализация кнопки №1
  button2.begin(); //инициализация кнопки №2
}

void loop()

{
  { //////////////////////////////////////////////////////////////////////////////////////////
    // -------------Постоянное вращение двигателя против часовой - по часовой---------------//
    if (stepper.isDone() &&  rotate1 == false &&  Start_step == 1)
    {
      stepper.setDirection(CCW);    // направление вращения (против часовой)
      stepper.rotate(2);            //количество оборотов
      rotate1 = true;
    }
    if (stepper.isDone() && rotate1 == true && rotate2 == false &&  Start_step == 1)
    {
      stepper.setDirection(CW);     //направление вращения (по часовой)
      stepper.rotate(2);            //количество оборотов
      rotate2 = true;
    }
    if (stepper.isDone() && rotate2 == true && rotate1 == true )
    {
      rotate1 = false; rotate2 = false;
    }
    stepper.setRPM(Speed[menu_speed]);
    stepper.run(); // инициация работы двигателя
    if (Start_shoot == 1)camera();
    if (Start_step == 0)stepper.setDirection(STOP);
  }

  { ///////////////////////////////////////////////////////////////////////////////////////////////
    // -------------------Установка интервала и запуск съемки 1й кнопкой-------------------------//
    switch ( button1.Loop() ) {
      case SB_CLICK:   // Фиксируем короткое нажатие кнопки №1
        menu_interval++;
        if (menu_interval > 2)   //ограничим количество режимов
        {
          menu_interval = 0;
        }
        lcd.setCursor(6, 1);
        stepper.run();
        lcd.print(((Interval[menu_interval]) * 2) / 1000);
        stepper.run();
        lcd.print(" ");
        stepper.run();
        break;
      case SB_LONG_CLICK: // Фиксируем длинное нажатие кнопки №1
        Start_shoot++;
        if (Start_shoot > 1) // количество режимов
        {
          Start_shoot = 0;
        }
        break;
    }
  }
  { ///////////////////////////////////////////////////////////////////////////////////////////////
    // -------------Пуск двигателя и переключение скоростей вращения 2й кнопкой------------------//
    switch ( button2.Loop() ) {
      case SB_CLICK:    // Фиксируем короткое нажатие кнопки №2
        menu_speed++;
        if (menu_speed > 3)       // количество режимов
        {
          menu_speed = 0;
        }
        lcd.setCursor(6, 0);
        stepper.run();
        lcd.print(Speed[menu_speed]);
        stepper.run();
        lcd.print(" ");
        stepper.run();
        break;
      case SB_LONG_CLICK: // Фиксируем длинное нажатие кнопки №2
        Start_step++;
        if (Start_step > 1) // количество режимов (1-пуск/0-стоп)
        {
          Start_step = 0;
        }
        break;
    }
  }
}

void camera() // Фокусировка и затвор
{
  unsigned long currentMillis = millis ();
  if (currentMillis >= (previousMillis + (Interval[menu_interval])))
  {
    previousMillis = currentMillis;
    digitalWrite(9, !digitalRead(9));
    if (currentMillis >= (previousMillis + 300)) {
      digitalWrite(10, !digitalRead(10));
      
    }
    previousMillis = currentMillis;
    digitalWrite(10, !digitalRead(10));
    digitalWrite(9, !digitalRead(9));
  }
}

Все равно подозрение что дело в дисплее.

Уже эмпирическим путем установил, что если максимальная скорость 10 оборотов и интервал 9 секунд, то все нормально работает. Стоит вывести на экран 11 (оборотов) или 10 (секунд) и опять остановка.

Согласен, что мне до полной оптимизации алгоритма еще далеко, но вот совсем простой пример:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#include <CustomStepper.h>

CustomStepper stepper(3, 4, 5, 6, (byte[]) {
  8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001
}, 4075.7728395, 12, CW);
boolean rotate1 = false;
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
  lcd.init();
  lcd.backlight();
  stepper.setRPM(12);
  stepper.setSPR(4075.7728395);
}

void loop()
{
  if (stepper.isDone() && rotate1 == false)
  {
    stepper.setDirection(CCW);
    stepper.rotate();
  }
  lcd.setCursor(0, 0);
  lcd.print(1);
  stepper.run();
}

Двигатель вообще не стартанет, пока не убрать строку 28. Что единичка выводится, что любая буква. Пробовал выводить число по ннажатию кнопки. Доходит до двухзначного числа и остановка. Вывод информации на дисплей останавливает двигатель. Есть вообще  разница в скорости работы и вывода символов от того, как он подключен? Шлейфом проводов или по i2c?

inspiritus
Offline
Зарегистрирован: 17.12.2012

З даётся мне , что пока человек вообще не ведает, что творит, алгоритмы не при чем.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

То есть, если оставить в лупе только run() - мотор будет крутится?

zodiak2064
Offline
Зарегистрирован: 13.06.2018

Да, если оставить только run() ,то крутится.

zodiak2064
Offline
Зарегистрирован: 13.06.2018

Если понизить скорость до 9 оборотов, то работает и с lcd.print. Все таки получается, что чем выше скорость вращения, тем чаще нужно отправлять stepper.run. 

В моем скетче без дисплея на максимальной скорости в 12 оборотов можно выбрать любой интервал съемки. Хоть 2, хоть 10 секнд и все работает. Но при выводе двухзначного числа на дисплей при большой скорости вращения происходит остановка. Сейчас нашел компромисс с максимальной скоростью 10 оборотов и интервалом в 9 секунд. Пока работает, но это полумеры. Стоит вывести показания счетчика отснятых кадров, они дойдут скажем до трехзначного числа и все опять встанет.

vvadim
Offline
Зарегистрирован: 23.05.2012

если не секрет - что снимаете и чем?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Вобщем, все понятно. Вы выбрали неудачную библиотеку. Насколько я понимаю - их метод измерения задержек между степами несколько неудачен и шагание происходит, только если run() вызывается в некоторый промежуток времени после начала движения. Задержки выросли - в "окно шага" вызов функции не попадает, мотор не шагает. Калькуляция этого "окна шага" происходит внутри библиотеки и синхронизироваться с ней непросто (да и смысла нет). Странный, вобщем, этот CustomStepper. Или я чего-то не понимаю в алгоритме работы этой либы.

zodiak2064
Offline
Зарегистрирован: 13.06.2018

vvadim пишет:

если не секрет - что снимаете и чем?

Таймлапсами загорелся. Снимаю обычной старой цифромыльницей. Разобрал корпус и подпаял проводки к кнопке затвора (нужной функции из коробки нет) и ардуино периодически кадры щелкает. Вот захотелость в движении поснимать. Интересный эффект получается.

vvadim
Offline
Зарегистрирован: 23.05.2012

а когда движение по двум осям так вообще круто будет)))))

inspiritus
Offline
Зарегистрирован: 17.12.2012

Извините за нескромность: какого года у Вас Порш?

vvadim
Offline
Зарегистрирован: 23.05.2012

inspiritus пишет:

Извините за нескромность: какого года у Вас Порш?

наверно тему попутал)))))

sadman41
Онлайн
Зарегистрирован: 19.10.2016

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

inspiritus
Offline
Зарегистрирован: 17.12.2012

Данет же, в теме ясно написано "поршу"

поршу нет лр да.

Stepan163
Offline
Зарегистрирован: 24.03.2020

можешь скинуть скетч с работающей кнопкой на почту ? Stepan163s@ya.ru

 

zodiak2064 пишет:

Никак не заставлю меняться скорость при нажатии кнопки. Строки 39-45. Двигатель вращается вперед-назад с медленнной скоростью и иногда его нужно поторопить нажатием кннопки. Нажал- ускорился, отпустил - продолжил вращаться на прежней медленнной скорости. Скорость при нажатии не меняется. Можете объяснить бестолковому, что конкретнно не правильно?

 

#include <CustomStepper.h>          // Подключаем библиотеку CustomStepper
CustomStepper stepper(3, 4, 5, 6);  // Указываем пины, к которым подключен драйвер шагового двигателя

boolean rotate1 = false;            // Переменная для смены режимов
boolean rotate2 = false;            // Переменная для смены режимов

unsigned long currentTime;
unsigned long loopTime = currentTime;
char a = 1; //обороты

void setup()

{
  stepper.setRPM(a);            //количество оборотов в минуту
  stepper.setSPR(4075.7728395); //колочество шагов на полный оборот. Максимальное значение 4075.7728395
  pinMode (9, OUTPUT);          // фокус камеры
  pinMode (10, OUTPUT);         // затвор камеры
  currentTime = millis();       // считываем время, прошедшее с момента запуска программы
  digitalWrite(12, HIGH);
}

void loop()
{
  if (stepper.isDone() &&  rotate1 == false)
  {
    stepper.setDirection(CCW);    // направление вращения (по часовой)
    stepper.rotate(19);           //количество оборотов
    rotate1 = true;
  }
  if (stepper.isDone() && rotate1 == true && rotate2 == false)
  {
    stepper.setDirection(CW);  //направление вращения (против часовой)
    stepper.rotate(19);        //количество оборотов
    rotate2 = true;
  }
  if (stepper.isDone() && rotate2 == true )rotate1 = false;


  if (digitalRead(12) == HIGH) //кнопка не нажата - 1 об.мин
  {
    a = 1;
  }
  else {                       // кнопка нажата - 12 об.мин
    a = 12;
  }


  stepper.run(); // инициия работы двигателя
  camera();
}


void camera() // Фокусировка и затвор
{
  currentTime = millis();
  if (currentTime >= (loopTime + 2500)) // интервал (мс*2)
  { digitalWrite(9, !digitalRead(9));
    loopTime = currentTime;
    if (currentTime >= (loopTime + 500))
    {
      digitalWrite(10, !digitalRead(10));
    }
    loopTime = currentTime;
    digitalWrite(10, !digitalRead(10));
    digitalWrite(9, !digitalRead(9));
  }
}

 

Stepan163
Offline
Зарегистрирован: 24.03.2020

отпиши мне в вк https://vk.com/solovyovphotoshop