0 голосов

Здравствуйте. В вашем проекте wiki.amperka.ru Можно добавить настройку количества кадров и скорости вращения двигателя перед каждой съёмкой. Для этого понадобится потенциометр, пара кнопок и четырёхразрядный индикатор. Подскажите пожалуйста куда подключать кнопки, индикатор и потенциометр, и какой код добавить в программу. С уважением Александр.

(2 баллов) 1 1 2

2 Ответы

0 голосов

Для начала можно взять два потанцеометра и подключить один к А0 скорость вращения, а другой к А1 частота кадров.

Подправил код, чтобы с ними работало:

// Характеристика двигателя,
// количество шагов на один оборот вала
#define MOTOR_STEPS_REVOLUTION 200

// Передаточный коэффициент шестерёнок
#define GEAR_COEFFICIENT 2


// Итоговое количество шагов на один оборот столика
#define STEPS_REVOLUTION GEAR_COEFFICIENT * MOTOR_STEPS_REVOLUTION

// Необходимое количество кадров за один оборот
int SHOTS =40; //

int STEPS_ON_SHOT=10;

// Выдержка времени между шагами.
// Чем больше это число, тем медленнее вращается двигатель
int DELAY_TIME= 8;

// Назначим пины
// Troyka-Stepper:
// Шаг двигателя
#define STEP 5 
// Направление вращения
#define DIR  6 
// Включение двигателя
#define EN   7 

// Реле. При срабатывании включает затвор фотоаппарата
#define SHOT 8

void setup() {
  // Настроим все необходимые пины на выход
  for (int i = STEP; i <= SHOT; ++i) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  // Включаем мотор
  digitalWrite(EN, HIGH);

  // Для каждого из необходимого количества снимков...
  for (int i = 0; i < SHOTS; ++i) {
    // Ждём 500 мс, чтобы столик остановился
    delay(500);

    // Замыкаем реле, происходит съёмка
    digitalWrite(SHOT, HIGH);
    delay(200);
    // Размыкаем реле
    digitalWrite(SHOT, LOW);

    // Выдержка, чтобы фотоаппарат успел записать снимок на карту
    delay(1000);

    // Поворачиваем столик на необходимое количество шагов
  SHOTS=map(analogRead(A0),0,1023,4,40); //
  //сюда можно добавить логарифм 
  // Количество шагов двигателя между снимками
 STEPS_ON_SHOT= STEPS_REVOLUTION/SHOTS;
  DELAY_TIME=map(analogRead(A01),0,1023,1,15); //
    for (int i = 0; i < STEPS_ON_SHOT; ++i) {

      // Один шаг
      digitalWrite(STEP, HIGH);
      
      delay(DELAY_TIME);
      digitalWrite(STEP, LOW);
      delay(DELAY_TIME);
    }
  }

  // После завершения съёмки отключаем двигатель
  digitalWrite(EN, LOW);

  // Завершаем работу.
  // Чтобы возобновить работу нужно нажать кнопку RESET
  while (true) {
    ;
  }
}

(3 тыс. баллов) 7 17 38
Здравствуйте. Спасибо большое за ответ. Попробовал, выдала ошибку:



Arduino: 1.8.13 (Windows 7), Плата:"Arduino Uno"
C:\Users\sasha\Documents\Arduino\photoTurntable\phototable\phototable.ino: In function 'void loop()':

phototable:63:29: error: 'A01' was not declared in this scope

   DELAY_TIME=map(analogRead(A01),0,1023,1,15); //

                             ^~~

C:\Users\sasha\Documents\Arduino\photoTurntable\phototable\phototable.ino:63:29: note: suggested alternative: 'A1'

   DELAY_TIME=map(analogRead(A01),0,1023,1,15); //

                             ^~~

                             A1

exit status 1

'A01' was not declared in this scope
A01 замени везде на A1
0 голосов

Здравствуйте!

Вот корректный код, он решает все проблемы:

// Характеристика двигателя,
// количество шагов на один оборот вала
#define MOTOR_STEPS_REVOLUTION 200

// Передаточный коэффициент шестерёнок
#define GEAR_COEFFICIENT 2


// Итоговое количество шагов на один оборот столика
#define STEPS_REVOLUTION GEAR_COEFFICIENT * MOTOR_STEPS_REVOLUTION

// Необходимое количество кадров за один оборот
int SHOTS =40; //

int STEPS_ON_SHOT=10;

// Выдержка времени между шагами.
// Чем больше это число, тем медленнее вращается двигатель
int DELAY_TIME= 8;

// Назначим пины
// Troyka-Stepper:
// Шаг двигателя
#define STEP 5 
// Направление вращения
#define DIR  6 
// Включение двигателя
#define EN   7 

// Реле. При срабатывании включает затвор фотоаппарата
#define SHOT 8

void setup() {
  // Настроим все необходимые пины на выход
  for (int i = STEP; i <= SHOT; ++i) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  // Включаем мотор
  digitalWrite(EN, HIGH);

  // Для каждого из необходимого количества снимков...
  for (int i = 0; i < SHOTS; ++i) {
    // Ждём 500 мс, чтобы столик остановился
    delay(500);

    // Замыкаем реле, происходит съёмка
    digitalWrite(SHOT, HIGH);
    delay(200);
    // Размыкаем реле
    digitalWrite(SHOT, LOW);

    // Выдержка, чтобы фотоаппарат успел записать снимок на карту
    delay(1000);

    // Поворачиваем столик на необходимое количество шагов
  SHOTS=map(analogRead(A0),0,1023,4,40); //
  //сюда можно добавить логарифм 
  // Количество шагов двигателя между снимками
 STEPS_ON_SHOT= STEPS_REVOLUTION/SHOTS;
  DELAY_TIME=map(analogRead(A1),0,1023,1,15); //
    for (int i = 0; i < STEPS_ON_SHOT; ++i) {

      // Один шаг
      digitalWrite(STEP, HIGH);
      
      delay(DELAY_TIME);
      digitalWrite(STEP, LOW);
      delay(DELAY_TIME);
    }
  }

  // После завершения съёмки отключаем двигатель
  digitalWrite(EN, LOW);

  // Завершаем работу.
  // Чтобы возобновить работу нужно нажать кнопку RESET
  while (true) {
    ;
  }
}

Как уже сказал @Un_ka:

Для начала можно взять два потанцеометра и подключить один к А0 скорость вращения, а другой к А1 частота кадров.

Нужно только вгрузить другой код.

(238 баллов) 3 11 24
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. lyay

    4 балл(ов)

  2. Andrei131

    1 балл(ов)

...