Motorsteuerung zum Fokussieren.

  • 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--;

    }}


    //HUK 2018