Posts

Posts mit dem Label "Netduino" werden angezeigt.

Luftdrucksensor BMP085 mit dem Netduino - Höhenangabe (Teil 4)

Bild
Mit dem Luftdruck lässt sich in etwa auch die Höhe ermitteln. Allerdings ist dieser Wert bedingt verwendbar. Zum einen muss der Sensor beim einschalten mit der aktuellen Höhe kalibriert werden und zum anderen gibt es verschiedene Formeln für die Berechnung, die spezielle Anforderungen erfüllen. Wie immer kommt es darauf an, was man möchte. Im Dokument selbst, wird nur der Luftdruck verwendet. Die Formel hierfür ist nicht sonderlich komplex und lässt sich daher in wenigen Codezeilen umsetzen. altitude = 44330 * (1 – (p/p0) 1/5.255) Nach dem Dokument auf Seite 14, ist diese Formel zu verwenden. Auffällig dürften die festen Zahlenwerten sein, die auf den ersten Blick keinen Bezug darstellen. Die Beschreibung für diese Sache ist leider ohne Begründung, was mir selbst etwas Kopfzerbrechen bildet und mich auf den Weg brachte im weiten Internet nach einer plausiblen Antwort zu suchen. Leider mit geringen Erfolg und steht daher noch auf der TODO Liste. Wer bereits für den Arduino

Luftdrucksensor BMP085 mit dem Netduino - Kalibrieren (Teil 3)

Bild
Um überhaupt mit den gelesenen Daten etwas anfangen zu können, müssen diese umgerechnet werden. Bevor dies geht, müssen am Anfang Kalibrierungsdaten ermittelt werden. Im Handbuch ist in kurzer Form beschrieben, in welchen Schritten gelesen und umgerechnet wird. Fummelig ist die Umrechnung für den Luftdruck. Es sind eine Menge Variablen, welche die Kalibrierungswerte aufnehmen und andere, um die Ergebnisse zwischen zu speichern. Zu der Klasse “BMP085” aus den zwei vorigen Posts kommen nun weitere Methoden hinzu. Damit der Post  nicht zu sehr in die Länge geht, habe ich nur die neuen und geänderten Inhalte zu der Klasse abgebildet. Als erstes müssen die Kalibrierungskoeffizienten ermittelt werden, die in den Member abgelegt werden. Die Namen für die Variablen wurden direkt aus dem Datenblatt übernommen, was zugegeben etwas unschön aussieht. // Kalibrierungswerte private short _AC1; private short _AC2; private short _AC3; private uint _AC4; private uint _AC5; private uint

Luftdrucksensor BMP085 mit dem Netduino - Temperatur (Teil 2)

Bild
Wie bereits in meinem vorigen Post beschrieben, soll nun der Temperatur Wert ausgelesen werden. Der Teil für das Auslesen des Luftdrucks wird in eine Methode ausgelagert. Die Methode “ReadSensorData” gibt die zwei Werte in einem Daten Objekt zurück, das zunächst angelegt wird. Die “ToString” Methode im Daten Objekt wird überschrieben, um die Wiedergabe beider Werte simpel zu gestalten. public class SensorData {     public int TemperaturRawValue = 0;     public int PressureRawValue = 0;     public override string ToString()     {         return "Temperatur Raw Value: " + TemperaturRawValue.ToString() +             " - Pressure Value: " + PressureRawValue.ToString();     } } Nach dem das Daten Objekt vorliegt, kann die Methode “ReadSensorData”  für die Rückgabe umgeschrieben werden. Die Methode nimmt nun das Daten Objekt als Referenz an. Für das Einlesen der Temperatur wird ein zweites Byte Array benötigt zum zwischenspeichern. Die Methode “GetTemper

PWM / PPM Frequenz an Brushless Motoren mit dem Netduino

Bild
Im Modellbau ist es üblich, dass die Frequenz für PWM bei 50Hz zum Ansteuern von analogen Servos und analogen Motorenreglern verwendet wird. Wer allerdings einen digitalen Servo oder eine digitale Motorensteuerung hat, kann hier eine weit höhere Frequenz verwenden. Besonders bei Modellhelikoptern oder auch bei den Quadrocoptern wird dies gefordert. Der Grund liegt hier klar auf der Hand, dass die Periodendauer wesentlich kürzer wird und somit pro Sekunde mehrmals ein neuer Steuerwert festgelegt werden kann. Bei 50Hz liegt die Periodendauer bei 20 Millisekunden, wovon 1 bis 2 Millisekunden das eigentliche Steuersignal (Duration) abbilden und in den restlichen 18 Millisekunden nichts weiter kommt. Daher habe ich mir gedacht, wie sieht eigentlich dann das Signal aus, wenn es auf 200Hz gesetzt wird. Beispiel Darstellung mit 50Hz PWM Signal mit einer Periodendauer von 20ms. Beispiel Darstellung mit 200Hz PWM Signal mit einer Periodendauer von 5ms Schnell stellt sich heraus, d

Kleiner Vergleich zwischen Netduino Plus 1 und Netduino Plus 2

Bild
Netduino Plus 1 (Links) und Netduino Plus 2 (rechts) Seit kurzem zählt zu meinem Bastelsortiment der Netduino Plus 2, der mit mehr Takt deutlich schneller rechnet als der Netduino Plus 1. Die Investition hat sich gelohnt und bringt mein Projekt weiter voran. Kommen wir zunächst zu den grundlegenden technischen Daten. Auch auf der Seite Netduino.com/Hardware/ zu finden.   Netduino Plus 1 Netduino Plus 2 Speed 48 MHz 168 MHz Code Storage 64 KB 384 KB RAM 42 KB 100+ KB GPIO 20 22 UART 2 4 PWM 4 6 SPI 1 1 I²C 1 1 Klar ist, dass der neue schneller sein muss, allerdings habe ich mich gefragt, wie viel mehr ich verarbeiten kann. Nun, mein Beispiel zeigt eine kleine Rechenaufgabe, in der die Zeit gestoppt wird und man nach 100 Durchläufen den Durchschnittswert erhält. int counter = 0; long average = 0; while ( true ) {     Stopwatch .GetElapsedMicrosecounds();     for ( int i = 0; i < 100; i++)     {         float f = ( float )Syste

Kreisgeschwindigkeit aus dem Sensor umrechnen (Die Zweite)

Bild
Von mir entwickeltes Programm zum darstellen eines künstlichen Horizontes und ein Würfel, das die Bewegungen des Sensors wieder gibt. Im letzten Post zeigte ich eine relativ ungenaue Lösung für das Umrechnen der Winkellage. Grund hierfür ist, dass der Zeitabstand nicht verwendet wird. Als Provisorium reicht es allerdings aus. Nun, welche Formel wird stattdessen benötigt? Kreisgeschwindigkeit = Drehwinkel / Zeitspanne steht für die Winkelgeschwindigkeit steht für den Drehwinkel steht für die vergangene Zeit Im nächsten Schritt muss ich die Formel umstellen, um später an das Ergebnis des Drehwinkels heran zu kommen. Der Sensor gibt pro Abfrage die Winkelgeschwindigkeit, und die Zeit wird zwischen der aktuellen Abfrage und der letzten Abfrage bestimmt. Die verwendeten Werte nehme ich wie zuletzt aus dem Sensor MPU6050 mit den entsprechenden Einstellungen. Der Wert 32768 ist der Maximale Einheiten Wert der in eine Richtung gemessen werden kann. Die verga

Kreisgeschwindigkeit aus dem Sensor umrechnen

Bild
Von mir entwickeltes Programm zum darstellen eines künstlichen Horizontes. Neben Beschleunigung existiert die Kreisgeschwindigkeit und kann durch ein Gyroskop gemessen werden. Um nun daraus einen Winkel zu ermitteln, ist eine einfache Rechnung erforderlich. (Aktueller Winkel) = (Aktueller Winkel) + (Messwert) Sieht also nicht sonderlich wild aus und genauso wenig schwierig ist dies in ein Programm zu schreiben. private double _Angle = 0; public double UpdateAngle( double measurement) {     _Angle += measurement;     return _Angle; } Von Gyroskop zu Gyroskop sind die Ergebnisse unterschiedlich. Wie immer nehme ich den MPU6050 Sensor, der einen Messbereich von 0 bis 65535 wiedergibt. Um auch hier negative Werte zu erhalten, ist es nötigt, die Werte um 32768 zu verschieben. Sowie ich das im Blog Post mit dem Beschleunigungssensor Ergebnis erledigt habe . Zudem muss noch der Wert skaliert werden, der davon abhängig ist, auf welche Messgeschwindigkeit eingestellt wurd

MPU6050 Sensor auslesen mit dem Netduino (Repost)

Bild
Fest verlötet auf meinem Shield. Anfang des Jahres habe ich bereits darüber geschrieben und dazu auch ein Beispiel Projekt gepostet. Nun möchte ich diesen Artikel neu aufsetzen und etwas mehr auf einzelne Punkte eingehen. Zunächst nochmal der Hinweis, es handelt sich wieder um einen reinen Funktionalen Programm Code und hat daher keine Fehlerbehandlung. Ein paar Informationen zu dem Sensor Hersteller InvenSens Bezeichnung MPU-6000 und MPU-6050 Sensor Achsen 6 Gyroskope Einstellungen +-250°/s, +-500°/s, +-1000°/s, +-2000°/s Beschleunigungseinstellungen +-2g, +-4g, +-8g, +-16g Verbindung I²C (der 6000er hat zusätzlich SPI) Kommen wir nun zum eigentlichen Thema. Ursprünglich gab es von Jeff Rowberg bereits eine fertige Library in C++ . Leider ließ sich dieser Code nicht für den Netduino verwenden und daher strebte ich an, eine C# und .NET Micro Framework Variante zu schreiben. Zugegeben, alleine mit dem PDF Dokument hätte ich das nicht verstanden und war fro

Zeitkritische Momente mit dem Netduino

Bild
USB TTL UART, Netduino mit Shield und Schaltnetzteil für Tests. Bei einigen Anwendungen kommt es vor, dass eine Iteration möglichst wenig Zeit benötigen soll. Das bedeutet, dass man sich mit Code Optimierung beschäftigen muss, in dem man zumeist die gewohnte Art zu Programmieren überdenken muss. Grundsätzlich sollte man das nicht tun, wenn man Anfänger ist, und dann auch nicht wenn man professioneller Entwickler ist. Es sei denn, die Anforderung erfordert diese Optimierung. In der Entwicklung für meinen Quadrocopter stieß ich auf dieses Problem, dass eine Iteration viel zu lange dauert. Zwar sauber geschrieben, jedoch nicht Performance-optimiert, kam ich auf ca. 40ms bis 45ms pro Iteration. Das ergibt pro Sekunde 22 bis 25 Durchläufe. Nach den Optimierungen kam ich auf Iterationslaufzeiten von 11ms bis 22ms. Diese weite Zeitspanne entstand durch dynamische Verarbeitung von Byte Werten beim Senden und Empfangen, was jedoch ein anderes Thema abbilden würde. Zunächst benötigen wir e