我在最后一部分的项目上停留在我的项目中,该部分通过读取xml进给来控制伺服,并且根据它应该转动几度的值。我正在使用yahoo的天气xml提示,它显示不同的风速属性作为速度,方向等。我正在做的是我只使用风向和速度,以便用LED和方向箭头显示它。 LED的一切工作正常,但是当涉及伺服时,我不太清楚该做什么。它适用于Arduino扫描示例,但我使用Firmata,我猜它的代码有点不同。首先,我使用标准的Firmata来控制LED,但是伺服不好,所以现在我使用2个标准Firmata的arduino用于LED,一个用伺服Firmata用于伺服,在不同的COM端口分配。不幸的是,当我尝试编程伺服时,它只能变得更快或更慢,而无法控制它的角度以及何时停止。在arduino中,它与他们的例子一起工作,但在Firmata中似乎我无法适应它,所以它在Processing with Firmata中的作用相似。我已经被困在这2天了已经有任何帮助会受到赞赏,因为我必须在星期一之前完成它
这是代码:
import processing.serial.*;
import cc.arduino.*;
Arduino arduino, arduino2;
final String URL = "http://weather.yahooapis.com/forecastrss?w=27764362";
final String WORD = "yweather:wind";
final String TOKEN = "\\W+";
int ledPin = 13;
int ledPin1 = 12;
int ledPin2 = 8;
int pos=0;
void setup() {
arduino = new Arduino(this, Arduino.list()[0], 57600);
arduino2 = new Arduino(this, Arduino.list()[1], 57600);
arduino.pinMode(ledPin, Arduino.OUTPUT);
arduino.pinMode(ledPin1, Arduino.OUTPUT);
arduino.pinMode(ledPin2, Arduino.OUTPUT);
arduino2.pinMode (9, Arduino.OUTPUT);
final String[] xml = loadStrings(URL);
int idx = 0;
for (; idx != xml.length; ++idx)
if ( xml[idx].contains(WORD) ) break;
if (idx == xml.length) {
println("Not found");
exit();
}
println("Index: " + idx);
println(xml[idx]);
final int[] info = int( xml[idx].split(TOKEN) );
final int dir = info[6];
final int spd = info[8];
println("Speed: " + spd);
println("Direction: " + dir);
if (spd < 5 ) {
arduino.digitalWrite(ledPin, Arduino.LOW);
arduino.digitalWrite(ledPin1, Arduino.LOW);
arduino.digitalWrite(ledPin2, Arduino.LOW);
}
if (spd >= 5 && spd <10) {
arduino.digitalWrite(ledPin, Arduino.HIGH);
arduino.digitalWrite(ledPin1, Arduino.LOW);
arduino.digitalWrite(ledPin2, Arduino.LOW);
}
if (spd >= 10 && spd <= 15) {
arduino.digitalWrite(ledPin, Arduino.HIGH);
arduino.digitalWrite(ledPin1, Arduino.HIGH);
arduino.digitalWrite(ledPin2, Arduino.LOW);
}
if (spd > 16) {
arduino.digitalWrite(ledPin, Arduino.HIGH);
arduino.digitalWrite(ledPin1, Arduino.HIGH);
arduino.digitalWrite(ledPin2, Arduino.HIGH);
}
println("3");
if (dir >= 10 && dir <= 25) {
println("4");
arduino2.analogWrite(9, 90);
delay(1500);
}
else if (dir > 340 && dir <= 360) {
println("Low speed");
arduino2.analogWrite(9, 80); //in this case 80 is controlling the speed, although I wanted to control the angle
delay(1500);
arduino2.analogWrite(9, 120); // same here
delay(1500);
println("5");
}
}
所有那些prinLn(1-5)显然只是代码检查器,看看它是否有问题,但我想不存在,它只是我无法控制角度或任何其他特定控制它除了它的速度,但它不会停止旋转,直到我拔掉大多数情况下的usb :)
我想我需要插入一些arduino示例的部分以使其正确移动:
void loop()
{
for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
但是自从我尝试以后不太确定,但我可能没有正确编程。
谢谢!
答案 0 :(得分:0)
setup()仅在草图初始化时调用一次。在运行时期间重复调用 loop()。因此,您的大多数代码都需要处于循环中。
我建议从一些简单的草图开始,逐步运行。
ladyada有一些很好的教程,即http://www.ladyada.net/learn/arduino/lesson4.html的串行通信 firmata存储库在https://github.com/firmata/arduino/tree/master/examples上有一些很好的例子 此外,arduino论坛揭示了在http://forum.arduino.cc/
搜索“firmata”的一些讨论