Relais ab bestimmter Abstandsmessung schalten

Hallo allerseits,
meine Idee ist es, ab einem bestimmten Abstand, der von Infrarotsensoren gemessen wird, ein Relais zu schalten welches den Notstop der Maschine aktiviert. Ist das realisierbar durch eine if-Abfrage mit "kleiner gleich" dem gemessenem Wert und dann den Pin an dem das Relais angesteckt ist auf HIGH oder LOW setzen?
Hier mein aktueller Code mit der Library des VL53L0X. Da habe ich noch ein Funktionsprinzip mit Schalter, den ich ausgeklammert habe.

Vielen Dank und viele Grüße,
Silvester

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

//bool button0read = false;
//bool button0on = false;
//bool switch0 = false;


// Uncomment this line to use long range mode. This
// increases the sensitivity of the sensor and extends its
// potential range, but increases the likelihood of getting
// an inaccurate reading because of reflections from objects
// other than the intended target. It works best in dark
// conditions.

//#define LONG_RANGE


// Uncomment ONE of these two lines to get
// - higher speed at the cost of lower accuracy OR
// - higher accuracy at the cost of lower speed

//#define HIGH_SPEED
#define HIGH_ACCURACY


void setup()
{
  //pinmode(2,INPUT_PULLUP);
  //pinMode(12,OUTPUT);

  Serial.begin(9600);
  Wire.begin();

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }

#if defined LONG_RANGE
  // lower the return signal rate limit (default is 0.25 MCPS)
  sensor.setSignalRateLimit(0.1);
  // increase laser pulse periods (defaults are 14 and 10 PCLKs)
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif

#if defined HIGH_SPEED
  // reduce timing budget to 20 ms (default is about 33 ms)
  sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
  // increase timing budget to 200 ms
  sensor.setMeasurementTimingBudget(200000);
#endif
}

void loop()
{
  //button0read = digitalRead(2);

  //if (button0read == false && button0on == false){
    //button0on = true;
  //}

  //if (button0read == true && button0on == true){
   // button0on = false;
    //switch0 = !switch0;
  //}

  //if(switch0 == true){
    //digitalWrite(12,true); 
  //} else {
    //digitalWrite(12, false);
  //}
  Serial.print(sensor.readRangeSingleMillimeters());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();

}

Hallo silverrrr

Eine Notstop-Funktion wird nicht in Software realisiert.
Dafür gibt es Schalter, die den Notstop auslösen.

220px-Not-Aus_Betätiger

kein Notstop, aber ein schnellaus.

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

//bool button0read = false;
//bool button0on = false;
//bool switch0 = false;


// Uncomment this line to use long range mode. This
// increases the sensitivity of the sensor and extends its
// potential range, but increases the likelihood of getting
// an inaccurate reading because of reflections from objects
// other than the intended target. It works best in dark
// conditions.

//#define LONG_RANGE


// Uncomment ONE of these two lines to get
// - higher speed at the cost of lower accuracy OR
// - higher accuracy at the cost of lower speed

//#define HIGH_SPEED
#define HIGH_ACCURACY



constexpr byte btnPin {2};
constexpr uint32_t minDistanz {50};
uint32_t entfernung;
bool isAus = false;


void setup()
{
  //pinmode(2,INPUT_PULLUP);
  //pinMode(12,OUTPUT);
  Serial.begin(9600);
  pinMode(btnPin, INPUT_PULLUP);
  Wire.begin();
  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }
#if defined LONG_RANGE
  // lower the return signal rate limit (default is 0.25 MCPS)
  sensor.setSignalRateLimit(0.1);
  // increase laser pulse periods (defaults are 14 and 10 PCLKs)
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif
#if defined HIGH_SPEED
  // reduce timing budget to 20 ms (default is about 33 ms)
  sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
  // increase timing budget to 200 ms
  sensor.setMeasurementTimingBudget(200000);
#endif
}

void frageTaste()
{
  if (!digitalRead(btnPin))
  {
    isAus = true;
  }
}

void frageSensor()
{
  entfernung = sensor.readRangeSingleMillimeters();
  if ((millis() / 2) % 50 == 0)
  {
    Serial.println(entfernung);
  }
  if (entfernung < minDistanz)
  {
    isAus = true;
    Serial.println(F("AUS"));
  }
  if (sensor.timeoutOccurred())
  {
    Serial.println(F(" TIMEOUT"));
    isAus = true;
  }
}
void loop()
{
  frageTaste();
  frageSensor();
  if (isAus)
  {
    // warte auf Aktion
  }
  else
  {
    // mach was
  }
}
2 Likes

Hallo paulpaulson,

genau, wir wollen in der Verkabelung des Schalters ein Relais zwischen setzen, den man dann durch den Arduino schalten kann

Hallo,

erstmal vielen lieben Dank!
Wie ich das verstehe wird mir hier nur gesagt wann ich den Schalter betätigen muss, richtig?
Was ist wenn in der Verkabelung des Aus-Schalters ein Relais dazwischen liegt?

Trenne das physikalische.
Der Arduino soll das ja nur auslösen.
Deine Notausschaltung ist eine Leitung in der ein NC Kontakt drin steckt.
Mit dem in Reihe musst Du nur einen Kontakt deines Relais packen.

Aber, jetzt kommt die Hürde.
Das Relais sollte wenn möglich im Ruhezustand angezogen sein. Fällt der Arduino aus oder what ever fällt der Kontakt und die Leitung ist ausgelöst.

Von daher kann der else-zweig entfallen
Und nun kommt es darauf an, was du da für ein Relaisbaustein dran hast.
Die meisten sind Lowaktiv.
Das heißt im setup den pin low setzen, schaltet das Relais ein.
Mit dem auslösen von isAus wird der pin high gezogen.
Das Relais fällt ab. Schnellstop.

Ist dein vorgeschlagener Code denn alles was ich benötige (ausgenommen das Relais) ?
Im Loop würde ich dann die Relaisschaltung einbauen?

Der code ist eigentlich alles las mur mal noch etwas Zeit, dann kann ich den laptop aufmachen. Ich Bau das fertig

Statt Abstandssensor Arduino Auswertung in Sw und Relais Das Notaus auslöst würde ich einen Endschalter nehmen der So montiert ist daß er bei einem gewissen Abstand eines Teiles zu einem anderen betätigt wird und Das Notaus auslöst.

Das ist einfacher und weniger Fehleranfälliger und vor allen Störresistent.
Grüße Uwe

Der code compiliert.
Die einzigen Konstanten, die möglichen Änderungen unterliegen sind aus und minDistanz
Alles andere sollte so tun.
Als Kontrolle habe ich noch die Onboard-LED mit eingebaut.
Die geht aus, wenn ausgelöst.

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

//#define LONG_RANGE


// Uncomment ONE of these two lines to get
// - higher speed at the cost of lower accuracy OR
// - higher accuracy at the cost of lower speed

//#define HIGH_SPEED
#define HIGH_ACCURACY

constexpr byte btnPin {2};
constexpr byte relPin {12};
constexpr byte ctlPin {LED_BUILTIN};   // sichtkontrolle
constexpr uint32_t minDistanz {50};
//  Je nach Schaltung ist aus mit LOW oder HIGH zu belegen
constexpr bool aus {LOW};              // Relaisboardsteuerung

uint32_t distanz;

bool isAus = false;

void setup()
{
  Serial.begin(9600);
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(relPin, OUTPUT);
  pinMode(ctlPin, OUTPUT);
  digitalWrite(ctlPin, HIGH);          // Zeigt Betriebsbereitschaft an
  digitalWrite(relPin, !aus);
  Wire.begin();
  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }
#if defined LONG_RANGE
  // lower the return signal rate limit (default is 0.25 MCPS)
  sensor.setSignalRateLimit(0.1);
  // increase laser pulse periods (defaults are 14 and 10 PCLKs)
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif
#if defined HIGH_SPEED
  // reduce timing budget to 20 ms (default is about 33 ms)
  sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
  // increase timing budget to 200 ms
  sensor.setMeasurementTimingBudget(200000);
#endif
}

void frageTaste()
{
  if (!digitalRead(btnPin))
  {
    isAus = true;
  }
}

void frageSensor()
{
  static uint32_t lastDistanz = 9999999;
  distanz = sensor.readRangeSingleMillimeters();
  if (distanz != lastDistanz)
  {
    Serial.println(distanz);
    lastDistanz = distanz;
  }
  if (distanz < minDistanz)
  {
    isAus = true;
    Serial.println(F("AUS"));
  }
  if (sensor.timeoutOccurred())
  {
    Serial.println(F(" TIMEOUT"));
    isAus = true;
  }
}

void loop()
{
  frageTaste();
  frageSensor();
  if (isAus)
  {
    digitalWrite(relPin, aus);
    digitalWrite(ctlPin, LOW);
    Serial.println(F("Press Reset to Restart"));
  }
}

Noch ein Nachtrag:
Das Relais reagiert jetzt auf LOW-aktiv.
Das heisst, das Ding zieht an, wenn LOW am PIN anliegt.
Das bedeutet auch, das dann das Kontaktpaar NO für die Steuerung genutzt wird.
Fehlt dem Arduino oder der Relaisplatine der Strom, fällt das relais ab -> stop.

1 Like

Ich denke was du meinst ist das sowas nicht mit arduino Software realisiert wird (normalerweise :slightly_smiling_face: )

Nothalt Funktionen realisiere ich beinahe täglich in Software, aber es ist spezielle Software auf speziellen Steuerungen :grin:

Das ganze hat ja auch rechtlichen Charakter wenn das in einer Maschine umgesetzt wird. Aber ich denke dann ist das hier auch der falsche Rahmen. Das aber nur als randbemerkung. Wenn wir das mal überlesen bzw dir (=dem TO) das überlassen und uns rein auf die Funktion konzentrieren... würde ich nur anregen wollen dass in dem Code oben das isAus nicht auf false zurück gesetzt wird. Das heißt es klappt nur einmal. Oder der ganze arduino wird mit ausgeschaltet wenn not halt aktiv ist. Aber dazu müsste vllt mal kurz ein Schaltplan skizziert werden...

1 Like

Der Variablenname gibt genau seine Funktion wieder.
Wenn isAus aktiv ist, ist es HIGH.
Und ja, es soll nur einmal klappen. Genau beim ersten Mal des auslösens.

Wenn die Variable gesetzt ist, wird der Outputpin passend gelöscht.
Darum ist die Variable isAus auch nicht der Pegel des PIN, sondern der Pin wird über einen extra Funktionsblock gesteuert.

[edit: typo]

Hallo Uwe,

das kann ich mir gerne auch anschauen, hast du eventuell eine Empfehlung für einen solchen Schalter? Bei meiner Maschine handelt es sich um eine Karbonwickelanlage, bei der sich das Werkstück dreht. Also auf jeden Fall berührungslos. Hier mal ein Bild davon.


Die Sensoren sollen an den Wickelkopf der den Faden ablegt.

Klasse!
Ich melde mich sobald Tests gemacht wurden.

Was ich noch nicht durchblicke. Was willst Du den bewirken? Willst Du verhindern daß der Kopf irgendwo gegenfährt? Willst Du das ende der Wicklung automatisieren?

Grüße Uwe

Hallo Uwe,

ja ich möchte Kollisionen zwischen dem Kopf und dem Tank verhindern.

Gruß Silvester

Bräuchte ich ein Breadboard um 2 Sensoren gleicher Art zu betreiben?

???

Ein Breadbord (Steckplatine) wird zum Testaufbau verwendet. Dies weil man einfach die Bauteile einstecken kann bzw einfach umstecken kann. Für einen endgültigen Aufbau sind die Steckplatine zu unsicher.

Welche Sensoren??

Grüße Uwe

Hallo Uwe,

Achso, alles klar.
Es sind die VL530LX Sensoren

Laut Datenblatt kann man die I2C Adresse per Programmierung ändern:
"Programmable I2C address ". Also wenn man die Adresse umprogrammiert kann man mehr als einen Sensor an den I2C Bus anschließen.

Was mich aber verunsichert ist, daß im Datenblatt für die Meßgenauigkeit als Meßflächeeine Bestimmte Farbe genannt ist:
"Reflectance targets are standard ones (Grey 17% N4.74 and White 88% N9.5 Munsell
charts)."
Außerdem daß die Meßfläche den gesamten Offnungswinkel des Sensors ausfüllt (das heißt daß der Sensor nicht eine kleine Fläche anleuchtet und das meiste daneben vorbei).

Nun, was mich verunsichert, ist, daß das Material das Du kontrollieren willst, schwarz ist. Bevor ich mich für diesen Sensor entscheide, würde ich zuerst einen Test machen, ob der überhaupt in Deinem Aufbau funktioniert.

Grüße Uwe