I am trying to use a Beaglebone Wireless (debian image 2017-07-01) to read
values from an HMC5883L Magnetometer.
The device is connected through I2C2 (pins P9_19 and P9_20). The address
for the device is 0x68.
I know the device is connected since I can see it by using i2cdetect as
shown below:
However, whenever I run my python code to read the values, I get messages
that the bone is having errors accessing the adresses.
As with most of my problems with the BBBW, the code works fine on an older
bone (debian image 2015-11-12).
My faith in Beagleboard dwindles by the minute.
Here is the python code, first is my main file:
from time import sleep
import os
import hmcCl
sensor = hmcCl.hmc()
sensor.setConfig()
count = 0
while True:
count += 1
x = 0
y = 0
z = 0
he = 0
os.system("clear")
x, y, z = sensor.getAvgRead(5)
print("X: {} Y: {} Z: {} Count: {}".format(x,y,z, count))
print(sensor.getDirection())
sleep(.2)
Next is the object file (hmcCl.py):
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"
Any help into this matter is greatly appreciated.
Thanks,
Tomas
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/beagleboard/5ba269c0-78d2-4ccc-8859-dc6f24b8e604%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.