Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Slider do nagrywania wideo "Timelapse"

Smilejarik 28 Lut 2016 16:18 6594 19
  • Slider do nagrywania wideo "Timelapse"

    Witam!

    Chcę przedstawić niewielką konstrukcję co pozwala bardzo wolno, z określoną prędkością przesuwać kamerkę/telefon podczas nagrywania wideo/zdjęć z w trybie 1 klatka na sekundę czy na kilka sekund.

    Slider do nagrywania wideo "Timelapse" Slider do nagrywania wideo "Timelapse" Slider do nagrywania wideo "Timelapse" Slider do nagrywania wideo "Timelapse"

    Stworzyłem to pod wpływem ładnych filmików z YouTube jeśli sobie wyszukać: "Timelapse + jakieś miejsce", interesowało mnie bardzo wolne kontrolowane przesuwanie kamery w zależności od wybranego trybu nagrywania. Krótko mówiąc: im większa przerwa między klatkami - tym wolniej trzeba przemieszczać kamerę.







    Przykładowo:
    - w trybie 1 klatka na 1 s, aby mieć 5 sekund wideo musimy nagrywać 2,5 minuty;
    - w trybie 1 klatka na 2 s, aby mieć 5 sekund wideo musimy nagrywać 5 minut;
    - i t.p.

    Zestaw części to:
    - Arduino Nano V3.0 ATmega328 16M
    - 5V Stepper Motor 28BYJ-48
    - HX1838 Infrared Remote Control Module
    - 84x48 Nokia 5110 LCD Module.

    W planach mam:
    - dodać przycisk włączenia/wyłączenia;
    - ustawić wyświetlacz poziomo a nie bokiem;
    - pokazać na wyświetlaczu czas i umożliwić wybór prędkości w zależności od trybu nagrywania. Chodzi mi o to aby w czasie nagranego wideo 6-8 sekund pokonać tą odległość 1 m.

    Kod programu:

    Spoiler:
    // LCD5110_NumberFonts
    // Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
    // web: http://www.RinkyDinkElectronics.com/
    //
    // This program is a demo of the included number-fonts,
    // and how to use them.
    //
    // This program requires a Nokia 5110 LCD module.
    //
    // It is assumed that the LCD module is connected to
    // the following pins using a levelshifter to get the
    // correct voltage to the module.
    // SCK - Pin 8
    // MOSI - Pin 9
    // DC - Pin 10
    // RST - Pin 11
    // CS - Pin 12
    //
    #include <IRremote.h>
    int RECV_PIN = 7;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    #include <LCD5110_Basic.h>

    static int oldBatteryPcnt = 0;

    // for Stepper/////////////////////////////////////////////////////
    // declare variables for the motor pins
    int motorPin1 = 2; // Blue / Синий - 28BYJ48 pin 1
    int motorPin2 = 3; // Pink / Розовый - 28BYJ48 pin 2
    int motorPin3 = 4; // Yellow / Желтый - 28BYJ48 pin 3
    int motorPin4 = 5; // Orange / Оранжевый - 28BYJ48 pin 4

    // установить скорость шагового двигателя.
    //variable to set stepper speed.
    int stepTime = 1000; // delay between series in microseconds

    // Кол-во сделанных шагов.
    // count of steps made.
    int count = 0;

    // Необходимое количество шагов, для одного полного оборота, на (360 градусов).
    // number of steps per full revolution.
    int countsperrev = 512;

    int lookup[8] = {
    B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
    //////////////////////////////////////////////////////////////////////////////

    LCD5110 myGLCD(8,9,10,12,11);
    extern uint8_t SmallFont[];
    extern uint8_t MediumNumbers[];
    extern uint8_t BigNumbers[];

    int LightPin = 6;

    int light=0; // 0-OFF, 1-ON
    int pause = 1; // 0-Left, 1-PAUSE, 2-Right
    int dir = 2; // direction depends on pause, 0,1,2
    int motorSpeed;
    int relax = 0;

    void setup()
    {
    myGLCD.InitLCD();

    pinMode(motorPin1, OUTPUT);
    pinMode(motorPin2, OUTPUT);
    pinMode(motorPin3, OUTPUT);
    pinMode(motorPin4, OUTPUT);

    pinMode(LightPin, OUTPUT);
    digitalWrite(LightPin, HIGH);

    myGLCD.setFont(SmallFont);
    myGLCD.print("Speed:", LEFT, 40);
    myGLCD.print("READY", CENTER, 20);

    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver

    }

    void loop()
    {


    if (irrecv.decode(&results))
    {
    // Serial.println(results.value);



    if (results.value==16712445) //Move right
    {
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(2, 0);
    myGLCD.print("right--->>", CENTER, 20);
    pause=2;
    }
    if (results.value==16720605) //move left
    {
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(2, 0);
    myGLCD.print("<<---left", CENTER, 20);
    pause=0;
    }
    if (results.value==16761405) // STOP
    {
    if (pause!=1){
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(2, 0);
    myGLCD.print("PAUSE", CENTER, 20);
    dir=pause;
    pause=1;
    }
    else if (dir==0 && pause==1){
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(2, 0);
    myGLCD.print("<<---left", CENTER, 20);
    pause=0;
    }
    else if (dir==2 && pause==1){
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(2, 0);
    myGLCD.print("right--->>", CENTER, 20);
    pause=2;
    }
    }

    if (results.value==16769055) // RPM-
    {
    stepTime=stepTime*1.2;
    if (stepTime>4000) relax=3;
    if (stepTime>14000) stepTime=14000;
    motorSpeed=(15000-stepTime)/100;
    myGLCD.setFont(MediumNumbers);
    myGLCD.clrRow(4, 30);
    myGLCD.clrRow(5, 30);
    myGLCD.printNumI(motorSpeed, RIGHT, 32);
    }
    if (results.value==16754775) // RPM+
    {
    stepTime=stepTime/1.2;
    if (stepTime<4000) relax=0;
    if (stepTime<600) stepTime=600;
    motorSpeed=(15000-stepTime)/100;
    myGLCD.setFont(MediumNumbers);
    myGLCD.clrRow(4, 30);
    myGLCD.clrRow(5, 30);
    myGLCD.printNumI(motorSpeed, RIGHT, 32);
    }
    if (results.value==16748655) // Lihgt ON/OFF
    {
    if (light==0) {
    digitalWrite(LightPin, LOW);
    light=1;
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(0, 42);
    myGLCD.print("L-ON", RIGHT, 0);
    }
    else {
    digitalWrite(LightPin, HIGH);
    light=0;
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(0, 42);
    myGLCD.print("L-OFF", RIGHT, 0);
    }
    }


    irrecv.resume(); // Receive the next value

    }

    if (pause==1) stopstep(); // pause (stop)

    // anticlockwise
    if (pause==0)
    {
    for(int i = 0; i < 8; i++)
    {
    setOutput(i);
    delayMicroseconds(stepTime);
    }
    }

    // clockwise
    if (pause==2)
    {
    for(int i = 7; i >= 0; i--)
    {
    setOutput(i);
    delayMicroseconds(stepTime);
    }
    }



    // myGLCD.clrScr();

    }

    void stopstep()
    {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    }

    void setOutput(int out)
    {
    digitalWrite(motorPin1, bitRead(lookup[out], 0));
    digitalWrite(motorPin2, bitRead(lookup[out], 1));
    digitalWrite(motorPin3, bitRead(lookup[out], 2));
    digitalWrite(motorPin4, bitRead(lookup[out], 3));
    delay(relax);
    if (relax==3){
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    }
    }



    Schemat dodam jak tylko go narysuję ;)
    Dziękuję za uwagę


    Fajne!
  • #2 28 Lut 2016 20:11
    actin
    Poziom 32  

    Witam
    Jakiś program używasz na telefonie do nagrywania?
    Możesz udostępnić program Arduino ?

  • #3 28 Lut 2016 20:15
    michalko12
    Specjalista - Mikrokontrolery

    I wszystko byłby fajnie gdyby cały ten wózek był sztywny i wyważony. Ten gibający zwis na pewno będzie powodował drgania na filmach, co chyba nawet dało się zauważyć na tym załączonym filmie.


    Mam nadzieję, że krytyka dozwolona jest :^)

  • #4 28 Lut 2016 20:48
    D214d3k
    Poziom 39  

    Ślizgacze to korki od wina? Wszystko fajnie ale telefon słabo zmierzył światło a rurki nie wytrzymają nic cięższego. Mimo wszystko + :).

  • #6 28 Lut 2016 22:57
    Smilejarik
    Poziom 6  

    Krytyka i pomysły jak najbardziej.

    Na telefonie w standardowych ustawieniach mam coś takiego "Odstęp poklatkowy":
    Slider do nagrywania wideo "Timelapse"
    Ogólnie to zamierzam korzystać z kamerki Xiaomi Yi, jest tam taki tryb.

    Ślizgacze to u mnie z czegoś takiego:
    Slider do nagrywania wideo "Timelapse"


    Kod programu:

    Spoiler:
    // LCD5110_NumberFonts
    // Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
    // web: http://www.RinkyDinkElectronics.com/
    //
    // This program is a demo of the included number-fonts,
    // and how to use them.
    //
    // This program requires a Nokia 5110 LCD module.
    //
    // It is assumed that the LCD module is connected to
    // the following pins using a levelshifter to get the
    // correct voltage to the module.
    // SCK - Pin 8
    // MOSI - Pin 9
    // DC - Pin 10
    // RST - Pin 11
    // CS - Pin 12
    //
    #include <IRremote.h>
    int RECV_PIN = 7;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    #include <LCD5110_Basic.h>

    static int oldBatteryPcnt = 0;

    // for Stepper/////////////////////////////////////////////////////
    // declare variables for the motor pins
    int motorPin1 = 2; // Blue / Синий - 28BYJ48 pin 1
    int motorPin2 = 3; // Pink / Розовый - 28BYJ48 pin 2
    int motorPin3 = 4; // Yellow / Желтый - 28BYJ48 pin 3
    int motorPin4 = 5; // Orange / Оранжевый - 28BYJ48 pin 4

    // установить скорость шагового двигателя.
    //variable to set stepper speed.
    int stepTime = 1000; // delay between series in microseconds

    // Кол-во сделанных шагов.
    // count of steps made.
    int count = 0;

    // Необходимое количество шагов, для одного полного оборота, на (360 градусов).
    // number of steps per full revolution.
    int countsperrev = 512;

    int lookup[8] = {
    B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
    //////////////////////////////////////////////////////////////////////////////

    LCD5110 myGLCD(8,9,10,12,11);
    extern uint8_t SmallFont[];
    extern uint8_t MediumNumbers[];
    extern uint8_t BigNumbers[];

    int LightPin = 6;

    int light=0; // 0-OFF, 1-ON
    int pause = 1; // 0-Left, 1-PAUSE, 2-Right
    int dir = 2; // direction depends on pause, 0,1,2
    int motorSpeed;
    int relax = 0;

    void setup()
    {
    myGLCD.InitLCD();

    pinMode(motorPin1, OUTPUT);
    pinMode(motorPin2, OUTPUT);
    pinMode(motorPin3, OUTPUT);
    pinMode(motorPin4, OUTPUT);

    pinMode(LightPin, OUTPUT);
    digitalWrite(LightPin, HIGH);

    myGLCD.setFont(SmallFont);
    myGLCD.print("Speed:", LEFT, 40);
    myGLCD.print("READY", CENTER, 20);

    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver

    }

    void loop()
    {


    if (irrecv.decode(&results))
    {
    // Serial.println(results.value);



    if (results.value==16712445) //Move right
    {
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(2, 0);
    myGLCD.print("right--->>", CENTER, 20);
    pause=2;
    }
    if (results.value==16720605) //move left
    {
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(2, 0);
    myGLCD.print("<<---left", CENTER, 20);
    pause=0;
    }
    if (results.value==16761405) // STOP
    {
    if (pause!=1){
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(2, 0);
    myGLCD.print("PAUSE", CENTER, 20);
    dir=pause;
    pause=1;
    }
    else if (dir==0 && pause==1){
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(2, 0);
    myGLCD.print("<<---left", CENTER, 20);
    pause=0;
    }
    else if (dir==2 && pause==1){
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(2, 0);
    myGLCD.print("right--->>", CENTER, 20);
    pause=2;
    }
    }

    if (results.value==16769055) // RPM-
    {
    stepTime=stepTime*1.2;
    if (stepTime>4000) relax=3;
    if (stepTime>14000) stepTime=14000;
    motorSpeed=(15000-stepTime)/100;
    myGLCD.setFont(MediumNumbers);
    myGLCD.clrRow(4, 30);
    myGLCD.clrRow(5, 30);
    myGLCD.printNumI(motorSpeed, RIGHT, 32);
    }
    if (results.value==16754775) // RPM+
    {
    stepTime=stepTime/1.2;
    if (stepTime<4000) relax=0;
    if (stepTime<600) stepTime=600;
    motorSpeed=(15000-stepTime)/100;
    myGLCD.setFont(MediumNumbers);
    myGLCD.clrRow(4, 30);
    myGLCD.clrRow(5, 30);
    myGLCD.printNumI(motorSpeed, RIGHT, 32);
    }
    if (results.value==16748655) // Lihgt ON/OFF
    {
    if (light==0) {
    digitalWrite(LightPin, LOW);
    light=1;
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(0, 42);
    myGLCD.print("L-ON", RIGHT, 0);
    }
    else {
    digitalWrite(LightPin, HIGH);
    light=0;
    myGLCD.setFont(SmallFont);
    myGLCD.clrRow(0, 42);
    myGLCD.print("L-OFF", RIGHT, 0);
    }
    }


    irrecv.resume(); // Receive the next value

    }

    if (pause==1) stopstep(); // pause (stop)

    // anticlockwise
    if (pause==0)
    {
    for(int i = 0; i < 8; i++)
    {
    setOutput(i);
    delayMicroseconds(stepTime);
    }
    }

    // clockwise
    if (pause==2)
    {
    for(int i = 7; i >= 0; i--)
    {
    setOutput(i);
    delayMicroseconds(stepTime);
    }
    }



    // myGLCD.clrScr();

    }

    void stopstep()
    {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    }

    void setOutput(int out)
    {
    digitalWrite(motorPin1, bitRead(lookup[out], 0));
    digitalWrite(motorPin2, bitRead(lookup[out], 1));
    digitalWrite(motorPin3, bitRead(lookup[out], 2));
    digitalWrite(motorPin4, bitRead(lookup[out], 3));
    delay(relax);
    if (relax==3){
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    }
    }

  • #7 29 Lut 2016 15:03
    Tranceformer
    Poziom 9  

    Swietna sprawa i dobra robota!

  • #8 29 Lut 2016 15:30
    SylwekK
    Poziom 28  

    Znowu moje ulubione klimaty :) Mimo małej sztywności całego układu zdaję sobie sprawę, że czegoś większego niż telefon czy GoPro na tym wisiało nie będzie dlatego + za konstrukcje. Użyte materiały i prostota mnie urzekły :) Nie wiem jak długo ślizgacze wytrzymają, ale pewnie wyjdzie w praniu. Podobają mi się takie konstrukcje z prostej przyczyny - tanim kosztem i chwilą wyobraźni można mieć namiastkę dość drogich urządzeń, a jeszcze kiedy spełniają swoje zadanie zgodnie z założeniami i nie rozpadają się w trakcie pracy (tu właśnie dzięki tej prostocie raczej to nie grozi) to już jest nieźle. Oczywiście konstrukcji daleko do ideału i prawdę mówiąc do profesjonalnych zadań się kompletnie nie nadaje, ale od czegoś trzeba zacząć ;)

  • #9 29 Lut 2016 19:46
    leonow32

    Poziom 29  

    Dobry przykład jak zrobić coś z niczego :) mam tylko pytanie do tych arduinowatych funckji

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Rozumiem, że każda z tych funkcji ustawia tylko jeden bit na wyjściach portów? Czy nie lepiej byłoby ustawić cały port za jednym zamachem w jednej linijce? Jak takie podejście wpływa na wielkość kodu wynikowego?[/code]

  • #10 29 Lut 2016 23:51
    Karol966
    Poziom 30  

    leonow32 napisał:
    D
    Rozumiem, że każda z tych funkcji ustawia tylko jeden bit na wyjściach portów? Czy nie lepiej byłoby ustawić cały port za jednym zamachem w jednej linijce? Jak takie podejście wpływa na wielkość kodu wynikowego?[/code]


    Też tak rozumiem, ahh ta piękna dusza arduino :D Nie jestem żadnym znawcą arduino ale coś mi podpowiada, że zapewne da się odwołać bezpośrednio do IO, oo i już jest:
    https://www.arduino.cc/en/Reference/PortManipulation

  • #12 12 Mar 2016 11:23
    SylwekK
    Poziom 28  
  • #13 12 Mar 2016 12:26
    piotr411
    Poziom 22  

    Przecież w projekcie to smartphone robi zdjęcia dlatego dziwi mnie obecność Arduino. Smartfone potrafi znacznie więcej niż Arduino i można kupić używane za grosze. I dlaczego miał by Nie zostać? Rodzicom w ogródku działkowym, gdzie mieli regularne włamania, założyłem alarm z aparatem oparty na smartphonie LG L3. Nie tylko Robi zdjęcia, ale zapisuje filmy i wysyła sms kiedy ktoś wejdzie na teren. Po ostatnim włamaniu przekazałem materiał z twarzami wandali na policję i póki co na działkach spokój.

  • #14 12 Mar 2016 22:29
    Smilejarik
    Poziom 6  

    Bardzo dobrze, będę wiedzieć że coś takiego istnieje, wyświetlaczem był by smartfon, zamiast arduino - ESP8266, tylko trzeba by było zapoznać się z kompatybilnym IDE aby to zaprogramować.
    Druga sprawa to program na Androida który by połączył to wszystko w całość, narazie nie mam pojęcia jak to zrobić.

    Ale przeważnie korzystam z kamerki Xiaomi Yi, którą już steruję ze smartfonu przez WiFi aby zmieniać tryby i ustawienia, więc mi to trochę nie pasuje.

  • #15 15 Mar 2016 23:39
    Robo24
    Poziom 10  

    W Arduino nikt nie przejmuje się wielkością kodu jak również nie za bardzo ma możliwość go optymalizować w oryginalnym ide ;P

    Arduino po to, że projekt jest prosty od początku do końca i spełnia założenia. Z ESP8266 miałem trochę zabawy na początku zanim to ustrojstwo ruszyło a apka na androida dla początkujących też jest trudniejsza niż program na arduino ;)

    Ps. ESP ładnie daje się programować z arduino ide ;)

    Co myślicie o zrobieniu łazika np na 8 kołach/gąsienicach i kamera stabilizowana niezależnie od ruchów podwozia? Pewnie wystarczyłby mechaniczny stabilizator z dwoma kołami zamachowymi

  • #16 16 Mar 2016 00:34
    piotr411
    Poziom 22  

    Trudno jest mi się, z Tobą zgodzić, co do trudności programowania na Androidzie. Owszem jeśli będziesz programować w Javie lub C, będzie to dość mozolne. Ale jak znasz podstawy Basic, to tu masz kompletny kod na Androida, wykonujący zdjęcie co 10 sekund.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Jak wyżej napisałem projekt jest przerośnięty. wystarczyło wszytko napisać na Androidzie. Polecam poszukać w Google Play, Mintoris Basic, zaglądnij tylko do referencji, a wszytko będzie jasne. Jedyne czego się nie uda jak narazie to wysłać SMS ;)

    Dla rozwinięcia projektu pisząc 2 linie kodu więcej, zdjęcia zamiast zapisywać na kartę, można bezpośrednio wysyłać na serwer FTP lub na pocztę. Ograniczy to chodzenie po dachach :-) jeśli tam umieścisz smartphone.

  • #17 16 Mar 2016 20:17
    SylwekK
    Poziom 28  

    Zdjęcia, zdjęciami, ale coś musi ten wózek jeszcze pchać/ciągnąć ;) więc mimo smartfona i tak trzeba zrobić jakiś driver, itd... a jeśli już robimy elektronikę to cóż za koszt jest wstawić procek i niech elektronika zajmie się już całością wysyłając tylko sygnał do smartfona o konieczności zrobieniu fotki. Tak czy inaczej samym smartfonem tematu sensownie nie ogarniesz :)

  • #18 16 Mar 2016 21:48
    piotr411
    Poziom 22  

    Oczywiście, że coś musi pchać wóz, ale też bezpośrednio z portów Arduino nie wysteruje silników. Dlatego obstaje przy swoim, Arduino czy jak kto woli, uC jest tu nie potrzebny, dodatkowy. Tablet/Smartphone ma dodatkowo czujniki które potrafią coś więcej od Arduino i to można wykorzystać. Od strony programowej, łatwiej jest pisać soft pod Androida niż pod AVR, bez względu czy będzie to prymitywne Arduino, bogate AVR Studio czy Bascom.

  • #19 16 Mar 2016 22:23
    SylwekK
    Poziom 28  

    @piotr411, oczywiście jest jeszcze jeden warunek jeśli uparłeś się na fona :) - slider używa tylko smartfona do fotek, a to z kolei drastycznie zmniejsza możliwości, np. kiepskie zdjęcia nocne, a o zmiennych ogniskowych już nie wspomnę. W przypadku gdy telefon miałby sterować jeszcze driverem napędowym i innym aparatem to układ sprzętu wydaje się już nieco groteskowy ;)

  • #20 16 Mar 2016 23:01
    piotr411
    Poziom 22  

    Nie uparłem się na smartphonie tylko twierdzę, że w tym projekcie, wyświetlacz, arduino i interface RF są zbędne. W innym projekcie może i bym zastosował inne rozwiązania, ale temat dotyczy tego konkretnego przypadku.