Drehscheibe

Drehscheibe Marke „Eigenbau“

1. Verwendete Hardware (Stückliste)

  • Mikrocontroller: Arduino Nano oder Bluno UNO (Bluetooth-fähiger Arduino Uno Klon).
  • Motortreiber: Original Arduino Motor Shield Rev3 (basiert auf dem L298P Chip).
  • Schrittmotor: BJ42D15 (NEMA 17, 1.8° Schrittwinkel, 200 Schritte pro Umdrehung).
  • Sensorik: Digitaler Hallsensor (z. B. A3144) zur Nullpunkt-Referenzierung.
  • Anzeige: 4-stelliges 7-Segment-Display (Modell 3041 mit TM1628/1630 Chip).
  • Stromversorgung: Externes Netzteil (empfohlen 12V DC, min. 2A) an den Schraubklemmen des Motor Shields.

2. Programm-spezifische Anpassungen (Die „Geheimrezepte“)

Im Code haben wir mehrere massgeschneiderte Lösungen für deine Hardware eingebaut:

  • Hitzeschutz (Power-Management):
    • Problem: Der L298P Chip und der Motor werden im Stillstand extrem heiss.
    • Lösung: Die Funktion setMotorPower(false) schaltet die Pins 3 und 11 (PWM) nach jeder Fahrt ab. Der Motor wird stromlos und bleibt eiskalt.
  • Sicherheits-Homing (Timeout):
    • Problem: Wenn der Magnet abfällt, dreht der Motor ewig weiter.
    • Lösung: Eine millis()-Abfrage stoppt den Motor nach exakt 60 Sekunden, falls kein Magnet gefunden wurde, und zeigt „Err“ im Display.
  • Präzisions-Positionierung:
    • Logik: Das Array posSteps[] arbeitet in 200er-Schritten. Das bedeutet, jede Position (1–10) entspricht genau einer vollen Umdrehung des Motors. Dies ist ideal für mechanische Untersetzungen (Getriebe).
  • Display-Speicher-Bereinigung:
    • Besonderheit: Das 3041-Display behält „Geister-Ziffern“ im Speicher.
    • Lösung: Eine for-Schleife überschreibt bei jedem Update alle 14 Speicherregister mit 0x00, um ein sauberes Schriftbild zu garantieren.
  • Kommunikation:
    • Eingestellt auf 115200 Baud, damit der Bluno Bluetooth-Chip verzögerungsfrei mit deinem PC oder Smartphone kommunizieren kann.

3. Pin-Belegung am Arduino / Shield

BauteilPinsFunktion
SchrittmotorD12, D13 (DIR) / D3, D11 (PWM)Antrieb via Motor Shield
HallsensorD2Nullpunkt-Suche (Magnet)
Display DIOA2Datenleitung
Display CLKA3Taktleitung
Display STBA4

Falls der Magnet nicht gefunden wird. Err und aus.

Null Position gefunden. Startbereit.


#include <Stepper.h>

// — DISPLAY PINS (Modell 3041 / TM1628) —

const int DIO = A2;

const int CLK = A3;

const int STB = A4;

// — MOTOR SHIELD PINS (Original Arduino Rev3) —

const int pwmA = 3;  

const int pwmB = 11;  

const int brakeA = 9;

const int brakeB = 8;

// — BITMUSTER 7-SEGMENT (0-9) —

const byte numTable[] = {

  0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F

};

// — LOGIK VARIABLEN —

const int stepsPerRev = 200;

const int hallPin = 2;      

long posSteps[] = {0, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800};

int currentPosIndex = 0;

unsigned long timeoutMillis = 60000; // 60 Sekunden Sicherheits-Limit

Stepper myStepper(stepsPerRev, 12, 13);

// — DISPLAY FUNKTIONEN —

void sendByte(byte b) {

  for (int i = 0; i < 8; i++) {

    digitalWrite(CLK, LOW);

    digitalWrite(DIO, (b & (1 << i)) ? HIGH : LOW);

    digitalWrite(CLK, HIGH);

  }

}

void updateDisplay(int pos, bool error = false) {

  digitalWrite(STB, LOW);

  sendByte(0x8A); // Display ON

  digitalWrite(STB, HIGH);

  // Speicher löschen (Geister-Ziffern entfernen)

  digitalWrite(STB, LOW);

  sendByte(0x40);

  digitalWrite(STB, HIGH);

  digitalWrite(STB, LOW);

  sendByte(0xC0);

  for (int i = 0; i < 14; i++) sendByte(0x00);

  digitalWrite(STB, HIGH);

  // Neue Zahl schreiben

  digitalWrite(STB, LOW);

  sendByte(0xC0);

  if (error) {

    sendByte(0x79); // ‚E‘

    sendByte(0x00); sendByte(0x50); // ‚r‘

    sendByte(0x00); sendByte(0x50); // ‚r‘

  } else if (pos == 0) {

    sendByte(0x76); // ‚H‘ für Homing

  } else if (pos < 10) {

    sendByte(numTable[pos]);

  } else if (pos == 10) {

    sendByte(numTable[1]); // ‚1‘

    sendByte(0x00);

    sendByte(numTable[0]); // ‚0‘

  }

  digitalWrite(STB, HIGH);

}

// — MOTOR POWER (Hitzeschutz) —

void setMotorPower(bool on) {

  if (on) {

    digitalWrite(brakeA, LOW); digitalWrite(brakeB, LOW);

    digitalWrite(pwmA, HIGH); digitalWrite(pwmB, HIGH);

    delay(10);

  } else {

    digitalWrite(pwmA, LOW); digitalWrite(pwmB, LOW);

  }

}

void setup() {

  Serial.begin(115200);

  pinMode(DIO, OUTPUT); pinMode(CLK, OUTPUT); pinMode(STB, OUTPUT);

  pinMode(hallPin, INPUT_PULLUP);

  pinMode(pwmA, OUTPUT); pinMode(pwmB, OUTPUT);

  pinMode(brakeA, OUTPUT); pinMode(brakeB, OUTPUT);

  myStepper.setSpeed(60);

  updateDisplay(0); // Zeige ‚H‘

  // — HOMING MIT SICHERHEITS-TIMEOUT —

  Serial.println(„Homing startet…“);

  setMotorPower(true);

  unsigned long startHoming = millis();

  bool found = false;

  while(millis() – startHoming < timeoutMillis) {

    if(digitalRead(hallPin) == LOW) { // Magnet gefunden

      found = true;

      break;

    }

    myStepper.step(1);

    delay(2);

  }

  setMotorPower(false);

  if (!found) {

    Serial.println(„TIMEOUT: Magnet nicht gefunden!“);

    updateDisplay(0, true); // Zeige „Err“

    while(1); // Not-Halt

  }

  currentPosIndex = 0;

  updateDisplay(1);

  Serial.println(„Bereit!“);

}

void loop() {

  if (Serial.available() > 0) {

    int input = Serial.parseInt();

    if (input >= 1 && input <= 10) {

      long steps = posSteps[input-1] – posSteps[currentPosIndex];

      setMotorPower(true);

      myStepper.step(steps);

      setMotorPower(false);

      currentPosIndex = input-1;

      updateDisplay(input);

    }

  }

}

Diese Seite verwendet Cookies, um die Nutzerfreundlichkeit zu verbessern. Mit der weiteren Verwendung stimmst du dem zu.

Datenschutzerklärung