@amperka/proximity странности

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем ander, 1 дек 2017.

  1. ander

    ander Нерд

    Помогите, пожалуйста, разобраться - при работе через библиотеку @amperka/proximity с датчиком приближения и освещенности периодически возникают ошибки ("Uncaught InternalError: Timeout on I2C Read Receive") с зависанием на секунду, иногда не вызывается callback-функция VL6180X.range(callback), а при резком изменении расстояния до препятствия (быстро провести рукой рядом с датчиком) - значения value, приходящие в .range(function(error, value) "залипают" на одном и том же значении и не изменяются...

    Пробовал понизить скорость работы I2C с 400к до 100к - не помогло. Контакты проверял.
    Питать пробовал и с полностью заряженного аккумулятора и по USB от компьютера - не помогает.
    Складывается впечатление, что в коде библиотеки что-то где-то не хорошо...
     
    Последнее редактирование: 1 дек 2017
    Konkery нравится это.
  2. ander

    ander Нерд

    Код программы:

    Код (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.');
     
     
    Последнее редактирование: 1 дек 2017
  3. ander

    ander Нерд

    Логи с ошибками:

     
  4. ander

    ander Нерд

    А вот это лог, по которому видно, что не сразу начинает срабатывать вызов callback-функции - пока в зоне действия не появляется препятствие:
    до этого момента почему-то только от ультразвука сообщения... приближаем к датчикам препятствие - и оживает лидар:
     
    Последнее редактирование: 2 дек 2017
  5. ander

    ander Нерд

    Зы - да, датчиков два: ультразвук и лазер, интервалы запускаются после нажатия кнопки.