Как получить данные BH1750 (датчик освещенности) через интерфейс I2 C с помощью инструментов i2 c - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь использовать датчик BH170FVI через интерфейс i2 c в Ubuntu-16.04. Моя доска UpSquared не малина.

Чтобы использовать интерфейс i2 c, я установил i2 c -tools. До этого я также управлял датчиком BMI160 с помощью этого инструмента, не сталкиваясь с проблемой.

Когда я пытался обнаружить свой датчик через клемму с помощью команды:

i2cdetect -r -y 5

This Команда правильно определяет мой датчик, как показано ниже:

enter image description here

Как кажется, адрес моего устройства - 0x23.

После этого, когда я попытался прочитать все данные карты регистров с помощью команды:

i2cdump -y -f 5 0x23

Результат:

enter image description here

Проблема в том, что все адреса на карте равны нулю. По крайней мере один из них должен прочитать легкое количество. Я думал, что питание датчика может отключиться, но я попытался использовать команду 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()

Мой вопрос заключается в том, почему я не могу управлять своим датчиком через i2ctools.

1 Ответ

1 голос
/ 06 марта 2020

Я думаю, что @ 0andriy прав. Вам нужен драйвер, библиотека для его сопряжения (подробнее в «официальной» пользовательской документации для libiio ), с привязками python в вашем случае и некоторой конфигурацией. В пользовательском пространстве вы можете использовать mraa / upm, но его нет в вашей Ubuntu, поэтому вам нужно его собрать.

Предложенный ответ - использовать драйвер в ядре, создать небольшую таблицу acpi, которая сообщает ядро, какое устройство найти по адресу 0x23 на шине 5. А затем вы используете привязки python-libiio или libiio 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 приведены в комментариях, т.е. добавление Клиентские устройства i2 c на x86_64 , Сборка контроллера устройств i2 c и spidev Linux на плате Intel Atom содержит дополнительную информацию о том, как скомпилировать и подключить приведенная выше таблица для вашей системы.

...