Всем хорошего дня.
Возник вопрос с датчиками tof из сабжа. Есть проект в котором используются указанные датчики типа 0cx и 4cd, нормально работают. Но возникла необходимость работы проекта при низких температурах. По даташиту датчики работают до -30. И в районе этой температуры реально начинают подвисать. По обращению за расстоянием по библиотечной функции не приходит ответ по I2C и поток виснет. При несёте контроллера датчики нормально переинициализируются и работают некоторое, достаточно долгое время.
Сделал перед каждым запросом прерывание по таймеру, но, проблема - датчики по той же процедуре что и при первой инициализации не заводятся :(. В библиотеке вроде есть вызов . end() но это не деструктор, а баловство. Xshut’ы понятно дергаю, но чото не хочет.
Как победить? Ребутать MCU вариант не нравится((
Информации мало, а потому, скорее всего скажу мимо, но тут Вы сам себе буратино.
то, кто мешает Вам их полностью переинициализировать?
- уничтожить объект, связанный с датчиком;
- выключить, питание датчика; (никто же не мешает его через транзистор кормить)
- включить питание датчика;
- создать новый объект, связанный с датчиком.
Если перезагрузка контроллера действительно помогает, то это не может не работать.
Вполне правильно меня поняли. Интересует именно первый пункт. По остальным пунктам там идет управление через пин xshut датчика, собственно они нормально по нему сбрасываются без сброса питания т.к. если ресетнуть mcu не дергая питание, датчики успешно переинициализируются.
Так вот по первому пункту… Код пишу в Arduino ide последняя версия (или близко). Библиотеки официальные stm’овские. Может на датчики не совсем оф, но на базе официальных сишных либ сотрудниками стм.
Я и сам это считал наиболее вероятным, и вы подтвердили - не знаю как уничтожить созданный объект (класс VL53L0CX например). При первичной инициализации есть процедуры .begin() и .InitSensor(i2cAddr), которые успешно отрабатывают. Так же есть процедура .end(), но при повторной инициализации ее добавление не помогает.
Сейчас пришла мысль что объект при первичной инициализации меняет параметр i2c адреса, возможно после сброса датчика надо и адрес объекта на дефолтный исправить.
Ну и ткните носом как в ардуине правильно объекты классов чистить…
А что заглянуть в исходники сложено ?
Для начала, покажите как Вы его создаёте. Тогда и поговорим как уничтожать.
@WaRLoC
Ссылку на библиотеку датчика?
Сейчас кода под рукой нет. А так объявляется объект типа : VL53L0X Sensor(i2c, xShut_pin);
Потом в сетапе ложу все пины xShut всех датчиков и по очереди
Sensor.begin();
Sensor.InitSensor(NewI2CAddr);
С проверками статусов и все такое…
Но сейчас пересмотрел либы и думаю что все проще, деструктора в либах нет, но для повторной инициализации нужно текущий I2C адрес датчика сбросить до дефолтного. Чуть поправить либы чтоб значения пинаxShut и текущего адреса из protected в public перевести и вперед.
@MMM
Это для датчика vl53l4cd
Для vl53l0x:
Но принципиально там похоже
Ну, простейший способ его полностью удалить, это создать динамически,
VL53L0X * Sensor = new VL53L0X (i2c, xShut_pin);
а потом воспользоваться операцией delete
.
delete Sensor;
Хотя, это жёсткая мера (ultima ratio – когда ничто другое не помогает), но не работать это не может. Если можете без этого обойтись, лучше обойтись.
Надеюсь объект Sensor каждый раз разный: Sensor1, Sensor2 и так далее? Или все пины " по очереди" в один и тот же?
Для каждого физического датчика, отдельный объект :), иначе оно бы не работало. А оно работает)).
Это вот спасибо за наводку. В данном случае скорее всего получится без удаления объекта. Но были задачи где я репу чесал как удалить объект… Теперь знаю вариант
В общем вопрос решил созданием динамического объекта в куче по рекомендации @ЕвгенийП