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 ;)
Kauf dir das Lichtschranken-Shield und lade die zugehörige Lib runter,
dann kannst du in deinem Sketch in der Aruino-Lichtschranken-Language
programmieren.
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 :)
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 ...
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.
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 :(
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.
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
unsignedcharZustandVorher;
2
3
voidsetup()
4
{
5
....
6
7
ZustandVorher=digitalRead(....);
8
}
9
10
voidloop()
11
{
12
unsignedcharZustandJetzt;
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
volatileintImpulse=0;// Variablen, die von Interruptroutinen angefasst werden, sollten "volatile" deklariert werden
5
volatileunsignedlonglastTime=0;// Zeitpunkt der letzten steigenden Flanke, nötig zum Entprellen
6
volatileintUmdrehungen=0;
7
volatilelongZeit_start;
8
volatilelongZeit_stopp;
9
volatilelongZeit_Umdrehung;
10
volatilelongZeit_sek;
11
volatilelongZeit_min;
12
volatilelongDrehzahl;
13
14
15
voidsetup()
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
voidkeyPressed()// state hochzählen, falls mindestens 50ms seit der letzten Flanke vergangen sind
25
{
26
unsignedlongnow=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
voidloop()
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 ?
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 ?
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.