Macroschlitten mit Arduino und Nextion Display

Macroschlitten mit Arduino und Nextion Display

Macroschlitten mit Arduino und Nextion Display

Heute möchte ich euch das Projekt MACROSCHLITTEN vorstellen. Hier wird die Kamera mit einer Spindel und einem Schrittmotor bewegt.

Wozu braucht man einen Macroschlitten?

Ich beschäftige mich ein bisschen mit Marcofotographie (Nahaufnahmen). Nun ist es so, wenn man ein Objekt aufnimmt bekommt man nur einen kleinen Bereich gut scharf gestellt, siehe Bild.
Focus vorn
Wenn man nun aber das ganze Bild scharf abgebildet haben möchte, kann man mit hilfe einer Software mehrere Bilder zusammenfügen. Hierzu muss man mehrere Bilder mit verschiedenen Abstufungen der Schärfe aufnehmen, siehe Bilder.
Focus hintenFocus vorn
Wenn diese Aufnahmen mit einem Stativ und ohne Macroschlitten gemacht werden schiebt sich das Objekt durch das Scharfstellen der ebenen (drehen am Schärfering). Das kann dann zu problemen mit der Software führenen.
Macht man diese Aufnahmen mit einem Macroschlitten, bleibt das Objekt nahezu unverändert und somit bessere Ergebnisse mit der Software.
Das Bild zeigt die beiden Bilder (es können auch mehrere Bilder sein) kombiniert (Focus Stacking)
Focus kombi

Der Aufbau

Für das Projekt habe ich mir extra eine Arduino Shield mit hilfe von https://easyeda.com/ erstellt.
Wer das noch nicht kennt, damit könnt Ihr Leiterplaten erstellen und herstellen lassen, ich finde echt gut geeingnet für solche Projekte. Das Programm ist kostenlos und das Herstellen ich auch recht günstig.
Layout

Funktion

Über das Display können 10, 100, oder 1000 Schritte gefahren werden und der Shrittmodus gewählt werden Vollschritt, Halbschritt, Viertelschritt und Achtelschritt. Ich habe zum Thema Schrittmotor schon mal einen Beitrag gemacht. Betrieben wird das ganz mit einem 12 Volt Netzteil oder einer Batterie, ein Gehäuse habe ich leider noch nicht gebaut.
MacroschlittenNextion Dsiplay

Programmcode

Für die Ansteuerung des Nextion Display verwende ich die Serielle Schnittstelle. Über den CHAR BUTTON lese ich den Code aus den das Display sendet, wenn eine Taste gedrückt wird. Dieser Code wird dann nur über die IF Anweisung abgefragt. In meinem Fall wird auch nur eine Stelle des Code abgefragt.

#include <Wire.h>
#include <Streaming.h>
int MS1 = 5;
int MS2 = 6;
int MS3 = 7;
int EN = 4;
int Step = 9;
int Dir =10;
int Index;
char button [7] = {};

void setup() {
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(MS3, OUTPUT);
  pinMode(EN, OUTPUT); //Enable
  pinMode(Step, OUTPUT); //Step
  pinMode(Dir, OUTPUT); //Direction

  digitalWrite(EN, LOW);
  Serial.begin(9600);

}


void loop() {

  if (Serial.available() > 0)
  {
    for (int i = 0; i < 6; i++) {
      button[i] = button[i + 1];
    }
    button[6] = Serial.read();

  }

  //10er Step UP
  if (button[2] == 1)
  {
    digitalWrite(Dir, LOW);
    for (Index = 0; Index < 10; Index++)
    {
      digitalWrite(Step, HIGH);
      delayMicroseconds(500);
      digitalWrite(Step, LOW);
      delayMicroseconds(500);
    for (int i = 0; i < 7; i++) {
      button[i] = 0;
    }
    }
  }

  //10er Step DOWN
  if (button[2] == 4)
  {
    digitalWrite(Dir, HIGH);
    for (Index = 0; Index < 10; Index++)
    {
      digitalWrite(Step, HIGH);
      delayMicroseconds(500);
      digitalWrite(Step, LOW);
      delayMicroseconds(500);
    for (int i = 0; i < 7; i++) {
      button[i] = 0;
    }
    }
  }


  //100er Step UP
  if (button[2] == 6)
  {
    digitalWrite(Dir, LOW);
    for) (Index = 0; Index < 100; Index++)
    {
      digitalWrite(Step, HIGH);
      delayMicroseconds(500);
      digitalWrite(Step, LOW);
      delayMicroseconds(500);
    for) (int i = 0; i < 7; i++) {
      button[i] = 0;
    }
    }
  }

  //100er Step DOWN
  if (button[2] == 7)
  {
    digitalWrite(Dir, HIGH);
    for) (Index = 0; Index < 100; Index++)
    {
      digitalWrite(Step, HIGH);
      delayMicroseconds(500);
      digitalWrite(Step, LOW);
      delayMicroseconds(500);
    for (int i = 0; i < 7; i++) {
      button[i] = 0;
    }
    }
  }

  //1000er Step UP
  if (button[2] == 9)
  {
    digitalWrite(Dir, LOW);
    for (Index = 0; Index < 1000; Index++)
    {
      digitalWrite(Step, HIGH);
      delayMicroseconds(500);
      digitalWrite(Step, LOW);
      delayMicroseconds(500);
    for (int i = 0; i < 7; i++) {
      button[i] = 0;
    }
    }
  }

  //1000er Step DOWN
  if (button[2] == 10)
  {
    digitalWrite(Dir, HIGH);
    for (Index = 0; Index < 1000; Index++)
    {
      digitalWrite(Step, HIGH);
      delayMicroseconds(500);
      digitalWrite(Step, LOW);
      delayMicroseconds(500);
    for (int i = 0; i < 7; i++) {
      button[i] = 0;
    }
    }
  }

  // Modus 1
  if (button[2] == 12)
  {
    String cmd;
    cmd += "\"";
    Serial.print("tModus.txt=" + cmd + "Modus 1" + cmd);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.print("tModus.txt=" + cmd + "Modus 1" + cmd);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.write(0xFF);
    digitalWrite (MS1,LOW);
    digitalWrite (MS2,LOW);
    digitalWrite (MS3,LOW);  
    for (int i = 0; i < 7; i++) {
      button[i] = 0;
    }
  }

  // Modus 1/2
  if (button[2] == 13)
  {
    String cmd;
    cmd += "\"";
    Serial.print("tModus.txt=" + cmd + "Modus 1/2" + cmd);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.print("tModus.txt=" + cmd + "Modus 1/2" + cmd);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.write(0xFF);
    digitalWrite (MS1,HIGH);
    digitalWrite (MS2,LOW);
    digitalWrite (MS3,LOW);  
    for (int i = 0; i < 7; i++) {
      button[i] = 0;
    }  
  }
  
  // Modus 1/4
  if (button[2] == 14)
  {
    String cmd;
    cmd += "\"";
    Serial.print("tModus.txt=" + cmd + "Modus 1/4" + cmd);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.print("tModus.txt=" + cmd + "Modus 1/4" + cmd);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.write(0xFF);
    digitalWrite (MS1,LOW);
    digitalWrite (MS2,HIGH);
    digitalWrite (MS3,LOW);   
    for (int i = 0; i < 7; i++) {
      button[i] = 0;
    }
  }
  
  // Modus 1/8
  if (button[2] == 15)
  {
    String cmd;
    cmd += "\"";
    Serial.print("tModus.txt=" + cmd + "Modus 1/8" + cmd);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.print("tModus.txt=" + cmd + "Modus 1/8" + cmd);
    Serial.write(0xFF);
    Serial.write(0xFF);
    Serial.write(0xFF);
    digitalWrite (MS1,HIGH);
    digitalWrite (MS2,HIGH);
    digitalWrite (MS3,LOW);   
    for (int i = 0; i < 7; i++) {
      button[i] = 0;
    }
  }
}

Folgende Bauteile wurde verwendet:

1x Arduino Uno R3 https://amzn.to/2ORVWA1 *
1x Nextion Display 3,5 Zoll https://amzn.to/2OThyw9 *
1x Arduino Shield (selbst entworfen)
1x Schrittmotor http://amzn.to/2DlOOKz *
1x Treiberboard A4988 http://amzn.to/2DqSKsS *
1x Linearführung -> Bei Aliexpress

Leave a Comment