Как считать данные по i2c на lua

Тема в разделе "ESP8266, ESP32", создана пользователем BlakSoft, 7 ноя 2022.

  1. BlakSoft

    BlakSoft Нуб

    Доброго времени суток не подскажите как считать данные с дальномера WCMCU-531 (по протоколу I2C) с помощью nodemcu v2 lua на esp8266
    у меня выдает пустой результат
    Подключение
    NODEMCU ------ WCMCU-531
    3,3V ---------------------VCC
    GND ---------------------GND
    D2 ------------------------ SCL
    D1 ------------------------- SDA

    пример кода (lua)
    Узнаем адрес датчика
    Код:
    Код (Text):

    id =0
    sda=1
    scl=2

    i2c.setup(id,sda,scl,i2c.SLOW)

    for i=0,127 do
    i2c.start(id)
    print(string.format("%20x",i),i2c.address(id,i,i2c.TRANSMITTER))
    i2c.stop(id)
    end
     
    Читаем данные с датчика (адрес датчика 0x29 нашел сканером)
    Код:
    Код (Text):

    id=0
    sda=1
    scl=2

    i2c.setup(id,sda,scl,i2c.SLOW)

    i2c.start(id)
    i2c.address(id,0x29,i2c.RECEIVER)
    c = i2c.read(id,100)
    i2c.stop(id)
    print(c)
     
    результат печатает нулевой
     
  2. ИгорьК

    ИгорьК Гуру

    Почитайте документацию, прежде чем на шине i2c делать read() следует обязательно вызвать write()
     
  3. BlakSoft

    BlakSoft Нуб

    Я не могу понять что нужно прописать во write(id, )
    я читал про api на этот датчик только не могу понять как отправлять команды
    пробовал заключать их в ковычки
    write(id,'VL53L0X_PerformSingleRangingMeasurement()')
    и просто прописовать
    write(id,VL53L0X_PerformSingleRangingMeasurement())
    но эфекта ноль,
    а API команды взял с документации
     

    Вложения:

    • api-vl53lox.pdf
      Размер файла:
      901,9 КБ
      Просмотров:
      147
  4. ИгорьК

    ИгорьК Гуру

    https://nodemcu.readthedocs.io/en/dev/modules/i2c/

    Там есть полный пример чтения:
    "function read_reg(...)"

    И для чтения, кроме адреса устройства, нужен адрес ячейки, из которой начинать читать данные и сколько байт надо читать.
    Все это в документации.
     
    Последнее редактирование: 7 ноя 2022
  5. BlakSoft

    BlakSoft Нуб

    попробовал разобраться с протоколом i2c (по ссылке выше)
    пример кода
    Код (Text):
    id = 0
    sda = 1
    scl = 2

    i2c.setup(id,sda,scl,i2c.FAST)

    i2c.start(id)
    i2c.address(id,0X29,i2c.TRANSMITTER)
    i2c.write(id,0)
    --i2c.write(id,'VL53L0X_DataInit()')
    i2c.write(id,'VL53L0X_PerformSingleRangingMeasurement()')
    --i2c.write(id,'VL53L0X_GetRangingMeasurementData()')
    i2c.stop(id)
    i2c.start(id)
    i2c.address(id,0X29,i2c.RECEIVER)
    r = i2c.read(id,100)
    i2c.stop(id)
    print(' результат '..r)
    функции API:
    Функция VL53L0X_DataInit() вызывается один раз и выполняет инициализацию устройства.
    Вызывается один раз и только один раз после вывода устройства из состояния сброса.
    Функция VL53L0X_PerformSingleRangingMeasurement() запускает измерение,
    ожидает готовности данных (путем опроса состояния ранжирования или состояния прерывания) и сообщает
    данные. Эта функция также очищает прерывание после измерения
    Функция VL53L0X_GetRangingMeasurementData() возвращает данные измерения дальности.
    .

    результат выполнения кода
    "результат n"
    не могу понят в кокую сторону копать
     
  6. ИгорьК

    ИгорьК Гуру

    Вот еще в помощь: Интерфейсная шина IIC (I2C) | Электроника для всех (easyelectronics.ru)

    Дать комментарий к каждой строке кода - что она по-вашему делает.
    Без понимания каждого процесса не обойтись. Это если вы учитесь. Если решаете единственную задачу по изготовлению устройства - вам в "закажу проект".

    В частности, у вас:
    "i2c.read(id,100)" - пытается читать сто байт кода. Я такого еще не видел.
    "i2c.write(id,'VL53L0X_PerformSingleRangingMeasurement()')" - пытается писать безумную строку

    Понимаете, чтобы "изготовить" несколько правильных строк кода надо перелопатить документацию к вашей железке. Делать это можете только вы или кто-то по очень заинтересованный. Это не я точно.
     
    parovoZZ нравится это.
  7. ИгорьК

    ИгорьК Гуру

    Код (Lua):
    id  = 0 -- По умолчанию
    sda = 1 -- Нога
    scl = 2 -- Нога

    -- initialize i2c, set pin 1 as sda, set pin 2 as scl
    i2c.setup(id, sda, scl, i2c.FAST)

    -- Функция: читать девайс_адрес и адрес_регистра из него
    function read_reg(id, dev_addr, reg_addr)
        i2c.start(id)
        -- указываем девайсу_по_адресу что будет запись
        i2c.address(id, dev_addr, i2c.TRANSMITTER)
        -- пишем адрес регистра, из которого будем читать
        i2c.write(id, reg_addr)
        i2c.stop(id)
        i2c.start(id)
        -- обращаемся по адресу девайса
        i2c.address(id, dev_addr, i2c.RECEIVER)
        -- читаем (здесь) 1 байт
        c = i2c.read(id, 1)
        i2c.stop(id)
        return c
    end

    -- читаем из регистра 0xAA от девайса по адресу 0x77
    reg = read_reg(id, 0x77, 0xAA)
    print(string.byte(reg))
     
  8. BlakSoft

    BlakSoft Нуб

    Может подскажете на чем можно попрактиковаться по протоколу i2c чтобы в нем разобраться
    просто у меня только wcmcu531 на этом протоколе работает вот я под него и пытаюсь чтонибудь сотворить, но как выясниорсь не все так просто
    Еслиб мне была нужна готовая программа я бы ее давно на фрилансе заказал
     
  9. ИгорьК

    ИгорьК Гуру

    https://www.st.com/resource/en/datasheet/vl53l0x.pdf

    Вам этот документ нужен, там есть все про регистры, в частности - п. 3.
    Логика очень простая. Я выше вам показал - обращаетесь к железке по адресу и указываете ей регистр из которого будете читать. Потом читаете определенное количество байт. Все до жути просто.
     
  10. ИгорьК

    ИгорьК Гуру

    Кстати: "and uses a device address of 0x52."
     
  11. ИгорьК

    ИгорьК Гуру

    Ок, лайфхак. Не хотите читать даташит - находите подходящую ардуино библиотеку и смотрите ее. Там та-же логика - запись числа по адресу и чтение некоторого количества байт. Потом с ними что-то делают.
    Обладая элементарной сообразительностью можно понять и адреса и сколько байт читать.
     
    DetSimen нравится это.
  12. DetSimen

    DetSimen Гуру

    У задающих такие вопросы, абычна, с этим бааальшые проблемы
     
  13. ИгорьК

    ИгорьК Гуру

    Все с чего-то начинают, новички, обычно, не знают с какой стороны подойти. Сам таким был.
     
  14. parovoZZ

    parovoZZ Гуру

    Чтобы в чем-то попрактиковаться, нужны Книги и инструменты. Книг разных много, а для изучения протоколов нет ничего лучше, чем логический анализатор. Да и предмет изучения должен быть «народным», а не диковинным.
     
  15. Рокки1945

    Рокки1945 Гуру

    - надо взять на вооружение