Слайдер для Gopro.

Dimo3000
Offline
Зарегистрирован: 17.09.2014

Здравствуйте! Давно мучала мысль сделать слайдер ( устройство для медленного передвижения go pro или любой другой камеры), на этой неделе собрал, купил arduino leonardo, lcd дисплей, драйвер двигателя на l293 и шаговый.

все собрал, запрограммировал. Но! Контреллер не может вести обратный отсчет и сразу же крутить мотор. Действия производятся последовательно. Пробывал ф-ию millis не работает. Кто знает, как можно сделать так, чтобы мотор крутился и таймер не зависал и работал? Заранее спасибо!

Araris
Offline
Зарегистрирован: 09.11.2012

Еще в таких случаях пишут "перерыл весь Интернет, ничего не нашел". Это не форум гадалок, покажите же, что собрали, как запрограммировали.

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

Ну и как управляете двигателем - кнопками или потенциометром

Dimo3000
Offline
Зарегистрирован: 17.09.2014

Двигатель управляется по следующей схеме: Ардуино, драйвер двигателя, двигатель. Управляющик 4 пина (6,7,8,9). Вот код:

#include <Stepper.h>

const int stepsPerRevolution = 200;  


Stepper myStepper(stepsPerRevolution, 6,7,8,9);            

void setup() {

  myStepper.setSpeed(1);

  Serial.begin(9600);
}

void loop() {
   Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
}

Так же, есть код вывода таймера на дисплей:

#include <LiquidCrystal.h>
    LiquidCrystal lcd(12,11,10,5,4,3,2);
    int runTimer = 1;
    int runFor = 60; 

     
    void setup() {

    lcd.begin(16, 2);
    }
     
    void loop() {
    if(runTimer == 1){
    lcd.clear();
    lcd.print("TIMER=");
    //Start timer
    timer();
    } else {

    }
    runTimer = 0;
    lcd.noDisplay();
    delay(250);
    for(int duration = 0; duration < 100; duration ++){

    }
    lcd.display();
    delay(250);
    }
     
    void timer() {
    for(int timer = runFor;timer > 0; --timer){
    if(timer >= 10) {
    lcd.setCursor(6,0);
    } else {
    lcd.setCursor(6,0);
    lcd.print("0");
    lcd.setCursor(7,0);
    }
    lcd.print(timer);
    lcd.print(" SECOND!");
    delay(1000);
    }
    lcd.setCursor(0,0);
    lcd.clear();
    lcd.print(" TIMER ALERT!");
    }

Суть в том, что таймер ведет отсчет и двигатель работает. Как только время вышло, выводится сообщение на дисплей и двигатель останавливается. Нужно как-то два этих кода соединить так, что бы они работали параллельно.

Прогамма запускается автоматически.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

Dimo3000
Offline
Зарегистрирован: 17.09.2014

Хм, меньше нельзя, по рпсчетам 200 шагов = 1 оборот, 1 шаг равен 0,4 см, Можно больше. А можете пожалуйста, написать код, буду очень благодарен. Потомучто если я выкидываю библиотеку выдается ошибка.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

О как. Я щас спрошу простой детский вопрос но вам будет всему сразу обидно.
- Дяденька, вы дурак?

Dimo3000
Offline
Зарегистрирован: 17.09.2014

Хах, Нет конечно. Просто с++ Вообще не знаю, беру все готовое и пробую с этим работать. Что-то меняю в коде что-то оставляю. Ардуино на руках только 3 день.

Dimo3000
Offline
Зарегистрирован: 17.09.2014

Вы предлогаете использовать вот такой код без библиотеки: 

void unStepMotor(int pin_1, int pin_2,int pin_3,int pin_4,int speedMotor){
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);  
  //
}
void setup(){
  pinMode(8,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(2,OUTPUT);
}
//
void loop(){
  for(int i=0; i<=60; i++) unStepMotor(8,7,4,2,0);
  for(int j=0; j<=60; j++) unStepMotor(2,4,7,8,0);
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

внутренный счетчик никогда не останавливается (ну если только питания вырубить)

что точно надо? по шагам. например сделали 10 шагов отправили время (или включили рэле неважно)и так далее

или крутить шаговик в течении 3 секунд например а потом что то сделать

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Я предлагаю делать один шаг , считаем таймер , делаем шаг ,считаем таймер и тд

Dimo3000
Offline
Зарегистрирован: 17.09.2014

Суть в том, что шаговик вращает шпильку. Есть рельсы и карета. На карете, внизу, есть гайка в которой таки и есть данная шпилька. Гайка тянет каретку и камера на ней плавно едет в течении 3 часов. Если сделать как Вы предлагаете, то плавность исчезнет.

Dimo3000
Offline
Зарегистрирован: 17.09.2014

Puhlyaviy пишет:
Я предлагаю делать один шаг , считаем таймер , делаем шаг ,считаем таймер и тд

Так можно, но опять таки, я боюсь что камера будет идти рывками. Хотя промежуток маленький и незаметный. Об этом я давно думал. Гугл помощи не дал. Оставил эту мысль в гробу. Я не пойму как сделать так: шаг, -1 сек. таймер, шаг, и.т.д.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Мда а попробовать, религия не позволяет?

art100
Offline
Зарегистрирован: 09.03.2014

Puhlyaviy пишет:
Я предлагаю делать один шаг , считаем таймер , делаем шаг ,считаем таймер и тд

это слишком просто

а помучатся?

отбил все желание у человека велосипеды изобретать

это ведь не шаговый двигатель который шагает и стоит

это ведь реактивная турбина которую останоить нельзя

и как вот тысячи камер видонаблюдения наезжают отьезжают крутя обьективы?

а тут шаговый мотор

я еще понимаю движок постоянного тока

 

Dimo3000
Offline
Зарегистрирован: 17.09.2014

#include <LiquidCrystal.h>
    LiquidCrystal lcd(12,11,10,5,4,3,2);
    int runTimer = 1;
    int runFor = 60; // time in seconds

void unStepMotor(int pin_1, int pin_2,int pin_3,int pin_4,int speedMotor){
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);  
  //
}
void setup(){
    lcd.begin(16, 2);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
}
//
void loop(){
   if(runTimer == 1){
    
    lcd.clear();
    lcd.print("\xA8p\xB8\xB3""e\xBF");
    //Start timer
    timer();
    } else {
   
    }
    runTimer = 0;
    lcd.noDisplay();
    delay(250);
    for(int duration = 0; duration < 100; duration ++){
    }
    lcd.display();
    delay(250);

 
}
 void timer() {
    for(int timer = runFor;timer > 0; --timer){
    if(timer >= 10) {
    lcd.setCursor(6,0);
    } else {
    lcd.setCursor(6,0);
    lcd.print("0");
    lcd.setCursor(7,0);
    }
    lcd.print(timer);
    lcd.print(" SECOND!");
    for(int i=0; i<=200; i++) unStepMotor(6,7,8,9,0);
    
    }
    lcd.setCursor(0,0);
    lcd.clear();
    lcd.print(" TIMER ALERT!");
    }

Переделал код. Щас попробую.

art100
Offline
Зарегистрирован: 09.03.2014

Dimo3000 пишет:

Суть в том, что шаговик вращает шпильку. Есть рельсы и карета. На карете, внизу, есть гайка в которой таки и есть данная шпилька. Гайка тянет каретку и камера на ней плавно едет в течении 3 часов. Если сделать как Вы предлагаете, то плавность исчезнет.

я не телепат

что там за шпилька

музыкальная? https://yadi.sk/i/HtXBk6nebK38u

может механика кривая?

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Еще раз мдааааа. А че так мало делеев? Пихай их больше.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

много букв а толком как должно работать непонятно. шаг -1сек таймер. как это понять???

 

Dimo3000
Offline
Зарегистрирован: 17.09.2014

Шпилька - это длинный болт. На одном конце шаговый, на другом подшипник. На карете (которая на рельсах) внизу есть гаечка, в ней этот самы болт. Болт вращается, и по резьбе гайка едет вместе с коретой. 

Шаг двигателя, -1 секунда от заданного времени на таймере. 1 шаг равен 1 секунде.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

много букв а толком как должно работать непонятно. шаг -1сек таймер. как это понять???

 


Ну видимо 3 часа = 10800 шагов. Там же рельсы Москва-Владивосток

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

и у него не получилось так сделать? 1 шаг + отнять переменную + вывести в uart или на дисплей меньше секунды надо. еще ждать придется))

Dimo3000
Offline
Зарегистрирован: 17.09.2014

Говорю еще раз, язык программирования для меня темный лес. Длинна рельс уже 4 метра и расчитанно все так что реально потребуется 10800 секунд. Но шагов чуть меньше)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

и у него не получилось так сделать? 1 шаг + отнять переменную + вывести в uart или на дисплей меньше секунды надо. еще ждать придется))


А че гы? Он на этот шаг ставит скорость меньше чем у улитки. А библиотека ему не отдает руль, пока не доделает задачу. А сделать шаг меньше 200 ему религия не позволяет.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не понял снова. 1 шаг это не шаг шагового двигателя, а какая то другая еденица или что? шаг в чем измеряется в сантиметрах или попугаях может

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

не понял снова. 1 шаг это не шаг шагового двигателя, а какая то другая еденица или что? шаг в чем измеряется в сантиметрах или попугаях может


В удавах намотаных на 4 метровый шток.

art100
Offline
Зарегистрирован: 09.03.2014

4 метра двигать камеру - думаю это что-то для панарамных сьемок

если я правильно понял

я вижу к чему вы прийдете

насколько я понял интерес в том чтоб не бустро от угла до угла добежать а несколько дней "тянучки" на фото тянуть

насколько я понял вы прийдете к двум решениеям сразу или одному из них

это микрошаговый драверочек за 5$ или пара понижающих шестеренок

 

просвятите меня как чайника что такое

слайдер?

Что это по-английски, и я не нужно переводить.

у вас же есть фотоаппарат

где фото?

 

на те вам рабочего кода из моего каталога stepmotors

// art100 написать 20140523 тест шаговые двигатели pololulu A4988
// пен---------------------------------------
// джойстик --------------------------
int joypinx = A0; //джойстик pin 
int joypiny = A1; //джойстик pin
int joypinf = A2; //джойстик pin
// лазеров, светодиодов ----------------
int led3 = A4;//3; // 
// шаговые двигатели ------------
int dir_Pin1 = 4;//
int stepPin1 = 3;//
#define microstep16pin A5//
#define sleeppin 2//
// константы для джойстика -------------------------------------------
int sp1table = 120;// a4988 1000;//медленный
int sp2table = 10;// a4988 10000;//скорость a3987
int joyx = 0; //джойстик
int joyy = 0; //джойстик
int joyf = 0; //джойстик
int stepxcor =10;// для коррекции >0<
int stepycor =10;// для коррекции >0<
// usb------------------------------
int commandusb = 0; //
//---------------------------
// шаговый двигатель 1 pololulu A4988 -------------------------------
void stepA4988(boolean dir1,int steps1,int msec1){
digitalWrite(dir_Pin1,dir1); // направление
for(int i=0;i<steps1;i++){
digitalWrite(stepPin1,HIGH); delayMicroseconds(msec1);
digitalWrite(stepPin1, LOW); delayMicroseconds(msec1);
}
}
//--------------------------------------------------------------------------------------
void setup(){ 
pinMode(joypinx, INPUT); //джойстик X
pinMode(joypiny, INPUT); //джойстик Y 
pinMode(joypinf, INPUT_PULLUP); //джойстик fire pin
pinMode (сд3), OUTPUT); //лазерная
digitalWrite(сд3), HIGH); //
pinMode(dir_Pin1, OUTPUT);//Таблица
pinMode(stepPin1, OUTPUT);//Таблица 

pinMode(microstep16pin, OUTPUT);
digitalWrite(microstep16pin, HIGH); //высокий для 16microstepping, низким не microstepping
pinMode(sleeppin, OUTPUT);

Serial.begin(9600);
} 
//======================================================================
void loop(){
// джойстик ----------------------------------------------------------
joyx = analogRead(joypinx)>>7; // 3 кнопки 0/4/7 0.1.2.3.4.5.6.7 sanks for speed реестра shift Flexi
joyy = analogRead(joypiny)>>7; // 3 кнопки 0/4/7 0.1.2.3.4.5.6.7 sanks for speed реестра shift Flexi 
// Serial.print('X');Serial.print(joyx);Serial.print(';'); Serial.print('Y');Serial.print(joyy);Serial.println(';'); //тест
если(joyx==0){stepA4988(false,stepxcor,sp1table);}//скорость
если(joyx==7){stepA4988(правда ,stepxcor,sp1table);}//скорость 
если(joyy==0){stepA4988(false,stepxcor,sp2table);}//скорость
если(joyy==7){stepA4988(правда ,stepxcor,sp2table);}//скорость 
// led --------------------------------------------------------
if(digitalRead(joypinf)==LOW) { digitalWrite(сд3), LOW); } // лазерная работать
else { digitalWrite(сд3), HIGH); } // лазерная работать
Serial.print("joyx joyy sp1table sp2table: "); Serial.print(joyx);Serial.print(joyy);Serial.println(";");//Serial.print(sp1table);Serial.print(sp2table);Serial.println(";");//
// джойстик ---------------------------------------------------------- 

// usb ----------------------------------------------------------------
if (Serial.available() > 0) { 
commandusb = Serial.read();
если (commandusb==76 ) {digitalWrite(сд3), HIGH);} // лазера на L
если (commandusb==108) {digitalWrite(сд3), LOW);} // laser off l
если (commandusb==45 ) {stepA4988(правда, stepycor,sp1table);} // вниз+ 
если (commandusb==43 ) {stepA4988(false,stepycor,sp1table);} // 
Serial.print("commanda usb received: "); Serial.println(commandusb);
}
// usb ---------------------------------------------------------------- 
} 

// digitalWrite(STEP_PIN_0, высокий);
// digitalWrite(STEP_PIN_1, высокий);
// delay(1);
// digitalWrite(STEP_PIN_0, низкий);
// digitalWrite(STEP_PIN_1, низкий);
// delay(1);

//========================================================================
// шаговый двигатель 1 Таблица для A3987 easydriver 2 булавки------------------------------------
//void step1(boolean dir1,int steps1,int msec1){
// digitalWrite(dir_Pin1,dir1); // направление
// for(int i=0;i<steps1;i++){
// digitalWrite(stepPin1,высокий); delayMicroseconds(msec1);
// digitalWrite(stepPin1, LOW); delayMicroseconds(msec1);
// }
//}
// шаговый двигатель 2 лазерная для A3987 easydriver 2 булавки------------------------------------
//void step2(boolean dir2,int steps2,int msec2){
// digitalWrite(dir_Pin2,dir2); // направление
// for(int i=0;i<steps2;i++){
// digitalWrite(stepPin2,HIGH); delayMicroseconds(msec2);
// digitalWrite(stepPin2, LOW); delayMicroseconds(msec2);
// }
//}
// для L298 4 контакта--------------------------
//// для (o=0; o<stepsmotor1; o++) { // 360 градус Таблица
// for (m=0; m<step1Laser/8; m++) { // 200step/8=25step 25step*1.8gradus/step = 45 градус сканирование с низким 
// digitalWrite(сд3), HIGH); //лазер и вниз
// //myStepper2.step(+1);
// step2(правда, steptable,speetable);
//// delay(100); //для компьютера tormoz 0,01 sek 
// delay(500); //для компьютера tormoz 0,01 sek 
//// delay(1000); //для компьютера tormoz 1 sek
// } 
// //возвращение на старт
// for (m=0; m<step1Laser/8; m++) { // 200step/8=25step 25step*1.8gradus/step = 45 градус вернуть
// digitalWrite(сд3), низкий);
// //myStepper2.step(-1); // до лазера
// //myStepper1.step(+1); // Таблица 45 градус
// step2(false,steptable,speetable);
// step1(правда, steptable,speetable);
// } 
// delay(1000); //для компьютера tormoz 1 5 sek

//------------------------------------------
//DEC, Char D Ch D Ch Ch D
//0 null 32 64 sp @ 96 ` 
//1 33 ! 65 97 
//2 34", 66 б 98 б
//3 35 # 67 C 99 c 
//4 36 $ 68 D 100 d 
//5 37 % 69 E e 101 
//6 38 & 70 F f 102 
//7 39 ' 71 г 103 г 
//8 40 ( 72 ч 104 ч 
//9 вкладка 41 ) 73 I 105 i 
//10 строка 42 * 74 J j 106 
//11 43 + 75 K k 107 
//12 44 , 76 л 108 л 
//13 retur 45 - 77 м 109 м 
//14 46 . 78 N 110 n 
//15 47 / 79 111 O O 
//16 48 0 80 стр, 112 стр 
//17 49 1 81 Q q 113 
//18 50 2 82 R r 114 
//19 51 3 83 S 115 s 
//20 52 4 84 T t 116 
//21 53 5 85 U u 117 
//22 54 6 86 V v 118 
//23 55 7 87 W 119 Вт 
//24 56 8 88 X 120 x 
//9 25 57 89 Y y 121 
//26 58 : 90 Z z 122 
//27 59 ; 91 [ 123 { 
//28 60 < 92 \ 124 | 
//29 61 = 93 ] 125 } 
//30 62 > 94 ^ 126 ~ 
//31 63 ? 95 _ 127 
//----------------------------------------

http://yadi.sk/d/sydH7XAzR5NQQ

https://yadi.sk/i/zJIaQXHjbXCLY

https://yadi.sk/d/kUpxUCqobXCRX

суть в том что ваш 1.8 градуса поделить еще на 16 

короче видео смотрите

 

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Арт100 как обычно на своей спирто содержащей волне. Интересно он вообще читает обсуждения?

art100
Offline
Зарегистрирован: 09.03.2014

Puhlyaviy пишет:
Арт100 как обычно на своей спирто содержащей волне. Интересно он вообще читает обсуждения?

не успеваю

а че уже нафлудили и можно страницу обновлять?

 

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

Dimo3000, ты таймлапсы снимать собираешься?

Dimo3000
Offline
Зарегистрирован: 17.09.2014

Вот фото макета проверочного:

Испльзовать планирую для медленной сьемки облаков, машин, людей. В Самаре много места для этого. Проверил, все работает. Решил заказать токарю запчасти, в скором времени будут ножки, платформы, каретка и многое другое. Всем спасибо за помощь. Скоро будут фото и ведео отчеты. Ну и новый слайдер в заводской красоте =)