Spielen Sie mit Raspberry Pi (18) - MPU6050 Gyroskop-Beschleunigungssensormodul-Anwendung

Spielen Sie mit Raspberry Pi (18) - MPU6050 Gyroskop-Beschleunigungssensormodul-Anwendung

I. Einleitung

Mittlerweile sind die Funktionen von Smartphones sehr leistungsfähig: Neben den grundlegenden Kommunikationsfunktionen ist auch die Messung von Daten wie Standort und Geschwindigkeit sowie Raumwinkel sehr komfortabel, was in Anwendungen wie Routennavigation, Karten etc. sehr wichtig ist Somatosensorische Spiele. Haben Sie jemals darüber nachgedacht, wie ein intelligentes Gerät Daten wie seinen räumlichen Zustand und seine Beschleunigung erhält? Das MPU6050 ist ein Sensormodul, das diese Art der Datenmessung bereitstellt.

Zunächst einmal ist es nicht kompliziert, die Daten des Sensormoduls MPU6050 über den Raspberry Pi auszulesen. Der MPU60X0 ist ein hochskalierbarer digitaler Bewegungsprozessor. Wir verwenden in diesem Experiment die verpackten Funktionsmodule, wie in der folgenden Abbildung gezeigt:

Der MPU6050-Chip selbst hat 24 Pins, 6 Pins auf jeder Seite, und hat viele Funktionen.Die Pin-Funktionen und -Positionierung sind in der folgenden Abbildung dargestellt:

Für die fortgeschrittene Verwendung von MPU6050 können Sie es erhalten, indem Sie das Chip-Handbuch lesen.In diesem Blog konzentrieren wir uns auf die Anwendung auf dem Raspberry Pi. Wir müssen uns nur auf die 8 Pins des verwendeten Moduls konzentrieren.

2. Anschluss und Vorbereitung

Das Modul, das wir in diesem Experiment verwenden, hat 8 Pins, und nur 4 Pins werden benötigt, um die Funktion zu realisieren. Für die Anwendung des I2C-Protokollbusses des Raspberry Pi gab es vor dieser Blogreihe viele Experimente und Anwendungen. Verbinden Sie zunächst das Sensormodul wie folgt mit dem Raspberry Pi:

Sensormodul Himbeerkuchen
VCC +5V
Masse Masse
SCL SCL
SDA SDA

Bevor Sie beginnen, den I2C-Bus zu verwenden, vergessen Sie nicht, die I2C-Funktion des Raspberry Pi zu aktivieren. Wenn Sie nicht viel über die Verwendung des I2C-Bus wissen, können Sie die folgenden Blogs lesen:

https://my.oschina.net/u/2340880/blog/5142788

Nachdem die Verbindung hergestellt ist, geben Sie im Terminal des Raspberry Pi folgenden Befehl ein, um die verbundenen I2C-Geräte anzuzeigen:

sudo i2cdetect -y 1










Wenn die Verbindung korrekt ist, sieht die Terminalausgabe wie folgt aus:

Es ist ersichtlich, dass die in der Abbildung gezeigte 68 die Adresse des angeschlossenen Sensors ist.

Jetzt ist es an der Zeit zu verstehen, wie der MPU6050-Sensor verwendet wird. Wir wissen, dass wir über den I2C-Bus die Daten eines bestimmten Registers im Gerät leicht lesen und auch Daten in ein bestimmtes Register des Geräts schreiben können. Daher Verwendung von MPU6050 Der Kern eines Sensors besteht darin, zu verstehen, wie die darin enthaltenen Register verwendet werden. Wir stellen einige beispielhaft verwendete Register vor, die vollständige Registerbelegung kann dem Chip-Handbuch entnommen werden.

1. Energieverwaltungsregister

Die Adresse des Power-Management-Registers ist 107, was der Hexadezimalzahl 0x6b entspricht. Es ist ein 8-Bit-Register, und das 4. Bit ist reserviert und kann nicht verwendet werden. Die Funktionen sind wie folgt:

DECIVE_RESET: Die Funktion dieses Bits besteht darin, den Sensor zurückzusetzen und alle Register innerhalb des Sensors auf den Anfangszustand zurückzusetzen.Nachdem der Reset abgeschlossen ist, wird dieses Bit gelöscht.

SLEEP: Schlafsteuerbit, wenn dieses Bit 1 ist, befindet sich der Sensor im Schlafmodus. Es sollte beachtet werden, dass die Standardeinstellung der Schlafmodus ist, wenn der Sensor startet, wir müssen ihn manuell aufwecken.

CYCLE: Wenn das Gerät in den Non-Sleep-Modus versetzt ist, d. h. das SLEEP-Bit nicht 1 ist, befindet sich der Sensor, wenn es auf 1 gesetzt ist, im zyklischen Modus und die Daten werden zyklisch mit der durch das Register eingestellten Geschwindigkeit abgetastet 108.

TEMP_DIS: Ob der Temperatursensor deaktiviert werden soll, wenn auf 1 gesetzt, wird der Temperatursensor deaktiviert.

CLKSEL: 3-Bit-Wert ohne Vorzeichen, der verwendet wird, um die Taktquelle anzuweisen.

Für die Option CLKSEL wird sie wie folgt eingestellt:

CLKSEL-Wert Bedeutung
0 unter Verwendung des internen 8-MHz-Oszillators
1 Verwenden Sie die Frequenz der Gyroskop-X-Achse
2 Verwenden Sie die Frequenz der Y-Achse des Gyroskops
3 Verwenden Sie die Frequenz der Gyroskop-X-Achse
4 Verwenden Sie eine externe Frequenz von 32,768 kHz
5 Verwenden Sie eine externe 19,2-MHz-Frequenz
6 reservierter Wert
7 Stoppen Sie die Uhr und lassen Sie den Oszillator zurückgesetzt

2. Gyroskop-Datenregister

Die Adresse des Kreiseldatenregisters ist 67 bis 72, insgesamt 48 binäre Bits, wie folgt:

Diese Register sind schreibgeschützt und können nicht beschrieben werden.

Die Register 67 und 68 speichern 16-Bit-Daten, die die Messdaten der X-Achse des Gyroskops sind. Davon speichern 68 Register die unteren 8 Bits und 67 Register die oberen 8 Bits.

Die Register 69 und 70 speichern 16-Bit-Daten, die die Messdaten der Y-Achse des Gyroskops sind. Davon speichern 70 Register die unteren 8 Bits und 69 Register die oberen 8 Bits.

Die Register 71 und 72 speichern 16-Bit-Daten, die die Messdaten der Z-Achse des Gyroskops sind. Darunter speichert das Register 72 die unteren 8 Bits und das Register 71 die oberen 8 Bits.

Es ist zu beachten, dass die aus diesen Registern entnommenen Daten alle Rohdaten sind. Um den vom echten Gyroskop gemessenen Drehwinkel zu erhalten, müssen sie umgerechnet werden. Die Umrechnungseinheit bezieht sich auf die Gesamtreichweite, und die Reichweite wird im Register konfiguriert 27.

3. Gyroskop-Konfigurationsregister

Die Adresse des Gyroskop-Konfigurationsregisters ist 27, was wie folgt ein lesbares und beschreibbares Register ist:

Die drei Bits XG_ST, YG_ST und ZG_ST werden verwendet, um das Gyroskop so einzustellen, dass es einen Selbsttest durchführt. FS_SEL wird verwendet, um den Bereich des Gyroskops einzustellen, und die unteren 3 Bits sind reserviert und müssen nicht verwendet werden. Der Bereich, der durch FS_SEL eingestellt werden kann, ist wie folgt:

FS_SEL Messbereich Empfindlichkeitsparameter
0 ±250 °/s 131
1 ±500 °/s 65.5
2 ±1000 °/s 32.8
3 ±2000 °/s 16.4

Für verschiedene Bereiche müssen wir, nachdem wir die Originaldaten erhalten haben, durch den entsprechenden Empfindlichkeitsparameter dividieren, um die endgültigen Gyroskopdaten zu erhalten.

4. Beschleunigungsmesser-Datenregister

Die Adresse des Datenregisters des Beschleunigungsmessers ist 59 bis 64, insgesamt 48 binäre Bits, wie folgt:

Die Verwendungsmethode ähnelt der des Gyroskop-Datenregisters.Es muss auch den Bereich des Beschleunigungsmessers im Register 28 konfigurieren und einstellen und den tatsächlichen Beschleunigungswert durch die Empfindlichkeit entsprechend dem Bereich berechnen.

5. Beschleunigungsmesser-Konfigurationsregister

Die Adresse des Gyroskop-Konfigurationsregisters ist 28, was wie folgt ein lesbares und beschreibbares Register ist:

XA_ST, YA_ST, ZA_ST sind alle Selbsttestausführungs-Steuerbits, AFS_SEL wird verwendet, um den Bereich einzustellen, und seine entsprechende Beziehung zur Empfindlichkeit ist wie folgt:

AFS_SEL Messbereich Empfindlichkeitsparameter
0 ±2 16384
1 ±4g 8192
2 ±8g 4096
3 ±16g 2048

6. Temperaturdatenregister

Die Adresse des Temperaturdatenregisters ist 65 bis 66, insgesamt 16 Binärbits, wie folgt:

Da die gemessenen Temperaturdaten eine vorzeichenbehaftete Zahl sind, muss die folgende Berechnungsformel verwendet werden, um die tatsächlichen Celsius-Daten zu erhalten:

Celsius = TEMP_OUT / 340 + 36,53

Darüber hinaus gibt es viele funktionale Sensoren, wie z. B. Abtastratenkonfiguration usw., die bei Bedarf dem Chiphandbuch entnommen werden können.

3. Schreiben Sie den Code

Nach Abschluss der vorherigen grundlegenden Vorbereitungen ist es sehr einfach, Code zu schreiben, um die Daten des Sensormoduls zu erhalten.Der Beispielcode lautet wie folgt:

#coding:utf-8

import smbus
import math
import time

# 电源控制寄存器地址
power_regist = 0x6b

# I2C模块初始化
bus = smbus.SMBus(1)
# 外接I2C设备的地址
address = 0x68

# 封装一些读取数据的功能函数

# 读取一个字长度的数据(16位)
def readWord(adr):
    high = bus.read_byte_data(address, adr)
    low = bus.read_byte_data(address, adr+1)
    val = (high << 8) + low
    return val

# 将读取到的数据转换为原码 (有符号数本身是采用补码方式存储的)
def readWordReal(adr):
    val = readWord(adr)
    x = 0xffff
    # 首位为1 表示是负数
    if (val >= 0x8000):
        # 求原码
        return -((x - val)+1)
    else:
        return val

# 已知加速度求角度值
def dist(a, b):
    return math.sqrt((a*a)+(b*b))

def getRotationX(x, y, z):
    radians = math.atan2(y, dist(x,z))
    return math.degrees(radians)

def getRotationY(x, y, z):
    radians = math.atan2(x, dist(y,z))
    return math.degrees(radians)

# 设置电源模式
bus.write_byte_data(address, power_regist, 0)


while True:
    time.sleep(0.5)
    print("螺旋仪数据-----------")
    gyroX = readWordReal(0x43)
    gyroY = readWordReal(0x45)
    gyroZ = readWordReal(0x47)

    print("X轴陀螺仪原始数据:", gyroX, "X轴每秒旋转度数:", gyroX/131)
    print("Y轴陀螺仪原始数据:", gyroY, "Y轴每秒旋转度数:", gyroY/131)
    print("Z轴陀螺仪原始数据:", gyroZ, "Z轴每秒旋转度数:", gyroZ/131)

    print("加速度数据----------")
    accelX = readWordReal(0x3b)
    accelY = readWordReal(0x3d)
    accelZ = readWordReal(0x3f)

    print("X轴加速度原始数据:", accelX, "X轴加速度:", accelX/16384)
    print("Y轴加速度原始数据:", accelY, "Y轴加速度:", accelY/16384)
    print("Z轴加速度原始数据:", accelZ, "Z轴加速度:", accelZ/16384)

    print("摄氏温度数据--------")
    temp = readWordReal(0x41)
    print("温度原始数据:", temp, "摄氏度:", temp/340 + 36.53)

    print("旋转家角度数据-------")
    print("X轴旋转度数:", getRotationX(accelX/16384, accelY/16384, accelZ/16384))
    print("Y轴旋转度数:", getRotationX(accelX/16384, accelY/16384, accelZ/16384))




Führen Sie den obigen Code auf dem Raspberry Pi aus, und der Effekt ist wie unten gezeigt:

Konzentrieren Sie sich auf Technologie, verstehen Sie Liebe, seien Sie bereit zu teilen, seien Sie ein Freund

QQ:316045346

{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/2340880/blog/5287674
Empfohlen
Rangfolge