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).
- Logik: Das Array
- 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 mit0x00, 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
| Bauteil | Pins | Funktion |
|---|---|---|
| Schrittmotor | D12, D13 (DIR) / D3, D11 (PWM) | Antrieb via Motor Shield |
| Hallsensor | D2 | Nullpunkt-Suche (Magnet) |
| Display DIO | A2 | Datenleitung |
| Display CLK | A3 | Taktleitung |
| Display STB | A4 |

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);
}
}
}
