×

Arduino-Steuerung für Fischer-Technik


Gepostet Februar 2017, Kategorie: Elektronik


Thumbnail: Arduino-Steuerung für Fischer-Technik

Die Schüler der Abeitsgemeinschaft des Gymnasiums wollen Fischer-Technik-Modelle mit Hilfe des Arduinos steuern. Dafür habe ich die Platine entworfen, die es ermöglicht Motoren, Schrittmotoren, Glühlampen und Sensoren an den Arduino anzuschließen.


Inhaltsverzeichnis


    Platine

    Die Steuerung übernimmt ein Arduino Nano. Auf der Platinen befinden sich zwei Betriebspannungen. V+ entspricht der Spannung, die an den Schraubbuchen angelegt wird. Diese sollte im Bereich von 6 - 12 V liegen - groß genug, um den Arduino zu versorgen und maximal so viel, wie die Motoren vertragen. Diese Spannung versorgt die Motortreiber, den ULN2003A und geht in den VIN-Eingang des Arduino. Der Spannungswandler des Arduino wandelt V+ in 5 V. Mit 5 V wird die Logik der L293D gespeißt. Auf die Funktion der drei weiteren Baugruppen wird in den nachfolgenden Abschnitten eingegangen.

    Schaltplan|50 Vorlage der Platine|25 Platine|25

    Gesamtübersicht

    Gesamtübersicht|50

    Analoge-Einbaugruppe

    Diese Baugruppe nutzt die Anschlüsse A2 bis A7 des Arduinos. Jeder Anschluss wird über einen 220 Ohm-Widerstand mit der ersten Headerreihe verbunden. Die zweite Headerreihe ist komplett mit GND verbunden. Der Widerstand sorgt dafür, dass der Arduino nicht zerstört werden kann. Bei einen Kurzschluss würden maximal fließen.

    Status-LEDs

    An die Pins A2 bis A5 können Status-LEDs direkt angeschlossen werden. Die Anschlüsse A6 und A7 besitzen keine digitale Aus- und Eingabeeinheit und können deshalb nicht für dieses Zweck verwendet werden. Dies soll das nachfolgende Programm zeigen. Die Pins A2, A3 und A7 werden zum Blinken angeregt, jedoch blinken nur die LEDs an A2 und A3.

    Status-LEDs

    void setup() {
      pinMode(A2, OUTPUT);
      pinMode(A3, OUTPUT);
      pinMode(A7, OUTPUT);
    }
     
    void loop() {
      digitalWrite(A2, 1);
      digitalWrite(A3, 1);
      digitalWrite(A7, 1);
      delay(500);
      digitalWrite(A2, 0);
      digitalWrite(A3, 0);
      digitalWrite(A7, 0);
      delay(500);
    }

    Digitale Sensoren

    Für digitale Sensoren können wieder nur die Anschlüsse A2 bis A5 verwendet werden. Digitale Sensoren benötigen einen Pullupwiderstand. Hier kenn der interne des Arduinos verwendet werden, der durch den Befehl pinMode(xxx, INPUT_PULLUP); eingeschaltet wird. Das nachfolgende Programm setzt die LED andauern auf den Status des Tasters. Weil der Taster den Eingang auf Masse zieht, ist die LED an und wird beim Drücken des Tasters ausgeschalten.

    Digitale Sensoren am Beispiel eines Tasters

    void setup() {
      pinMode(A2, OUTPUT);
      pinMode(A3, INPUT_PULLUP);
    }
     
    void loop() {
      digitalWrite(A2, digitalRead(A3));
    }

    Analoge Sensoren

    Für analoge Sensoren können alle vorhandenen Pins verwendet werden. Die meisten analogen Sensoren sind Widerstandssensoren. Da der Arduino eine Spannung misst, ist es sinnvoll ein Spannungsteiler auszubauen. Deshalb wird für den Fotosensor eine dreifache Buchsenleiste verwendet.

    Plot der Ausgabe des Fotosensors|66 Fotosensor|33

    Gleichstrommotoren-Baugruppe

    Um vier Gleichstrommotoren anzusteuern, wurden zwei L293D-ICs verwendet. Deren Logikeinheit wird mit 5 V versorgt. Für die Stromversorgung der Motoren wurde V+ verwendet. Die Steuerung der Motoren erfolgt immer über einen PWM- und einen normalen digitalen Ausgang. Das heißt, damit man die Geschwindigkeit in beide Richtungen steuern kann, muss sich an folgendes Diagramm gehalten werden.

    Drehrichtung mit einem PWM-Pin

    Im nachfolgenden Programm werden Motor 0 und 1 in verschiedenen Geschwindigkeiten und Richtungen gefahren.

    const byte MA[] = {12, 10, 7, 8};
    const byte MB[] = {11, 9, 5, 6};
     
    void setup() {
      for (int i=0; i<4; i++) {
        motor_init(i);
      }
    }
     
    void loop() {
      motor_run(0, 127);
      motor_run(1, 127);
      delay(1000);
      motor_run(0, 255);
      motor_run(1, 255);
      delay(1000);
      motor_run(0, 0);
      motor_run(1, 0);
      delay(1000);
      motor_run(0, -127);
      motor_run(1, -127);
      delay(1000);
      motor_run(0, -255);
      motor_run(1, -255);
      delay(1000);
      motor_run(0, 0);
      motor_run(1, 0);
      delay(1000);
    }
     
    void motor_init(byte motor_id) {
      pinMode(MA[motor_id], OUTPUT);
      pinMode(MB[motor_id], OUTPUT);
    }
     
    void motor_run(byte motor_id, int motor_speed) {
      if (motor_speed >= 0) {
        digitalWrite(MA[motor_id], 0);
        analogWrite(MB[motor_id], motor_speed);
      } else {
        digitalWrite(MA[motor_id], 1);
        analogWrite(MB[motor_id], motor_speed + 255);
      }
    }

    ULN2003A-Baugruppe

    Der ULN2003A ist ein Darlington-Transistor-Array mit offenen Kollektor. Des bedeutet, dass Lasten, gegen Masse geschalten werden können. Deshalb befindet sich unterhalb der Pin-Reihe, die mit den Kollektoren des ULN2003A, eine Pin-Reihe, die komplett mit V+ verbunden ist.

    Eine Anwendungsmöglichkeit ist ein Gleichstrommotor mit den ULN2003A und V+ zu verbinden, um ihn in einen Richtung fahren zu können. Genauso können größere Lasten, wie Glimmlampen oder Stepper-Motor verbunden werden.

    Im folgenden Beispielprogramm wurde der unipolare Schrittmotor 38BYJ-48 verwendet. Dieser soll sich immer um einen Umdrehung nach rechts und links drehen. Dabei ist wichtig, dass die Spulen des Schrittmotors in der richtigen Reihenfolge geschalten werden, damit der Motor einen runden und kraftvoll Lauf vollzieht. Einen richtige Reihenfolge der Anschlüsse ist im folgenden Bild zu sehen.

    Anschließen des Schrittmotors|66 Anschließen des Schrittmotors|33

    #include <Stepper.h>
     
    const int stepsPerRevolution = 2304;
    Stepper myStepper(stepsPerRevolution, 4, 3, 2, 13);
     
    void setup() {
      myStepper.setSpeed(10);
    }
     
    void loop() {
      myStepper.step(stepsPerRevolution);
      delay(500);
     
      myStepper.step(-stepsPerRevolution);
      delay(500);
    }