Kamera Slider

Hallo zusammen :slight_smile:

Ich habe heute meinen ersten Sketch soweit fertig gestellt!

Da ich noch nicht so viel Erfahrung habe, will ich mich mal schlau machen, womit ich mein Sketch noch verbessern oder sogar erweitern könnte.

Die Hauptfunktionen sind bis jetzt:

Taster1:
Einfacher Klick: Geschwindigkeit des Schrittmotors in 4 Stufen durchzuschalten
Doppelklick: Den Weg den der Schlitten zurücklegt, auch in 4 Längen zu unterteilen
Langes Drücken: Funktion (noch) nicht belegt

Taster2:
Einfacher Klick: Motor startet in 1. Richtung / Sliderende kann nicht überfahren werden
Doppelklick: Motor startet in die 2. Richtung / Slideranfang kann nicht überfahren werden
Langes Drücken: Motor fährt auf die "Parkposition", also auf 0 in meinem Fall

Und hier der gesamte Sketch:

#include <LiquidCrystal.h>
#include <OneButton.h>
#include <Stepper.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int SPMU = 32;
Stepper myStepper(SPMU, 6,7,8,9);

int sped = 300;
int distance = 500;
int distancemax = 2000;
int distancestep = distancemax/4;
int gohome = 0;

  OneButton button1 = OneButton(10,false);
  OneButton button2 = OneButton(13,false);
  
//-------------------------------------------------------------------------------------------------------------
void setup() {

  lcd.begin(16, 2);

  pinMode(10,INPUT);
  pinMode(13,INPUT);

  button1.attachClick(Speed_Click);
  button1.attachDoubleClick(Distance_Click);
  
  button2.attachClick(forward_Click);
  button2.attachDoubleClick(Back_Click);
  button2.attachDuringLongPress(GoHome_Click);
  
}
//-------------------------------------------------------------------------------------------------------------
void loop() {

  myStepper.setSpeed(sped);

//Speed Button
  button1.tick();
  delay(10);

//Start Button
  button2.tick();
  delay(10);


//Speed Screen Setup
  lcd.setCursor(0, 0);
  lcd.print("Speed");
  lcd.setCursor(6, 0);
  if (sped == 300)
      {lcd.print("1/4");}
  if (sped == 500)
      {lcd.print("2/4");}
  if (sped == 700)
      {lcd.print("3/4");}
  if (sped == 900)
      {lcd.print("4/4");}
  

//Distance Screen Setup
  lcd.setCursor(0, 1);
  lcd.print("Move");
  lcd.setCursor(6, 1);
  if (distance == distancemax/4)
      {lcd.print("1/4");}
  if (distance == distancemax/2)
      {lcd.print("2/4");}
  if (distance == distancemax/4*3)
      {lcd.print("3/4");}
  if (distance == distancemax/1)
      {lcd.print("4/4");}


//Total Distance Screen Setup
  lcd.setCursor(10, 1);
  lcd.print("--");
  lcd.setCursor(13, 1);
  if (gohome == 0)
      {lcd.print("0/4");}
  if (gohome == distancemax/4)
      {lcd.print("1/4");}
  if (gohome == distancemax/2)
      {lcd.print("2/4");}
  if (gohome == distancemax/4*3)
      {lcd.print("3/4");}
  if (gohome == distancemax/1)
      {lcd.print("4/4");}
  
}
//-------------------------------------------------------------------------------------------------------
 void Speed_Click(){
      if (sped < 900)
      {
      sped = sped + 200;
      }
      else
      {
      sped = 300;  
      }
    }

 void Distance_Click() {
     if (distance < 2000)
      {
      distance = distance + 500;
      }
      else
      {
      distance = 500;  
      }
    }
   
 void forward_Click(){
     if (gohome + distance - 1 < distancemax)
      { 
       myStepper.step(distance);
       gohome = gohome + distance;
      }
    }
    
 void Back_Click(){
     if (gohome - distance +1 > 0)
      {
       myStepper.step(-distance);
       gohome = gohome - distance;
      }
    }

 void GoHome_Click(){
     myStepper.step(-gohome);
     gohome = 0;
     }

Für das, dass es mein erster Sketch ist bin ich ziemlich zufrieden damit.

Würde mich sehr über Vorschläge freuen.

Scoolt:
Würde mich sehr über Vorschläge freuen.

#include <Stepper.h>
...
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Du könntest als Bibliothek AccelStepper verwenden, um sanft zu beschleunigen und abzubremsen.

Für die Anzeige gibt es kleine Zusatzplatinen, um mittels I2C (zwei Drähte) Daten zu übertragen, spart IOs.

Scoolt:
Für das, dass es mein erster Sketch ist bin ich ziemlich zufrieden damit.

Klopf Dir auf die Schultern und weiter geht's :slight_smile:

Hallo!

Ich möchte mir irgendwann ebenfalls einen Kameraschlitten bauen.

Hast Du die Mechanik selbst gebaut? Wenn ja, würde ich mich über ein Foto freuen.

Gruß

Gregor

Hallo zusammen :slight_smile:

Ich hatte mein Programm für meinen Kamera-Slider ja eigentlich schon fertig.

Nun, da ich mit dem Mechanischen Teil soweit bin, dass ich die ersten Probefahrten durchführen kann hat sich natürlich der Wurm eingeschlichen...

Zuerst mal das Programm:

  #include <LiquidCrystal.h>
  #include <OneButton.h>
  #include <Stepper.h>

  LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
  int SPMU = 32;
  Stepper myStepper(SPMU, 6,7,8,9);

  int sped = 300;
  long distancemax = 44400;
  long distance = distancemax/4;
  long gohome = 0;

  OneButton button1 = OneButton(10,false);
  OneButton button2 = OneButton(13,false);
  
//-------------------------------------------------------------------------------------------------------------
void setup() {

  lcd.begin(16, 2);

  pinMode(10,INPUT);
  pinMode(13,INPUT);

  button1.attachClick(Speed_Click);
  button1.attachDoubleClick(Distance_Click);
  
  button2.attachClick(forward_Click);
  button2.attachDoubleClick(Back_Click);
  button2.attachDuringLongPress(GoHome_Click);


//Info Screen Setup
  lcd.setCursor(1, 0);
  lcd.print("Goezzlers DIY");
  lcd.setCursor(3,2);
  lcd.print("Slider V1.");
  delay(5000);
  lcd.clear();
  
}
//-------------------------------------------------------------------------------------------------------------
void loop() {

  myStepper.setSpeed(sped);
  digitalRead(A0);

//Speed Button
  button1.tick();
  delay(10);

//Start Button
  button2.tick();
  delay(10);


//Speed Screen Setup
  lcd.setCursor(0, 0);
  lcd.print("Speed");
  lcd.setCursor(6, 0);
  if (sped == 300)
      {lcd.print("1/4");}
  if (sped == 500)
      {lcd.print("2/4");}
  if (sped == 700)
      {lcd.print("3/4");}
  if (sped == 900)
      {lcd.print("4/4");}
  

//Distance Screen Setup
  lcd.setCursor(0, 1);
  lcd.print("Move");
  lcd.setCursor(5, 1);
   lcd.print(distance);
  /*if (distance == distancemax/4)
      {lcd.print("1/4");}
  if (distance == distancemax/2)
      {lcd.print("2/4");}
  if (distance == distancemax/4*3)
      {lcd.print("3/4");}
  if (distance == distancemax/1)
      {lcd.print("4/4");}
*/

//Total Distance Screen Setup
  lcd.setCursor(10, 1);
  //lcd.print("-");
  lcd.setCursor(11, 1);
   lcd.print(gohome);
  /*if (gohome == 0)
      {lcd.print("0/4");}
  if (gohome == distancemax/4)
      {lcd.print("1/4");}
  if (gohome == distancemax/2)
      {lcd.print("2/4");}
  if (gohome == distancemax/4*3)
      {lcd.print("3/4");}
  if (gohome == distancemax/1)
      {lcd.print("4/4");}
  */
}
//-------------------------------------------------------------------------------------------------------
 void Speed_Click(){
      if (sped < 900)
      {
      sped = sped + 200;
      }
      else
      {
      sped = 300;  
      }
    }

 void Distance_Click() {
     if (distance < distancemax)
      {
      distance = distance + distancemax/4;
      }
      else
      {
      distance = distancemax/4;  
      }
    }
   
 void forward_Click(){
     if (gohome + distance <= distancemax)
      { 
       lcd.clear();
       lcd.setCursor(3,0);
       lcd.print("Go to:");
       lcd.setCursor(10,0);
  if (distance + gohome == distancemax/4)
      {lcd.print("1/4");}
  if (distance + gohome == distancemax/2)
      {lcd.print("2/4");}
  if (distance + gohome == distancemax/4*3)
      {lcd.print("3/4");}
  if (distance + gohome == distancemax/1)
      {lcd.print("4/4");}
              
       myStepper.step(distance);
       gohome = gohome + distance;
       
       lcd.setCursor(6, 1);
       lcd.print("Done!");
       delay(5000);
       lcd.clear();
       }
    }
    
 void Back_Click(){
     if (gohome - distance +1 > 0)
      { 
       lcd.clear();
       lcd.setCursor(3,0);
       lcd.print("Go to:");
       lcd.setCursor(10,0);
  if (gohome - distance == distancemax/4)
      {lcd.print("1/4");}
  if (gohome - distance == distancemax/2)
      {lcd.print("2/4");}
  if (gohome - distance == distancemax/4*3)
      {lcd.print("3/4");}
  if (gohome - distance == 0)
      {lcd.print("0/4");}
      
       myStepper.step(-distance);
       gohome = gohome - distance;

       lcd.setCursor(5, 1);
       lcd.print("Done!");
       delay(3000);
       lcd.clear();
      }
    }

 void GoHome_Click(){
     lcd.clear();
     lcd.setCursor(5,0);
     lcd.print("GoHome");
  
     myStepper.step(-gohome);
     gohome = 0;

     lcd.setCursor(5, 1);
     lcd.print("Done!");
     delay(3000);
     lcd.clear();
     }

Als ich bei distancemax noch 2000(zu Probe zwecken) stehen hatte funktionierte alles perfekt.

Nun ist mein Problem, dass...

  1. wenn ich bei distance von der Position 0 ausgehend mehr als 2/4 auf einmal fahre, fährt mein Schlitten in die falsche Richtung.

  2. wenn ich auf Position 4/4 stehe und zu 0/4 mit der GoHome Funktion will fährt mir mein Schlitten wieder in die falsche Richtung, also gegen 5/4 zu.

Es ist wahrscheinlich nur eine "Klitzekleinigkeit", trotzdem komm ich nicht drauf.

lg lukas

agmue:
hören sich beide vorschläge gut an!
Bezüglich "AccelStepper" wie schauts da mit den Code/Befehlen aus? kann ich den/die wo aufgelistet finden?
Und wegen der Zusatzplatine, könntest du vll etwas mehr ins Deteil gehen.

gregorss:
Selbstgebaut kann man das nicht ganz nennen.
Bis jetzt ist es nur ein Teil und das ist die Motoraufhängung.

Und warum dieser "Doppelpost" ?
Lass es doch bei einem, ist übersichtlicher.

Bezüglich "AccelStepper" wie schauts da mit den Code/Befehlen aus? kann ich den/die wo aufgelistet finden?

Google kaputt?
Maus kaputt?

http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html

Ok das ist eine gute Idee!
Nur wie lösche ich diesen Beitrag?

lg

HotSystems:
Und warum dieser "Doppelpost" ?
Lass es doch bei einem, ist übersichtlicher.

Hab beide zuammengefaßt.
Grüße Uwe

uwefed:
Hab beide zuammengefaßt.
Grüße Uwe

Super, danke.

OFFTOPIC <<<<

gregorss:
Hallo!

Ich möchte mir irgendwann ebenfalls einen Kameraschlitten bauen.

Hast Du die Mechanik selbst gebaut? Wenn ja, würde ich mich über ein Foto freuen.

Gruß

Gregor

Hallo Gregor,

ich hab mir letztes Jahr auch einen gebaut:
Hier hab ich ein Video in Aktion - ganz am Schluss sind ein paar Bilder der Mechanik.

Aber Mechanik Ideen und Beispiele gibt es ja unendlich.

Was ich noch nicht geschafft ist einen Slider mit Schrittmotor zu bauen der auch in 45° die
Kraft hat meine DSLR hoch zu ziehen, ohne das ich eine fette USV mit mir rumschleppen muss
damit der Motor genügend Haltekraft während eine Timelapse hat.

So genug OffTopic, wenn's zuviel ist kann der Beitrag gerne geläscht werden :slight_smile:

Tchefter:
https://www.youtube.com/watch?v=xxCIYy12k9A

Eieiei, das ist ganz schön aufwendig gebaut. Hat sich aber ganz offensichtlich gelohnt, die Kamerafahrten zeigen das deutlich.

Tchefter:
Aber Mechanik Ideen und Beispiele gibt es ja unendlich.

Ich hätte halt gerne das Perfekte zum kleinsten Preis :slight_smile:

Wahrscheinlich werde ich mir erstmal einen Makroschlitten zulegen und dann sehen, wie ich den „verbessern“ kann.

Gruß

Gregor

gregorss:
Ich hätte halt gerne das Perfekte zum kleinsten Preis :slight_smile:

Na ja, die Kosten beliefen sich um die 40€ (Aluröhrchen, Alu U-Schiene, Linearlager, GT2 Zahräder + Riemen, SuB-D I/O) + das was man so noch in der KruschtelKiste hat :slight_smile:

Wahrscheinlich werde ich mir erstmal einen Makroschlitten zulegen und dann sehen, wie ich den „verbessern“ kann.

Auch ne Gute Idee, zeigen wenn du was hast :slight_smile:

Tchefter:
Na ja, die Kosten beliefen sich um die 40€ (Aluröhrchen, Alu U-Schiene, Linearlager, GT2 Zahräder + Riemen, SuB-D I/O) + das was man so noch in der KruschtelKiste hat :slight_smile:

Hoppla? Ich muss mir das offensichtlich noch ein paar mal (und genauer) angucken.

Gruß

Gregor

gregorss:
Hoppla? Ich muss mir das offensichtlich noch ein paar mal (und genauer) angucken.

Gruß

Gregor

Zum Aufbau im groben:

12mm Aluröhrchen auf 7,5mm U-Schienen fixiert. Die U-Schienen vorher auf ein 80mm Brett geschraubt, vor ausrichten mit den Röhrchen und den Linearlager drauf.
Am Getriebemotor ist ein 36er GT2 Pulley und auf der Gegenseite ein 8x20x8 Kugellager (Skaterlager) wo der Riemen drauf lauft. Auf den Seiten je eine kleine und Große U-Scheibe, damit der Riemen nicht runterspringt. Die kleine ist dafür da damit die große Scheibe nicht am Kugellager schleift.
Motor abmessen, zeichnen und Halterung fräsen... :slight_smile: ebenso das Plate für die Linearlager.
Der Riemen wird unter dem Plate verbunden / getackert... :slight_smile:

Mit Hirnschmalz und "wenig" Geld im Beutel, geht alles :slight_smile:

Tchefter:
Mit Hirnschmalz und wenig Geld im Beutel, geht alles :slight_smile:

Du sagst es. Manchmal habe ich nicht nur wenig Geld :slight_smile:

Gruß

Gregor

Scoolt:
Bezüglich "AccelStepper" wie schauts da mit den Code/Befehlen aus? kann ich den/die wo aufgelistet finden?
Und wegen der Zusatzplatine, könntest du vll etwas mehr ins Deteil gehen.

Wenn Du diesen unipolaren Motor verwendest, hat dies funktioniert (zumindest bei mir):

AccelStepper stepper(AccelStepper::HALF4WIRE, IN1, IN2, IN3, IN4);

Bei diesem 20x4 Character LCD Display siehst Du auf dem Bild der Rückseite eine kleine Platine für das I2C-Interface. Diese Platine gibt es auch einzeln zum Nachrüsten. Ich habe die in China für 1€ gekauft, will ich aber nicht empfehlen. Tipp: Wenn Du nichts siehst, drehe am Poti :slight_smile:

So mein Slider ist nun fertig! :wink:
Ich hab auch ein kleines Videoüber den Zusammenbau gemacht :wink:

Das Programm kann natürlich jeder Zeit problemlos upgedatet werden!

Scoolt:
Ich hab auch ein kleines Videoüber den Zusammenbau gemacht :wink:

Uh. Du hast Dir ganz schön Arbeit gemacht. Und supi Werkzeug hast Du offensichtlich auch.

Gruß

Gregor

BTW: Das D in LCD steht bereits für Display.

Hi Scoolt :sunglasses:

sehr sehr cooles Teil was Du da gebaut hast!!! Eigtl. hab ich meine Pläne für den 5. oder 6. Slider zubauen verworfen ABER DAS was du da zeigst ist der Knaller und animiert mich sobald das Brennholz eingefahren ist, soll heißen, wenn's draußen nicht mehr sooo gemütlich ist, doch nochmal eine Version zu starten.
Was mir noch etwas schleierhaft ist, mit dem kleinen Motor vertikale slides zu machen, so um die 45° die DSLR hochziehen, da haben meine Nema17 mit einem 12V Bleigelakku immer versagt. Bei einer Timelapse ist die Kamera im Haltemodus nach unten gerutscht, und auch teilweise bei langsamen fahrten.

Danke für's zeigen! Und mega viel Spaß damit!

PS: dein "Erste Resultate" Video ist auch Spitze!