AdSense

Sonntag, 21. Juli 2013

Beschleunigungssensor MPU-6050 mit Raspberry PI auslesen

(English version) Der Beschleunigungssensor MPU-6050 ist ziemlich vielseitig, klein und billig. Er kann mit bis zu 6 V betrieben werden und liefert Beschleunigungswerte und sogar Gyroskopwerte (also Drehung in Grad pro Sekunde). So ein Sensor ist also das ideale Kernstück für einen Quadrocopter.

Da man mit einem Raspberry PI deutlich einfacher debuggen kann als mit Atmegas habe ich den Beschleunigungssensor zuerst mal mit dem Raspberry PI angesteuert. Das Grundprinzip ist ziemlich einfach, man muss nur einmal herausfinden wie es geht. Ich benutze am Raspberry PI die bcm2835-Library (http://www.airspayce.com/mikem/bcm2835/).

Das ganze lässt sich mit I²C auch über einen ATmega machen, dafür benutze ich diese Implementierung von I²C, dieser Post hilft da sicherlich weiter.

Um jetzt z.B. die x-Beschleunigung (Am Raspberry PI) auszumessen geht man folgendermaßen vor:

#include <bcm2835.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main (int atgc, char** argv)
{
    bcm2835_init();
    bcm2835_i2c_begin();

    char addr = 0x68;

    //I found this address somewhere in the internet...
    char buf[1];
    char regaddr[2];
    int x = 0;
    int ret;

    bcm2835_i2c_setSlaveAddress(addr);

    //disable sleep mode!!!!!

    regaddr[0] = 107;
    regaddr[1] = 0;
    //This is the basic operation to write to an register
    //regaddr[0] is the register address
    //regaddr[1] is the value
    bcm2835_i2c_write(regaddr, 2);
   
    regaddr[0] = 59;
    ret = BCM2835_I2C_REASON_ERROR_DATA;
    while(ret != BCM2835_I2C_REASON_OK)
    {
        //This is the basic operation to read an register
        //regaddr[0] is the register address
        //buf[0] is the value
        bcm2835_i2c_write(regaddr, 1);
        ret = bcm2835_i2c_read(buf, 1);
    }
    x = buf[0]<<8;

    regaddr[0] = 60;
    ret = BCM2835_I2C_REASON_ERROR_DATA;
    while(buf[0] == 99)
    {
        bcm2835_i2c_write(regaddr, 1);
        ret = bcm2835_i2c_read(buf, 1);
    }
    x += buf[0];


    //because of the sign, we have here 32-bit integers,
    //the value is 16-bit signed.

    if (x & 1<<15)
    {
        x -= 1<<16;
    }

    double x_val = x;
    x_val = x_val / 16384;

    //This is only valid if the accel-mode is +- 2g
    //The range can be controlled via the 
    //GYRO_CONFIG and ACCEL_CONFIG registers

    printf("accel: %g\n", x_val);

    bcm2835_i2c_end();
}


Dies kann jetzt natürlich noch beliebig erweitert werden, um Beschleunigungs-Werte und Gyro-Werte auszulesen. Da hiermit aber der grundlegende Zugriff auf die Register geklärt sein sollte, werde ich hier nur auf die Register Map verweisen: http://www.invensense.com/mems/gyro/documents/RM-MPU-6000A.pdf

Keine Kommentare:

Kommentar veröffentlichen