【发布时间】:2020-06-17 01:55:27
【问题描述】:
我正在尝试通过 Ubuntu-16.04 上的 I²C 接口使用 BH170FVI sensor。我的董事会是UpSquared 而不是 Raspberry。
为了能够使用i2c接口,我安装了i2c-tools。我之前也用这个工具控制了BMI160 sensor,没有遇到问题。
当我尝试在终端上使用以下命令检测我的传感器时:
i2cdetect -r -y 5
此命令正确检测到我的传感器,如下所示:
看来我的设备地址是0x23。
之后,当我尝试通过命令读取所有寄存器映射数据时:
i2cdump -y -f 5 0x23
结果是:
问题是所有地图地址都为零。其中至少有一个应读取光量。我以为传感器电源可能会关闭,但我尝试使用命令i2cset 开机,但仍然没有任何变化。
注意:我的传感器没有问题,因为我使用 Arduino 以及以下代码进行了尝试:
#!/usr/bin/python
import smbus
import time
# Define some constants from the datasheet
DEVICE = 0x23 # Default device I2C address
POWER_DOWN = 0x00 # No active state
POWER_ON = 0x01 # Power on
RESET = 0x07 # Reset data register value
ONE_TIME_HIGH_RES_MODE = 0x20
bus = smbus.SMBus(1) # Rev 2 Pi uses 1
def convertToNumber(data):
# Simple function to convert 2 bytes of data
# into a decimal number
return ((data[1] + (256 * data[0])) / 1.2)
def readLight(addr=DEVICE):
data = bus.read_i2c_block_data(addr,ONE_TIME_HIGH_RES_MODE)
return convertToNumber(data)
def main():
while True:
print "Light Level : " + str(readLight()) + " lux"
time.sleep(0.5)
if __name__=="__main__":
main()
我的问题是为什么我无法通过i2c-tools 控制我的传感器。
【问题讨论】:
-
像这样从用户空间使用传感器是一种错误的方法。正确的是依赖内核驱动,本例中为:elixir.bootlin.com/linux/latest/source/drivers/iio/light/…。
-
由于您拥有基于 ACPI 的平台,因此您需要使用 SSDT 覆盖在您的配置中启用传感器。在此处查看更多信息:stackoverflow.com/questions/46095840/…、stackoverflow.com/questions/54768841/… 和 stackoverflow.com/questions/39118721/…
-
@0andriy 我检查了你的链接,但不幸的是我不太擅长这些平台。我所需要的只是能够像我共享的 Python 代码那样读取传感器数据。但是我需要 C/C++ 中的代码,当我搜索时,我明白我不能像这样将 smbus 与 c/c++ 一起使用。我需要一个简单的 c/c++ 代码,比如 python 代码来读取数据。 This link 我也无法运行许多未定义库的 cos。如果您可以共享一个简单的代码来读取数据,我会接受您的回答。感谢您的帮助。
-
许多未定义的库是什么意思?您是否尝试在用户空间中编译它?!不,我说的是在用户空间中使用它,因为它是一个内核驱动程序。为此需要
libiio(当然可以通过 sysfs 简单地做到这一点,尽管它不那么方便)。总结:内核驱动程序(已经在上游)在 ACPI 的帮助下将为您带来 IIO 标准 ABI 到用户空间,在libiio的(可选)帮助下,您可以获得传感器数据。这就是它应该走的路。 -
@0andriy 感谢您的建议。我不熟悉这些问题,我认为最好从头开始。你能告诉我一个关于我的问题的链接吗?我检查并尝试了上面的链接,但由于缺乏知识,我无法继续。谢谢
标签: linux x86 i2c light-sensor upsquared