.

Arduino Schrittmotor, Stepper IR Fernsteuerung

Mit dem Hintergedanken, einen Antennen-Rotor für meine Loop Antenne zu bauen, habe ich einen Schrittmotor oder Stepper (Nema 17) mit einer TV Infrarot Fernsteuerung gesteuert. Der hier verwendete Treiber ist nicht in der Lage, das Microstepping (kleinere Schritte als 1,8°) anzusteuern, was aber für meinen Zweck trotzdem ausreicht. Das hier empfohlene Set mit dem Schrittmotor "Nema 17" und dem hochwertigen Treiber "TB 6600" kostet nur um 20 Euro und schöpft die Qualitäten (Micro Stepping) des Motors voll aus.

Was man braucht

 

Video "Schrittmotor, Stepper fernsteuern in Arduino"

Detailbilder zu diesem Experiment

arduino schrittmotor stepper

Der Infrarot Sensor. Detaillierte Beschreibung und Kodierung in diesem Video

arduino infrarot sensor

Video "Schrittmotor aus DVD Laufwerk in Arduino zum Laufen bringen und fernsteuern"

In diesem Video habe ich mein altes DVD Laufwerk zerlegt und die Antriebseinheit mit Schrittmotor ausgebaut. Dann habe ich noch 4 Kabel angelötet und durch Zusammenschließen der Kabel herausgefunden, welche zwei Kabel zusammen gehören. Das funktioniert ganz ohne Messgerät. Und dann geht es auch schon los. Kurz ein einfaches Skript auf den Arduino geladen und der Stepper bewegt sich und fährt auf und ab.

Als besonderes Schmankerl habe ich dann den DVD Brenner noch per Infrarot Fernsteuerung betrieben. So kann man auch mit Elektronik Schrott noch Spaß haben :-) Manche bauen sich sogar ganze Plotter oder 3D Drucker aus solchen alten Laufwerken zusammen!

 

Arduino Sketch (Code)

Der einfache Code, um den Stepper zum Laufen zu bringen

const int PinEn = 5;      //Enable,
 Aktivierung
const int PinStep = 6;    //Step
const int PinDir = 7;     //Direction,
 Drehrichtung

int steps = 0;                   //Variable deklarieren
void setup() {
  pinMode(PinStep, OUTPUT);
  pinMode(PinDir, OUTPUT);
  pinMode(PinEn, OUTPUT);
  digitalWrite(PinEn, HIGH);
}

void loop() {
  digitalWrite(PinDir, LOW);   //Uhrzeigersinn
  for(steps = 0; steps < 200; steps++)
    {
        digitalWrite(PinStep, HIGH);
        delayMicroseconds(500);
        digitalWrite(PinStep, LOW);
        delayMicroseconds(500);
    
    }
        delay(1000);

digitalWrite(PinDir, HIGH);   //gegen Uhrzeigersinn
  for(steps = 0; steps < 200; steps++)
    {
        digitalWrite(PinStep, HIGH);
        delayMicroseconds(500);
        digitalWrite(PinStep, LOW);
        delayMicroseconds(500);
    
    }
        delay(1000);
}

 

 

Der Code mit integrierter Infrarot Fernsteuerung

#include <IRremote.h>       //IR Library einbinden
int RECV_PIN = 9;           //IR Sensor an Pin 9

IRrecv irrecv(RECV_PIN);
decode_results results;

const int PinEn = 5;      //Enable,
 Aktivierung
const int PinStep = 6;    //Step
const int PinDir = 7;     //Direction,
 Drehrichtung

int steps = 0;                   //Variable deklarieren
int raster = 1;                  //Geschwindigkeit

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  
  pinMode(PinStep, OUTPUT);
  pinMode(PinDir, OUTPUT);
  pinMode(PinEn, OUTPUT);
  digitalWrite(PinEn, HIGH);
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);

  if (results.value == 2496420446)   //wenn Taste A gedrückt wird ist Raster = 1
  {raster = 1;
  Serial.println("Schrittweite 1 = 1,8°");
  }  
  if (results.value == 598863752)   //wenn Taste B gedrückt wird ist Raster = 5
  {raster = 5;
  Serial.println("Schrittweite 5 = 9°");
  }

  if (results.value == 2774773698)   //wenn Taste C gedrückt wird ist Raster = 10
  {raster = 10;
  Serial.println("Schrittweite 10 = 18°");
  }

  if (results.value == 4031698352)   //wenn Taste D gedrückt wird ist Raster = 25
  {raster = 25;
  Serial.println("Schrittweite 25 = 45°");
  }
  
    
  if (results.value == 1431986946)   //wenn Taste >> gedrückt wird
  {  
  digitalWrite(PinDir, LOW);   //Uhrzeigersinn

  for(steps = 0; steps < raster; steps++)
    {
        digitalWrite(PinStep, HIGH);
        delayMicroseconds(1000);
        digitalWrite(PinStep, LOW);
        delayMicroseconds(1000);
    } 
            
  }

        
if (results.value == 4283186720)   //wenn Taste << gedrückt wird
{
digitalWrite(PinDir, HIGH);   //Gegen Uhrzeigersinn

  for(steps = 0; steps < raster; steps++)
    {
        digitalWrite(PinStep, HIGH);
        delayMicroseconds(1000);
        digitalWrite(PinStep, LOW);
        delayMicroseconds(1000);
    
    }
        
}
    irrecv.resume();
}
}