我是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);
答案 0 :(得分:0)
在像Arduino这样的平台上,您可以轻松预测代码执行的每个操作的准确时间(如果使用汇编)。这是因为arduino编程实际上是裸骨,而且没有像微处理器这样的微处理器,管道产生滞后或增加不可预测性等。
另一方面,BeagleBone black在其上运行基于Linux的操作系统。如果操作系统是通用的(不是实时操作系统),则几乎不可能声明代码的准确时间。你看,OS有很多东西,比如调度程序和缓冲区。处理器也非常复杂,在其I / O引脚上有缓存和流水线。所有这些都增加了不可预测性。
时间受限的程序在通用操作系统上永远不会好。他们不能处理它。有Realtime OS踢的地方。
对于BeagleBone黑板,我们有一种称为PRU(可编程实时单元)的东西。这些是用于时间约束操作的额外处理器集。 您可以找到有关他们的更多信息here。