使用BeagleBone Black测量两个光敏电阻之间的时间

时间:2017-07-20 20:04:35

标签: cloud9-ide beagleboneblack

我是BBB的新手。我对Arduino UNO有一些经验,并希望通过使用我的BBB来改变一些事情。

编辑(7月20日):我应该提到我在Windows 10上编程。我不知道这是否有帮助,只是认为我应该提及它。

我在Arduino的IDE上制作了一个测量LDR之间时间的项目。这是代码:

const int THRESHOLD_LOW  = 550;  // low point of LDR reading
const int THRESHOLD_HIGH = 625;  // high point of LDR reading

// HystereticRead takes the analog input of the LDRs and converts it to logic
// devices 

int HystereticRead(int pin, int previousState) {
int photo = analogRead(pin);
if (previousState == LOW && photo >= THRESHOLD_HIGH) {
   return HIGH;
} else if (previousState == HIGH && photo < THRESHOLD_LOW) {
    return LOW;
} else {
    return previousState;
} 
}

void setup() {
  Serial.begin(9600);  
}

void loop() {
  static int state0, state1;
  static double time0, time1, time2;

  int new_state = HystereticRead(A0, state0);
  if (state0 == LOW && new_state == HIGH) {
     time0 = millis();
 }
 state0 = new_state;

 new_state = HystereticRead(A1, state1);
 if (state1 == LOW && new_state == HIGH) {
     time1 = millis();
     time2 = (time1-time0)/1000;
     Serial.println("Time passed: (s)");
     Serial.println(time2);
 }
 state1 = new_state;
}

我使用cloud9编程我的BBB并试图模仿我的Arduino项目。这就是我所拥有的:

var b = require('bonescript');
var LDR = 'P9_38';
var LDR1 = 'P9_40';
const THRESHOLD_LOW = 250;
const THRESHOLD_HIGH = 550;

function AnalogToDigital(LDR, previousState) {
    var light = analoglogRead(LDR);
    if(previousState == b.LOW && light >= THRESHOLD_HIGH) {
        return b.HIGH;
    } else if(previousState == b.HIGH && light < THRESHOLD_LOW) {
        return b.LOW;
    } else {
        return previousState;
    }
}
function readLightLoop() {
    var state0, state1;
    var time0, time1, time2;
    var new_state = AnalogToDigital(LDR, state0);
    if(state0 == b.LOW && new_state == b.HIGH) {
        time0 = new Date().getTime();
    }
    state0 = new_state;
    var new_state = AnalogToDigital(LDR1, state1)
    if(state == b.LOW && new_state == b.HIGH) {
        time1 = new Date().getTime();
        time2 = (time1 - time0);
        console.log("Time passed: (s)");
        console.log(time2);
    }
    state1 = new_state;
}

我试图做一些研究,看看我能改变什么,但没有运气。希望我能在这里找到一些答案。提前谢谢!

编辑(7月25日):我注意到我没有说出我的问题。有没有办法在我的BBB上使用我的LDR来衡量时间的流逝,就像我在Arduino上一样?您会推荐使用其他IDE吗?谢谢!

编辑(7月25日):我想出了这段代码,让我可以在某种程度上衡量BBB上的时间:

var b = require('bonescript');
var LDR = 'P9_38';
var LDR1 = 'P9_40';
var startTime;
var endTime;
var loopTimer = 1500;
const THRESHOLD = 590;

function start() {
    var light = b.analogRead(LDR) * 1000;
        if(light < THRESHOLD) {
        startTime = new Date();
        console.log(light);
    }
}

function end() {
    var light1 = b.analogRead(LDR1) * 1000;
    if(light1 < THRESHOLD) {
        endTime = new Date();
        console.log(light1);
        var timeDiff = endTime - startTime;
        timeDiff /= 1000;
        var seconds = (timeDiff).toFixed(2);
        console.log('time passed in seconds: ');
        console.log(seconds);
    }
}

function loop() {
    start();
    end();
}

var timer = setInterval(loop, loopTimer);

但似乎不喜欢在约1.5秒内测量时间。我会继续修补它!

编辑(7月26日):我找到了自己的解决方案!这是代码:

var b = require('bonescript');
var LDR = 'P9_38';
var LDR1 = 'P9_40';
var startTime;
var endTime;
var loopTimer = 250;
const THRESHOLD_LDR = 700;
const THRESHOLD_LDR1 = 730;

function start() {
    var light = b.analogRead(LDR) * 1000;
    if(light < THRESHOLD_LDR) {
        startTime = new Date();
        console.log(light);
    }
}

function end() {
    var light1 = b.analogRead(LDR1) * 1000;
    if(light1 < THRESHOLD_LDR1) {
        endTime = new Date();
        console.log(light1);
        var timeDiff = endTime - startTime;
        timeDiff /= 1000;
        var seconds = (timeDiff).toFixed(2);
        console.log('time passed in seconds: ');
        console.log(seconds);
    }
}

function loop() {
    start();
    end();
}

var timer = setInterval(loop, loopTimer);

1 个答案:

答案 0 :(得分:0)

在像Arduino这样的平台上,您可以轻松预测代码执行的每个操作的准确时间(如果使用汇编)。这是因为arduino编程实际上是裸骨,而且没有像微处理器这样的微处理器,管道产生滞后或增加不可预测性等。

另一方面,BeagleBone black在其上运行基于Linux的操作系统。如果操作系统是通用的(不是实时操作系统),则几乎不可能声明代码的准确时间。你看,OS有很多东西,比如调度程序和缓冲区。处理器也非常复杂,在其I / O引脚上有缓存和流水线。所有这些都增加了不可预测性。

时间受限的程序在通用操作系统上永远不会好。他们不能处理它。有Realtime OS踢的地方。

对于BeagleBone黑板,我们有一种称为PRU(可编程实时单元)的东西。这些是用于时间约束操作的额外处理器集。 您可以找到有关他们的更多信息here