Доброго времени суток не подскажите как считать данные с дальномера 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) результат печатает нулевой
Я не могу понять что нужно прописать во write(id, ) я читал про api на этот датчик только не могу понять как отправлять команды пробовал заключать их в ковычки write(id,'VL53L0X_PerformSingleRangingMeasurement()') и просто прописовать write(id,VL53L0X_PerformSingleRangingMeasurement()) но эфекта ноль, а API команды взял с документации
https://nodemcu.readthedocs.io/en/dev/modules/i2c/ Там есть полный пример чтения: "function read_reg(...)" И для чтения, кроме адреса устройства, нужен адрес ячейки, из которой начинать читать данные и сколько байт надо читать. Все это в документации.
попробовал разобраться с протоколом 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: Спойлер: API функции Функция VL53L0X_DataInit() вызывается один раз и выполняет инициализацию устройства. Вызывается один раз и только один раз после вывода устройства из состояния сброса. Функция VL53L0X_PerformSingleRangingMeasurement() запускает измерение, ожидает готовности данных (путем опроса состояния ранжирования или состояния прерывания) и сообщает данные. Эта функция также очищает прерывание после измерения Функция VL53L0X_GetRangingMeasurementData() возвращает данные измерения дальности. . результат выполнения кода "результат n" не могу понят в кокую сторону копать
Вот еще в помощь: Интерфейсная шина IIC (I2C) | Электроника для всех (easyelectronics.ru) Дать комментарий к каждой строке кода - что она по-вашему делает. Без понимания каждого процесса не обойтись. Это если вы учитесь. Если решаете единственную задачу по изготовлению устройства - вам в "закажу проект". В частности, у вас: "i2c.read(id,100)" - пытается читать сто байт кода. Я такого еще не видел. "i2c.write(id,'VL53L0X_PerformSingleRangingMeasurement()')" - пытается писать безумную строку Понимаете, чтобы "изготовить" несколько правильных строк кода надо перелопатить документацию к вашей железке. Делать это можете только вы или кто-то по очень заинтересованный. Это не я точно.
Код (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))
Может подскажете на чем можно попрактиковаться по протоколу i2c чтобы в нем разобраться просто у меня только wcmcu531 на этом протоколе работает вот я под него и пытаюсь чтонибудь сотворить, но как выясниорсь не все так просто Еслиб мне была нужна готовая программа я бы ее давно на фрилансе заказал
https://www.st.com/resource/en/datasheet/vl53l0x.pdf Вам этот документ нужен, там есть все про регистры, в частности - п. 3. Логика очень простая. Я выше вам показал - обращаетесь к железке по адресу и указываете ей регистр из которого будете читать. Потом читаете определенное количество байт. Все до жути просто.
Ок, лайфхак. Не хотите читать даташит - находите подходящую ардуино библиотеку и смотрите ее. Там та-же логика - запись числа по адресу и чтение некоторого количества байт. Потом с ними что-то делают. Обладая элементарной сообразительностью можно понять и адреса и сколько байт читать.
Чтобы в чем-то попрактиковаться, нужны Книги и инструменты. Книг разных много, а для изучения протоколов нет ничего лучше, чем логический анализатор. Да и предмет изучения должен быть «народным», а не диковинным.