Фирма сервоуправления

Я застрял в своем проекте в последней части, которая управляет сервоприводом, читая XML-канал, и в зависимости от значений он должен поворачиваться на несколько градусов. Я использую XML-фид погоды от yahoo, который показывает различные атрибуты скорости ветра, такие как скорость, направление и т. Д. Я использую только направление и скорость ветра, чтобы визуализировать их с помощью светодиодов и стрелок для направления. Все отлично работает со светодиодами, но когда дело доходит до сервопривода, я не совсем уверен, что делать. Это хорошо работает с широким примером Arduino, но я использую Firmata, и я думаю, что код для него немного другой. Сначала я использовал стандартные Firmata для управления светодиодами, но с сервоприводом это было не очень хорошо, так что теперь я использую 2 arduino, один со стандартными 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 
  } 

Но не совсем уверен, так как я пытался, но я, возможно, не запрограммировал это должным образом.

Спасибо!

1 ответ

setup() вызывается только один раз при инициализации эскиза. loop () неоднократно вызывается во время выполнения. следовательно, большая часть вашего кода должна быть в цикле.

я рекомендую начать с простых набросков, чтобы все пошло по шагам.

Ladyada имеет несколько хороших учебных пособий, например, для последовательной связи на http://www.ladyada.net/learn/arduino/lesson4.html
хранилище firmata содержит несколько хороших примеров на https://github.com/firmata/arduino/tree/master/examples
Кроме того, на форуме Arduino обсуждается вопрос о поиске "firmata" на http://forum.arduino.cc/

Другие вопросы по тегам