Motorsteuerung zum Fokussieren.
Verfasst: 03.03.2018, 19:45
Hallo allerseits,
bei den Sonnenaufnahmen ist das Fokussieren mit dem Newton ziemlich umständlich. Man kraucht in die Box mit dem Rechner (sonst sieht man ja nichts), versucht dann mit einer Hand den Auszug zu erreichen. Stößt irgend wo an und alles wackelt. Durch das Seeing am Tag ist so schon kaum der Fokus zu finden. Deshalb möchte ich das mit einem Schrittmotor steuern.
Als Motor soll ein 5V 4 Phasen Schrittmotor (Getriebe) mit dem Modul ULN2003zu Einsatz kommen. Die Steuerung über einen Arduino. Das kostet zusammen nicht mal 10 Euro. Schneller Vor- und Rücklauf. Ebenfalls langsamer Vor- und Rücklauf. Man kann eine Position abspeichern. Es wird angezeigt, ob man sich vor oder hinter der gespeicherten Position befindet. Weiterhin kann man automatisch zu diese Position fahren.
Ich stelle das Programm unten ein. Sicherlich kann man das eine oder andere anders machen, ist mein erstes Programm in C.
Das Programm:
// Übersetzung des Motors 1/64, 512 Schritte für eine Umdrehung
//Namen für Ausgabe Motor
int aus1=8;int aus2=9;int aus3=10;int aus4=11;
//Namen Lage zum gespeicherten Wert
int vor_speicher=12;int nach_speicher=13;
int ausgabe_motor [8][8] ={
{1,0,0,0,1,0,0,1},
{1,1,0,0,0,0,0,1},
{0,1,0,0,0,0,1,1},
{0,1,1,0,0,0,1,0},
{0,0,1,0,0,1,1,0},
{0,0,1,1,0,1,0,0},
{0,0,0,1,1,1,0,0},
{1,0,0,1,1,0,0,0},};
//Namen für Eingänge
int schalter_schnell_vor=2;int schalter_schnell_ruek=3;int schalter_langsam_vor=4;
int schalter_langsam_ruek=5;int schalter_merken=6;int schalter_home=7;
//Variable
int zw=0;long stellung=0; long speicher=0; long maxwert=10000; int tempo=0; //maxwert begrenzt die Anzahl der möglichen Schritte
int schnell=2; int langsam=10;
//---------------------------------------------------------------------------------------
void setup() {
// Motorausgänge
pinMode (aus1,OUTPUT);pinMode (aus2,OUTPUT);pinMode (aus3,OUTPUT);pinMode (aus4,OUTPUT);
// Lage zum gespeicherten Wert
pinMode (vor_speicher,OUTPUT);pinMode (nach_speicher,OUTPUT);
//Tasteneingänge
pinMode(schalter_schnell_vor,INPUT);pinMode(schalter_schnell_ruek,INPUT);
pinMode(schalter_langsam_vor,INPUT);pinMode(schalter_langsam_ruek,INPUT);
pinMode(schalter_merken,INPUT);pinMode(schalter_home,INPUT);
//interner Pullup
digitalWrite (schalter_schnell_vor,HIGH);digitalWrite (schalter_schnell_ruek,HIGH);
digitalWrite (schalter_langsam_vor,HIGH);digitalWrite (schalter_langsam_ruek,HIGH);
digitalWrite (schalter_merken,HIGH);digitalWrite (schalter_home,HIGH);
}
//-----------------------------------------------------------------------------------
void loop() {
//Tastaturabfrage Bewegung
if(digitalRead(schalter_schnell_vor)==0){tempo=schnell;vor();}
if(digitalRead(schalter_schnell_ruek)==0){tempo=schnell;ruek();}
if(digitalRead(schalter_langsam_vor)==0){tempo=langsam;vor();}
if(digitalRead(schalter_langsam_ruek)==0){tempo=langsam;ruek();}
//Tastaturabfrage Speicher
if(digitalRead(schalter_merken)==0){speicher=stellung;}
//Tastaturabfrage Home
if(digitalRead(schalter_home)==0&&stellung<speicher)
{tempo=schnell;
do{vor();}
while(stellung!=speicher);
}
if(digitalRead(schalter_home)==0 && stellung>speicher)
{tempo=schnell;
do{ruek();}
while(stellung!=speicher);
}
//Tastaturabfrage Motor aus
if(digitalRead(schalter_schnell_vor)==1&&digitalRead(schalter_schnell_ruek)==1&&
digitalRead(schalter_langsam_vor)==1&&digitalRead(schalter_langsam_ruek)==1&&
digitalRead(schalter_home)==1)
//Motor aus
{delay(tempo);digitalWrite(aus1,0);digitalWrite(aus2,0);digitalWrite(aus3,0);digitalWrite(aus4,0);}
//Lage zum Speicher
if (stellung<=speicher){digitalWrite (vor_speicher,1);}
else {digitalWrite (vor_speicher,0);}
if (stellung>=speicher){digitalWrite (nach_speicher,1);}
else {digitalWrite (nach_speicher,0);}
}
// -------------------------- Unterprogramme ---------------------------------------------------
void vor(){
if (stellung<maxwert){
zw=0;
do{
digitalWrite(aus1,ausgabe_motor[zw][0]);digitalWrite(aus2,ausgabe_motor[zw][1]);
digitalWrite(aus3,ausgabe_motor[zw][2]);digitalWrite(aus4,ausgabe_motor[zw][3]);
delay(tempo);
zw++;
}while(zw<8);
stellung++;
}}
void ruek(){
if (stellung>0){
zw=0;
do{
digitalWrite(aus1,ausgabe_motor[zw][4]);digitalWrite(aus2,ausgabe_motor[zw][5]);
digitalWrite(aus3,ausgabe_motor[zw][6]);digitalWrite(aus4,ausgabe_motor[zw][7]);
delay(tempo);
zw++;
}while(zw<8);
stellung--;
}}
bei den Sonnenaufnahmen ist das Fokussieren mit dem Newton ziemlich umständlich. Man kraucht in die Box mit dem Rechner (sonst sieht man ja nichts), versucht dann mit einer Hand den Auszug zu erreichen. Stößt irgend wo an und alles wackelt. Durch das Seeing am Tag ist so schon kaum der Fokus zu finden. Deshalb möchte ich das mit einem Schrittmotor steuern.
Als Motor soll ein 5V 4 Phasen Schrittmotor (Getriebe) mit dem Modul ULN2003zu Einsatz kommen. Die Steuerung über einen Arduino. Das kostet zusammen nicht mal 10 Euro. Schneller Vor- und Rücklauf. Ebenfalls langsamer Vor- und Rücklauf. Man kann eine Position abspeichern. Es wird angezeigt, ob man sich vor oder hinter der gespeicherten Position befindet. Weiterhin kann man automatisch zu diese Position fahren.
Ich stelle das Programm unten ein. Sicherlich kann man das eine oder andere anders machen, ist mein erstes Programm in C.
Das Programm:
// Übersetzung des Motors 1/64, 512 Schritte für eine Umdrehung
//Namen für Ausgabe Motor
int aus1=8;int aus2=9;int aus3=10;int aus4=11;
//Namen Lage zum gespeicherten Wert
int vor_speicher=12;int nach_speicher=13;
int ausgabe_motor [8][8] ={
{1,0,0,0,1,0,0,1},
{1,1,0,0,0,0,0,1},
{0,1,0,0,0,0,1,1},
{0,1,1,0,0,0,1,0},
{0,0,1,0,0,1,1,0},
{0,0,1,1,0,1,0,0},
{0,0,0,1,1,1,0,0},
{1,0,0,1,1,0,0,0},};
//Namen für Eingänge
int schalter_schnell_vor=2;int schalter_schnell_ruek=3;int schalter_langsam_vor=4;
int schalter_langsam_ruek=5;int schalter_merken=6;int schalter_home=7;
//Variable
int zw=0;long stellung=0; long speicher=0; long maxwert=10000; int tempo=0; //maxwert begrenzt die Anzahl der möglichen Schritte
int schnell=2; int langsam=10;
//---------------------------------------------------------------------------------------
void setup() {
// Motorausgänge
pinMode (aus1,OUTPUT);pinMode (aus2,OUTPUT);pinMode (aus3,OUTPUT);pinMode (aus4,OUTPUT);
// Lage zum gespeicherten Wert
pinMode (vor_speicher,OUTPUT);pinMode (nach_speicher,OUTPUT);
//Tasteneingänge
pinMode(schalter_schnell_vor,INPUT);pinMode(schalter_schnell_ruek,INPUT);
pinMode(schalter_langsam_vor,INPUT);pinMode(schalter_langsam_ruek,INPUT);
pinMode(schalter_merken,INPUT);pinMode(schalter_home,INPUT);
//interner Pullup
digitalWrite (schalter_schnell_vor,HIGH);digitalWrite (schalter_schnell_ruek,HIGH);
digitalWrite (schalter_langsam_vor,HIGH);digitalWrite (schalter_langsam_ruek,HIGH);
digitalWrite (schalter_merken,HIGH);digitalWrite (schalter_home,HIGH);
}
//-----------------------------------------------------------------------------------
void loop() {
//Tastaturabfrage Bewegung
if(digitalRead(schalter_schnell_vor)==0){tempo=schnell;vor();}
if(digitalRead(schalter_schnell_ruek)==0){tempo=schnell;ruek();}
if(digitalRead(schalter_langsam_vor)==0){tempo=langsam;vor();}
if(digitalRead(schalter_langsam_ruek)==0){tempo=langsam;ruek();}
//Tastaturabfrage Speicher
if(digitalRead(schalter_merken)==0){speicher=stellung;}
//Tastaturabfrage Home
if(digitalRead(schalter_home)==0&&stellung<speicher)
{tempo=schnell;
do{vor();}
while(stellung!=speicher);
}
if(digitalRead(schalter_home)==0 && stellung>speicher)
{tempo=schnell;
do{ruek();}
while(stellung!=speicher);
}
//Tastaturabfrage Motor aus
if(digitalRead(schalter_schnell_vor)==1&&digitalRead(schalter_schnell_ruek)==1&&
digitalRead(schalter_langsam_vor)==1&&digitalRead(schalter_langsam_ruek)==1&&
digitalRead(schalter_home)==1)
//Motor aus
{delay(tempo);digitalWrite(aus1,0);digitalWrite(aus2,0);digitalWrite(aus3,0);digitalWrite(aus4,0);}
//Lage zum Speicher
if (stellung<=speicher){digitalWrite (vor_speicher,1);}
else {digitalWrite (vor_speicher,0);}
if (stellung>=speicher){digitalWrite (nach_speicher,1);}
else {digitalWrite (nach_speicher,0);}
}
// -------------------------- Unterprogramme ---------------------------------------------------
void vor(){
if (stellung<maxwert){
zw=0;
do{
digitalWrite(aus1,ausgabe_motor[zw][0]);digitalWrite(aus2,ausgabe_motor[zw][1]);
digitalWrite(aus3,ausgabe_motor[zw][2]);digitalWrite(aus4,ausgabe_motor[zw][3]);
delay(tempo);
zw++;
}while(zw<8);
stellung++;
}}
void ruek(){
if (stellung>0){
zw=0;
do{
digitalWrite(aus1,ausgabe_motor[zw][4]);digitalWrite(aus2,ausgabe_motor[zw][5]);
digitalWrite(aus3,ausgabe_motor[zw][6]);digitalWrite(aus4,ausgabe_motor[zw][7]);
delay(tempo);
zw++;
}while(zw<8);
stellung--;
}}