Hallo zusammen, als Hobby-Elektroniker habe ich mir ein neues Bastel-Projekt überlegt. Klingt zwar amüsant, aber ich habe in einer Bar eine elektronische Cocktailbar gesehen, die ich gerne im Kleinformat für meinen Partykeller nachbauen würde. Prinzipiell wird durch eine Pumpe die entsprechende Flüssigkeit angesaugt und mit einem Durchflusssensor das Volumen gemessen. Für einen ersten Test habe ich eine kleine Pumpe, die mir 1,2 Liter pro Minute liefert. Der Durchflusssensor liefert mir ein 5V Rechteckimpuls. Ingesamt liefert er bei einem Liter genau 2500 Impulse. Je nach Volumen kann man das entsprechend runterrechnen. Der Link und das Datenblatt ist hier: http://www.conrad.de/ce/de/product/150391/Durchflussmesser-Flow-Meter-FCH-m-POM-LC-001-35-lmin-BIO-TECH-eK-FCH-m-POM-LC-mit-Duese-1-mm-001-10-lmin Nun muss ich in meinen Programmcode ein kleines Delay für die serielle Verbindung einbauen, die ich später benötigen werde. Nach folgender Rechnung: 1.2l/min * 2500 Impulse = 3000 Impulse/min => 1 Impuls pro 20 ms Um jeden Impuls zu erfassen muss mein Programmcode schneller als 20ms laufen, oder? Eine weitere Frage wäre, was wäre denn wenn mein Arduino nicht synchron arbeitet wie der empfangene Impuls. Ich bin da leicht skeptisch, wie ich das am besten lösen kann. Vielleicht kann mir jemand paar Tipps geben, wie das Problem am besten zu lösen ist. Ich bin über jeden Hinweis dankbar. Vielleicht sind meine Überlegungen auch völlig falsch :D Liebe Grüße Julian
In dem Moment, in dem die die Wörter 'Zeitverzögerung' und 'Delay' in einem Satz gemeinsam in den Mund nimmst, ist bereits allen klar, dass das nichts wird. Delay ist selten die Lösung, oft aber das Problem. Die Lösung deines Problems (wie 90% aller anderer Probleme, in denen eine zeitliche Steuerung notwendig ist) führt über Timer FAQ: Timer Man setzt sich eine ISR auf, die alle 20ms aufgerufen wird. Weiters setzt du einen Zähler (einfach eine Variable) auf den Wert, dessen Vielfaches von 20ms abgezählt werden soll und gleichzeitig wird die Pumpe eingeschaltet. In der ISR wird dieser Zähler um 1 erniedrigt und wenn 0 erreicht wurde, wird in der ISR die Pumpe wieder abgeschaltet. Fazit: Du bist das ganze Timingproblem ein für allemal los und kannst in der Hauptschleife nach Herzenslust fuhrwerken wie du lustig bist. Ist die vorberechnete Zeit abgelaufen, dann stoppt der Timer ganz von alleine und ohne weiteres Zutu in der Hauptschleife die Pumpe. Ganz einfach, wenn man mit seinem µC umgehen gelernt hat. > Vielleicht kann mir jemand paar Tipps geben, wie das Problem am besten zu lösen ist. Wenn du das ernsthaft programmieren willst, dann ohne das Arduino Geraffel. Es bringt dir herzlich wenig, verhindert aber, dass du ordentlich die Programmierung eines µC lernst. Ansonsten musst du dir eben ein Tutorial suchen, wie man auf einem Arduino mit einem Timer in Interrupts arbeitet. Das Prinzip bleibt nach wie vor dasselbe. Ganz abgesehen davon, dass 20ms für einen µC schon eine Dreiviertel-Ewigkeit darstellt, wenn man das vernünftig programmiert und nicht immer gleich an 'Delay' bei Zeitsteuerungen denkt. Wie gesagt: Delay ist selten die Lösung - oft aber das Problem.
:
Bearbeitet durch User
Wozu der Timer mit der 20ms Timer-ISR, wenn er doch per ISR die Impulse direkt zählen kann? Kann dem irgendwie nicht folgen. Pumpe ein, Impulse per Interrupt zählen, Pumpe aus -> fertig. Da brauchts keinen Timer.
Jürgen schrieb: > Wozu der Timer mit der 20ms Timer-ISR, wenn er doch per ISR die Impulse > direkt zählen kann? Kann dem irgendwie nicht folgen. Du hast recht. Ich war jetzt in Gedanken bei der Umkehrung: Er muss eine gewisse Anzahl an Pulsen generieren. Aber du hast recht, der Fall liegt ja gar nicht vor. > Pumpe ein, Impulse per Interrupt zählen, Pumpe aus -> fertig. > Da brauchts keinen Timer. Wo du recht hast, hast du Recht. Danke fürs zurechtrücken.
Karl Heinz schrieb: > Wenn du das ernsthaft programmieren willst, dann ohne das Arduino > Geraffel. Es bringt dir herzlich wenig, verhindert aber, dass du > ordentlich die Programmierung eines µC lernst. Das in Deiner Diktion "Arduino Geraffel" verhindert aber nicht, dass Hobbybastler damit eine Cocktailmaschine bauen und programmieren: http://www.youtube.com/watch?v=hJIkJ9x0-JQ Aber der Typ, der die gebaut hat, wollte wahrscheinlich auch nur eine ordentliche Cocktailmaschine bauen und sein Ziel war es gar nicht "ordentlich die Programmierung eines µC" zu lernen. Weiß man's wirklich so genau?
Jürgen S. schrieb: > Das in Deiner Diktion "Arduino Geraffel" verhindert aber nicht, dass > Hobbybastler damit eine Cocktailmaschine bauen und programmieren: > http://www.youtube.com/watch?v=hJIkJ9x0-JQ Der Unterschied: er konnte das. Und das ist auch nicht vom Himmel gefallen, sondern er musste das Lernen. Du kannst es drehen und wenden wie du willst, ums lernen kommst du nicht herum. Ich kanns auch mit dem Arduino-Geraffel programmieren. Ich kanns aber auch ohne. Und weil ich es auch ohne kann, hab ich eine gewisse Vorstellung davon, wie dieses Arduinio Geraffel eigentlich intern arbeitet. Was mir wiederrum dabei hilft, diese vorgefertigten Dinge vernünftig und effizent einzusetzen, wenn es denn sein muss. Aber eigentlich gibt es oft gar keine Notwendigkeit dafür. Zumindest dann nicht, wenn wir uns auf der Ebene von Portbits setzen, löschen oder Impulse zählen bewegen. Dafür habe ich allerdings die volle Kontrolle und bin nicht darauf angewiesen, mit vorgefertigten Komponenten zu arbeiten, die nicht unbedingt fehlerfrei sind und die undokumentierte Nebenwirkungen in andere Systeme haben. Der prinzipielle Programmaufbau ist sowieso da wie dort derselbe. Ob ich jetzt selber schreibe
1 | int main() |
2 | {
|
3 | alle Initialisierungen |
4 | |
5 | sei(); |
6 | |
7 | while( 1 ) { |
8 | |
9 | Aktionen in der Hauptschleife |
10 | |
11 | }
|
12 | }
|
oder ob mir das Arduino Framework das hier vorgibt
1 | int main() |
2 | {
|
3 | setup(); |
4 | |
5 | while( 1 ) { |
6 | loop(); |
7 | }
|
8 | }
|
und ich die Funktionen setup() bzw. loop() schreibe, ist Jacke wie Hose. Einziger Unterschied: eine klassische Flankenabfrage, wie man sie beispielsweise zum Zählen von Pulsen einsetzen kann ....
1 | alt = Port & Bitnummer; |
2 | |
3 | while( 1 ) { |
4 | |
5 | neu = Port & Bitnummer; |
6 | if( neu != alt && neu ) // steigende Flanke feststellen |
7 | {
|
8 | alt = neu; |
9 | |
10 | mach was bei steigender Flanke |
11 | |
12 | }
|
13 | }
|
ist ungefähr 150 mal so schnell, wie ein digitalRead im Arduino System.
:
Bearbeitet durch User
Karl Heinz schrieb: > Einziger Unterschied: eine klassische Flankenabfrage, wie man sie > beispielsweise zum Zählen von Pulsen einsetzen kann .... > ... > ist ungefähr 150 mal so schnell, wie ein digitalRead im Arduino System. Faktor 150 bei direkter Programmierung vs. digitalRead() ist ein Gerücht, ganz so viel ist es am Ende doch nicht. Im übrigen hindert einen mit der Arduino-Software niemand daran, exakt dieselben Datenrichtichtungsregister, Port- und Pinadressen direkt und schnell zu verwenden, wie Du es auch machst. Die teils langsamen Arduino-Komfortfunktionen wie digitalRead(), digitalWrite() und wie sie alle heißen, sind OPTIONAL. Wer einen einfachen Einstieg finden möchte, kann diese Befehle verwenden. Das mache ich auch gerne, weil ich es bequem finde. Aber man braucht die lahmen Arduino-Komfortbefehle nicht zu verwenden, wenn man nicht möchte. Mit der Arduino Core-Library verhält es sich wie mit jeder anderen Library: Wenn die Befehle in einer Library vorhanden sind, kann man sie benutzen. Aber es zwingt einen niemand, das auch zu tun. Bei einer Cocktailmaschine, die in 30 Sekunden fünf Zutaten zu einem Cocktail mixt, sehe ich jedenfalls nichts, weshalb man dabei auf die "langsamen" Arduino-Komfortfunktionen digitalRead() oder digitalWrite() verzichten müßte, nur um eine Pumpe einige wenige Millionstel Sekunden schneller ein- oder ausschalten zu können.
>Die teils langsamen Arduino-Komfortfunktionen wie digitalRead(), >digitalWrite() und wie sie alle heißen, sind OPTIONAL. Und sind wie bei allen abstrahierenden Frameworks voll beabsichtigt. Ich habe mal ein Progamm von einem Arduino Uno ( Atmega328 ) auf einem Arduino Due ( ARM ) ohne jegliche Änderung verwendet. Nur durch die Abstraktion der Ports und des Framworks ist das möglich. Ich war sogar erstaunt, dass das ohne Problem ging, da ich auch zeitkritische Teile mit delay() verwendet hatte.
Hallo Karl Heinz, beim Durchlesen dieses Threads möchte ich Deine Anmerkungen nicht unkommentiert lassen: 1. Wie jurs bereits anmerkte möchte der Threaderöffner eine Cocktailmaschine bauen. Hiezu benötigt er Hilfe. Er hat sich für die (mittlerweile weltmarktführende) Arduino Plattform entschieden. Aus welchen Gründen auch immer hat er sich dazu entschieden es mit diesem Mikrocontroller zu stemmen. Eine Wertung seiner Wahl steht nicht zur Diskussion. 2. Um eine Automatisierung zu bauen benötigt er eine Steuerung. Egal ob Logo oder S7-417H oder halt Arduino. Die jeweilige IDE ermöglicht dies und erfordert nicht immer Kenntnisse über Fuses oder interne Timer oder andere µC interne Dinge. Ganze Prozessautomatisierungsanlagen werden heutzutage mit dieser Programmiertiefe programmiert. 3. Du bist Moderator dieses Forums. Dies erfordert Kompetenzen über dem technischen Können hinaus. Ein Moderator sollte sich niemals bewertend oder gar abwertend gegenüber einer Technologie, einer Idee oder einer persönlichen Vorliebe eines Fragenden äußern. Ein Moderator soll Hilfestellungen geben und für ein gutes, freundliches Miteinander sorgen. "...ist bereits allen klar, dass das nichts wird." ist eine Aussage, welche eher zum Cyblord passen würde als zu jemandem der hier die o.g. Funktion erfült. Ich möchte Dich ausdrücklich bitten, die Art Deiner Führung dieses Forums zu überdenken. Viele Grüße Jörg
Hier scheint es ja nur noch um das Programmieren zu gehen; vielleicht noch einen Hinweis auf einen (nicht unbedeutenden) Nebeneffekt: ist der Durchflussmesser (gilt auch für eventuelle Schläuche) denn geeignet für Lebensmittel? Lt. Datenblatt für Wasser, Benzin, Heizöl und nicht agressive Flüssigkeiten. Gerade Fruchtsäfte können sehr schnell vergammeln (schimmeln), wenn sie unter Raumtemperaturen stehebleiben und ein Turbinendurchflussmesser hat viele Ecken und Winkel, wo etwas kleben bleiben kann. Eventuell mal über Kühlung und Spülzyklen nachdenken, falls das nicht nur ein Gimmick werden soll.
Jürgen S. schrieb: > Das in Deiner Diktion "Arduino Geraffel" verhindert aber nicht, dass > Hobbybastler damit eine Cocktailmaschine bauen und programmieren: > http://www.youtube.com/watch?v=hJIkJ9x0-JQ Ja Jürgen weißt, also ich will ja gerne ein Space-Shuttle bauen und erhoffe mir hier Hilfe. Von entsprechender Technik, Mechanik, Metallurgie, Luft- und Raumfahrttechnik, Raketentechnik usw. hab ich aber leider keinen Schimmer. Aber schau mal, andere haben das auch geschafft, also bitte wo ist das Problem?. Schau hier: http://www.nasa.gov. Was lernen wir daraus? Es ist völlig egal was andere schon gemacht haben und jedem hier ist völlig klar, dass man sowas mit Arduino machen kann, weil man sowas mit ALLEM machen kann das man irgendwie programmieren kann. Auch mit Lego-Mindstorms oder sonst was. Also warum das offensichtliche nochmal dauernd bestätigen? Genauso offensichtlich ist es, dass der TE niemals eine Cocktailmaschine selber programmieren kann. Nicht mit Arduino und auch sonst mit nichts. Zumindest nicht ohne Cocktail-Shield und Cocktail-Lib mit dem Aufruf cocktail.startMaschine(), für den er allerdings 100 Posts im Forum braucht, weil er die Doku nicht liest. gruß cyblord
:
Bearbeitet durch User
Schade, dass der Cyblord meinen letzten Post nicht las. Dort habe ich in Erwartungshaltung und vorsorglich schonmal die negativen Kommentare des Cyblord fast schon zitiert... Sag' mal Cyblord, ist es Dir eigentlich nicht peinlich dass Deine merkwürdige Art und Weise schon im Vorfeld belächelt wird ? @ Jürgen... einfach nicht hinhöhren... @hk_book: Du scheinst Dich auszukennen, aber eine CIP ist hier wohl nicht möglich ;-) :-))) Dennoch hast Du Recht !!!! Mein Lösungsvorschlag hierzu: Ich empfehle nach jeder Benutzung die Durchspülung mit Correga-Tabs Lösung.
Jörg schrieb: > Schade, dass der Cyblord meinen letzten Post nicht las. Warum soll ich Posts von dir lesen? hast du schonmal was sinnvolles geschrieben? Also. > Dort habe ich in > Erwartungshaltung und vorsorglich schonmal die negativen Kommentare des > Cyblord fast schon zitiert... Ja weil dein Unterbewusstsein dir wohl bereits sagt dass es eben auch SO IST. Außerdem gehst du ja sogar KHB an. Nur weil er sagt wie es ist. Was soll man davon halten? Natürlich muss niemand wertfrei an sowas rangehen. Natürlich kann und soll man hier (auch als mod) seine Meinung schreiben. Ich finde das Arduino-Framework furchtbar. KHB auch, aber er ist nunmal extrem freundlich und diplomatisch darum sagt er dies nicht so deutlich. > Sag' mal Cyblord, ist es Dir eigentlich nicht peinlich dass Deine > merkwürdige Art und Weise schon im Vorfeld belächelt wird ? Belächelt von wem? Von dir und ein paar anderen Spackos? Wen juckt das? Ich weiß dass ich recht habe. Frag in 2 Jahren, der TE wird keine Cocktailmaschine haben und keine programmieren können. Realität halt. > @ Jürgen... einfach nicht hinhöhren... Genau, Augen zu und durch. Bloß keine Kurskorrekturen. Alle doof außer Arduino-Jörg.
:
Bearbeitet durch User
> 1. Wie jurs bereits anmerkte möchte der Threaderöffner eine > Cocktailmaschine bauen. Hiezu benötigt er Hilfe. Er hat sich für die > (mittlerweile weltmarktführende) Arduino Plattform entschieden. Aus > welchen Gründen auch immer hat er sich dazu entschieden es mit diesem > Mikrocontroller zu stemmen. > Eine Wertung seiner Wahl steht nicht zur Diskussion. OK. Dann ganz konkret auf die Anfrage des TO > Um jeden Impuls zu erfassen muss mein Programmcode schneller als > 20ms laufen, oder? Wenn du das so ausgerechnet hast, dann wird es wohl schon stimmen > Eine weitere Frage wäre, was wäre denn wenn mein Arduino nicht > synchron arbeitet wie der empfangene Impuls. Ich bin da leicht > skeptisch, wie ich das am besten lösen kann. > Vielleicht kann mir jemand paar Tipps geben Der Tipp lautet: Dein µC ist viel schneller als du denkst. Nur weil du vom PC mit seinen GHz gewohnt bist, dass alles eine gewisse Zeit dauert, ist das nicht bei allen Computern so. Auf dem PC frisst das Betriebssystem, die grafische Ausgabe, die Netzwerkbehandlung, Sicherheitsmechanismen, Virenscanner, etc. etc. einen nicht unbedeutenden Teil der Rechenleistung auf. Aber all das hast du auf deinem µC nicht. Dein Programm läuft auf der nackten Hardware und die macht rund 15 Millionen Befehle in der Sekunde. Mehr als genug Zeit bei halbwegs vernünftiger Programmierung, so dass du nicht in Zeitnot kommst. Die Betonung liegt auf vernünftig. Man kann natürlich auch so einen µC durch ungeschickte Programmierung mehr als ausbremsen und dann wird das nichts. Das man sein Handwerk, die Programmierung, zumindest so einigermassen beherrschen soll, wenn man so ein Projekt angeht, sollte sich eigentlich von selber verstehen. Sei es wie es sei: 20ms sind für einen mit 16Mhz getakteten AVR eine kleine Ewigkeit, in der er immerhin rund 300-tausend Befehle abarbeiten kann. Wenn du dich da nicht allzu ungeschickt anstellst, dann läufst du nicht Gefahr 'asynchron' mit dem Pumpen Puls zu werden. Aus Sicht des Arduino spielt sich dieser Puls in Zeitlupe ab.
:
Bearbeitet durch User
Also schonmal Danke für die Antworten. Ich denke der Tipp des Timers war ganz passend. Um Interrupts zu benutzen brauche ich beim Arduino entsprechend viele Pins, die sind aber nicht so ausreichend vorhanden, deswegen werde ich vorerst die Idee des Timers probieren. Mal schauen irgendwie bekomme ich das schon hin. Leider ist es auch hier wieder passiert, dass Nutzer einfach nur frech & unverschämt werden. Insbesondere meine ich damit "cyblord". Mir ist es ein Rätsel, warum man solche sinnfreien Antworten auf meine Thread geben muss. Vielleicht kannst du dich im Haushalt, Beruf etc nicht profilieren und musst es hier versuchen, aber ich kann dir sagen, lass es besser. Wenn Hobby-Elektroniker, vlt bisschen untertrieben da ich angehender BSc-Avsolvent in Mechatronik bin, sich in ihrer Frezeit ein Bastel-Projekt überlegen, dann finde ich das völlig adequat hier nach Tipps fragen zu dürfen. Auch ich muss mich Schritt für Schritt in ein Arduino einarbeiten. Deine Einstellung, dass man das eh nicht schafft, sollst du dir besser ganz schnell abgewöhnen, weil bringen tut auch das nichts. Ein Forum ist dafür da um seine Fragen zu stellen und von erfahrenen Leuten Antwort zu bekommen. Vielleicht scheinst du erfahren zu sein, doch deine Aussagen spiegeln genau das Gegenteil wider. Denk mal bitte drüber nach. Zum Thema Arduino: Er mag vlt nicht der beste uC sein, doch er hat bisher meine Ansprüche erfüllt. So habe ich in Kombination mit einem RasPi eine Hausautomatisierung mit Touch-Panel entwickelt, die tadellos funktioniert. Warum sollte man was besseres nehmen, wenn sich altes gut bewährt hat? Alt im Übrigen im Sinne von gebräuchlich, bevor wieder Kontra kommt. Ich hoffe, dass dem ein oder anderen mal klar wird, was es bedeutet im Forum anständig zu kommunizieren. cyblord dir wünsche ich für die Zukunft alles Gute, du packst das schon mit deinen Problemen :) Beste Grüße Julian PS: Thema erledigt.
Julian Utsch schrieb: > Also schonmal Danke für die Antworten. > Ich denke der Tipp des Timers war ganz passend. Um Interrupts zu > benutzen brauche ich beim Arduino entsprechend viele Pins, die sind aber > nicht so ausreichend vorhanden, deswegen werde ich vorerst die Idee des > Timers probieren. Du brauchst auch den Timer nicht
1 | uint8_t alt, neu; |
2 | uint16_t Pulse; |
3 | |
4 | void setup() |
5 | {
|
6 | alt = digitalRead( PumpenPin ); |
7 | }
|
8 | |
9 | void loop() |
10 | {
|
11 | neu = digitalRead( PumpenPin ); |
12 | if( neu != alt && neu == HIGH ) { |
13 | Pulse++; |
14 | alt = neu; |
15 | }
|
16 | |
17 | ....
|
18 | }
|
wie gesagt: wenn du dich im Rest nicht allzu ungeschickt anstellst und nicht sinnlos Zeit verplemperst (im Millisekunden Bereich), dann ist das von der Zeit her kein Problem. Hintergrund: Du kannst auf einem Ardunio nicht einfach so irgendeinen Timer zweckentfremden. Die sind im Arduino System schon eingeplant und haben dort fixe Aufgaben.
:
Bearbeitet durch User
>Leider ist es auch hier wieder passiert, dass Nutzer einfach nur frech & >unverschämt werden. Insbesondere meine ich damit "cyblord". Das ist nich ungewöhnlich hier. Das "cyberlördchen" ist der eingebaute Foren-Troll. Du musst nur "Arduino" sagen, dann kommte er vor und quaked.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.