Metainformationen zur Seite
  •  

Dies ist eine alte Version des Dokuments!


Schrittmotor

Im folgenden werde ich mich bei der Beschreibung eines Schrittmotors, auf 28BYJ-48 mit dem Treiber ULN2003 beschränken.

erste Umdrehung

Ziel war es zunächst diesen Schrittmotor mit einem Arduino anzusteuern. Dazu benötigte es zum Beipiel die Library AH_28BYJ48.

#include <AH_28BYJ48.h> 
//Library laden
 
const int stepsPerRevolution = 64*64;  // Anzahl Schritte pro Umdrehung * Zahnradfaktor
 
 
AH_28BYJ48 myStepper(stepsPerRevolution, 4,5,6,7);    
              // pin1 blau
              // pin2 pink
              // pin3 gelb
              // pin4 orange
 
void setup() {
  Serial.begin(9600);
}
 
void loop() {
    myStepper.setSpeedHz(1000);             //Geschwindigkeitsfrequenz setzen
    myStepper.step(stepsPerRevolution);     //Eine Umdrehung durchführen
    delay(1000);                            // 1000ms warten
 
    myStepper.setSpeedRPM(10);              //Geschwindigkeit in Anzahl Umdrehungen pro Minute setzen
    myStepper.step(-stepsPerRevolution);    // Drehung in andere Richtung ausführen
    delay(1000);  
}

Punkte ansteuern

Nachdem das ansteuern eines Schrittmotors klappt, bietet es sich nun an einen zweiten mitanzusteuern, um beide Motoren ein Faden zu wickeln, das Ende beider zu verknoten um dann später Muster malen zu lassen, nachdem man an den verknoteten Punkt einen Stift befestigt hat. Dazu ist es nötig einen Punkt abhängig von seinen Koordinaten anzusteuern. Das funktioniert vermutlich am besten über die Anzahl der Umdrehungen, die jeder Motor benötigt. Dazu wird im folgenden Programm jedoch jeder Motor am Programmstart so angenommen, als hätte er keine Umdrehungen durchgeführt, wenn er zum ersten Punkt fährt und danach erst die Fäden zusammengebunden.

#include <AH_28BYJ48.h>
 
const int stepsPerRevolution = 64*64;  // number of steps per revolution * gear factor
 
// initialize the library 
AH_28BYJ48 myStepper(stepsPerRevolution, 4,5,6,7);    
              // pin1 blau
              // pin2 pink
              // pin3 gelb
              // pin4 orange
 
AH_28BYJ48 myStepper2(stepsPerRevolution, 8,9,10,11);  
 
 
const float pi = 3.14;       // Pi
const int x_max = 11;        // Maxima des Feldes
const int y_max = 11;
int n_1 =0;                  // Auszuführende Umdrehungen zwischen letztem und neuen Punkt
int n_2 =0;                  
int n1_alt =0;               // Umdrehungen bis zum letzten Punkt 
int n2_alt = 0 ;
int n1_neu = 0;              // Umdrehungen bis zum neuen Punkt
int n2_neu = 0;
 
int x[] = {1,2,3,4,5,6,7,8,9}; // x-Koordinaten der Punkte
int y[] = {1,2,3,4,5,6,7,8,9};
int n1_mittelpunkt = sqrt(x_max*x_max/4 + y_max*y_max /4)/ (2* pi); 
int n2_mittelpunkt = sqrt(x_max*x_max/4 + y_max*y_max /4)/ (2* pi);
 
 
void setup() {
  Serial.begin(9600);
 
 }
 
void loop() {
 
    n1_neu = n1_mittelpunkt;    // Mittelpunkt ansteuern
    n2_neu = n2_mittelpunkt;
    n_1 = n1_mittelpunkt- n1_alt;
    n_2 = n2_mittelpunkt- n2_alt;
    bewegen(n_1,n_2);  
 
    for (int i=0; i < sizeof(x); i++){
      if (x[i] > x_max)  {x[i]= x_max;} // prüfung, ob Maxima überschritten werden
      if (y[i] > y_max)  {y[i] = y_max;}
 
      n1_alt= n1_neu;
      n2_alt= n2_neu;
      n1_neu = sqrt(y[i]*y[i]+x[i]*x[i])/ (2* pi);  // Umdrehungen vom Nullpunkt berechnen
      n2_neu = sqrt ( (x_max-x[i])* (x_max-x[i])+ y[i]*y[i])/ (2*pi);
 
      n_1 = n1_neu - n1_alt;              // Umdrehungen vom vorherigen Punkt berechnen
      n_2 = n2_neu - n2_alt;
 
      bewegen(n_1,n_2);                                    // Bewegungen durchführen 
 
 
  }  
  n1_alt = n1_neu;                    // zurück zum Mittelpunkt
  n2_alt = n2_neu;
  n_1 = n1_mittelpunkt-n1_alt;
  n_2 = n2_mittelpunkt-n2_alt;
  bewegen(n_1,n_2);
 
}
 
 
void bewegen (int s1,int s2){
 
      if ( s1 >= s2 ){                  // damit Fäden nicht außeinander reißen
 
 
        for ( int i=0; i< stepsPerRevolution; i++){
          myStepper.setSpeedHz(1000);            
          myStepper.step(s1); 
          myStepper2.setSpeedHz(1000);
          myStepper2.step(s2);
        }
        delay(1000);
      }  
 
      else{
        for ( int i=0; i< stepsPerRevolution; i++){
          myStepper2.setSpeedHz(1000);
          myStepper2.step(s2);  
          myStepper.setSpeedHz(1000);
          myStepper.step(s1); 
        }
        delay(1000);
      }
 
}