Posts

Es werden Posts vom 2013 angezeigt.

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

Luftdrucksensor BMP085 mit dem Netduino - Luftdruck (Teil 1)

Bild
Für das Erfassen von Wetterdaten eignet sich der Sensor BMP085. In erster Linie misst dieser den Luftdruck, kann jedoch auch die Temperatur messen. Dennoch bleiben wir zunächst bei einem kurzen Testprogramm für den Netduino. public class BMP085 : I2CDevice {    // Bestimmt wie lange gewartet wird in Millisekunden     private int _Timeout = 1000;    // Standard Mode     private int _Mode = 1;     // Empfangspuffer     private byte [] _Receive = new byte [3];     // Konstruktor mit vererbten Konstruktor von der I2CDevice Klasse     public BMP085() : base ( new Configuration (0x77, 40))     {     }     // Sensor lesen     public int ReadSensorData()     {         // Status Abfrage senden         if (Write( new byte [] { 0xF4, ( byte )(0x34 + (_Mode << 6)) }) == 0)         {             Debug .Print( "Status abfrage konnte nicht ausgeführt werden." );             return 0;         }         // Kurz abwarten         Thread .Sleep(8);         // Sensor Erg

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

Tippe die Lampe an

Bild
Letztes Jahr habe ich zu dem Sensor BMA020 bereits ein Code Beispiel für den Arduino gepostet . Nun dachte ich, da der so rum liegt, kann man den vielleicht auch mal für etwas verwenden. Also kam mir die Idee eine Lampe einzuschalten, in dem man gegen sie tippt oder leicht schlägt. Im späteren Verlauf stellte ich fest, dass einige Widerstände zu groß berechnet wurden. Die Abweichungen kommen durch die LED, die eigentlich für 12V ausgelegt sind und ich sie aber mit 9V betreibe. (Für den ATMega fehlt auf dem Bild der Quarz, PIN9 und PIN10) Zunächst skizzierte ich mir meine Schaltung und berechnete anhand des Schaltbildes die Widerstände. Dann sammelte ich meine benötigten Komponenten zusammen und steckte sie auf meinem Breadboard, um zu sehen ob meine Überlegung richtig ist. Versuchsaufbau der Schaltung Natürlich funktioniert die Schaltung nicht ohne einen Programmcode und daher musste ich mir zunächst etwas überlegen. Zum Beispiel wie ich aus den drei Achsen einen Wert

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

HMC5883L Sensor auslesen mit dem Netduino

Bild
HMC5883L Magnet Sensor auf dem Breadboard Shield und PullUp-Widerständen. Was mit dem Arduino geht, geht auch mit Netduino. Auch hier konnte ich ein funktionales Beispiel für den 3 Achsen Magnet Sensor HMC5883L als Klasse schreiben. public class HMC5883L {     /// Klasse für die I²C Verbindung     private I2CDevice _i2CDevice;     /// Die Variabeln zum Speichern der Ergebnisse nach der Messung.     private byte [] _Data = new byte [6];     /// Ruft die Achse X ab oder legt diese fest.     public int AxisX { get ; set ; }     /// Ruft die Achse Y ab oder legt diese fest.     public int AxisY { get ; set ; }     /// Ruft die Achse Z ab oder legt diese fest.     public int AxisZ { get ; set ; }     /// Der Konstruktor Initialisiert die Verbindung her und     /// stellt den Sensor mit einer Standard Konfiguration ein.     public HMC5883L()     {        // I²C Bus verbindung herstellen mit 100kHz         _i2CDevice = new I2CDevice ( new I2CDevice . Configuration (0x1E, 10

HMC5883L Sensor ohne (externe) Library auslesen mit dem Arduino

Bild
HMC5883 Magnet Sensor auf dem Breadboard Shield. Letztes Jahr habe ich bereits darüber geschrieben, allerdings keinen Code dazu gepostet. Ich habe nur beschrieben, was mit der Library verändert werden musste, damit diese funktioniert. Diesmal hatte ich Zeit, um mich etwas näher damit zu befassen und konnte nun endlich ein funktionales Beispiel schreiben. Um den Code fürs erste übersichtlich zu halten, habe ich das Skalieren und das Berechnen nach Norden ausgelassen. // Wird für die I²C Verbindung verwendet. #include < Wire .h> // Adresse des Sensors #define sensor_address 0x1E // Variabelen die für den Lese Vorgang benötigt werden byte data[6]; int axisX; int axisY; int axisZ; // Konfiguration der Seriellen Verbindung und Initialisierung des Sensors. void setup () {   Serial . begin (9600);   Serial . println ( "Init Sensor" );   // I²C Verbindung starten.   Wire . begin ();   // Operating Mode (0x02):   // Continuous-Measurement Mode (0x00)   SetConfigu