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-Sample 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 sowas in Deinem Roboter so 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 genommen von der Arduino Bibliothek Seite verwiesen auf: Momentan entwickle ich ein grafisches LCD-System, um Temperaturen, Flüsse, Spannungen, Energie und Energie in einem Wärmepumpensystem anzuzeigen. Die Verwendung eines grafischen LCD bedeutet, dass die Hälfte meines SRAM und 75 meines Blitzes durch einen Schirmpuffer und Schnüre verbraucht worden sind. Ich sehe derzeit min / max / Durchschnittswerte für die Energie an. Um Mitternacht, wenn die tägliche Zahl zurückgesetzt wird, prüft das System, ob der Verbrauch für den Tag über oder unter dem vorherigen Minimum oder Maximum liegt und speichert den Wert. Der Durchschnitt wird berechnet, indem der kumulative Energieverbrauch durch die Anzahl der Tage dividiert wird. Ich möchte den täglichen Durchschnitt über die letzte Woche und Monat (4 Wochen aus Gründen der Einfachheit), d. h. Derzeit geht es darum, ein Array von Werten für die letzten 28 Tage aufrechtzuerhalten und einen Durchschnitt über das gesamte Array für die monatlichen und letzten 7 Tage für wöchentlich zu berechnen. Zuerst war ich dies mit einem Array von Schwimmern (wie die Energie in Form von 12.12kWh), aber das war mit 28 4 Bytes 112 Bytes (5.4 von SRAM). Ich habe nichts dagegen, nur einen einzigen Dezimalpunkt der Auflösung, so dass ich geändert, um mit uint16t und die Multiplikation der Zahl mit 100. Dies bedeutet, dass 12.12 wird als 1212 dargestellt, und ich teile durch 100 für die Anzeige. Die Größe des Arrays ist jetzt auf 56 Bytes (viel besser). Es gibt keine triviale Möglichkeit, die Figur auf einen uint8t zu reduzieren, den ich sehen kann. Ich könnte den Verlust einer Dezimalstelle tolerieren (12,1kWh anstatt 12,12kWh), aber der Verbrauch ist häufig höher als 25,5kWh (255 ist der höchste Wert, der durch eine 8-Bit-Ganzzahl ohne Vorzeichen dargestellt wird). Der Verbrauch lag nie unter 10,0 kWh oder über 35,0 kWh, so daß ich 10 von den gespeicherten Zahlen subtrahieren konnte, aber ich weiß, dass wir eines Tages diese Grenzen überschreiten werden. Ich testete dann Code, 9-Bit-Werte in ein Array zu packen. Dies ergibt einen Bereich von 0-51,2 kWh und verwendet insgesamt 32 Bytes. Allerdings ist der Zugriff auf ein Array wie dieses ziemlich langsam, vor allem, wenn Sie über alle Werte iterieren müssen, um einen Durchschnitt zu berechnen. Also meine Frage ist - gibt es eine effizientere Methode der Berechnung eines gleitenden Durchschnitt mit drei Fenstern - Lebensdauer, 28 Tage und 7 Tage Effizienz bedeutet kleiner in Bezug auf SRAM Nutzung, aber ohne die Strafe von riesigen Code. Kann ich vermeiden, die Speicherung aller Werte gefragt Ich habe gedacht, und Sie haben Recht. So dass technisch macht meine Antwort falsch. Ich investiere noch mehr Zeit und Geduld. Vielleicht etwas aus der Box. Ich lasse Sie wissen, wenn ich mit etwas kommen. Wir machen so etwas viel an meinem Arbeitsplatz. Lassen Sie mich fragen. Sorry über die Verwirrung. Ndash Aditya Somani Mar 8 14 am 17:15 gibt es eine effizientere Methode der Berechnung eines gleitenden Durchschnitt mit. 28 Tage und 7 Tage. Müssen sich an 27 Tage Geschichte erinnern. Vielleicht erhalten Sie nahe genug Speicherung 11 Werte anstelle von 28 Werten, vielleicht so etwas wie: Mit anderen Worten, anstatt jedes Detail von jedem Tag für die letzten 27 Tage zu speichern, (a) speichern 7 oder so Werte der detaillierten täglichen Informationen für die Vergangenheit 7 oder so Tage, und auch (b) speichern Sie 4 oder so zusammengefasste Werte der Gesamt-oder durchschnittliche Informationen für jede der letzten 4 oder so Wochen. Dies ist eine Sammlung von Routinen für die Durchführung mathematischer Analysen 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: ShareIntro Eine der Hauptanwendungen für das Arduino-Board ist das Lesen und Protokollieren von Sensordaten. Zum Beispiel überwacht man den Druck jede Sekunde des Tages. Da hohe Abtastraten oft Spikes in den Graphen erzeugen, möchte man auch einen Mittelwert der Messungen haben. Da die Messungen nicht statisch in der Zeit sind, was wir oft brauchen, ist ein laufender Durchschnitt. Dies ist der Durchschnitt einer bestimmten Periode und sehr wertvoll bei der Trendanalyse. Die einfachste Form eines laufenden Durchmessers kann durch einen Code ausgeführt werden, der auf dem vorherigen laufenden Durchschnitt basiert: Wenn man keine Gleitkomma-Mathematik verwenden möchte - da dies Speicherplatz einnimmt und Geschwindigkeit verringert - kann man dies in der Integer-Domäne vollständig durchführen. Die Teilung durch 256 in dem Beispielcode ist ein Schiebe-Recht 8, das schneller ist als eine Teilung durch z. B. 100. Dies gilt für jede Potenz von 2 als Teiler und man muss nur darauf achten, dass die Summe der Gewichte gleich der Potenz von 2 ist. Und natürlich sollte man darauf achten, dass es keinen Zwischenüberlauf gibt (erwägen Sie unsigned long) Eine genauere laufende Durchschnitt, in concreto aus den letzten 10 Messungen, benötigen Sie ein Array (oder verkettete Liste), um sie zu halten. Diese Anordnung wirkt wie ein kreisförmiger Puffer und bei jeder neuen Messung wird die älteste entfernt. Der laufende Durchschnitt wird als die Summe aller Elemente geteilt durch die Anzahl der Elemente in dem Array berechnet. Der Code für den laufenden Durchschnitt wird etwa so aussehen: Nachteil dieses Codes ist, dass das Array, um alle Werte zu halten, ziemlich groß werden kann. Wenn Sie eine Messung pro Sekunde haben und Sie wollen einen laufenden Durchschnitt pro Minute benötigen Sie ein Array von 60 ein durchschnittliches pro Stunde würde ein Array von 3600 benötigen. Das könnte nicht auf diese Weise auf einem Arduino getan werden, da es nur 2K RAM hat. Allerdings kann durch den Bau eines 2-stufigen Durchschnitts kann es ganz gut angegangen werden (Disclaimer: nicht für alle Messungen). Im psuedo-Code: Da für jede runningAverage-Funktion ein neues internes statisches Array benötigt wird, wird dieses als Klasse implementiert. RunningAverage-Bibliothek Die RunningAverage-Bibliothek bildet eine Klasse der oben genannten Funktion, so dass sie mehrfach in einer Skizze verwendet werden kann. Es entkoppelt die add () - und die avg () - Funktion, um ein wenig flexibler zu sein, z. B. Kann man den Durchschnitt mehrmals nennen, ohne eine Sache hinzuzufügen. Beachten Sie, dass jede Instanz der Klasse ein eigenes Array hinzufügt, um Messungen zu halten, und dass dies die Speicherauslastung addiert. Die Schnittstelle der Klasse wird so klein wie möglich gehalten. Anmerkung: Bei Version 0.2 werden die Namen der Methoden beschreibender. Verwendung Eine kleine Skizze zeigt, wie sie verwendet werden kann. Ein Zufallsgenerator wird verwendet, um einen Sensor nachzuahmen. In setup () wird der myRA gelöscht, so dass wir mit dem Hinzufügen neuer Daten beginnen können. In loop () wird zuerst eine Zufallszahl erzeugt und in einen float umgerechnet, der myRA hinzugefügt wird. Dann wird das runningAverage auf den seriellen Port gedruckt. Man könnte es auch auf einem LCD-Display oder über ethernet etc. Wenn 300 Elemente hinzugefügt myRA ist gelöscht, um neu zu beginnen. Hinweise Um die Bibliothek zu verwenden, müssen Sie einen Ordner in Ihrem SKETCHBOOKPATHlibaries mit dem Namen RunningAverage erstellen und dort die. h - und die. cpp-Datei ablegen. Fügen Sie optional ein Beispielunterverzeichnis hinzu, um die Beispielanwendung zu platzieren. Geschichte 2011-01-30: Anfangsversion 2011-02-28: fester fehlender Zerstörer in der. h Akte 2011-02-28: entfernter Standardkonstruktor 2012--. TrimValue () Yuval Naveh hinzugefügt trimValue (gefunden im Web) 2012-11-21: refactored 2012-12-30: hinzugefügt fillValue () refactored für die Veröffentlichung 2014-07-03: hinzugefügt Speicherschutz-Code - wenn internen Array nicht zugeordnet werden kann Größe Wird 0. Dies ist, um das hier beschriebene Problem zu lösen - forum. arduino. cc/indextopic50473.msg1790086msg1790086 - Todo Test ausführlich. Template-Klasse RunningAverage. h RunningAverage. cppRecently mein Nachbar zahlte mir ein Schlüssel-weniger Eintrag System für seinen Wohnheimraum zu bauen. Ich beschloss, die ökonomische Route zu gehen und einen Knopf / ein Potentiometer zu verwenden, das außerhalb der Tür sitzt und ein Arduino auf dem Innere, das ein Servo steuert, das an das Schloss angeschlossen ist. Für mein Zimmer, dachte ich, es wäre interessant, einen Ping verwenden))) Ultraschall-Abstandssensor anstelle des Potentiometers und verlieren den Knopf. Der Ping))) Sensor gehalten Messwerte, während meine Hand in Bewegung war. Um dies zu beheben, entschied ich mich für ein Moving Average Filter und berechne dann die Standardabweichung der Werte, die derzeit im M. A. Filter enthalten sind. Wenn meine Hand noch ist, wird die Standardabweichung sehr klein. M. A.andS. D. (Pdf) - 8220storeValue (Variable) 8221 ist die Eingabe von Daten in das Array, dann rufen Sie M. A. und S. D. Nicht viel von einem Kreis benötigt Arduino039s Regler auch Ping))). Servo hat it039s eigenen 5v Regler. Braucht Kondensatoren pingDoorLocker (pdf) 8211 Wie Sie sehen können, blies dieses Programm ein little8230 Ich versuchte, die M. A. und S. D. Code sehr einfach zu folgen. Einige Dinge könnten in der S. D. Und Varianz-Methode, aber für den Anfänger, was ich oben geschrieben habe, ist wahrscheinlich einfacher zu verstehen, da es die Gleichungen folgt. Wie für die pingDoorLocker 8211 warf ich, dass Code zusammen sehr schnell. Follow-up-Hinweise: Das war wahrscheinlich der schlechteste Weg, um dieses Projekt zu tun8230 Ich dachte an ein paar Möglichkeiten, wie man das Programm, das den Code WEG schrumpfen würde schreibt, aber dies ist ein Beispiel über die Verwendung von M. A. und S. D. Ziemlich schlechte Verwendung eines M. A. Filter, wenn Sie mich fragen, seine Tür Unlocker. Seit ich ein paar Stunden in den Bau meines Nachbar8217s Türöffners, hier8217s ein Bild von ihm Es didn8217t wollen Zahlen auf dem Potentiometer wählen, so dass ich die LED-Blitz die Zahl, die derzeit eingegeben wird. Code für seinen Türöffner (pdf) 8211 hinterlassen Sie einen Kommentar, wenn Sie Schaltpläne / Code auf schnelle Anteil seit pdf verliert Registerkarten wollen.
No comments:
Post a Comment