MPU-6050 motion sensor
The MPU-6050 (on the ubiquitous GY-521 breakout) packs a three-axis accelerometer and a three-axis gyroscope into one chip for $6. It talks I²C at 0x68 — 0x69 when AD0 is high — reports tilt through gravity and rotation through angular rate, and also has a temperature sensor on board. There is no humidity or magnetometer here; XDA/XCL exist so an external magnetometer can be chained to it, and INT can signal events to a GPIO.
Pins
| Pin | What it is | Type |
|---|---|---|
| VCC | Supply 3.3–5 V (on-board regulator) | power |
| GND | Ground | ground |
| SCL | I²C clock | io |
| SDA | I²C data | io |
| XDA | Auxiliary I²C data (for a magnetometer) | io |
| XCL | Auxiliary I²C clock | io |
| AD0 | Address select: low 0x68, high 0x69 | io |
| INT | Interrupt output | io |
In circuit.py:
MPU6050()— MPU-6050 motion sensor — $6- Pins: 8
For most builds you need only VCC, GND, SDA, SCL and a decision about AD0. XDA, XCL and INT can be left unconnected.
Wiring it in circuit.py
from wiring import *
pi = Pi()
imu = MPU6050()
pi.V3_3 >> imu.vcc
imu.gnd >> pi.GND
pi.SDA >> imu.sda
pi.SCL >> imu.scl
imu.ad0 >> pi.GND # address 0x68The breakout has its own 3.3 V regulator, so it tolerates 5 V, but powering it from 3V3 keeps its I²C levels at 3.3 V too. The on-board I²C pull-ups are present on GY-521 boards. Grounding AD0 picks 0x68; wiring it to V3_3 moves the chip to 0x69.
Driving it in main.py
The simulator does not ship an Adafruit driver for the MPU-6050, but smbus2 is available and the registers are simple. Wake the chip first — out of reset it sleeps and every value reads zero:
from smbus2 import SMBus
from time import sleep
bus = SMBus(1)
bus.write_byte_data(0x68, 0x6B, 0) # PWR_MGMT_1 = 0: leave sleep mode
def word(register): # 16-bit registers are big-endian
raw = bus.read_i2c_block_data(0x68, register, 2)
return ((raw[0] << 8) | raw[1]) - (65536 if raw[0] & 0x80 else 0)
while True:
ax, ay, az = (word(0x3B + axis * 2) / 16384 for axis in range(3)) # ±2 g
print(f"accel {ax:+.2f} {ay:+.2f} {az:+.2f} g")
sleep(0.5)The acceleration registers start at 0x3B (X, Y, Z), temperature at 0x41 and gyro at 0x43. At the default ±2 g range, 16384 counts is one g; each axis is signed two's-complement, hence the word() helper. Real units are never perfectly still: average a few hundred samples while stationary and subtract them to calibrate.
Electrical notes
- Supply is 3–5.5 V (the GY-521 has a 3.3 V regulator and level shifting); the chip itself draws about 3.9 mA.
AD0low gives address 0x68, high gives 0x69.INTis a push-pull/active-high interrupt, configurable through the register map.- Sensitivity: accelerometer ±2/±4/±8/±16 g (16384/8192/4096/2048 LSB per g); gyroscope ±250/±500/±1000/±2000 °/s (131/65.5/32.8/16.4 LSB per °/s). Temperature is
raw / 340 + 36.53°C. - Typical zero offsets: about 0.05 g on the accelerometer and 2 °/s on the gyroscope, plus noise. The datasheet's registers let you trim them, or calibrate in software.
- It resets asleep (
PWR_MGMT_1bit 6 set). Writing 0 to 0x6B wakes it; writing 0x80 resets it.
Simulator vs real hardware
- Orientation comes from datafeed fields:
pitchDegandrollDegset the gravity vector the accelerometer sees;yawRateDpsand the rate of change of pitch and roll feed the gyroscope. In the Lab you can drive them by hand, with a wave, or with this computer's tilt. vibrationGadds shake to every axis with Gaussian noise, and each unit draws fixed zero offsets unless the feed'soffsetsknob is set tonone— which is handy when checking calibration code.- Registers are sampled at the instant you read them; while the chip sleeps they hold all zeros, matching the wake-first requirement above.
- There is no FIFO, DMP, interrupt routing or magnetometer emulation:
INT,XDAandXCLare wired but inert. No self-test, no temperature drift beyond the modelled noise.
Going deeper
- Primer: I²C, SPI, UART and 1-Wire; the smbus2 notes cover block reads.
- Same bus, easier driver: BME280 weather sensor — full library, no register juggling.
- Distance and motion detection on a GPIO instead: HC-SR04, PIR.
Further reading
- MPU-6000/6050 product specification (PS-MPU-6000A) — ranges, noise and electrical tables.
- MPU-6000/6050 register map (RM-MPU-6000A) — every register used above.
- smbus2 documentation —
write_byte_dataandread_i2c_block_data.