Макрорельсы для макросъемки .

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

 Доброго дня . Наконец то нашел время для хобби .

Давным давно собрал макрорельсы для макросьёмки . Устроены просто , стоит мультивибратор и пара РПС .

Но примитивность дает о себе знать . По механике всё хорошо стоит мощный редуктор и маленький электродвигатель . Также есть и полностью ручное управление для макрорельс . Все расположилось в маленьком алюминевом кейсе .

 
 
 
 
 
 
 
Также есть LED светильники с регулировкой мощности и просто LED светильники для фоновой подсветки .
Агрегат рабочий и без проблемный . Но пора бы и перейти на платформу Ардуино . 
 
Задача . 1 Включить электромотор и переместить каретку на заданное растояние .
 
              2  Остановиться на 5 секунд . Нужно чтобы все устоялось для предотвращения шевеленки .

              3 Дать команду на сьемку ( выдать команду на реле управления камерой )

               4 Ждать 5 секунд пока камера отработает .

               5  Включить электромотор и переместить каретку на заданное растояние .

и так по этому алгоритму заданное количество раз .

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

  На основе того проекта можно выполнить и этот . Пока ничего не менял выложил как есть .

 

[code]
const int relPin = 12;
const int buttonPin = 9;
const int zummerPin = 10; 
 
boolean debounce(int pin);
void beep_beep();
 
void setup() {
  Serial.begin(9600);
  pinMode(relPin, OUTPUT);
  pinMode(zummerPin, OUTPUT);
  pinMode( buttonPin, INPUT);
  digitalWrite(relPin, HIGH);
}
 
void loop() {
  static boolean do_scan = false;
  static int counter = 0;
 
  if (debounce(buttonPin)) { //состояние нажатой кнопки = HIGH
    do_scan = true;
  }
 
  if (do_scan) {
    digitalWrite(relPin, LOW);
    delay(39000);
    digitalWrite(relPin, HIGH);
 
    counter++;
 
    if (counter == 12) {
      counter = 0;
      do_scan = false;
      beep_beep();
    } else {
      Serial.println("S");
      delay(40000);
    }
  }
}
boolean debounce(int pin) {
  boolean state;
  boolean previousState = digitalRead(pin);
  for(int counter = 0; counter < 10; counter++) {
    delay(1);
    state = digitalRead(pin);
    if( state != previousState) {
      counter = 0;
      previousState = state;
    }
  }
  return state;
}
 
void beep_beep() {
  ; //тут будет пищалка
}
[/code]

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

 Вместо принт S выход на реле . Конечно можно через ИК порт но это лишнее .

  Еще нужно придумать как менять количество циклов  .

 И самое страшное на последок . КАК ВСЁ ЭТО ВЕРНУТЬ В ИСХОДНУЮ ТОЧКУ .

 Сообразить как сделать ну ни как не получается . Помогите ПОЖАЙЛУСТА .

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

1) Перейти на шаговый двигатель;
2) Принимать команды на перемещение через COM-порт.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я же Вам писал вчера - вставьте код правильно - с номерами строк! Даже говорил, где написано как вставлять правильно. А Вы опять вставили как попало. Издеваетесь?

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Пардон вечером исправлю.

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

В связке с компьютером получается очень громоздко и не удобно . Насекомые они гады на природе живут . Тащить в поле тяжело .
Нужно все сделать автономно .
Шаговый двигатель это здорово но очень много переделывать . Стоит редуктор примерно 1 на 700 даже если управлять по времени как сейчас получается довольно точно позиционировать .

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Давно не был на Вашем замечательном сайте .
Что поменялось , не могу фото вставить .

sadman41
Offline
Зарегистрирован: 19.10.2016

Если "по времени", то непонятна проблема. Крутанул на 3 сек, щёлкнул, зареверсировал двигатель, крутанул на 3 сек. Все. "Время работы" одним энкодером меняешь, "количество циклов" - другим. Или кнопками.  Четырьмя.

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Примерно так . Но как это встроить в скеч ?
В программирование полный 0 . Если есть возможность и желание помогите пожалуйста .

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

блин... когда я своим таким займусь...

всё не правильно.

1. нужен шаговик

2. нужно задавать приделы, где камера должна начать и кончить снимать... повалюкали камерой на рельсах, задали приделы где начинается\заканчивается резкость, ардуинка посчитала количество шагов движка, поделила их на количество кадров, стала в начало и начала дергать затвор после того, как шаговик отработает.

3. избавится от бытовых лед светильников, они дико зеленят, только импульсный свет.

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Конечно LED зло но как фон получается очень не плохо . Только надо использовать без драйверов , иначе на всех кадрах будет разный цвет .
Глубину прохода камеры и количество снимков можно и вручную выставить .
И конечно только вспышка .
Хотя при использование led драйверов при сборке кадра получаются интересные эффекты 3 д .

rkit
Offline
Зарегистрирован: 23.11.2016

DIFO пишет:
Конечно LED зло но как фон получается очень не плохо . Только надо использовать без драйверов , иначе на всех кадрах будет разный цвет

Ну да, сжечь светодиоды — это тоже решение, так сказать.

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

DIFO пишет:
  но как фон получается очень не плохо .

фон получается?!??!???

фон значит, в макро, понятно....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DIFO пишет:
Только надо использовать (светодиоды) без драйверов
Это как?

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

 Без драйверов ЭТО через резистор . Иначе мерцание которые мы невидим глазом камера фиксирует .

Nosferatu
Offline
Зарегистрирован: 04.11.2012

DIFO пишет:
.... Шаговый двигатель это здорово но очень много переделывать . Стоит редуктор примерно 1 на 700 даже если управлять по времени как сейчас получается довольно точно позиционировать .

Для начала нужны концевики в крайних положениях механизма, чтобы от этих нулей отсчитывать расстояния. Это 2 кнопки в программе.

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

Время работы двигателя, между срабатыванием концевиков, делите на число - "оптимальная точность позиционирования"

И у вас есть координатная линейка.

 

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Сейчас и стоят два концевика которые и ограничивают перемещение коретки . Жалко фото не загрузились . Регулируя расстояние между ними задаю расстояние перемещения . Дойдя до концевика РПС переключается и возвращает коретку на исходную точку заданную вторым концевиком .
Стоит мультивибратор с помощью которого и выдаются команды на движение , съёмку , движение . Время работы на перемещение задаётся переменным резистором . Все просто до безобразия .

rkit
Offline
Зарегистрирован: 23.11.2016

DIFO пишет:

 Без драйверов ЭТО через резистор

Без драйверов это с драйвером

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Если вам угодно называть токогосящий резистор драйвером то пожалуйста .
Лучше подскажите как ввести регулировку в скетч .

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Рад бы переделать но к сожалению нет ссылки изменить . И подскажите пожалуйста как правильно вставлять фото . С ,, радикала ,, не работает отказ сервера . Может Яндекс .

b707
Offline
Зарегистрирован: 26.05.2017

DIFO пишет:
подскажите пожалуйста как правильно вставлять фото . С ,, радикала ,, не работает отказ сервера . Может Яндекс .

Не обязательно внешний сервет, картинки можно грузить в свой профиль. В профиле находите "File browser". в нем - загрузить.

Когда вставляете картинку в сообщение - используйте кнопку "выбор на сервере" рядом с полем ввода ссылки

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

 

       К моему сожалению фото с Радикала не открылись ну и ладно .

       Сьемка  . Крышка используется как фон . 

 

  

 

 

Всё умещается в маленький чемоданчик . При подключение АКБ 12 вольт можно и в поле .

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

Не исправитесь - первое сообщение топика не редактируется.

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

А жаль , админ может его удалить ? Портит весь вид . Нашел интересный проект как специально написанный под мои нужды photopizza . Меняем градусы на мм и вперёд .

Еще бы обойти шаговый двигатель и оставить электромотор .

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Весь проект изложен по ссылке   https://cxem.net/arduino/arduino156.php 

Проект открытый так что можно и переделать под свои нужды . Тем более что эта ветка молчит .

Столкнулся с проблемой  при подключении клавиатуры на 12 кнопок .  В мониторе порта вместо чисел 4, 5, и тд . Пишет   В52 , В54 и  т далее . После некоторых В57 вставляет IR коды для пульта . При подключение другого блока кнопок результат тот же .  При загрузке проверочного скеча из примеров все работает . Подскажите куда копать .  

 

 
// клавиатура
#include <Keypad.h>
const byte ROWS = 3; //four rows
const byte COLS = 3; //four columns
char keys[ROWS][COLS] = {
    {'4','5','6'},{'7','8','9'},{'*','0','#'}};

byte rowPins[ROWS] = {14,15,16}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {17,18,19}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char key=' ';
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DIFO пишет:
Подскажите куда копать .
В сторону выкладывания как можно более короткого, но полного (чтобы его можно было запустить) скетча, который демонстрирует проблему.

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Там подключено 5 библиотек . По ссылке можно скачать полностью . Как здесь вставить не знаю .

 

[code]
// Моя версия скетча для поворотной платформы

#include "defines.h"
// библиотека IR
#include <IRremote.h> 
//вход ИК приемника
int RECV_PIN = 2;  
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results; 
unsigned long ir_dt, old_ir;
long ir_kod;
unsigned long ir_time1, ir_time2;
// клавиатура
#include <Keypad.h>
const byte ROWS = 3; //four rows
const byte COLS = 3; //four columns
char keys[ROWS][COLS] = {
    {'4','5','6'},{'7','8','9'},{'*','0','#'}};

byte rowPins[ROWS] = {14,15,16}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {17,18,19}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char key=' ';

//////////    Stepper
#include <AccelStepper.h>
AccelStepper stepper1(2,9,10); 

//
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,7,6,5,4);
//
#include <EEPROM.h>
// состояние дисплея
struct VIEW    
{
  int count_prg;   // кол-во программ
  int tek_prg;         // текущая программа
  int pos_prg;      // позиция в программе
  int val[10];      // значение позиции
  
};
VIEW VIEW1={0,0,0,{0,0,0,0,0,0,0,0,0,0}};
// шаговый двигатель
struct RUN    // структура 
{
  int tekrunprg;
  long steps;      // 
  long step;      // 
  int countstep;
  int speed;   // 
  int circles;
  int tekcircle;  
  int dtekcircle;  
  int direction;
  int tekdirection;
  int photo;
  int stopphoto;
  int photopause;
  int pause;
  int statuspause;
  unsigned long millispause;
};
RUN RUN1={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// min,max,step для настроек
unsigned long minvalue[9]={0,0,0,0,0,0,0,0,0};
unsigned long maxvalue[9]={370,370,3100,4,100,2,2,100,9000};
unsigned long stepvalue[9]={5,5,50,1,1,1,1,1,500};
int mode;
unsigned long milliskey=0;
unsigned long milliscalib=0;
long pos1=0;
long pos2=0;
int K1=100;

void setup()
  {
  // последовательный порт 
  Serial.begin(9600); 
  // дисплей
  lcd.begin(16,2);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("photopizza v0.06");
  lcd.setCursor(0,1);
  lcd.print("+79034461752");
  // инициализация настроек из EEPROM 
  if(EEPROM.read(0)==255)
     {
     clear_eeprom();
     ini_eeprom(1);
     }
  // инициализация настроек из EEPROM 
  get_param_prg_eeprom(0);
  //
  delay(2000);
  mode = VIEW_MODE;
  lcd_str1(mode);
  lcd_str2ve();  
  //
  stepper1.setSpeed(500);
  //stepper1.setAcceleration(100.0);
  // включить приемник 
  irrecv.enableIRIn(); 
  // прерывания для ИК
  ir_time1=0;ir_time2=0;
  attachInterrupt(0, get_ir_kod, FALLING); 
  }
void loop()
  {
  // обработка кода нажатия
  if(ir_kod>0)
   {
   Serial.print("ir_kod=");Serial.println(ir_kod,HEX);
   lcd_get_key(2);milliskey=millis();
   key=ir_to_key(ir_kod); 
   ir_kod=0;
   do_for_key(mode,key);   
   } 
  key = keypad.getKey();
  if(key){
    Serial.print("key=");Serial.println((int)key); 
    lcd_get_key(1);milliskey=millis();
    do_for_key(mode,key);   
    } 
  //
  if(millis()-milliskey>1000) 
    lcd_get_key(0);
  if(mode==CALIB_MODE)
    {
    stepper1.runSpeed();
    if(millis()-milliscalib>1000) 
       {lcd_str2calib(stepper1.currentPosition());
       milliscalib=millis();
       Serial.println(stepper1.currentPosition());
       }
    }
  if (stepper1.distanceToGo() == 0 && RUN1.tekrunprg>0)
    {
    RUN1.countstep=RUN1.countstep+1; 
    if(RUN1.steps>RUN1.step*RUN1.countstep) // 1 цикл несколько шагов
       {
       Serial.print("current=");Serial.println(stepper1.currentPosition());
       Serial.print("countstep=");Serial.println(RUN1.countstep);
       if(mode==RUN_MODE)
         lcd_str2run();
       if(RUN1.stopphoto>0)
         delay(RUN1.pause);
       pos1=min(RUN1.steps,RUN1.step*(RUN1.countstep+1));
       pos2=pos1*K1*kdirs[RUN1.tekdirection];
       Serial.print("pos1=");Serial.println(pos1);
       Serial.print("pos2=");Serial.println(pos2);
       stepper1.moveTo(pos2);
       }
    else  // закончился круг
      {
      Serial.print("current=");Serial.println(stepper1.currentPosition());
      Serial.print("countstep=");Serial.println(RUN1.countstep);
      if(mode==RUN_MODE)
         lcd_str2run();
      RUN1.tekcircle=RUN1.tekcircle+RUN1.dtekcircle;
      if(RUN1.circles>RUN1.tekcircle || RUN1.circles==0) 
         {
         stepper1.setCurrentPosition(0);
         RUN1.countstep=0;
         stepper1.setSpeed(0);
         stepper1.setCurrentPosition(0);
         if(RUN1.stopphoto>0)
           {
           if(RUN1.photo>0)
             {
             detachInterrupt(0); 
             delay(100);
             for (int i = 0; i < 5; i++) 
                {irsend.sendSony(0x8CBC0,20);delay(100);} 
             delay(RUN1.pause);
             attachInterrupt(0, get_ir_kod, FALLING);
             irrecv.enableIRIn(); 
               
             }
           else
             delay(RUN1.pause);
           }
         if(RUN1.tekdirection>1)
           RUN1.tekdirection=RUN1.tekdirection+kdirs[RUN1.tekdirection]; 
      Serial.print("current=");Serial.println(stepper1.currentPosition());
      Serial.print("countstep=");Serial.println(RUN1.countstep);
      if(mode==RUN_MODE)
         lcd_str2run();
         stepper1.setSpeed(RUN1.speed*kdirs[RUN1.tekdirection]);
         stepper1.moveTo(min(RUN1.steps,RUN1.step)*K1*kdirs[RUN1.tekdirection]); 
         }
      else
         {
         stepper1.setSpeed(0);
         stepper1.setCurrentPosition(0);
         mode=VIEW_MODE;RUN1.tekrunprg=0;
         lcd_str1(mode);lcd_str2ve();
         }
      Serial.print("currentPos=");Serial.println(stepper1.currentPosition());
      }
    }
  else if(RUN1.tekrunprg>0)
    stepper1.runSpeed();
  else
    ;
  }

[/code]

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я Вас просил

ЕвгенийП пишет:
как можно более короткого, но полного (чтобы его можно было запустить) скетча, который демонстрирует проблему
Понимаете - "как можно более короткий код" а не полный проект.

Я хочу его (код) запустить сам и посмотреть в чём там проблема.

У Вас проблема с клавиатурой, так чего Вы мне пихаете аксельстеппер, ликвидкристалл и др. Сократите код до минимума так, чтобы проблема оставалась видимой, всё остальное выбросьте и тогда выкладывайте. Я (или кто другой) сможет его запустить и посмотреть в чём там беда.

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Напрасно паниковал . При подключении 1602 все команды проходят корректно . Немного запутано но буду ,,, ковырять,,, дальше .

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

DIFO пишет:
Напрасно паниковал . При подключении 1602 все команды проходят корректно . Немного запутано но буду ,,, ковырять,,, дальше .

 

а у вас хобби снимать или в программках ковыряться ?
похоже что ковыряться.

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

DIFO
DIFO аватар
Offline
Зарегистрирован: 09.06.2019

Спасибо за совет . Но по ковыряться  хочется . Хобби такое . Потихоньку по ходу учусь и если не понятно спрашиваю грамотных людей . Целиком сам не напишу но подправить под свои нужды программу попробую .