【问题标题】:How to get data of BH1750 (light sensor) via on I2C interface using i2c-tools如何使用 i2c-tools 通过 I2C 接口获取 BH1750(光传感器)的数据
【发布时间】: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


【解决方案1】:

我认为@0andriy 是对的。你需要一个驱动程序,一个库来连接它(更多细节在"official" user documentation for libiio),在你的情况下使用python绑定和一些配置。在用户空间中,您可以使用 mraa/upm,但它不在您的 Ubuntu 中,因此您需要构建它。

建议的答案是使用内核中的驱动程序,创建一个小的 ACPI 表,告诉内核在总线 5 上的地址 0x23 上找到哪个设备。然后使用 python-libiiolibiio C++ 绑定来访问设备。可以加载到内核中的 ACPI 表示例(提示:通过 ConfigFS)在这里https://github.com/westeri/meta-acpi/tree/master/recipes-bsp/acpi-tables/samples

在你的情况下,它会是这样的:

DefinitionBlock ("bh1750.aml", "SSDT", 5, "", "BH1750", 1)
{
    External (_SB_.PCI0.I2C5, DeviceObj) // Define Correct I2C controller
    Scope (\_SB.PCI0.I2C5)
    {
        Device (ALS0)
        {
            Name (_HID, "PRP0001")
            Name (_DDN, "ROHM BH1750FVI ambient light sensor")
            Name (_CRS, ResourceTemplate () {
                    I2cSerialBus (
                            0x23,                   // I2C Address
                            ControllerInitiated, 
                            400000,                 // Bus Speed
                            AddressingMode7Bit,     
                            "\\_SB.PCI0.I2C5",
                            0x00,
                            ResourceConsumer,,)
            }
            Name (_DSD, Package () {
                ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
                Package () {
                    Package () {"compatible", "rohm,bh1750"},
                }
            })
        }
    }
}

...假设控制器的路径是\\_SB_.PCI0.I2C5(您可以在 DSDT 中找到它)。

@0andriy 在 cmets 中提供的链接,即 adding i2c client devices on x86_64Building a i2c device controller spidev Linux driver on Intel Atom board 提供了如何编译上表并将其附加到您的系统的其他信息。

【讨论】:

  • 如果我想用作mraa/upm,如何使用?
【解决方案2】:

据我所知,使用 i2c-tools 是不可能做到这一点的。问题是您需要从 BH1750 读取测量结果的方式。见数据表:

S Adr Rd (A) (Data) A (Data) NA P

您无法使用 i2c-tools 创建这样的序列:

  • 任一字节无寄存器地址
  • n 个字节,但你必须提供一个寄存器地址

两者都会导致 I2C 命令序列不是芯片想要的。

它在用户空间的 C 语言中为我工作。 在这里查看我的问题:

Read a word (2 byte) without providing a register address from userspace

【讨论】:

    猜你喜欢
    • 2018-12-06
    • 2020-09-13
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多