Помогите, пожалуйста, разобраться - при работе через библиотеку @amperka/proximity с датчиком приближения и освещенности периодически возникают ошибки ("Uncaught InternalError: Timeout on I2C Read Receive") с зависанием на секунду, иногда не вызывается callback-функция VL6180X.range(callback), а при резком изменении расстояния до препятствия (быстро провести рукой рядом с датчиком) - значения value, приходящие в .range(function(error, value) "залипают" на одном и том же значении и не изменяются... Пробовал понизить скорость работы I2C с 400к до 100к - не помогло. Контакты проверял. Питать пробовал и с полностью заряженного аккумулятора и по USB от компьютера - не помогает. Складывается впечатление, что в коде библиотеки что-то где-то не хорошо...
Код программы: Код (Javascript): var myIntervalID; var libButton = require('@amperka/button'); var libLed = require('@amperka/led'); var redButton = libButton.connect(P0, {holdTime: 0.8}); var redLed = libLed.connect(P1); //---------------------------------------------------------------------------------------------------------------------- /* P11 - ультразвук - ECHO P12 - ультразвук - TRIG частота опроса датчика - не более 20ГЦ (цикл измерения - до 50 мс) */ var echoSensorVal = 0; var echoSensorErr = ''; var MAX_ECHO_DIST = 5000; // максимальная измеряемая дистанция ультразвукового датчика var sonic = require('@amperka/ultrasonic'); var echoSensor = sonic.connect({trigPin: P12, echoPin: P11}); // ультразвуковой датчик var echoTimerID; // таймер для считывания показаний ультразвуковых датчиков var onEchoTimer = function () { echoSensor.ping( function (err, value) { echoSensorErr = ''; echoSensorVal = MAX_ECHO_DIST; if (err) { echoSensorErr = err.msg; } else { echoSensorVal = value; } print( 'time', getTime(), 'echoSensorErr', echoSensorErr, 'echoSensorVal', echoSensorVal ); }, 'mm' // значения в миллиметрах ); }; var laserTimerID; // идентификатор таймера опроса лазерного датчика расстояния //---------------------------------------------------------------------------------------------------------------------- /* P13 - Датчик приближения и освещенности - QVG */ // настраиваем I2C1 для работы модуля I2C1.setup({sda: SDA, scl: SCL, bitrate: 400000}); // подключаем модуль к I2C1 и пину прерывания var prox = require('@amperka/proximity').connect({ i2c: I2C1, irqPin: P13 }); var laserSensorErr = ''; var laserSensorVal = 0; // значение, считанное из датчика var MAX_LASER_DIST = 255; // mm максимальная дистанция var onLaserTimer = function () { prox.range(function (error, value) { laserSensorErr = ''; laserSensorVal = MAX_LASER_DIST; if (error) { laserSensorErr = error.msg; } else { laserSensorVal = value; }; print( 'time', getTime(), 'laserSensorErr', laserSensorErr, 'laserSensorVal', laserSensorVal ); }); }; var onTimer = function () { // process.memory(); print('time', getTime()); }; function onRedButtonPress() { if (myIntervalID === undefined) { redLed.turnOn(); echoSensorErr = ''; echoSensorVal = 0; laserSensorErr = ''; laserSensorVal = 0; echoTimerID = setInterval(onEchoTimer, 60); // таймер для считывания показаний ультразвукового датчика laserTimerID = setInterval(onLaserTimer, 10); // таймер для считывания показаний лазерного дальномера myIntervalID = setInterval(onTimer, 33); } else { clearInterval(myIntervalID); myIntervalID = undefined; clearInterval(echoTimerID); echoTimerID = undefined; clearInterval(laserTimerID); laserTimerID = undefined; redLed.turnOff(); } } //----------------------------------------------------------------------------------------------------------- redButton redButton.on('press', function () { console.log("Red button is just pressed"); onRedButtonPress(); }); redLed.turnOff(); print('Press red button to start.');
А вот это лог, по которому видно, что не сразу начинает срабатывать вызов callback-функции - пока в зоне действия не появляется препятствие: до этого момента почему-то только от ультразвука сообщения... приближаем к датчикам препятствие - и оживает лидар: