MovingAverage Bibliothek für Arduino oder Verdrahtung von Sofian Audry Inspiriert durch Code von Karsten Kutza Eine Speicher-effiziente exponentiell gleitende durchschnittliche Bibliothek. Ein gleitender Durchschnitt ist ein einfacher Weg, ein Signal zu glätten. Durch Einstellen eines Parameters, der als Gewichtungskoeffizient bezeichnet wird, ist es möglich, den Glättungsgrad zu steuern, wodurch das Signal mehr oder weniger reaktiv gegenüber Änderungen ist. Ähnliche und alternative Bibliotheken: Microsmooth Eine leichte und schnelle Signalglättungsbibliothek für Arduino. Bietet viele Arten von Glättung Algorithmus durch eine Funktions-basierte API. Arduino-Signalfilterbibliothek Bietet ein Framework und Klassen für verschiedene Arten von Tiefpassfilter und Medianfilter. RunningAverage Eine Bibliothek zum Berechnen eines einfachen gleitenden Durchschnitts (SMA) über einem Zeitfenster. RunningMedian Eine Bibliothek für die Berechnung der laufenden Median über ein Zeitfenster. Kopieren Sie den Ordner MovingAverage in den Ordner Arduino-Bibliotheken. Include the library Erstellen einer Instanz Eine MovingAverage-Instanz kann auf verschiedene Arten erstellt werden. Ein gleitender Durchschnitt arbeitet mit einem Gewichtungsabnahmekoeffizienten (), einem Wert zwischen 0 und 1, der verwendet wird, um den aktuellen Wert mit der Spur aller vorhergehenden Werte zu mischen. Eine höhere Rabatte ältere Beobachtungen schneller. So erstellen Sie eine Instanz mit Voreinstellung (0.1): So erstellen Sie eine Instanz mit einem bestimmten Wert (hier 0.01): Es ist auch möglich, eine Fenstergröße N anzugeben, anstatt ein Argument gt 1 als erster Parameter des Konstruktors zu senden. In diesem Fall wird der Koeffizient angenähert, um die Fenstergröße unter Verwendung der Formel 2 / (N1) anzupassen. Dies ist natürlich nicht genau, sondern eher wie eine Faustregel für die Einstellung. Um beispielsweise eine Instanz zu erzeugen, die dem gleitenden Mittelwert über eine Fenstergröße von annähernd 100 Abtastwerten entspricht: Der zweite Parameter erlaubt es, den Anfangswert des gleitenden Mittelwertes einzustellen (Standardwert ist 0). Es wird jedoch empfohlen, es mit dem Reset (Wert) zu initialisieren, indem ein für die Verteilung repräsentativer neutraler Wert verwendet wird, wie z. B. eine einzelne Probe. Aktualisiert den gleitenden Durchschnitt mit neuem Wert. Die Funktion gibt auch den aktuellen Wert (optional) zurück: Dies ist eine Sammlung von Routinen zur mathematischen Analyse von Arrays von Zahlen. Aktuelle Funktionsunterstützung: Alle Funktionen werden vollständig überlastet, um die folgenden Datentypen zu unterstützen: Mit Ausnahme von stddev () geben sie alle denselben Datentyp wie das Array zurück. Ein Array von int-Werten gibt ein einzelnes int zurück. Stddev () gibt immer einen float zurück. Alle Funktionen außer rollingAverage () nehmen zwei Argumente. Das erste ist das Array zu bearbeiten. Die zweite ist die Anzahl der Einträge im Array. RollingAverage () nimmt ein drittes Argument - den neuen Eintrag, der dem Array hinzugefügt werden soll. Rolling average Format: average rollingAverage (historyarray, slicecount, value) Fügt dem Array Historyarray einen Wert hinzu, der alle Werte um eine Stelle verschiebt. Der mittlere Mittelwert wird dann zurückgegeben. Mittleres Mittel (array, slicecount) Berechnet den mittleren Mittelwert der Werte im Array. Slicecount ist die Anzahl der Einträge im Array. Modus-Format: durchschnittlicher Modus (array, slicecount) Findet die häufigste Zahl im Array. Maximales Format: max maximum (array, slicecount) Sucht den größten Wert im Array. Minimum Format: min minimum (array, slicecount) Sucht den kleinsten Wert im Array. Standardabweichung Format: Abweichung stddev (array, slicecount) Die Standardabweichung ist die Quadratwurzel des Mittelwertes der Summe der Quadrate der Differenz zwischen jedem Datenpunkt und dem mittleren Mittelwert des Arrays. Dies ist die einzige Funktion, die nicht denselben Datentyp wie das Array zurückgibt. Die Standardabweichung wird immer als Float zurückgegeben. Beispiel: Share Ich arbeite an einem mobilen Roboter, der über einen drahtlosen 2,4 GHz Link gesteuert wird. Der Empfänger ist mit dem Arduino Uno verbunden, der als Hauptregler an Bord dient. Der kritischste (und Haupt-) Eingangskanal des Empfängers erzeugt ein sehr verrauschtes Signal, was zu vielen kleinen Änderungen am Ausgang der Aktoren führt, obwohl diese nicht benötigt werden. Ich suche Bibliotheken, die effiziente Glättung durchführen können. Gibt es ein Signal Glättung Bibliotheken zur Verfügung für die Arduino (Uno) Ich glaube, ich sehe eine Menge von Single-Probe Rauschspitzen in Ihrem lauten Signal. Der Medianfilter ist besser bei der Beseitigung von Einzelprobenrauschspitzen als bei jedem linearen Filter. (Es ist besser als jedes Tiefpaßfilter, gleitender Durchschnitt, gewichteter gleitender Durchschnitt usw. in Bezug auf seine Ansprechzeit und seine Fähigkeit, solche Einzelproben-Rauschspitzen-Ausreißer zu ignorieren). Es gibt in der Tat viele Signalglättungsbibliotheken für das Arduino, von denen viele einen Medianfilter enthalten. Signalglättungsbibliotheken bei arduino. cc: Signalglättungsbibliotheken bei github: Würde so etwas in Deinem Roboter funktionieren (Der Median-of-3 erfordert sehr wenig CPU-Leistung und damit schnell): Du könntest diese digital mit einem Tief filtern Filter: Ändern Sie die 0,99, um die Grenzfrequenz zu ändern (näher an 1,0 ist die niedrigere Frequenz). Der tatsächliche Ausdruck für diesen Wert ist exp (-2pif / fs) wobei f die Grenzfrequenz ist, die gewünscht wird und fs die Frequenz ist, an der die Daten abgetastet werden. Ein anderer Typ eines digitalen Filters ist ein Ereignisfilter. Es funktioniert gut auf Daten, die Ausreißer, z. B. 9,9,8,10,9,25,9. Ein Ereignisfilter gibt den häufigsten Wert zurück. Statistisch ist dies der Modus. Statistische Mittelwerte wie Mean, Mode etc. können mit Hilfe der Arduino Average Library berechnet werden. Ein Beispiel aus der Arduino Library-Seite: Double Exponential Moving Average Filter 8211 Beschleunigung der EMA Manchmal haben Sie ein verrauschtes Signal, das Sie zu einem weniger verrauschten Signal tiefpassieren möchten. Der exponentielle Moving Average Filter (EMA) ist ein schöner und einfacher Filter für das eingebettete System. Lesen Sie hier mehr über den EMA-Filter. Allerdings kann manchmal die EMA zu langsam sein. Der Kompromiss zwischen Geräuschunterdrückung und Geschwindigkeit könnte einfach nicht gut genug sein. Entweder bewegt sich das gefilterte Signal nicht schnell genug oder das Signal ist zu laut. Dies ist kein sehr gutes Vergleichsbild zwischen EMA und DEMA. Wir wollten nur ein cooles Bild hier. Lesen Sie weiter unten für einen richtigen Vergleich DEMA 8230die DEMA wird unterbelegt, während die EMA überbeansprucht wird. Eine Lösung hierfür könnte der Double Exponential Moving Average (DEMA) Filter sein. Bei einer gegebenen der DEMA hat schnellere Reaktion als die EMA, während immer noch die Aufrechterhaltung der gleichen Rauschunterdrückung. Ein möglicher Nachteil beim DEMA-Filter besteht darin, dass Sie ein Überschwingen erhalten. Mit anderen Worten, die DEMA wird unterdrückt, während die EMA überbeansprucht wird. Schauen Sie sich diesen Beitrag an, um herauszufinden, was wir damit meinen. Algorithmus Der Algorithmus ist ziemlich direkt: Die heikelste Sache hier ist das letzte Wort, wo Sie die EMA der EMA. Um dies zu erreichen, müssen wir zwei globale Variablen anstelle von einem haben. Implementierung Hierbei handelt es sich um eine schnelle Implementierung des DEMA-Filters auf Arduino. Beachten Sie, dass wir zwei globale Variablen für die Filterung anstelle von eins verwenden. Le Graph Blaue Linie: ursprüngliches Signal, orange Linie: reguläre EMA, rote Linie: DEMA. Wie Sie hier sehen können, gelingt es der DEMA, dem Originalsignal besser ohne Lärm zu folgen. Beachten Sie auch das Überschwingen bei der Sprungantwort. Das Kapitel an der Unterseite Die DEMA wurde im Seesaw-Projekt mit positiven Ergebnissen nach dem Schreiben des letzten Blogposts getestet. Dies ist ein Szenario, in dem wir die hohe Geschwindigkeit benötigen, die die DEMA bereitstellen kann. Es gibt auch etwas, das als Triple Exponential Moving Average (TEMA) bezeichnet wird. Dieser Filter verwendet die gleichen Prinzipien wie DEMA, aber nehmen sie noch weiter. Verwandte ArtikelTutorial: Potentiometer mit Arduino und Filtering In diesem Blogpost werden wir durchlaufen, was ein Potentiometer ist und wie sie funktionieren, wie man es mit einem Arduino verbinden sowie ein allgemeines Problem in Bezug auf Potentiometer Nutzung und ein Workaround zu diesem Problem zu beschreiben . Was ist ein Potentiometer Ein Potentiometer, das im folgenden als Pot bezeichnet wird. Ist ein variabler Widerstand. Es ist ein elektrisches Bauteil mit drei Anschlüssen (d. h. Stiften oder Schenkeln): eines für Eingangsspannung (z. B. 5 V), eines für Ausgangsspannung (z. B. GND) und eines für das Aufnehmen des Potentiometers (wir nennen dies den Wischer). Mechanisch gesprochen, Töpfe sind physikalisch angepasst in der Regel mit den Fingern. Sowohl rotative als auch lineare Töpfe sind üblich. Eine rotierende und eine lineare Topf (Quelle: Wikipedia) Töpfe werden viel in allen Arten von Elektrogeräten verwendet. Lautstärkeregler, Lichtdimmer und Fader in Audiomischern sind oft Töpfe. Sie kommen auch in digitale und sogar motorisierte Versionen, aber diese sind außerhalb des Geltungsbereichs dieser Post. Wenn Sie die Geschwindigkeit Ihres Elektromotors, die Position Ihres Servos, die LED-Helligkeit, die Filterabschaltung Ihres Synthesizers, die Verstärkung Ihres Gitarrenverstärkers oder Tausende von anderen coolen Sachen in Ihrem eigenen eingebetteten System steuern möchten, könnte ein Topf die Lösung sein Für Sie. The Theory Für eine Einführung in die elektrische Theorie, werfen Sie einen Blick auf diesen Beitrag schrieben wir eine Weile zurück, wo wir Grundlagen wie Spannung, Widerstand und Strom sowie die Beziehung zwischen diesen erklären. Also, what8217s passiert in einem Kreislauf mit einem Topf ist grundsätzlich Spannungsteilung in der Praxis. R1 und R2 sind im Pot selbst. (Quelle: Wikipedia) In den Schemata oben sind die Widerstände R 1 und R 2 Teil des Potentiometers selbst. R L ist der Widerstand der Last (ein Motor, eine LED oder was auch immer). Wenn Sie den Pot drehen oder schieben, ändern Sie die Werte von R 1 und R 2. Wenn man den Topf auf eine Weise bewegt, wird R 1 reduziert und R 2 erhöht. und umgekehrt. Dies führt zu verschiedenen Spannungswerten am Wischer (der in den Schemata oben zu R L geht). Der Spannungswert selbst kann unter Verwendung der folgenden Gleichung berechnet werden: wobei V L die Spannungsdifferenz zwischen dem Wischer und dem Ausgangsstift ist und V S die Spannungsdifferenz zwischen dem Eingangs - und dem Ausgangsstift ist. Um dies zu vereinfachen: Wenn der Ausgangsstift mit GND verbunden ist, kann man einfach sagen, dass VL die Spannung am Wischer ist und VS die Spannung am Eingangspin ist (und dann einfach die 8220-Spannungsdifferenz ignorieren8221 Mumbo Jumbo seit GND definiert ist Als 0V). Der Topf und die Arduino 8211 ein Beispiel Genug mit der Theorie, let8217s Dinge und läuft mit einem Beispiel Die Hardware Im folgenden Beispiel verwendet wir8217ve eine kleine 10K Plastiktopf für Steckbrett, ein Steckbrett. Ein paar Sprung Drähte (diese sind für diesen Zweck ausgezeichnet) und natürlich ein Arduino (in diesem Fall ein Leonardo). Wir ließen 5V zu einem der Stifte an den Seiten des Topfes und GND zum anderen gehen. Das mittlere muss zu einem der ANALOG IN-Pins auf dem Arduino gehen, in diesem Fall A0. Und that8217s es Der Stromkreis ist und läuft Roter Draht: 5V, schwarzer Draht: GND, gelber Draht: Wischer-Signal zum ADC. ADC (Analog-Digital-Wandler) Das Signal aus dem Pot ist analog, aber wir wollen es digital sein, damit wir den Wert auf dem Bildschirm ablesen können. Arduino hat einen eingebauten ADC (Analog-Digital-Wandler), der eine digitale Darstellung des Analogsignals erzeugt. Je höher die Eingangsspannung, desto größer der Digitalwert. Arduino8217s ADC nimmt in 0 bis 5 Volt und hat eine 10-Bit-Auflösung, die es Ausgang 1024 digitale Werte ermöglicht. Um zusammenzufassen: 0 Volt entspricht einem digitalen Wert von 0 und 5 Volt entspricht einem digitalen Wert von 1023. Mehr über Arduino8217s ADC finden Sie hier. Die Software Der einfachste Weg, um den Pot-Wert zu lesen ist, den digitalen Wert auf den seriellen Monitor zu drucken, so dass8217s was wir tun werden. Der Ablauf dieses einfachen Programms geht wie folgt: Initialisieren globaler Variablen. Richten Sie das serielle Modul ein. Die Schleife Lesen Sie die Spannung des Topfes und führen Sie es durch den ADC. Schreiben Sie den Digitalwert des Potentiometers auf den seriellen Monitor. Warten Sie 50 ms, bevor Sie es wiederholen. Unten ist der Code we8217re, der auf dem Leonardo läuft: Wenn der Code ausgeführt wird, öffnen Sie den Serial Monitor in der Arduino IDE, um die Pot-Wert-Änderung zu sehen, während Sie den Regler drehen. Denken Sie daran, die Baudrate auf den gleichen Wert wie in der seriellen Initialisierung in der Software (115200 in unserem Fall) zu setzen. Ein häufiges Problem und Filtering Wenn Ihre Software reagiert deutlich auf Änderungen auf dem Pot (zum Beispiel ändern Sie einen großen Zustand) you8217re gonna have Eine schlechte Zeit. Der Grund dafür ist, dass, während you8217re nicht den Topf berühren, können die Werte sowieso ändern. Und je größer die Auflösung Ihres ADC ist, desto wahrscheinlicher ist, dass Sie dieses Messrauschen treffen. Der Grund für dieses Problem ist, dass der Topf kontinuierlich angepasst wird und dass er oft in der Mitte von zwei digitalen Werten positioniert ist. Denken Sie daran, dass die reale Welt nicht ideal ist, so dass kleine unvermeidliche Änderungen in der Spannung von Rauschen ist genug, um es hin und her zwischen zwei oder mehr digitale Werte stoßen. Ein Paar von Lösungen Also, wie können wir damit umgehen Erste, don8217t Design Ihres Programms, so dass eine kleine Änderung auf dem Topf etwas Wichtiges macht. Zweitens können Sie dieses Messrauschen reduzieren, indem Sie einfaches Tiefpaßfilter in der Software hinzufügen. Oft genügt ein gleitender Durchschnittsalgorithmus. Wir werden einen exponentiellen gleitenden Durchschnittsalgorithmus implementieren, der von nun an als EMA bezeichnet wird. Um das Signal in diesem Beispiel zu glätten. Fühlen Sie sich frei zu versuchen, einige der anderen gleitenden durchschnittlichen Algorithmen als auch. Der EMA-Algorithmus geht wie folgt: wobei S t das Ergebnis der EMA zum Zeitpunkt t ist. Yt ist die Pot-Messung zum Zeitpunkt t. Und ist ein Koeffizient im Bereich lt0,1gt, der entscheidet, wie viele Proben der EMA-Algorithmus berücksichtigen sollte. Ein Tief wird sehr langsam zu schnellen Eingangsänderungen und nimmt viele Proben in Betracht. Eine hohe ist schnell, aber durchschnittlich über weniger Proben. Sie können in einem Tiefpaßfilter eine Art von Cutoff-Frequenz betrachten. Eine Visualisierung der Funktionsweise der EMA. Die Säulen entlang der X-Achse sind die Proben mit dem jüngsten nach links. Die Höhe der Säulen auf der Y-Achse ist der 8220weight8221 jeder Probe, d. h. wie 8220important8221 jede Probe bei der Berechnung der EMA ist. (Quelle: Wikipedia) Hier8217s der endgültige Code mit der EMA: Experimentieren Sie mit verschiedenen Werten, um den Unterschied in der Geschwindigkeit, wenn sich schnell ändern die Pot-Position zu sehen. Ein kurzes Fazit Wir hoffen, dass dieses kleine Tutorial für Sie hilfreich war. Potentiometer sind sehr nützlich in eingebetteten Systemen und wirklich Spaß zu spielen. Verwenden Sie sie, um zu steuern, was auch immer Sie ähnliche Artikel
Lernen Sie Forex mit Preis-Aktion Ich glaube, dass intelligente Händler, die in Forex erfolgreich sein wollen, müssen Preis-Aktion, und ihre Trading-Psychologie. Preis-Aktion ist der einfachste Weg, um Forex-Handel zu lernen, und Handelspsychologie stellt sicher, dass Sie den richtigen Weg handeln. Vergessen Sie mit verwirrenden Indikatoren. Vergessen Sie Sorgen um jeden Handel. Vergessen Sie den Handel ohne einen Plan. Wenn Sie Forex den richtigen Weg lernen wollen, kann ich Ihnen helfen. Nehmen Sie einige Preis-Action-Trades in dieser Woche Machen Sie mit meinem wöchentlichen Newsletter, um meine neuesten Preis-Action-Analyse und meine Trading-Tipps. Beherrschen Sie Ihre Handelspsychologie, bauen Sie Ihr Trading-Vertrauen und nehmen Sie einige Trades mit mir. Worauf warten Sie, wo Sie anfangen sollen? Sie wollen Forex lernen, aber Sie wissen nicht, wo ich anfangen soll. Nun, habe ich forex4noobs entworfen, um Sie von den Grundlagen bis hin zu erweiterten Preis-Action-Trading zu nehme...
Comments
Post a Comment