import time
|
|
import math
|
|
import board
|
|
import busio
|
|
import adafruit_lsm9ds1
|
|
from glitterpos_util import map_range
|
|
|
|
i2c = busio.I2C(board.SCL, board.SDA)
|
|
compass = adafruit_lsm9ds1.LSM9DS1_I2C(i2c)
|
|
|
|
def calibrate_compass(compass):
|
|
mag_min = [1000, 1000, 1000]
|
|
mag_max = [-1000, -1000, -1000]
|
|
|
|
print("Magnetometer Calibration")
|
|
|
|
lastDisplayTime = time.monotonic()
|
|
while True:
|
|
x, y, z = compass.magnetometer
|
|
mag_vals = [x, y, z]
|
|
for i in range(3):
|
|
mag_min[i] = min(mag_min[i], mag_vals[i])
|
|
mag_max[i] = max(mag_max[i], mag_vals[i])
|
|
|
|
# Display once every three seconds:
|
|
if (time.monotonic() - lastDisplayTime >= 3):
|
|
print("Uncalibrated:", x, y, z)
|
|
cal_x = map_range(x, mag_min[0], mag_max[0], -1, 1)
|
|
cal_y = map_range(y, mag_min[1], mag_max[1], -1, 1)
|
|
cal_z = map_range(z, mag_min[2], mag_max[2], -1, 1)
|
|
print("Calibrated: ", cal_x, cal_y, cal_z)
|
|
print("MAG_MIN =", mag_min)
|
|
print("MAG_MAX =", mag_max)
|
|
|
|
compass_heading = (math.atan2(cal_y, cal_x) * 180) / math.pi
|
|
if compass_heading < 0:
|
|
compass_heading += 360
|
|
print("Heading: ", compass_heading)
|
|
print("----")
|
|
|
|
lastDisplayTime = time.monotonic();
|
|
|
|
calibrate_compass(compass)
|