Robo-Hero
07.10.2012, 12:36
Hallo Zusammen,
seit längeren sitze ich schon an diesem Sensor. Mit dem Arduino funktioniert der Sensor mit der fertigen Code von https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050. Was mir jedoch zu schaffen macht, ist eine Lösung für Netduino zu schreiben.
Für die I2C Verbindung habe ich mir bereits eine Klasse zurecht geschrieben. Ursprünglich habe den Code von der Netduino Seite und habe den auf meine Bedürfnisse angepasst. Es funktioniert bereits auch schon mit dem BMA020 Sensor.
Die I2C Verbindung
public class I2C_Connector
{
private I2CDevice.Configuration _Config;
private I2CDevice _Device;
/// <summary>
/// Initialisiert die Klasse
/// Konfiguration wird angelegt und
/// die entsprechende Klasse I2CDevice wird initialisiert
/// </summary>
/// <param name="address">Adresse zur Hardware</param>
public I2C_Connector(byte address)
{
// Adresse und Taktfrequenz übergeben
_Config = new I2CDevice.Configuration(address, 400);
_Device = new I2CDevice(_Config);
}
public I2C_Connector(byte address, int clockRateKHz)
{
// Adresse und Taktfrequenz übergeben
_Config = new I2CDevice.Configuration(address, clockRateKHz);
_Device = new I2CDevice(_Config);
}
public bool IsConnected()
{
// Noch nicht fertig
return false;
}
/// <summary>
/// Sendet den Inhalt des Byte Array zur Hardware
/// </summary>
/// <param name="writeBuffer">Byte Array</param>
public int Write(byte[] writeBuffer)
{
try
{
// Byte Array übergeben für das ertellen einer Transaction
I2CDevice.I2CTransaction[] writeTransaction = new I2CDevice.I2CTransaction[]
{
I2CDevice.CreateWriteTransaction(writeBuffer)
};
// Sende die Daten an die Hardware. TimeOut bei 1 Sekunde
int written = this._Device.Execute(writeTransaction, 1000);
// Prüfe ob alle daten gesendet wurden, ansonsten Exception ausführen
if (written != writeBuffer.Length)
{
//throw new Exception("Es konnten keine Daten an das Modul gesendet werden.");
Debug.Print("Es konnten keine Daten an das Modul gesendet werden.");
}
return written;
}
catch(ArgumentException ex)
{
Debug.Print(ex.ToString());
}
return 0;
}
/// <summary>
/// Ruft mit den Adressen im Buffer die Werte ab
/// </summary>
/// <param name="readBuffer">Byte Array mit Adressen für den Abruf entsprechender Daten</param>
public byte[] Read(byte[] readBuffer)
{
// Erstelle ein Transaction zum Lesen mit übergabe des Byte Array
I2CDevice.I2CTransaction[] readTransaction = new I2CDevice.I2CTransaction[]
{
I2CDevice.CreateReadTransaction(readBuffer)
};
// Lese die Daten von der Hardware. TimeOut von einer Sekunde
int read = this._Device.Execute(readTransaction, 1000);
// Prüfe, ob die Daten gesendt wurden
if (read != readBuffer.Length)
{
//throw new Exception("Es konnte nicht vom Modul gelesen werden.");
Debug.Print("Es konnte nicht vom Modul gelesen werden.");
}
return readBuffer;
}
}
Schreiben (oder auch Senden genannt) geht, oder zumindest sieht das so aus.
Das die Verbindung nicht geht, sehe ich immer wenn ich die Methode "Read(byte[] readBuffer)" aufrufe.
Letzter Vorgang den ich versucht habe war folgendes:
I2C_Connector i2c = new I2C_Connector(0x68, 400);
byte[] ba = i2c.Read(new byte[] { MPU6050_R.PWR_MGMT_1 });
Aber egal was ich auch nehme, ich kann vom Sensor Modul nicht lesen.
Nach einem brauchbaren Code in C# und einem kürzeren Beispiel in C/C++ habe ich schon seit Tagen gesucht, aber nichts gefunden. Wäre allerdings nicht das erstmal, dass ich nach den Falschen Begriffen suche... :confused:
Was ich dazu bereits lese ist, die PDF zu dem Sensor. Leider ist das Englisch etwas komisch, jedoch das wesentliche fehlt, eine Beschreibung wie man den Sensor Initialisiert. Im Grunde stehen nur die Adressen und dessen Beschreibung vor.
Geht man nach dem Beispiel, dass bereits für den Arduino vorliegt, wird beim Initialisieren als erstes der Status des Moduls abgefragt (MPU6050_RA_PWR_MGMT_1 = 0x6B), was ich auch in meinem letzten Code Beispiel zeige. Danach wird erst die Konfiguration des Sensors vorgenommen.
Grüße von
Robo-Hero
seit längeren sitze ich schon an diesem Sensor. Mit dem Arduino funktioniert der Sensor mit der fertigen Code von https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050. Was mir jedoch zu schaffen macht, ist eine Lösung für Netduino zu schreiben.
Für die I2C Verbindung habe ich mir bereits eine Klasse zurecht geschrieben. Ursprünglich habe den Code von der Netduino Seite und habe den auf meine Bedürfnisse angepasst. Es funktioniert bereits auch schon mit dem BMA020 Sensor.
Die I2C Verbindung
public class I2C_Connector
{
private I2CDevice.Configuration _Config;
private I2CDevice _Device;
/// <summary>
/// Initialisiert die Klasse
/// Konfiguration wird angelegt und
/// die entsprechende Klasse I2CDevice wird initialisiert
/// </summary>
/// <param name="address">Adresse zur Hardware</param>
public I2C_Connector(byte address)
{
// Adresse und Taktfrequenz übergeben
_Config = new I2CDevice.Configuration(address, 400);
_Device = new I2CDevice(_Config);
}
public I2C_Connector(byte address, int clockRateKHz)
{
// Adresse und Taktfrequenz übergeben
_Config = new I2CDevice.Configuration(address, clockRateKHz);
_Device = new I2CDevice(_Config);
}
public bool IsConnected()
{
// Noch nicht fertig
return false;
}
/// <summary>
/// Sendet den Inhalt des Byte Array zur Hardware
/// </summary>
/// <param name="writeBuffer">Byte Array</param>
public int Write(byte[] writeBuffer)
{
try
{
// Byte Array übergeben für das ertellen einer Transaction
I2CDevice.I2CTransaction[] writeTransaction = new I2CDevice.I2CTransaction[]
{
I2CDevice.CreateWriteTransaction(writeBuffer)
};
// Sende die Daten an die Hardware. TimeOut bei 1 Sekunde
int written = this._Device.Execute(writeTransaction, 1000);
// Prüfe ob alle daten gesendet wurden, ansonsten Exception ausführen
if (written != writeBuffer.Length)
{
//throw new Exception("Es konnten keine Daten an das Modul gesendet werden.");
Debug.Print("Es konnten keine Daten an das Modul gesendet werden.");
}
return written;
}
catch(ArgumentException ex)
{
Debug.Print(ex.ToString());
}
return 0;
}
/// <summary>
/// Ruft mit den Adressen im Buffer die Werte ab
/// </summary>
/// <param name="readBuffer">Byte Array mit Adressen für den Abruf entsprechender Daten</param>
public byte[] Read(byte[] readBuffer)
{
// Erstelle ein Transaction zum Lesen mit übergabe des Byte Array
I2CDevice.I2CTransaction[] readTransaction = new I2CDevice.I2CTransaction[]
{
I2CDevice.CreateReadTransaction(readBuffer)
};
// Lese die Daten von der Hardware. TimeOut von einer Sekunde
int read = this._Device.Execute(readTransaction, 1000);
// Prüfe, ob die Daten gesendt wurden
if (read != readBuffer.Length)
{
//throw new Exception("Es konnte nicht vom Modul gelesen werden.");
Debug.Print("Es konnte nicht vom Modul gelesen werden.");
}
return readBuffer;
}
}
Schreiben (oder auch Senden genannt) geht, oder zumindest sieht das so aus.
Das die Verbindung nicht geht, sehe ich immer wenn ich die Methode "Read(byte[] readBuffer)" aufrufe.
Letzter Vorgang den ich versucht habe war folgendes:
I2C_Connector i2c = new I2C_Connector(0x68, 400);
byte[] ba = i2c.Read(new byte[] { MPU6050_R.PWR_MGMT_1 });
Aber egal was ich auch nehme, ich kann vom Sensor Modul nicht lesen.
Nach einem brauchbaren Code in C# und einem kürzeren Beispiel in C/C++ habe ich schon seit Tagen gesucht, aber nichts gefunden. Wäre allerdings nicht das erstmal, dass ich nach den Falschen Begriffen suche... :confused:
Was ich dazu bereits lese ist, die PDF zu dem Sensor. Leider ist das Englisch etwas komisch, jedoch das wesentliche fehlt, eine Beschreibung wie man den Sensor Initialisiert. Im Grunde stehen nur die Adressen und dessen Beschreibung vor.
Geht man nach dem Beispiel, dass bereits für den Arduino vorliegt, wird beim Initialisieren als erstes der Status des Moduls abgefragt (MPU6050_RA_PWR_MGMT_1 = 0x6B), was ich auch in meinem letzten Code Beispiel zeige. Danach wird erst die Konfiguration des Sensors vorgenommen.
Grüße von
Robo-Hero