Firmata伺服控制



我被困在我的项目的最后一部分,这是通过阅读xml feed控制伺服,并取决于它应该转几个度的值。我正在使用雅虎的天气xml feed,它显示了不同的风速属性,如速度,方向等。我所做的是,我只使用风向和风速,以便用LED和箭头表示方向。一切工作良好的LED,但当涉及到伺服我不太确定该怎么做。它与Arduino扫描示例一起工作正常,但我使用Firmata,我猜它的代码有点不同。首先,我使用标准Firmata来控制LED,但它与伺服不太好,所以现在我使用2 arduino的一个与标准Firmata的LED和一个与伺服Firmata的伺服,分别分配在不同的COM端口上。不幸的是,当我试图编程伺服它只会变得更快或更慢,而无法控制它的角度和何时停止。在arduino中,它与他们的例子一起工作,但在Firmata中,我似乎无法适应它,所以它在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 
  } 

但不太确定,因为我试过了,但我可能没有正确编程。

谢谢!

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"的讨论。

最新更新