mpu9250: add MPU6500 (#5767)

Signed-off-by: Yifei Ding <yifeiding@protonmail.com>
This commit is contained in:
Yifei Ding 2022-11-19 06:58:24 -08:00 committed by GitHub
parent 8a06528747
commit d17ef95a3c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 111 additions and 23 deletions

View File

@ -1640,13 +1640,14 @@ cs_pin:
### [mpu9250]
Support for mpu9250 and mpu6050 accelerometers (one may define any
number of sections with an "mpu9250" prefix).
Support for MPU-9250, MPU-9255, MPU-9255, MPU-6050, and MPU-6500
accelerometers (one may define any number of sections with an
"mpu9250" prefix).
```
[mpu9250 my_accelerometer]
#i2c_address:
# Default is 104 (0x68).
# Default is 104 (0x68). If AD0 is high, it would be 0x69 instead.
#i2c_mcu:
#i2c_bus:
#i2c_speed: 400000

View File

@ -18,6 +18,31 @@ that it has a voltage regulator and a level shifter.
### Wiring
An ethernet cable with shielded twisted pairs (cat5e or better) is recommended
for signal integrety over a long distance. If you still experience signal integrity
issues (SPI/I2C errors), shorten the cable.
Connect ethernet cable shielding to the controller board/RPI ground.
***Double-check your wiring before powering up to prevent
damaging your MCU/Raspberry Pi or the accelerometer.***
#### SPI Accelerometers
Suggested twisted pair order:
```
GND+MISO
3.3V+MOSI
SCLK+CS
```
##### ADXL345
**Note: Many MCUs will work with an ADXL345 in SPI mode(eg Pi Pico), wiring and
configuration will vary according to your specific board and avaliable pins.**
You need to connect ADXL345 to your Raspberry Pi via SPI. Note that the I2C
connection, which is suggested by ADXL345 documentation, has too low throughput
and **will not work**. The recommended connection scheme:
@ -31,25 +56,46 @@ and **will not work**. The recommended connection scheme:
| SDA | 19 | GPIO10 (SPI0_MOSI) |
| SCL | 23 | GPIO11 (SPI0_SCLK) |
An alternative to the ADXL345 is the MPU-9250 (or MPU-6050). This
accelerometer has been tested to work over I2C on the RPi at 400kbaud.
Recommended connection scheme for I2C:
| MPU-9250 pin | RPi pin | RPi pin name |
|:--:|:--:|:--:|
| 3V3 (or VCC) | 01 | 3.3v DC power |
| GND | 09 | Ground |
| SDA | 03 | GPIO02 (SDA1) |
| SCL | 05 | GPIO03 (SCL1) |
Fritzing wiring diagrams for some of the ADXL345 boards:
![ADXL345-Rpi](img/adxl345-fritzing.png)
#### I2C Accelerometers
Double-check your wiring before powering up the Raspberry Pi to prevent
damaging it or the accelerometer.
Suggested twisted pair order:
```
3.3V+SDA
GND+SCL
```
##### MPU-9250/MPU-9255/MPU-6515/MPU-6050/MPU-6500
Alternatives to the ADXL345 are MPU-9250/MPU-9255/MPU-6515/MPU-6050/MPU-6500.
These accelerometers have been tested to work over I2C on the RPi or RP2040(pico)
at 400kbaud.
Recommended connection scheme for I2C on the Raspberry Pi:
| MPU-9250 pin | RPi pin | RPi pin name |
|:--:|:--:|:--:|
| VCC | 01 | 3.3v DC power |
| GND | 09 | Ground |
| SDA | 03 | GPIO02 (SDA1) |
| SCL | 05 | GPIO03 (SCL1) |
![MPU-9250 connected to RPI](img/mpu9250-PI-fritzing.png)
Recommended connection scheme for I2C(i2c0a) on the RP2040:
| MPU-9250 pin | RP2040 pin | RPi pin name |
|:--:|:--:|:--:|
| VCC | 39 | 3v3 |
| GND | 38 | Ground |
| SDA | 01 | GP0 (I2C0 SDA) |
| SCL | 02 | GP1 (I2C0 SCL) |
![MPU-9250 connected to PICO](img/mpu9250-PICO-fritzing.png)
### Mounting the accelerometer
@ -96,10 +142,13 @@ Afterwards, check and follow the instructions in the
[RPi Microcontroller document](RPi_microcontroller.md) to setup the
"linux mcu" on the Raspberry Pi.
#### Configure ADXL345 With RPi
Make sure the Linux SPI driver is enabled by running `sudo
raspi-config` and enabling SPI under the "Interfacing options" menu.
For the ADXL345, add the following to the printer.cfg file:
Add the following to the printer.cfg file:
```
[mcu rpi]
serial: /tmp/klipper_host_mcu
@ -115,9 +164,12 @@ probe_points:
It is advised to start with 1 probe point, in the middle of the print bed,
slightly above it.
For the MPU-9250, make sure the Linux I2C driver is enabled and the baud rate is
#### Configure MPU-6000/9000 series With RPi
Make sure the Linux I2C driver is enabled and the baud rate is
set to 400000 (see [Enabling I2C](RPi_microcontroller.md#optional-enabling-i2c)
section for more details). Then, add the following to the printer.cfg:
```
[mcu rpi]
serial: /tmp/klipper_host_mcu
@ -132,6 +184,28 @@ probe_points:
100, 100, 20 # an example
```
#### Configure MPU-6000/9000 series With PICO
PICO I2C is set to 400000 on default. Simply add the following to the
printer.cfg:
```
[mcu pico]
serial: /dev/serial/by-id/<your PICO's serial ID>
[mpu9250]
i2c_mcu: pico
i2c_bus: i2c1a
[resonance_tester]
accel_chip: mpu9250
probe_points:
100, 100, 20 # an example
[static_digital_output pico_3V3pwm] # Improve power stability
pin: pico:gpio23
```
Restart Klipper via the `RESTART` command.
## Measuring the resonances
@ -158,6 +232,9 @@ is some other ID, it is indicative of the connection problem with ADXL345,
or the faulty sensor. Double-check the power, the wiring (that it matches
the schematics, no wire is broken or loose, etc.), and soldering quality.
**If you are using MPU-6000/9000 series accelerometer and it show up as `mpu-unknown`, use with
caution! They are probably refurbished chips!**
Next, try running `MEASURE_AXES_NOISE` in Octoprint, you should get some
baseline numbers for the noise of accelerometer on the axes (should be
somewhere in the range of ~1-100). Too high axes noise (e.g. 1000 and more)

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@ -9,8 +9,16 @@ from . import bus, motion_report, adxl345
MPU9250_ADDR = 0x68
MPU9250_DEV_ID = 0x73
MPU6050_DEV_ID = 0x68
MPU_DEV_IDS = {
0x74: "mpu-9515",
0x73: "mpu-9255",
0x71: "mpu-9250",
0x70: "mpu-6500",
0x68: "mpu-6050",
#everything above are normal MPU IDs
0x75: "mpu-unknown (DEFECTIVE! USE WITH CAUTION!)",
0x69: "mpu-unknown (DEFECTIVE! USE WITH CAUTION!)",
}
# MPU9250 registers
REG_DEVID = 0x75
@ -189,12 +197,14 @@ class MPU9250:
# In case of miswiring, testing MPU9250 device ID prevents treating
# noise or wrong signal as a correctly initialized device
dev_id = self.read_reg(REG_DEVID)
if dev_id != MPU9250_DEV_ID and dev_id != MPU6050_DEV_ID:
if dev_id not in MPU_DEV_IDS.keys():
raise self.printer.command_error(
"Invalid mpu9250/mpu6050 id (got %x).\n"
"Invalid mpu id (got %x).\n"
"This is generally indicative of connection problems\n"
"(e.g. faulty wiring) or a faulty chip."
% (dev_id))
else:
logging.info("Found %s with id %x"% (MPU_DEV_IDS[dev_id], dev_id))
# Setup chip in requested query rate
self.set_reg(REG_PWR_MGMT_1, SET_PWR_MGMT_1_WAKE)
self.set_reg(REG_PWR_MGMT_2, SET_PWR_MGMT_2_ACCEL_ON)