Näherungssensor geht in Störung/ Kurzschluss - warum?

Hey liebe Arduino Gemeinde & allen ein frohes neues Jahr!
Dies ist mein erster Post hier, seid bitte nachsichtig. :slight_smile:
Ich stehe momentan bei einem Projekt vor einem Problem und benötige eure Hilfe.

Ich möchte mit einem kapazitiven Näherungssensor (NO, PNP) die Drehzahl eines Zahnrades bestimmen. Das Signal soll mittels Interrupt von einem Arduino Nano (Nachbau von Joy-it) ausgewertet und auf einem LCD Display angezeigt werden. Es sind keine hohen Drehzahlen zu erwarten (60 bis max. 600 U/min).

Ich habe die Schaltung (Spannungsteiler + Stepdown Widerstand) auf einem Breadboard aufgebaut und zu Hause an einem Rührgerät ausprobiert. Hier konnten zuverlässig (natürlich je nach Abstand) in den verschiedenen Stufen des Rührers plausible Drehzahlen detektiert bzw. ausgegeben werden. Habe daraufhin die Schaltung auf Platine gelötet und im Projekt integriert und den Sensor ausgerichtet.
Habe bei der Integration etwas getüftelt und dabei vielleicht bei der Verdrahtung mit der Platine etwas vertüdelt. Alles noch mal zig mal überprüft und jetzt laut Stromlaufplan (Anhang) verkabelt. Nun geht der Sensor aber direkt, sobald er das Zahnrad detektiert laut Datenblatt in Überlast/Kurzschluss. Die Anlage steht dabei. Lasse ich die Anlage laufen, werden die Zähne erkannt (LED leuchtet bei jedem Zahn), die Störungsfrequenz der LED blinkt aber nach wie vor. Ist der Sensor vielleicht defekt/ beim Tüfteln kaputtgegangen?
Die Drehzahl auf dem LCD bleibt bei "0 U/min".

Habe ehrlicherweise auch schon Chat GPT drüber schauen lassen aber nichts Brauchbares oder nützliches herausbekommen und vertraue nun auf eure Erfahrung und Schwarmintelligenz. :slight_smile:

Viel Input erstmal, aber ich hoffe jemand ließt sich das durch und hat nen Tipp. Wäre extrem Dankbar!
Beste Grüße
Max

Sensor:
https://www.reichelt.de/de/de/shop/produkt/induktiver_naeherungssensor_3-draht_m12_mont_buendig_kabel-334559

Nano:
https://www.reichelt.de/de/de/shop/produkt/arduino_kompatibles_nano_board_atmega328_mini-usb-225690?nbc=1&q=%2Farduino-kompatibles-nano-board-atmega328-mini-usb-ard-nano-v3-p225690.html&trstct=pos_5

Schaltplan (Skizze):

Code vom Nano:

// Einbinden von Bibliotheken
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <stdio.h>

// ------ DEFINIEREN VON KONSTANTEN VARIABLEN ------
const int SensorPin = 2;                            // Definieren vom Interrupt Pin 2
const int NrOfTooth = 20;                           // Definieren der Zähnezahl bzw Impulse, welche zu erwarten sind
int InterruptCounter;                               // Globale Variablen zur generellen Verwendung
unsigned long drehzahl;

// Initialisieren des LCD Displays
LiquidCrystal_I2C lcd(0x27,16,2);


void setup(){
  Serial.begin(9600);
  Serial.println("Programmstart");
  lcd.init();
  // delay(1800);                                      // Warten bis Controllino ready ist
  lcd.setCursor(0, 0); 
  lcd.print("Drehzahl:");
  lcd.backlight();

  pinMode(SensorPin, INPUT);
}

void loop(){
  meassure();
  Serial.println("hallo");
}

void meassure() {
  char buf[17];                                     // erstellt einen Puffer aus 18 chractern
  unsigned long drehzahl = 0;
  InterruptCounter = 0;                     
  attachInterrupt(digitalPinToInterrupt(SensorPin), countup, RISING);     // Interrupt aktivieren und bei einem Interrupt an Pin 2 auslösen & countup aufrufen 
  delay(1000);                                                            // 1 Sekunde lang Impulse zählen; 1 sekunde macht skallierung einfacher
  detachInterrupt(digitalPinToInterrupt(SensorPin));                      // interrupt wird deaktiviert
  drehzahl = (InterruptCounter / NrOfTooth) * 60;                         // hier Drehzahl errechnen und auf 1 Minute hochgerechnet
  sprintf(buf, "%5lu U/Min      ",drehzahl);                              // mithilfe von sprintf drehzahl formatieren und im Puffer speichern
  display_rpm(buf);                                 // Puffer übergeben und auf LCD ausgeben 
}

void countup() {
  InterruptCounter++;                               // Impulse zählen
}
//Hier Drehzahl auf lcd display ausgeben.
void display_rpm(const char* rpm) {  
  lcd.setCursor(0, 1);
  lcd.print(rpm); 
  
  Serial.print("Counts: ");                          // Debug
  Serial.print(InterruptCounter);                 // Debug
  Serial.print(" RPM: ");                            // Debug
  Serial.println(rpm);                               // Debug
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

1 Like

Am einfachsten, nochmal auf dem Breadboard testen. Beruflich gingen uns ähnliche Sensoren kaputt wegen defekten Relais, wen die Kurzschlussüberwachung in kurzer Zeit wird mehrmals in Anspruch genommen dann gehen die Sensoren Hopssen, und das von fast allen Herstellern.
Wie geschrieben wir haben damit Relais gesteuert.

@UKHeliBob : Oh verdammt, wohl falsch abgebogen. Vielen Dank für's verschieben!

@fony : okay verstehe, hm vielleicht habe ich ihn wirklich zerschossen beim ersten mal, wenn die wirklich so empfindlich sind...
Klingt vernünftig, ich werde die Schaltung nochmal auf dem Breadboard aufbauen und gucken. Das ist eine gute Idee. (ehrlicherweise im Wahn gar nicht drauf gekommen, den Sensor abseits vom System erneut zu prüfen :'D )

Wen der dauerhaft im Fehlerstatus ist = Kurzschluss passiert dem nichts, nur das aus, an, aus an... bei Fehler mögen die nicht.

okay, dass bedeutet er erkennt intern, dass ein Kurzschluss vorherrscht und "Schützt" sich durch seine interne Schaltung?
Wie meinst du das: aus, an, aus, an - lieber ne längere zeit am stück im Fehlerzustand lassen, als ihn sofort wieder vom Strom/ Spannung zu nehmen um mit der Fehlersuche weiter zu machen?

  1. Hast Du einen kapazitiven (wie im Titel) oder Induktiven (wie im Link) Näherungsschalter?
  2. die gibt es auch als NPN Ausführung. Wieso hast Du nicht den genommen?
  3. Schaltplan:
    Das Pin D2 wird bei betätigten Sensor auf +12V geschaltet. Das hält der NANO nicht aus.
    Die Masse ist immer gleich darum ist der 10Kohm Widerstand über GND kurzgeschlossen.
  4. wieso schaltest Du den Näherungssensor nicht an den Controllino. Der verträgt 12V an den Eingängen.

Wenn Du einen Spannungsteiler verwenden willst da mach das richtig:

PNP Ausgang
10 kOhm Widerstand
D2
5,1kOHM Widerstand
Gnd

Grüße Uwe

1 Like

@uwefed : Au weija! Na klar Du hast recht.. schießt ja direkt durch an D2.. :open_mouth: ich Birne, "Spannungsteiler" ist hier ja komplett für die Katz! :'D
Danke!
Dementsprechend so:

  1. Klar, auch da hast Du Recht - sorry für die Verwirrung! Meine Natürlich einen Induktiven Näherungsschalter!
  2. NPN habe ich auch zu Hause liegen (da liegt er warm u Trocken), von der Aufgabenstellung/ dem Projekt her war jedoch ein PNP gefordert.
  3. Danke für den Hinweis!
  4. Der betreibt einen Schrittmotor. Habe die Erfahrung gemacht, wenn in der "Motorschleife" andere Befehle ausgeführt werden oder Sensoren abgefragt werden müssen, lahmt der Programmablauf und dann ist dieser nicht mehr schnell genug um die Schritte auszuführen.

Ich werde die Schaltung morgen entsprechend testen sowie umbauen und berichten was bei rum gekommen ist.

Grüße
Max

Dann hast Du falsch programmiert. delay()??

Grüße Uwe

Das Problem lässt sich mit der MobaTools-Library lösen.
Die MobaTools-Library erzeugt die Schrittmotor-Impulse per Timer-Interrupt im Hintergrund.

@uwefed
habe delayMicroseconds() verwendet:
Steuere mit einem Poti die Drehzahl, daher PotiDelay...

digitalWrite(PUL,HIGH);
delayMicroseconds(PotiDelay);
digitalWrite(PUL,LOW);
delayMicroseconds(PotiDelay);

@StefanL38
Habe von MobaTools.h schon gelesen und sie auch kurz in meinem Code Verwendet. Eigentlich ziemlich nice und mächtig, genauso wie die AccelStepper.h. Habe mit beiden den Motor zwar zum Laufen bekommen jedoch nicht sofort über einen Poti die Drehzahl steuern können. Hat immer gezuckt bzw. gebrummt und auf den Poti nicht reagiert. War dann leider zu ungeduldig und habe aufgrund von Zeitdruck mich für den klassischen bzw. "direkten" weg, dem ansteuern von PUL mittels HIGH und LOW, entschieden. Sicherlich tierisch ineffizient und unnötig verkompliziert, aber der Motor läuft bzw. macht was er soll und die Bedingung ist somit für mich erfüllt.
Nutze AccelStepper um die Spulen stromlos zu schalten, wenn der Motor nicht benutzt wird... naja immerhin etwas haha :'D

Und das wäre dann eine schöne Frag im Forum gewesen. Wie man das macht so dass es prima läuft. Aufgrund der Tatsache, dass die MobaTools die Schrittmotorimpulse per timer-interrupt erzeugen bin ich mir recht sicher, dass sich die Abfrage des Potis und einstellen der Geschwindigkeit flott lösen lässt.

@StefanL38
Ja, da hast du recht. Müsste von der Guidline her sicher ein neues Thema starten, wenn ich das nochmal angehen möchte. :thinking:

Habe heute die Schaltung neu aufgebaut und @uwefed, natürlich hat es dann funktioniert! In meiner geistigen Umnachtung den Wald vor lauter Bäumen nicht gesehen.
Somit alles schick, Sensor macht was er soll und Drehzahlen werden auch ausgegeben. -Danke!

Wenn ich eine Frage noch stellen darf, da es nun etwas in Richtung Stepper geht:
Bei der Drehzahlmessung mit dem Poti auf Anschlag habe ich eine Drehzahl von 148 U/min gemessen. Die maximal möglichen delayMicroseconds betragen bei Anschlag 100. Hab noch ein Planetenradgetriebe am Schrittmotor mit i=5. Der Schrittmotor (23S31-0250 von JAT) braucht für eine Umdrehung 200 Schritte bei einem Vollschrittwinkel von 1,8°. Eigentlich müssten bei einem delay von knapp 100 doch eher 600 U/min am Getriebeausgang bzw. 3000 U/min am Motor (außerhalb seiner maximal möglichen Drehzahl) zu erwarten sein. Wie kann das sein, dass die gemessenen und errechneten Umdrehungen so stark voneinander abweichen... also generell. Auf eine ineffiziente Programmierung zurückzuführen? Ist der Treiber (DM542T) mit dafür verantwortlich? Stepper sind scheinbar sehr empfindlich was unsaubere Programmierung angeht?! :thinking:

Treiber steuern den Schrittmotor so an, daß für jeden STEP Impuls dieser einen Schritt macht. Es gibt aber verschiedene MODI bei dem der Schrittmotor einen ganzen Schritt, oder einen Microschritt macht. Der DM542T kann 2,4,8,16,32,64,128,5,10,20,25,40,50,100, oder 125 Microschritte pro Vollschritt. Darum kann der Motor 400 800 ecc bis 25000 Schritte pro Umdrehung machen. Die Einstellung findest Du auf Seite 7 von

Dazu kommt noch das Getriebe. Bei einem 1:5 Getriebe braucht es noch 5 mal mehr Schritte pro Umdrehung. Bist Du sicher daß es genau 1:5 sind und nicht etwas nahe dran?

100µS HIGH und 100µS LOW dazu noch das Ansteuern des Ausgangs (digitalWrite()), was auch noch ca 3,5µS sind? das sind dann ca 4831 Impulse pro Sekunde also bei 200 Schritte pro Umdrehung ca 24 Umdrehungen pro Sekunde bei Vollschritt ohne Getriebe. Mit Getriebe ca 4,8 ups also 290 upm. Wenn Du Microschritte verwendest dann dementsprechend weniger.

Grüße Uwe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.