Forum: Mikrocontroller und Digitale Elektronik Geschwindikeitsmessung Arduino


von Paul (Gast)


Lesenswert?

Hallo Leute,

Ich habe vor mittels einer Refelxlichtschranke die 
Drehzahl/Geschwindigkeit eines Computerlüfters zu messen. Das ganze soll 
so funktionieren,dass ich mit 1 Lichtschranke eben durch die den lüfter 
( die Lüfterblätter ) strahle und die Unterbrechungen zähle die durch 
die Lüfterblätter beim drehen verursacht werden.
Das ganze soll mit Hilfe eines Arduino Uno R3 realisiert werden.

Leider habe ich vom Programmieren in dieser Richtung keine Ahnung und 
hoffe hier jemanden zu finden der mir da einfach helfen kann....... Je 
einfacher das Programm desto besser ;)

Der Lüfter hat 9 Lüfterblätter ! Ich denke diese Info braucht man um die 
Negativen / Positiven Flankenauswertung vorzunehmen.



Besten Dank schonmal an die die mir helfen können ;)

von kif (Gast)


Lesenswert?

Kauf dir das Lichtschranken-Shield und lade die zugehörige Lib runter, 
dann kannst du in deinem Sketch in der Aruino-Lichtschranken-Language 
programmieren.

von DrWright (Gast)


Lesenswert?

Warum benutz du nicht den Tacho Ausgang des Lüfters um die Drehzahl zu 
bestimmen?

von Paul (Gast)


Lesenswert?

Ich muss das ganze in einem Projekt ausarbeiten..... dies sollte doch 
etwas mehr arbeit machen wie nur die Drehzahlleitung auszuwerten ;)

Zudem muss ich verschiedene Arten der 
Geschwindigkeitsmessung/Drehzahlmessung aufzeigen. Und das mit der 
Refelxlichtschranke was so das günstigste Anschauungsmaterial :)

von m.n. (Gast)


Lesenswert?

Paul schrieb:
> Ich muss das ganze in einem Projekt ausarbeiten.....

Ohne Dir Alles fertig zu zeigen, aber wenn Du die reziproke Messung 
verstanden hast, kannst Du noch viel ausarbeiten.
http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp7

von Frank (Gast)


Lesenswert?

Um dir eine erste Roadmap zu geben:

- richte ein Pin so ein, dass bei Pegelwechsel ein Zähler inkrementiert 
wird
- richte einen 1s-Timer so ein, dass bei dessen Auslösung Folgendes 
passiert:
  a) Einlesen des Zählerstandes in eine Variable
  b) Rücksetzen des Zählerstandes auf Null
  c) teilen des Variableninhaltes durch die Anzahl der Lüfterflügel
  d) Ausgabe des Zählerstandes auf Display oder UART
- zurück zum Anfang

So solltest du erste Schritte hinbekommen ...

von Frank (Gast)


Lesenswert?

Korrektur:
  d) Ausgabe der Variablen auf Display oder UART

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> Ich muss das ganze in einem Projekt ausarbeiten..... dies sollte doch
> etwas mehr arbeit machen wie nur die Drehzahlleitung auszuwerten ;)

Genau genommen unterscheidet sich die Auswertung der Drehzahlleitung in 
nichts von der Auswertung der UNterbrechungen einer Lichtschranke.

Oder dachtest du, auf der Drahzahlleitung schreibt der Lüfter im 
Klartext die Drehzahl raus? Die Drahzahlleitung ist nicht mehr als 1 
Puls pro Umdrehung.
Wie bestimmt man daraus die Drehzahl?
Was ist überhaupt Drehzahl? Das ist die Anzahl der Umdrehungen pro 
Sekunde. Hat man also ein System, welches 1 (oder mehrere) Pulse in 
jeder Umdrehung erzeugt, wie bestimmt man dann naheligenderweise die 
Drehzahl?
Man könnte zb 1 Sekunde lang mitzählen, wieviele Pulse kommen. Zählt man 
beispielsweise 20 Pulse in dieser 1 Sekunde und weiß man, dass pro 
Umdrehung lediglich 1 Puls kommt, dann hat man also eine Drehzahl von 20 
Umdrehungen pro Sekunde. Das dann in U/min auszudrücken ist nur noch 
eine Umrechnung.

Diese Art der Drehzahlmessung ist eine einfache Möglichkeit. Sie hat 
ihre Begrenzungen und Limitierungen, ist aber leicht verstehbar.

> Leider habe ich vom Programmieren in dieser Richtung keine Ahnung

Dann musst du das ändern.
Ein Programm welches Pulse an einem Eingang zählt, ist jetzt nicht 
gerade Hexenwerk oder Raketentecchnik.

> und hoffe hier jemanden zu finden der mir da einfach helfen
> kann....... Je einfacher das Programm desto besser ;)

Nö.
Es ist dein Projekt. Du kannst gerne nachfragen, wenn du an irgendeinem 
Detail nicht mehr weiter kommst, aber Pulse zählen ist so trivial, dass 
musst du schon alleine können. Jeder der erfolgreich einen Eingang 
abfragen kann, schafft das.

Lass erst mal die Sache mit der 1 Sekunde beiseite und programmier 
einfach nur einen Zähler, der bei jeder Unterbrechung der Lichtschranke 
um 1 weiterzählt. Und dann drehst du den Lüfter mit der Hand langsam 
durch und siehst nach, ob dein Programm funktioniert - der Zähler muss 
hochzählen. Damit gehts los: einfach nur die Unterbrechungen zählen.
Die Sache, das dies nur 1 Sekunde lang passieren soll, kommt später.

: Bearbeitet durch User
von Paul (Gast)


Lesenswert?

also ich hab jetzt schon mal hinbekommen das ich den Ausgang zählen 
kann, bzw die Pulse Zählen kann..... jedoch benötige ich eine Postive / 
Negative Flanke um auch genau 1 hochzuzählen bei einem 
Impulse/Lüfterblatt.

Kann mir jemand Programmtechnisch mit einer Negativen Flanke 
weiterhelfen ?
von der theorie des ganzen Problems hab ichs ja verstanden. Alles kein 
Thema. Der Grund warum ich hier schreibe ist ja die gedanken in eine 
Programmiersprache zu schreiben die ich leider nicht behersche !!!

Und ich habe leider keine Zeit mir die jetzt noch groß beizubringen :(

von m.n. (Gast)


Lesenswert?

Paul schrieb:
> Und ich habe leider keine Zeit mir die jetzt noch groß beizubringen :(

Dass ich Dich oben auf ein fertiges Programm für Arduino verwiesen habe, 
ist Dir wohl entgangen :-(
Dort noch eine Division /9 (Lüfterblätter) einzufügen, dürfte kein 
Problem sein, wenn Du tatsächlich etwas verstanden hättest.

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> also ich hab jetzt schon mal hinbekommen das ich den Ausgang zählen
> kann, bzw die Pulse Zählen kann..... jedoch benötige ich eine Postive /
> Negative Flanke um auch genau 1 hochzuzählen bei einem
> Impulse/Lüfterblatt.

Dann hast du es eben nicht hinbekommen.
So einfach ist das.

> Kann mir jemand Programmtechnisch mit einer Negativen Flanke
> weiterhelfen ?

Was ist denn eine Flanke?
Eine Flanke liegt vor, wenn beim wiederholten Abfragen eines Eingangs 
sich der Pgel geändert hat. Um das feststellen zu können, wirst du dir 
also den Pegel in einer Variable merken müssen, damit du beim nächsten 
Durchlauf durch loop() den Vergleich anstellen kannst.

> von der theorie des ganzen Problems hab ichs ja verstanden.

Das wage ich mal zu bezweifeln.
Du magst eine vage Ahnung haben, aber ob man das 'begreifen' nennen kann 
....

> Alles kein
> Thema. Der Grund warum ich hier schreibe ist ja die gedanken in eine
> Programmiersprache zu schreiben die ich leider nicht behersche !!!

Du kennst keine Variablen?
Du weißt nicht, wie du einen Eingang abfrägst?
Du kennst kein if?

Dann ändere das.

> Und ich habe leider keine Zeit mir die jetzt noch groß beizubringen :(

Dann hast du Pech.
Wer Bildhauerarbeiten machen möchte/muss muss zuerst den Umgang mit 
Hammer un Meissel und alle anderen Techniken beherrschen, die man als 
Amateur-Bildhauer so braucht

1
unsigned char ZustandVorher;
2
3
void setup()
4
{
5
  ....
6
7
  ZustandVorher = digitalRead( .... );
8
}
9
10
void loop()
11
{
12
  unsigned char ZustandJetzt;
13
14
  ZustandJetzt = digitalRead( ... );
15
16
  if( ZustandVorher != ZustandJetzt )    // gab es eine Veränderung?
17
  {
18
                                         // Ja gab es
19
20
    if( ZustandJetzt == LOW )            // was war die Veränderung?
21
                                         // war es ein Wechsel
22
                                         // a) von Low auf High
23
                                         // b) oder von High auf Low
24
    {
25
26
                                         // Es war ein Wechsel von High auf Low
27
                                         // im Volksmund auch eine 'fallende Flanke' genannt
28
      ....
29
    }
30
31
    ZustandVorher = ZustandJetzt;        // den jetzigen Zustand merken, damit
32
                                         // im nächstem Durchlauf durch loop
33
                                         // mit dem dann vorliegenden Zustand
34
                                         // verglichen werden kann
35
  }
36
}

: Bearbeitet durch User
von Paul (Gast)


Lesenswert?

1
const int inputPin = 2;
2
const int outputPin = 13;
3
4
volatile int Impulse=0;                   // Variablen, die von Interruptroutinen angefasst werden, sollten "volatile" deklariert werden
5
volatile unsigned long lastTime=0;      // Zeitpunkt der letzten steigenden Flanke, nötig zum Entprellen
6
volatile int Umdrehungen=0;
7
volatile long Zeit_start;
8
volatile long Zeit_stopp;
9
volatile long Zeit_Umdrehung;
10
volatile long Zeit_sek;
11
volatile long Zeit_min;
12
volatile long Drehzahl;
13
14
15
void setup() 
16
{                
17
  pinMode(outputPin, OUTPUT);
18
  pinMode(inputPin, INPUT); 
19
  Serial.begin(9600); 
20
21
  attachInterrupt(0, keyPressed, RISING);       // 0 ist der Interrupt für Pin 2, bei jeder steigenden Flanke wird keyPressed() aufgerufen
22
}
23
24
void keyPressed()                  // state hochzählen, falls mindestens 50ms seit der letzten Flanke vergangen sind
25
{                   
26
  unsigned long now = millis();
27
  if (now - lastTime > 50)        // entprellen
28
  {          
29
    Impulse++;
30
    Umdrehungen = Impulse / 3;    //Anzahl Lüfterblätter 3
31
    
32
    if (Impulse = 1)
33
       Zeit_start = millis();    //Zeit starten beim ersten Impuls (positive Flanke)
34
    
35
    if (Umdrehungen = 1)         //Wenn 1 Umdrehung
36
       Zeit_stopp = millis();    //Zeit stoppen
37
    
38
    Zeit_Umdrehung = Zeit_start - Zeit_stopp;    //benötigte Zeit für eine Umdrehung in ms
39
   
40
       
41
    Zeit_sek = Zeit_Umdrehung / 1000;          //Umrechnen von ms in s
42
    Zeit_min = Zeit_sek * 60;                  //Umrechnen von s in min
43
    
44
    Drehzahl = 1 / Zeit_min;                   //Drehzahl errechnen
45
   
46
    Serial.println(Drehzahl);
47
  }
48
  lastTime=now;
49
}
50
51
52
void loop()
53
{
54
  
55
}


Das ist das Programm bisher. Die Impulse und Umdrehungen kann ich 
messen. Nun geht es darum das ich das ganze in U/min umrechne. Leider 
gibt er mir bei der Ausgabe am Ende nur " ( -1 ) aus.
Wieso ist das so ?
Stimmt was mit meiner Rechnung nicht ?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Das hier
1
    if (Impulse = 1)
2
...
3
    
4
    if (Umdrehungen = 1)         //Wenn 1 Umdrehung

sind Zuweisungen und keine Vergleiche.
Ein Vergleich auf Gleichheit schreibt sich in C++ als == und nicht als =
1
    if (Impulse == 1)
2
...
3
    
4
    if (Umdrehungen == 1)         //Wenn 1 Umdrehung

von Paul (Gast)


Lesenswert?

ok stimmt !!
Danke das war mal ein Fehler :)


Nur leider Funktioniert das trotzdem nicht so.......
Irgendwie speichert sich die Zeit beim ersten Impuls ab, jedoch bei der 
ersten Umdrehung (sprich 3 Impulse) nicht mehr.

Gibt es einen anderen Weg um die Zeit zwischen dem ersten und dem 
dritten Impuls zu messen ?

von Karl H. (kbuchegg)


Lesenswert?

Paul schrieb:
> ok stimmt !!
> Danke das war mal ein Fehler :)
>
>
> Nur leider Funktioniert das trotzdem nicht so.......
> Irgendwie speichert sich die Zeit beim ersten Impuls ab, jedoch bei der
> ersten Umdrehung (sprich 3 Impulse) nicht mehr.

Logisch.
'Impulse' wird ja auch nie wieder 1 :-)

Aber: Hinweis
Die Endzeit eines Messvorgangs ist automatisch Startzeit des jeweils 
nächsten Messvorgangs.

Hinweis2
Du willst nicht die Drehzahl bei jedem Puls erneut ausrechnen. Denn die 
kann sich sowieso da nicht ändern. Ein Ausrechnen der Drehzahl macht nur 
dann Sinn, wenn du eine neue Endzeit hast.

>
> Gibt es einen anderen Weg um die Zeit zwischen dem ersten und dem
> dritten Impuls zu messen ?

Wie wäre es mit einem korrekten Programm?
So wie du programmierst, kannst du davon ausgehen dass (wenn die 
grundsätzliche Idee stimmt) du Fehler im Programm hast. Die 
grundsätzliche Idee ist schon ok, aber sie ist falsch umgesetzt. Du 
musst dir erst mal klar machen, wie die grundsätzliche Idee eigentlich 
funktioniert - das scheint mir nicht wirklich der Fall zu sein. Dann 
klappt es auch mit der Umsetzung. Einfach was hinzuschreiben, das hat 
gerade bei Neulingen noch nie funktioniert.

Tip
Oft hilft es, wenn man sich erst mal klar macht, wie man selber (als 
Person) die Aufgabenstellung lösen würde.
Also: du hast eine Signal, dass in regelmässigen Abständen kommt und du 
hast eine Armbanduhr. Du weisst ferner, dass immer 3 Signalpulse 
zusammengehören und eine Umdrehung darstellen.
Wie gehst DU vor um daraus die Drehzahl (laufend) zu errechnen?
1
Ereignis     Ablesung von der Uhr (Sekunden)
2
  Puls          3
3
  Puls          5
4
  Puls          7
5
  Puls          10
6
  Puls          12
7
  Puls          15
8
  Puls          19
9
  ...

welche Drehzahlen hast du gemessen.
Wenn DU selbst die Aufgabe lösen kannst, hast du offensichtlich das 
Prinzip verstanden und kannst das auch programmieren, nachdem du dir 
klar gemacht hast, wie du vorgegangen bist.
Dein Hilfsmittel sind Bleistift und Papier, auf dem du dir Werte 
notieren darfst. Du darfst alle Werte von deinem Papier benutzen wann 
immer du sie brauchst, du darfst aber nicht dein Gedächtnis für 
irgendwas benutzen. Das Papier ist dein Gedächtnis. Wenn du dir 
irgendwas für 'später' merken willst, dann musst du es aufschreiben. Du 
musst dir alles in geeigneter Form aufschreiben. Du hast zb. nicht das 
Wissen (weil du ja kein Gedächtnis hast) das jetzt gerade der dritte 
Puls reinkommt. Wenn du diese Information zur Verarbeitung brauchst, 
dann muss es auf deinem Papier irgendwo eine Stelle geben an der die 
jeweilige Pulsnummer steht und die du bei jedem Puls um 1 erhöhst. So 
ist das gemeint mit "du hast kein Gedächtnis".

Also, du bearbeitest jetzt ein Ereignis
1
  Puls          3
was machst du damit? Was notierst du dir?
Dann kommt das nächste Ereignis
1
  Puls          5
was machst du damit? Warum machst du genau das damit?
Als nächstes kommt
1
  Puls          7
wie ist das jetzt? Was machst du damit? Warum?
1
  Puls          10
etc. etc.

Wenn bei deinem Vogehen dann auch die 2.te Drehzahlberechnung das 
korrekte Ergebnis liefert, dann kann man auch davon ausgehen, dass das 
Verfahren insgesammt stimmt. Nur mit dem Erhalt des ersten Ergebnisses 
ist das noch nicht gesichert.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.