Sharp IR und Nema17; Distanzbereiche ausschließen

Hallo,

ich habe einen Sharp IR Sensor (5-30cm) und steuere über die Distanz einen Nema17-Motor.
Das funktioniert auch ganz gut.
Der untere Sketch rechnet die Spannung in Distanz um. Der Motor dreht sich im Uhrzeigersinn wenn der Sensor mehr als 90mm misst und gegen den Uhrzeigersinn wenn weniger als 90mm gemessen werden. Jetzt möchte ich aber den Messbereich, in dem der Motor agieren soll, eingrenzen. Wenn der Sensor mehr als 130mm oder wenniger als 50mm misst, soll der Motor still stehen.
Dafür habe ich mit “constrain” den Output des Seriellen Monitors eingegrenzt. Es werden nur noch die Messwerte von 50 bis 130 dargestellt.

Allerdings wird das gesetzte Limit ignoriert. Der Motor läuft weiter.

Gibt es die Möglichkeit Messbereiche zu definieren (z.B 91mm-130mm/ 91mm-50mm) in denen der Motor dann agieren kann?

Vielen Dank :confused:

int dirPin = 4;
int stepperPin = 3;
int sensorPin = A0;
int val = 0;
int sollAbstand = 90;


void setup(){
   Serial.begin (9600);
   Serial.println("Programmanfang");
   pinMode(dirPin, OUTPUT);
   pinMode(stepperPin, OUTPUT);
   }
   void step(boolean dir, int steps){
   digitalWrite(dirPin,dir);
   delay(50);
     for(int i=0;i<steps;i++){
     digitalWrite(stepperPin, HIGH);
     delayMicroseconds(600);
     digitalWrite(stepperPin, LOW);
     delayMicroseconds (600);
     }
}

void loop(){

     val = analogRead(sensorPin);
     Serial.print("Messwert: "); Serial.print(val); Serial.print(" ");
     int valConverted = (207600 / (val - 11))/10;

     valConverted = constrain(valConverted, 50, 130);

     Serial.print("abs. Abstand: "); Serial.print(valConverted); Serial.print("mm ");
     Serial.print("rel. Abstand: "); Serial.print(valConverted - sollAbstand); Serial.println(" mm");

     if (valConverted > 90)
     {step(true,51);}
     if (valConverted == 130) //über "constrain" als max. Messwert (funktioniert nicht)
     {step(true,0);}
     if (valConverted < 90)
     {step(false,51);}
     if (valConverted == 50) //über "constrain" als min. Messwert (funktioniert nicht)
     {step(false,0);}
     if (valConverted == 90)
     {step(true,0);}

     delay (20);
}

== 130 ist in > 90 enthalten. == 50 ist auch in < 90 enthalten. Das musst du trennen

Du musst erst auf die == Werte abfragen. Dann auf die zwei Bereiche. Und mit else if, statt if.

Achtung. Bei Abständen unter 5cm wird das Ausgangssignal wieder größer. Der Sensor ist also für bestimmte Abstände nicht eindeutig. Grüße Uwe

@Serenifly…Tatsächlich…so geht es.

Vielen Dank!!

     if (valConverted == 130)
     {step(true,0);}

     else if (valConverted == 90)
     {step(true,0);}

     else if (valConverted == 50)
     {step(false,0);}


     else if (valConverted > 90)
     {step(true,51);}

     else if (valConverted < 90)
     {step(false,51);}