Hallo vielleicht kann einer helfen ich benötige eine DC Motorsteuerung mit 2 Taster und 3 Hall Sensoren als Endschalter erster Hallsensor soll beim erreichen der Ausgangstellung stoppen beim betätigen von Schalter 1 soll der Motor einen schlitten bis zum ersten hall Sensor bewegen dann die Drehrichtung ändern zurück zur Ausgangstellung fahren und Stoppen beim betätigen des zweiten Tasters bis zum dritten Hallsensor fahren und wieder die Drehrichtung ändern und zurück in die Ausgangsstellung fahren.
Ich benötige diese um das öffnen eines DHL Paketkastens zu realisieren da DHL die kontaktlose Nutzung einstellt leider habe ich keinen Ahnung von Arduino und der Programmierung
Willst Du es lernen?
Ansonsten kannst Du hier fragen, ob Dir das einer baut.
?!?
klingt auch nach Strukturierung nicht wirklich durchgängig.
Poste ein Bild von relevanten Teilen/Aufbau des DHL Paketkastens.
Beginne zunächst mit einer grafischen Darstellung des Ablaufs - ganz ohne Programmierung. Welche Schritte sollen auf Grund von welchem Ereignis in welcher Reihenfolge abgearbeitet werden.
Zeichne schematisch, wie/wo die Sensoren 1, 2, 3 verteilt sind.
Und als erster Schritt: Repariere deine Tastatur und verwende Satzzeichen!
H = Hallsensoren
S = Taster
Der Motor soll über eine Spindel den Magneten (blaues Dreieck) bewegen
- Ist der Magnet bei H1 = Warten auf eine Eingabe
- S1 wird betätigt
- Motor soll sich rechts drehen bis der Magnet H2 erreicht hat dann
2 Sekunden warten und die Drehrichtung nach links ändern . - Magnet ist wieder bei H1 angekommen = Motor stoppen und auf Eingabe warten.
- S2 wird betätigt
- Motor soll sich rechts drehen bis der Magnet H3 erreicht hat dann
2 Sekunden warten und die Drehrichtung nach links ändern . - Magnet ist wieder bei H1 angekommen = Motor stoppen und auf Eingabe warten.
Funktion am Paketkaten ist das bei S1 nur das Paketfach geöffnet wird und bei S2 zusätzlich das Brieffach sich öffnet.
Ich hoffe jemand kann da helfen und ich habe alles was benötigt wird erklärt.
Im Voraus schon einmal vielen Dank
Moin @schlagerheilo,
darf man davon ausgehen, dass die Ausgangslage für S1 und S2 immer H1 ist?
Das wäre der einfachste Fall, da man auf die Tasten nur reagieren muss, wenn der Magnet sich in der Stellung H1 befindet. Von dort gibt es jeweils zwei simple Abläufe.
Muss die Spindel beim Anfahren von H3 auf Position H2 ebenfalls 2 s warten oder kann sie durchfahren?
ec2021
Den Code könntest Du als einfache Statemaschine aufbauen.
Die States könnten folgende Namen haben:
State_Stopp
State_Fahrt_zu_Pos_1
State_Fahrt_zu_Pos_2
State_Warten
State_Rueckfahrt
Hast Du schon die Hardware (Spindelmotor, Hallsensoren, H-Brücke, usw) und elektrotechnische Grundkenntnisse?
Ja die Ausgangslage ist immer H1 und beim anfahren von H3 kann sie durchfahren
die Hardware habe ich noch nicht einige Grundkenntnisse habe ich
in der Elektronik durch Nachbau von Schaltungen nur mit Arduino und vor allem mit der Programmierung kenne ich mich leider überhaupt nicht aus
Hier einmal ein Bild von der Mechanik des Paketkasten der Hebel ist in der Stellung über H1in meinen Diagramm und die Hallsensoren bei mir H2 und H3 die dort angefahren werden dieses versuche ich mit neuer Elektronik nachzubauen.
Hier mal ein (sehr) schnell geschriebenes Beispiel:
Siehe Wokwi: https://wokwi.com/projects/429318070253515777
Sketch:
/*
Forum: https://forum.arduino.cc/t/dc-motorsteuerung-mit-hall-endschalter/1376495/10
Wokwi: https://wokwi.com/projects/429318070253515777
2025/04/26
ec2021
Taster
Blau = H1
Grün = H2
Rot = H3
Schwarz = S1
Weiss = S2
*/
#include <MobaTools.h>
const byte s1Pin = 4;
const byte s2Pin = 5;
const byte h1Pin = 6;
const byte h2Pin = 7;
const byte h3Pin = 8;
const byte stepPin = 3;
const byte dirPin = 2;
const int stepsPerRev = 6400;
enum States {IDLE, WAIT, GOH1, GOH2, GOH3};
States state = IDLE;
MoToStepper stepper1( stepsPerRev, STEPDIR );
struct switchType {
byte pin;
byte state = HIGH;
unsigned long lastChange = 0;
byte lastState = HIGH;
void init(byte aPin) {
pin = aPin;
pinMode(pin, INPUT_PULLUP);
}
boolean was_pressed() {
byte actState = digitalRead(pin);
if (actState != state && millis() - lastChange > 100) {
lastChange = millis();
state = actState;
return (state == LOW);
} else {
return false;
}
}
};
switchType S1, S2, H1, H2, H3;
void setup()
{
Serial.begin(115200);
stepper1.attach( stepPin, dirPin );
stepper1.setSpeed( 100 );
//stepper1.setRampLen( 50);
S1.init(s1Pin);
S2.init(s2Pin);
H1.init(h1Pin);
H2.init(h2Pin);
H3.init(h3Pin);
}
void loop() {
stateMachine();
}
void controlMachine() {
if (S1.was_pressed()) {
Serial.println("S1 Pressed");
stepper1.rotate(1);
state = GOH2;
}
if (S2.was_pressed()) {
Serial.println("S2 Pressed");
stepper1.rotate(1);
state = GOH3;
}
}
void stateMachine() {
static unsigned long startTime = 0;
switch (state) {
case IDLE:
controlMachine();
break;
case WAIT:
if (millis() - startTime >= 2000) {
state = GOH1;
stepper1.rotate(-1);
}
break;
case GOH1:
if (H1.was_pressed()) {
Serial.println("H1");
state = IDLE;
stepper1.stop();
}
break;
case GOH2:
if (H2.was_pressed()) {
Serial.println("H2");
startTime = millis();
state = WAIT;
stepper1.stop();
}
break;
case GOH3:
if (H3.was_pressed()) {
Serial.println("H3");
startTime = millis();
state = WAIT;
stepper1.stop();
}
break;
}
}
Taster
Blau = H1
Grün = H2
Rot = H3
Schwarz = S1
Weiß = S2
Als Motor (weil bei Wokwi verfügbar) ein Stepper.
- Schwarze Taste S1 -> Motor dreht im Uhrzeigersinn bis die Grüne Taste betätigt wird (entspricht H2), wartet dann 2 s und dreht gegen den Uhrzeigersinn bis die blaue Taste (H1) betätigt wird
- Weiße Taste S2 -> Motor dreht im Uhrzeigersinn bis die Rote Taste betätigt wird (entspricht H3), wartet dann 2 s und dreht gegen den Uhrzeigersinn bis die blaue Taste (H1) betätigt wird
Das sollte es eigentlich sein, ggf. sollte man noch mechanische Endschalter verwenden, falls es mal ein Problem mit den Magnetkontakten gibt.
Viel Erfolg!
ec2021
P.S.: Die Steppermotor-Anteile muss man sinngemäß durch Kommandos für Stopp/Links/Rechtslauf des DC-Motors anpassen.
Bist Du sicher daß H1 nicht überfahren werden kann?
Grüße Uwe
super vielen Dank werde mal die Teile besorgen und mich an das testen Machen
Bitte auf jeden Fall berücksichtigen, dass der Sketch
- nicht mit der Originalhardware getestet wurde,
- diese Hardware bzgl. Polarität der Magnetkontakte abweichen kann,
- davon ausgeht, dass die Startposition beim Einschalten H1 ist und
- über keine Absicherung gegen das Überfahren der Positionen H1 und H3 verfugt.
Das Überprüfen der Startposition lässt sich noch einfach nachrüsten, indem in Setup() geprüft wird, ob die Position H1 (oder ggf H2 bzw. H3)
vorliegt. Soweit wenigstens H2 oder H3 der Fall ist, kann H1 angefahren werden. Bei Zwischenpositionen weiß der Sketch nicht, wohin gefahrlos gedreht werden kann. Er müsste z.B. ein Signal abgeben und per Hand auf eine der bekannten Stellungen verfahren werden.
Würde aber eher zum Arduino Nano v3 greifen als zum Uno, da der Nano etwas kleiner und handlicher ist
Dann eher zu einem MINI (ein Arduino ohne USB Adapter, der im Betrieb nicht gebraucht wird). Auch gibt Platinen mit anderen Microcontrolern, die weniger Pins haben.
Grüße Uwe
Hi Uwe,
gebe Dir grundsätzlich Recht.
Da der TO aber erwähnt hat, dass er keine Erfahrung mit Arduino hat, wäre ein Board mit USB für den Einstieg einfacher (sofern in seinem Paketkästchen genug Platz für den Einbau vorhanden ist).
Ich glaube nicht, dass er einen Programmer hat oder weitere Boards, um daraus einen Programmer zu basteln.
Nette Grüße
Rob
Der MINI mit USB Adapter ist im Endefekt zusammen ein NANO.
https://docs.arduino.cc/retired/boards/arduino-pro-mini/
USB Adapter mit ATmega16U2 (wie auf dem UNO R3):
https://docs.arduino.cc/retired/boards/arduino-usb-2-serial-micro/
oder solche mit dem FT232 wie auf dem NANO:
Grüße Uwe
Platz ist im Paketkasten genug habe Teile bestellt ,wenn alles da ist werde ich mich an das testen machen.
Liebe Grüße
Schlagerheilo
Hi @schlagerheilo ,
Du solltest auf jeden Fall meine Hinweise aus Post 14 berücksichtigen...
Mindestens die Prüfung bei Neustart des Sketches ist sinnvoll, wenn nicht zwingend.
Gruß
ec2021