Impulszähler‎ > ‎

Drehzahlmesser

http://sites.schaltungen.at/arduino-uno-r4/impulszaehler/drehzahlmesser

http://www.linksammlung.info/

http://www.schaltungen.at/

                                                                                              Wels, am 2019-05-10

BITTE nützen Sie doch rechts OBEN das Suchfeld  [                                                              ] [ Diese Site durchsuchen]

DIN A3 oder DIN A4 quer ausdrucken
*******************************************************************************I**
DIN A4  ausdrucken   (Heftrand 15mm / 5mm)     siehe     http://sites.schaltungen.at/drucker/sites-prenninger
********************************************************I*
~015_b_PrennIng-a_arduino.uno.r4-impulszaehler-drehzahlmesser (xx Seiten)_1a.pdf



Drehzahl mit einem Arduino messen.

#include <LiquidCrystal.h>                    // LCD Library einbinden

LiquidCrystal mylcd(8, 11, 9, 4, 5, 6, 7);    // Display Anschlußpins definieren

const int LCDdimmer = 10;                     // LCD Beleuchtung via Pin 10
const int Eingang = 2;                        // Pin 2 ist Eingang für Sensor

const int AVG = 4;                            // Glättung über mindestens 4 Messwerte

volatile unsigned long dauer=0;               // microsekunden seit dem letzten Interrupt
volatile unsigned long last=0;                // Zählerwert beim letzten Interrupt
volatile unsigned long average=1;             // Integrierte Dauer // =1: divide by 0 vermeiden
volatile int avgcnt=0;                        // Anzahl Messwerte im Puffer

void setup() {
  pinMode(Eingang, INPUT);                    // Eingangspin auf Eingang stellen
  digitalWrite(Eingang, HIGH);                // und Pullup-Widerstand einschalten

  pinMode(LCDdimmer, OUTPUT);                 // Display-Dimmer-Pin auf Ausgang
  analogWrite(10, 200);                       // Helligkeit auf 200

  mylcd.begin(16, 2);                         // Display hat 2 Zeilen a 16 Zeichen
  mylcd.print("Drehzahlmesser");              // Überschrift ausgeben

  attachInterrupt(0, readmicros, RISING );    // Interrupt 0 auf Routine readmillis setzen
}                                             // reagiert auf steigende Flanken an Pin 2

void loop() {                                 // Hauptprogramm
  char buf[17];                               // Pufferstring für sprintf
  unsigned long drehzahl=0;                   // selbstredend
  if (dauer != 0) {
    drehzahl = myround(60000000 / average);   // Drehzahl ausrechnen und runden
  } else {
    drehzahl = 0;                             // keine Messung? -> Stillstand
    avgcnt = 0;                               // entwerten des Average-Puffers
  }
  sprintf(buf, "RPM %5lu       ", drehzahl);  // als 5stellig formatierte Zahl in den Puffer schreiben
  mylcd.setCursor(0, 1);                      // cursor an den Anfang der 2. Zeile (fängt mit 0 an)
  mylcd.print(buf);                           // Puffer ausgeben
  dauer >>= 10;                               // Flag für Stillstand ( : 1024 )
  delay(500);                                 // eine halbe Sekunde schlafen
}                                             // mehr als zwei Werte pro Sekunde kann eh keiner lesen

void readmicros() {                           // Interrupt-Routine
  detachInterrupt(0);                         // Interrupt ausschalten damit er uns nicht beißt
  int avgmax;
  unsigned long us = micros();                // Microsekundenzähler auslesen
  if (last == 0) {                            // erster Messwert? 
    last = us;                                // merken und nicht weiter bearbeiten
  } else {
    if ( us < last ) {                        // Zählerüberlauf
      dauer = 4294967295 - last + us;         // erzeugt einen Fehler von 1µS - vernachlässigbar
    } else {
      dauer = us - last;                      // Differenz zum letzten Durchlauf berechnen
    }
    if (dauer > 5000) {                       // ignorieren wenn <= 5ms (Kontaktpreller)
      average = dauer + average * avgcnt++;   // Wert in buffer und mit Faktor avgcnt glätten
      average /= avgcnt;                      // und zurückrechnen
      avgmax = 1000000 / dauer;               // dynamische Größe des Integrationspuffers
      if (avgmax < AVG) avgmax = AVG;         // Trägheit mindestens 1 Sekunde
      if (avgcnt >= avgmax) avgcnt--;
      last = us;                              // und wieder den letzten Wert merken
    }
  }
  attachInterrupt(0, readmicros, RISING );    // Interrupt wieder einschalten.
}

unsigned long myround(unsigned long value) {  // Gewichtete Rundung
  int rto;
  if (value > 3000) {                         // Rundungswert bestimmen 
    rto = 100;
  } else if (value > 1500) {
    rto = 50;
  } else if (value > 500) {
    rto = 10;
  } else if (value > 100) {
    rto = 5;
  } else {
    return (value);
  }
  return (_myround(value, rto));
}

unsigned long _myround(unsigned long value, int roundto) {
  value += (roundto >> 1);                    // halben roundto Wert addieren
  value /= roundto;                           // integer division 
  value *= roundto;                           // integer multiplikation
  return (value);
}

     1  #include <LiquidCrystal.h>                    // LCD Library einbinden     2  LiquidCrystal mylcd(8, 9, 4, 5, 6, 7);        // Display Anschlußpins definieren     3  const int LCDdimmer = 10;                     // LCD Beleuchtung via Pin 10     4  const int Eingang = 2;                        // Pin 2 ist Eingang für Sensor     5  void setup() {     6    pinMode(Eingang, INPUT);                    // Eingangspin auf Eingang stellen     7    digitalWrite(Eingang, HIGH);                // und Pullup-Widerstand einschalten     8     9    pinMode(LCDdimmer, OUTPUT);                 // Display-Dimmer-Pin auf Ausgang    10    analogWrite(10, 200);                       // Helligkeit auf 200 (via PWM)    11    12    mylcd.begin(16, 2);                         // Display hat 2 Zeilen a 16 Zeichen    13    mylcd.print("Drehzahlmesser");              // Überschrift ausgeben    14    15    attachInterrupt(0, readmicros, RISING );    // Interrupt 0 auf Routine readmillis setzen    16                                                // reagiert auf steigende Flanken an Pin 2    17  }    18                                                // ein paar variablen definieren    19  volatile unsigned long dauer=0;               // microsekunden seit dem letzten Interrupt    20  volatile unsigned long last=0;                // Zählerwert beim letzten Interrup    21  long drehzahl;                                // selbstredend    22  char buf[17];                                 // Pufferstring für sprintf    23  void loop() {                                 // Hauptprogramm    24    drehzahl = 60000000 / dauer;                // Drehzahl ausrechnen und    25    sprintf(buf, "RPM %4lu   ", drehzahl);      // als 4stellig formatierte Zahl in den Puffer schreiben    26    mylcd.setCursor(0, 1);                      // cursor an den Anfang der 2. Zeile (fängt mit 0 an)    27    mylcd.print(buf);                           // Puffer ausgeben    28  }    29  void readmicros() {                           // Interrupt-Routine    30    detachInterrupt(0);                         // Interrupt ausschalten damit er uns nicht beißt    31    unsigned long m = micros();                 // Microsekundenzähler auslesen    32    unsigned long v = m - last;                 // Differenz zum letzten Durchlauf berechnen    33    if (v > 5000) {                             // ignorieren wenn <= 5ms (Kontaktpreller)    34      dauer = v;                                // Wert in dauer übernehmen    35      last = m;                                 // und wieder den letzten Wert merken    36    }    37    attachInterrupt(0, readmicros, RISING );    // Interrupt wieder einschalten.    38  }


https://github.com/StefanGerlach/Arduino-Drehzahlmesser
http://www.rc-network.de/forum/showthread.php/678771-Brushless-Drehzahlmesser-auf-Arduino-Basis-zum-Nachbauen
https://arduino-projekte.webnode.at/meine-projekte/drehzahlregelung-mit-arduino-uno-und-attiny45/drehzahlmessung/
https://arduino-projekte.info/drehzahlmesser/

https://forum.zerspanungsbude.net/viewtopic.php?t=1601

Arduino-Drehzahlmessung

Die Idee bei dieser Art der Drehzahlmessung ist, dass z.B. ein Lüfter (Ventilator) mit seinen Rotorblättern einen Lichtstrahl durch Rotation immer wieder unterbricht. Dies geschieht umso häufiger, je schneller sich der Lüfter dreht. Diesen Umstand machen wir uns im folgenden Aufbau zunutze, denn wir bauen eine Lichtschranke, die jede Unterbrechung zählt und dann in regelmäßigen Zeitabständen die Anzahl der Umdrehungen ausrechnet.


Arduino UNO oder kompatible
LED(hier: weiß 5mm)
1kΩ Widerstand
10kΩ Widerstand
Fotowiderstand (LDR) der GL55xx-Serie
9V Batterie + Batterie-Clip
PC-Lüfter (o.ä.)
Steckkabel ("Jumperkabel")
Steckbrett ("Breadboard")

Sketch
#define PIN_LED 9#define PIN_LED_DETECTOR A0// [0..1023] = [dark..bright]const unsigned int SENSOR_SENSITIVITY  = 500;// e.g. number of blades in a fanconst byte INTERUPTIONS_PER_REVOLUTION = 7;// in msconst unsigned long CALCULATE_INVERVAL = 2500;bool sensorStatus = false;unsigned int brightness = 0, rpm = 0;unsigned long interruptions, revolutions = 0, lastCalculateTime;void setup(){    Serial.begin(9600);    lastCalculateTime = millis();    pinMode(PIN_LED, OUTPUT);    digitalWrite(PIN_LED, HIGH);}void loop(){    if (millis() - lastCalculateTime > CALCULATE_INVERVAL) {        revolutions = interruptions / INTERUPTIONS_PER_REVOLUTION;        rpm = revolutions / (CALCULATE_INVERVAL / 1000) * 60;        revolutions = 0;        interruptions = 0;        lastCalculateTime = millis();        // show sensor brightness        Serial.print("B = " + (String)+brightness);        // show amount of interruptions of the sensor        Serial.print("; I = " + (String)interruptions);        // show amount of revolutions        Serial.print("; R = " + (String)revolutions);        // show rpm = "revolutions per minute"        Serial.println("; " + String(rpm) + " RPM");    }    brightness = analogRead(PIN_LED_DETECTOR);    if (sensorStatus == false && brightness >= SENSOR_SENSITIVITY) {        interruptions++;        sensorStatus = true;    }    if (sensorStatus == true && brightness < SENSOR_SENSITIVITY) {        sensorStatus = false;    }}



Statt der weißen LED könnte man eine Laser-Diode, z.B. auf dem fertig montierten Modul KY-008 verwenden:



Statt des Fotowiderstands könnte man eine Fotodiode oder sogar eine reguläre LED verwenden.
http://elektro.turanis.de/html/prj095/index.html






6.3 Drehzahlmesser
Wir messen die Drehzahl des Elektromotors mit einem Infrarot-Sensor.


Zum Beginn des Projekts löten wir erst einmal vier neue Stifte an den Pins 3, 4, 6, und 7 auf das Shield.
Für die neuen Stifte nehmen Sie am besten eine fünfpolige Stiftleiste und ziehen den mittleren, nicht benötigten Stift mit einer Zange heraus.

fehlt !
Bild 63. Aufsicht des Shields mit den vier neuen Stiften (unten).

Als Elektromotor verwenden wir wieder den Lego 71427 aus dem letzten Projekt (Sie können aber auch jeden anderen Kleinmotor einsetzen).
Beim Lego-Motor können wir aber die Bauteile von Lego Technik für den Aufbau gebrauchen.
Zunächst müssen wir für ein Feedback-Signal sorgen, damit der Arduino immer erkennen kann, wie schnell der Motor dreht.

Auf ein Lego-Rad wird ein Stück Papier geklebt, das in vier Segmente unterteilt ist, zwei schwarze und zwei weiße.
Damit haben wir schon eine Impulsscheibe.

fehlt!
Bild 64. Impulsscheibe.


Als Sensor haben wir eine Infrarot-Reflexlichtschranke QRB1134 von Fairchild gewählt.
Dieser Sensor verfügt über ein spezielles Taglichtfilter und hat deshalb wenige Probleme mit "falschem" Licht, das nicht von der eingebauten Infrarot-LED des Sensors, sondern aus einer Störquelle (Lampe, Sonne) stammt.
Der Sensor misst das Licht, das von der Impulsscheibe reflektiert wird.
Da die weiße Fläche auf der Scheibe mehr Licht reflektiert als die schwarze, kann der Arduino aus der Aufeinanderfolge der Reflexionen die Drehzahl errechnen.



Infrarot-Reflexlichtschranke QRB1134 von Fairchild

Bild 65. Anschluss des QRB1134 an Pin-3 des ARDUINO UNO R3


Der Sensor muss in einem Abstand von ungefähr 2...4 mm zur Impulsscheibe montiert werden. Wenn der Sensor dichter an der Scheibe ist, kann er das reflektierte IR-Licht nicht sehen, ist er weiter entfernt, wird der Unterschied zwischen weiß und schwarz zu gering. Der Sensor hat ungefähr 2 Drittel der Höhe eines Legosteins und sitzt recht fest. Wenn das Projekt aufgebaut ist, kann man durch Hin- und Herschieben des Sensors die beste Position finden und ihn dann festkleben. Über das Zahnrad lassen sich diverse Vorrichtungen wie ein Rad eines Roboters antreiben.




LEGO Fehlt
Bild 66. Sensoreinbau mit Legosteinen.

Nun wollen wir messen, wie lange es dauert, bis der Sensor eine Farbveränderung erkennt.
Zunächst warten wir auf das Signal, dass der Sensor Low wird.
Es ist gut möglich, dass sich der Motor überhaupt nicht dreht (und auf schwarz steht), dann kommt dieser Augenblick niemals.
Damit der Sketch nicht hängen bleibt, wird ein Time out gebraucht

.
timeout=false;
startT=millis();
while (digitalRead(sensor)==HIGH and timeout==false){
delay(10);
if ((millis()-startT)>1000){
timeout=true;
}
}

Wenn der Sketch länger als eine Sekunde warten muss, erfolgt das Time out und der Sketch macht mit den nächsten Befehlen weiter.
Dort geschieht das gleiche mit einer Time out-Konstruktion, allerdings wartet der Arduino, dass das Signal High wird.
Erfolgt kein Time out, so müssen wir nur noch die Drehzahl ausrechnen.

Wir verwenden eine Impulsscheibe mit vier Sektionen. Also müssen wir die Zeit einer Sektion mit vier multiplizieren, dann wissen wir, wie lange eine Umdrehung dauert.
Das Resultat in Millisekunden wird in Umdrehungen/min umgerechnet.
Wenn 60000,0 (1 min) mit vier multipliziert wird, müssen wir mit Float-Variablen rechnen!
Das ist für einen Spielzeugmotor und einer mit Filzstift gemalten Impulsscheibe eigentlich übertrieben.

Nach einem Time out geht der Sketch davon aus, dass der Motor still steht.
Dies geschieht auch, wenn endT gleich Null ist.
Theoretisch ist das nicht möglich, weil dann der Motor eine unendlich hohe Drehzahl hätte.
Praktisch schon, denn es kann sein, dass der Sensor nicht gut befestigt ist.

// berechnen der Drehzahl
endT=millis()-startT;
if (timeout==true or endT==0){
rpm=0;
}
eise{
rpm=60000.0/(4*endT);
}



Während des Zählens blinkt die LED und zeigt an, dass der Infrarot-Sensor die schwarzen und weißen Flächen gut erkennt.
Geschieht dies nicht, so können Sie den Sensor etwas näher oder weiter weg schieben.

Der gesamte Sketch sieht so aus:

int motorl = 10;
int motor2 = 13;
int pot = A0;
int sensor = 3;
int led = 5;
int value;
unsigned long startT, endT, timeout;
float rpm;
void setup() {
pinMode(motorl, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(led, OUTPUT);
pinMode(sensor, INPUT);
TCCR1B = TCCR1B & B11111000 I B00000001;
Serial.begin(9600);
}
void loop(){
// Drehzahl einstellen
value = map(analogRead(pot), 0, 1023, 0, 255);
analogWrite(motor1,value);
digitalWrite(motor2, LOW);
// ein Segment messen
timeout=false;
startT=millis();
while (digitalRead(sensor)==HIGH and timeout==false){
delay(10);
if ((millis()-startT)>1000){
timeout=true;
}
}
timeout=false;


startT=millis();
digitalWrite(led, HIGH);
while (digitalRead(sensor)==LOW and timeout==false){
delay(10);
if ((millis()-startT)>1000) {
timeout=true;
}
}
// Drehzahl berechnen
endT=millis()-startT;
if (timeout==true or endT==O){
rpm=0;
}
else{
rpm=60000.0/(4*endT);
}
digitalWrite(led, LOW);
// Daten zeigen
Serial.write(27);
Serial.print("[7;8H");
Serial.print("Motor speed: ");
Serial.print(rpm);
Serial.print(" rpm    ");
Serial.write(27);
Serial.print("[9;8H");
Serial.print("PWM setting: ");
Serial.print(100*value/255);
Serial.print(" %    ");
}


Im nächsten Bild sehen Sie den vollständigen Aufbau.
Das Steckboard haben wir lediglich eingesetzt, um Motor und Spannungsversorgung mit dem Shield verbinden zu können, wenn zu wenig Buchse-Buchse-Jumperkabel vorhanden sind.
Die Kabel, die links aus dem Bild ragen, führen zur externen 9V Versorgung.
Neben dem Fairchild QRB1134 "infrared photo reflector" müssen Sie auch den Motor anschließen, wie im vorherigen Projekt beschrieben (an M1, M2, Vdd und GND, siehe Bild 63).


BreadBoard  fehlt
Bild 67. Der vollständige Aufbau


https://github.com/rishadfb/arduino-linefollow





Infrarot IR Line Tracker Reflexlichtschranke 2-30cm LM393 f Arduino

Sendediode ist eine allerwelts-IR-LED CQY99, Empfänger ein TSSP4P38 von Vishay.
Hindernisdetektor, IR-Annäherungssensor zur optischen Hinderniserkennung mit digitalem Ausgang für z.B. Arduino,


Impulsscheibe

http://de.rs-online.com/web/p/reflexions-lichtschranke/0414197/
Arduino Lektion 43: Lichtschranke KY-010




6.4 Tempomat (konstante Drehzahl mit Regelschleife)
fehlt

6.5 Infrarot-Überwachung von Objekten
In diesem Projekt wird ein Infrarot-Detektor GP2Y0D340K von Sharp verwendet, um Objekte zu überwachen.


Infrarot-Detektor GP2Y0D340K von Sharp




Bild 69. Die Schaltung des Infrarot-Sensors laut Datenblatt.



6,6 Ultraschall-Sensor (rage finder)



Bild 71. Ultrasonic Range Finder SRF05


6.7 Neigungs- oder Bewegungssensor
In dem Projekt wird ein Neigungssensor von Sharp, der GP1S036HEZ an den Arduino angeschlossen, um zu überprüfen, ob das Steckboard schief gehalten wird.
Solche Sensoren findet man in Tablets zur Bestimmung der Lage des Computers.

Im Neigungssensor (engl. tilt sensor) GP1S036HEZ befindet sich eine kleine Kugel zwischen einer LED auf der einen und zwei lichtempfindlichen Sensoren auf der anderen Seite.

Wenn der Sensor gekippt wird, bewegt sich die Kugel und blockiert das Licht, das von der LED auf einen oder mehrere Sensoren strahlt.
Darum bezeichnet Sharp diesen Sensor als Photointerrupter for Detecting Tilt Direction.
Der Sensor lässt sich auch als Erschütterungssensor für alle Arten von heftigen Erschütterungen einsetzen.
So kann etwa in einem Fahrrad-Rücklicht kontrolliert werden, ob sich das Fahrrad bewegt und das Rücklicht deshalb leuchten muss.



SHARP tilt sensor GP1S036HEZ
Ansicht von unten

Nicht spezifizierte Toleranz: ± 0,2 mm
Die mit * gekennzeichneten Maße beziehen sich auf die von der Bleibasis gemessenen.
Grat ist nicht in den Maßen enthalten. Gratabmessungen: max. 0,15
Bild 76. Datenblatt des Neigungssensors




Die Anschlussbelegung ist offensichtlich, außer dass Sharp im Datenblatt von der Draufsicht (von oben) spricht, aber die Ansicht von unten meint.
Achten Sie deshalb gut darauf, welche Anschlüsse Sie wo festlöten!

Achten Sie auch darauf, dass der Sensor beim Löten nicht zu heiß wird, sonst schmilzt die Kugel und der Sensor ist zerstört.
Der Sketch ist einfach, da es sich um einen statischen Sensor handelt.
Sie müssen lediglich den richtigen Anschluss beachten und den Status des Sensors durch die beiden LEDs anzeigen.


Wir verbinden die Anschlüsse softwaremäßig mit dem Arduino:

const int led1 = 2;
const int led2 = 5;
const int sensl = 3;
const int sens2 = 4;


void setup() {
pinMode(2, OUTPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, OUTPUT);
}


void loop() {
digitalWrite(led1, digitalRead(sens1));
digitalWrite(led2, digitalRead(sens2));
delay(100);
}



Der maximale Strom durch den Sensor beträgt laut Datenblatt 50 mA bei 6 Volt.
Im Sensor befindet sich die LED mit einem Spannungsabfall von typisch 0,7 Volt.

Der Vorwiderstand wäre dann:

            6 - 0,7
R  =  -------------- = 53  Ohm     [Formel 36]
             0,1

Für den Arduino sind 50 mA zu viel, wir verwenden einen Vorwiderstand von 330 Ohm der den Strom auf 13 mA begrenzt.
Der Sensor arbeitet bei diesem Strom auch perfekt.
Der Kollektorstrom des Ausgangs darf maximal 20 mA betragen.
Nehmen wir für den Fototransistor einen Spannungsabfall von 0,7 Volt an, dann kommt man auf einen Widerstand von mindestens 215 Ohm.
Wir wählen 1k Ohm, was einem maximalen Strom von 4,3mA entspricht.

Da wir den Fototransistor als Schalter gebrauchen wollen, legen wir ihn noch mit einem Pull-down-Widerstand von 10k Ohm auf Masse.

Bild 77. Schaltung mit dem Neigungssensor   SHARP GP1S036HEZ


Die Widerstände haben folgende Farbcodes:

330    Ohm    orange-orange-braun
1 k     Ohm    braun-schwarz-rot
10 k   Ohm     braun-schwarz-orange


Auf dem Steckboard sieht der Aufbau so aus:


Der Neigungssensor kann vier Richtungen detektieren. Die verschiedenen Neigungen werden durch die beiden LEDs in folgender Weise angezeigt:

Sensorposition                                                                    rechte LED    linke LED
Halten Sie den Sensor mit den Anschlüssen nach unten und    0                    0
drehen Sie ihn rechts herum mit den Anschlüssen nach links,  0                    1
dann noch einmal rechts herum (Anschlüsse nach oben) und   1                    1
schließlich noch einmal (Anschlüsse nach rechts).                  1                    0


Tabelle 29. Die LEDs zeigen die Sensorneigung.


Neben den Neigungen zur Positionsbestimmung kann der Sensor auch Beschleunigungen detektieren. Die Kugel wird an eine der beiden Seiten gedrängt.


Beschleunigung    linke LED    rechte LED
nach rechts            1                  0
nach links               0                 1


Tabelle 30. Beschleunigung nach rechts und links.




Quelle:
BUCH: Arduino entdecken Seite 112










DIN A4  ausdrucken
********************************************************I*
Impressum: Fritz Prenninger, Haidestr. 11A, A-4600 Wels, Ober-Österreich, mailto:[email protected]
ENDE