Hallo an alle,
ich bin ein Arduino Starter und habe ein Programmierproblem.
Mein Projekt:
Es sollen über ein Fließband Teile bewegt werden und am Ende mit einem Mindestabstand von diesem herunterfallen.
Mein Ziel ist es zu bemerken, wenn der Abstand zwischen zwei Teilen auf meinem selbstgebauten Fließband zu gering ist und in dem Falle das Fließband für 2 Sekunden stoppen zu lassen.
Anschließend soll es wieder anfahren und wieder aufmerksam sein.
Bei meinem Code, arbeite ich bisher nur mit If -Befehlen um dies umzusetzen.
Leider Stoppt der Motor sobald der Sensor etwas erkennt.
Könnt ihr mir Helfen einen richtigen Weg zu finden?
Meine Hardware ist folgende:
- ein Arduino Uno, genauer: AZDelivery Mikrocontroller Board ATmega328
- ein AZDelivery CNC Shield V3 mit A4988 Motortreibern (nur ein Motor in Benutzung) (inkl. externer Spannungsversorgung)
- ein Nema17 Schrittmotor 1,8° ( 42Ncm 1.5A)
- KY-032 IR Infrot -Sensoren
DerCode ist folgender:
// Stepper Motor X
const int stepPin = 2; //X.STEP
const int dirPin = 5; // X.DIR
int sen = 9;
int detect;
long zeit3;
long zeit2;
long dauer;
long wiederholung;
long wartezeit;
long warten;
void setup() {
Serial.begin(9600);
pinMode(stepPin, OUTPUT); // Step Signal fuer Geschw.
pinMode(dirPin, OUTPUT); //Dir -> direction
pinMode(sen, INPUT); //Sensor eingang
}
void loop() {
detect = digitalRead(sen);
if (detect == 1) {
//digitalWrite(dirPin, HIGH); // Enables the motor to move in a particular direction
digitalWrite(dirPin, LOW);
digitalWrite(stepPin, HIGH);
delayMicroseconds(471);
digitalWrite(stepPin, LOW);
delayMicroseconds(471);
Serial.println("Laeuft");
}
else if (detect == 0) // Sensor detektiert etwas
{
if (detect == 1) // Sensor erkennt wieder nichts
{
zeit2 = millis(); // Zeit starten
digitalWrite(dirPin, LOW);
digitalWrite(stepPin, HIGH);
delayMicroseconds(471);
digitalWrite(stepPin, LOW);
delayMicroseconds(471);
if (detect == 0) // Sensor detektiert erneut etwas
{
wiederholung = millis(); // Zeit erkennen und messen der Dauer
dauer = wiederholung - zeit2;
Serial.println(dauer);
if (dauer > 2000) // wenn der Abstand groesser als 2 Sekunden -> nichts
{
}
else {
zeit3 = millis(); // wenn Dauer kleiner als 2Sekunden dann warte bis die Zeit rum ist und starte Loop neu
wartezeit = 2000 - (zeit3 - zeit2);
Serial.println(wartezeit);
//digitalWrite(stepPin, 0);
delay(wartezeit); // zwei Sekunden warten
}
}
}
}
};
Vielen Dank für Eure Unterstützung!
PrinzHermann