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.
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.
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)
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.
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.
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. Um das Programm auf das Display zu laden, die Datei auf eine SD Karte legen und diese dann in das Display stecken und anschalten. Der Upload der Datei läuft automatisch, danach muss das Display wieder ausgeschalten werden, SD Karten entfernen und mit dem nächsten einschalten ist das Programm für das Display da.
#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 wurden verwendet:
1x Platine, jetzt im Shop verfügbar https://arduino-projekte.info/produkt-kategorie/platinen/
1x Arduino Uno R3 https://ap-url.de/arduinouno
1x Nextion Display 3,5 Zoll https://ap-url.de/nextion35d
1x Schrittmotor http://amzn.to/2DlOOKz
1x Treiberboard A4988 https://ap-url.de/a4988
1x Linearführung http://s.click.aliexpress.com/e/bKnSpXba
5 Kommentare
Hallo, ich habe die HMI Datei sowie die tft für das Dsicovery Modell hinzugefügt. Nun sollte alles da sein was man braucht.
Hallo, könntest Du die .tft Datei vielleicht für das NX432F035_11 zur Verfügung stellen ?
Wollte es nachbauen, aber da ich ein anderes Display habe, funktioniert das irgendwie nicht.
Hallo Tobias,viele Dank für die schnelle Hilfe, die Übertragung hat sofort geklappt. 👍😀GrußDetlef
Hallo Detlef,
ich habe die Daten mal angepasst, probier es mal aus und gib mir eine Rückmeldung ob es geklappt hat.
Gruß
Tobias
Hallo,
habe den Macroschlitten mit Arduino UNO und Nextion Display “NX4832T035” zusammengebaut.
Beim Überspielen der .tft Daten erhalte ich die Nachricht “file version is too low”. Gibt es da eine neuere/andere Lösung?
Mit freundlichen Grüßen
Detlef