http://sites.schaltungen.at/arduino-uno-r4/impulszaehler/drehzahlmesser Wels, am 2019-05-10BITTE 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); } 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
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
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.
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 |
Impulszähler >