From ae5451269a3181e76f0f66f9607d5f5a33530c53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rcio=20Alencar?= Date: Mon, 5 Apr 2021 02:24:14 -0400 Subject: [PATCH] Power management methods 1. Sleep: Disable readings 2. Wakeup: Clear registers and enable readings --- README.md | 17 ++++++++++++++--- mpu6050.py | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9524188..251e682 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,20 @@ example usage: >>>from machine import I2C, Pin >>>import mpu6050 >>>i2c = I2C(scl=Pin(5), sda=Pin(4)) ->>>accelerometer = mpu6050.accel(i2c) ->>>accelerometer.get_values() -{'GyZ': -235, 'GyY': 296, 'GyX': 16, 'Tmp': 26.64764, 'AcZ': -1552, 'AcY': -412, 'AcX': 16892} +>>>imu = mpu6050.accel(i2c) +>>> imu.get_values() +{'GyZ': -60, 'GyY': -68, 'GyX': 2, 'Tmp': 33.04765, 'AcZ': 16048, 'AcY': 44, 'AcX': -952} +>>> imu.sleep() +>>> imu.get_values() +{'GyZ': -38, 'GyY': 56, 'GyX': -38, 'Tmp': 33.00059, 'AcZ': 15824, 'AcY': -40, 'AcX': -708} +>>> imu.get_values() +{'GyZ': -38, 'GyY': 56, 'GyX': -38, 'Tmp': 33.00059, 'AcZ': 15824, 'AcY': -40, 'AcX': -708} +>>> imu.wakeup() +>>> imu.get_values() +{'GyZ': -28, 'GyY': 59, 'GyX': -44, 'Tmp': 32.85941, 'AcZ': 15948, 'AcY': -76, 'AcX': -852} ``` Accelerometer/Gyroscope values are in int16 range (-32768 to 32767) If the mpu6050 loses power, you have to call __init__() again + +Source: https://github.com/adamjezek98/MPU6050-ESP8266-MicroPython + diff --git a/mpu6050.py b/mpu6050.py index 3576618..800f86c 100644 --- a/mpu6050.py +++ b/mpu6050.py @@ -40,6 +40,29 @@ def get_values(self): return vals # returned in range of Int16 # -32768 to 32767 + def sleep(self): + self.iic.start() + self.iic.writeto_mem(self.addr, 0x6B, b'\x40') + self.iic.stop() + + def wakeup(self): + from time import sleep + self.iic.start() + self.iic.writeto_mem(self.addr, 0x6B, b'\x80') + self.iic.stop() + sleep(0.05) + self.iic.start() + self.iic.writeto_mem(self.addr, 0x68, b'\x07') + self.iic.stop() + sleep(0.05) + self.iic.start() + self.iic.writeto_mem(self.addr, 0x68, b'\x00') + self.iic.stop() + sleep(0.05) + self.iic.start() + self.iic.writeto_mem(self.addr, 0x6B, b'\x00') + self.iic.stop() + def val_test(self): # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC from time import sleep while 1: