0

xml フィードを読み取ってサーボを制御し、値に応じて数度回転する必要がある最後の部分でプロジェクトに行き詰まっています。私は速度、方向などのさまざまな風速属性を示すyahooの天気xmlフィードを使用しています. LED に関してはすべて問題なく動作しますが、サーボに関してはどうすればよいかよくわかりません。Arduino のスイープの例では問題なく動作しますが、私は Firmata を使用しており、そのコードは少し異なると思います。最初に標準Firmataを使用してLEDを制御しましたが、サーボではうまくいきませんでした. 異なる 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 
  } 

しかし、試したのでよくわかりませんが、適切にプログラムしていない可能性があります。

ありがとう!

4

1 に答える 1