from Adafruit_I2C import Adafruit_I2C
import math
class hmc:
def __init__(self):
self.hmc = Adafruit_I2C(0x1E)
self.debug = False
self.address = 0x1E
self.readingList = [0, 0, 0]
self.maxList = [0, 0, 0]
self.minList = [0, 0, 0]
self.mpu = Adafruit_I2C(0x68)
def setConfig(self, mode=0x00):
self.mpu.write8(0x6B, 0) #MPU6050 Power Management_1 Register
self.mpu.write8(0x6A, 0) #MPU6050 USER_CTRL Register: Disables FIFO Buffer
self.mpu.write8(0x37, 2) #MPU6050 INT_PIN_CFG Register: Enables I2C Bypass
self.hmc.write8(0x00, 0x70) #Config Reg A: Frequency of measurement = 15Hz
self.hmc.write8(0x01, 0xA0) #Config Reg B: Gain = 5
self.hmc.write8(0x02, mode) #Mode Register
return True
def readMag(self):
retList = []
regList = [0x03, 0x04, 0x07, 0x08, 0x05, 0x06]
for i in range(0, len(regList), 2):
msb = self.hmc.readS8(regList[i])
lsb = self.hmc.readS8(regList[i+1])
retVal = (msb<<8) | lsb
retList.append(retVal)
for j in range(0, len(retList)):
self.readingList[j] = retList[j]
if retList[j] > self.maxList[j]:
self.maxList[j] = retList[j]
if retList[j] < self.minList[j]:
self.minList[j] = retList[j]
return True
def getAvgRead(self, samples):
xRead = 0
yRead = 0
zRead = 0
for i in range(0, samples):
if self.readMag():
xRead += self.readingList[0]
yRead += self.readingList[1]
zRead += self.readingList[2]
else:
print("Error")
xRead = xRead / samples
yRead = yRead / samples
zRead = zRead / samples
return xRead, yRead, zRead
def relativeRead(self, axis, reading):
#Takes the max and min of a given axis and finds 1/8 of that distance than
#checks the given number to see if it is within that range of the max or min
range = (self.maxList[axis] - self.minList[axis]) / 4
if (reading + range) > self.maxList[axis]:
return "High"
elif(reading - range) < self.minList[axis]:
return "Low"
else:
return False
def getDirection(self):
xMax = self.maxList[0]
yMax = self.maxList[1]
self.readMag()
if self.readingList[0] > self.readingList[1]:
if self.relativeRead(0, self.readingList[0]) == "High":
return "North"
elif self.relativeRead(1, self.readingList[1]) == "Low":
return "East"
elif self.readingList[1] > self.readingList[0]:
if self.relativeRead(1, self.readingList[1]) == "High":
return "West"
elif self.relativeRead(0, self.readingList[0]) == "Low":
return "South"
else:
return "N/A"