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.
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. Download
#include
#include
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
1x Nextion Display 3,5 Zoll
1x Schrittmotor http://amzn.to/2DlOOKz
1x Treiberboard A4988
1x Linearführung -> http://s.click.aliexpress.com/e/bKnSpXba
Nextion 3.5″ Basic Touch Display 480×320 HMI – NX4832T035
45,99 €
Umsatzsteuerbefreit gemäß UStG §19zzgl. VersandWeiterlesenArduino Uno R3
11,99 €
Umsatzsteuerbefreit gemäß UStG §19zzgl. VersandLieferzeit: ca. 1-3 WerktageIn den WarenkorbSteppertreiber A4988
2,99 €
Umsatzsteuerbefreit gemäß UStG §19zzgl. VersandLieferzeit: ca. 1-3 WerktageIn den Warenkorb- Angebot!
Platine für Stepper Motor Arduino Uno Shield
6,99 €4,99 €Umsatzsteuerbefreit gemäß UStG §19zzgl. VersandLieferzeit: ca. 1-3 WerktageIn den Warenkorb