Arduino 使用Firmata和Game Control Plus控制伺服系统

Arduino 使用Firmata和Game Control Plus控制伺服系统,arduino,processing,joystick,servo,firmata,Arduino,Processing,Joystick,Servo,Firmata,晚安, 我的Arduino上运行着Firmata的示例程序StandardFirmata,我使用Firmata和名为Game Control Plus的库制作了一个处理程序。 我的程序接受这些值​​将PS4操纵杆的数字转换为Firmata作为命令传递给Arduino的数字,一切似乎都正常工作,但是,由于某些原因,左右伺服电机在90以下不执行数字,甚至有时在执行运动时停止。 我想到的第一件事是引擎正在强制执行,或者程序发送了错误的值,所以我为伺服做了一个简单的Arduino程序,它们可以执行值​​

晚安, 我的Arduino上运行着Firmata的示例程序StandardFirmata,我使用Firmata和名为Game Control Plus的库制作了一个处理程序。 我的程序接受这些值​​将PS4操纵杆的数字转换为Firmata作为命令传递给Arduino的数字,一切似乎都正常工作,但是,由于某些原因,左右伺服电机在90以下不执行数字,甚至有时在执行运动时停止。 我想到的第一件事是引擎正在强制执行,或者程序发送了错误的值,所以我为伺服做了一个简单的Arduino程序,它们可以执行值​​在90以下,我还做了处理,在屏幕上打印了数值​​他是通过和价值观​​你走对了。 无论如何,我会留下我在下面制作的代码和接线图。我希望有人能帮我解开这个谜

import processing.serial.*;

/**
Controlling Servos with Firmata and Game Control Plus
Be able to control servos using any compatible joystick
by Davi Colares
*/

//Import necessay libraries
import cc.arduino.*;
Arduino arduino;
import org.gamecontrolplus.gui.*;
import org.gamecontrolplus.*;
import net.java.games.input.*;

//Define some useful things for GCP
ControlIO control;
ControlDevice stick;

//Define joystick, servos variables and initial values
float c_base, c_left, c_right, c_claw;
int base = 8, 
    left = 10,
    right = 9,
    claw = 11,
    initial_base = 90,
    initial_left = 90,
    initial_right = 90,
    initial_claw = 90;

public void setup()
{
  //Define Arduino Port, in my case 2
  arduino = new Arduino(this, Arduino.list()[2], 57600);

  //Define pin servos
  arduino.pinMode(base, Arduino.SERVO);
  arduino.pinMode(left, Arduino.SERVO);
  arduino.pinMode(right, Arduino.SERVO);
  arduino.pinMode(claw, Arduino.SERVO);

  //Sets servos to initial position
  arduino.servoWrite(base, initial_base);
  arduino.servoWrite(left, initial_left);
  arduino.servoWrite(right, initial_right);
  arduino.servoWrite(claw, initial_claw);

  //Open a config screen for the control, based in Gcpconfig, example code
  surface.setTitle("PS4 com MeArm");
  control = ControlIO.getInstance(this);
  stick = control.filter(GCP.STICK).getMatchedDevice("joystick");
  if (stick == null){
    println("Nenhum dispositivo configurado");
    System.exit(-1);
  }
}

public void getUserInput(){
  c_base = map(stick.getSlider("X").getValue(), -1, 1, 0, width);
  c_left = map(stick.getSlider("Y").getValue(), -1, 1, 0, height);
  c_right = map(stick.getSlider("Z").getValue(), -1, 1, 0, width);
  c_claw = map(stick.getSlider("W").getValue(), -1, 1, 0, height);

  //The base servo is 50, so I multiply by 1.8 to match 90 degree of servo
  c_base = c_base *1.8;
  c_left = c_left *1.8;
  c_right = c_right *1.8;
  c_claw = c_claw *1.8;
}

public void draw(){
  //print in processing serial and servos
  println(int(c_base), int(c_left), int(c_right), int(c_claw));
  getUserInput();
  arduino.servoWrite(base, int(c_base));
  arduino.servoWrite(left, int(c_left));
  arduino.servoWrite(right, int(c_right));
  arduino.servoWrite(claw, int(c_claw));
  delay(5);
}
控制器配置使用Gcpconfig,与PS4兼容

control ps4
X   base    3   SLIDER  Eixo X  0   1.0 0.05
Y   left    3   SLIDER  Eixo Y  0   1.0 0.05
W   right   3   SLIDER  Rotação Y   0   1.0 0.05
Z   claw    3   SLIDER  Rotação X   0   1.0 0.05
答案可能是: 计时器1: 定时器1是一个16位定时器。 在Arduino世界中,伺服库使用Arduino Uno上的定时器1 引脚9和10:由定时器1控制 由于firmata是一个复杂的程序,依赖计时器和中断,这可能是您附加的原因

....
  left = 10,
  right = 9,
  ....
把那些别针拔出来。 为什么一个简单的测试程序可以工作?因为您在那里不使用中断/tmer。 我查看了firmata源代码,他们称之为servo.h library=>所以为您的伺服选择两个不同的管脚
有关计时器的更多详细信息:ServoFirmata:另请阅读与伺服有关的打开/关闭问题

是否可以使用9或10的任何引脚差异来避免这些问题?任何未连接到计时器上用于测试的数字引脚。有一个特殊的伺服firmata版本,如果你只是需要伺服更好地工作。有一个原因,为什么在菲尔玛塔没有官方的伺服例子,。顺便说一句,如果这不能解决问题,我们还可以在赛尔沃菲尔塔之后测试更多的步骤,对吗?我只是想知道,什么样的引脚可以和不能与这些Firmata代码一起使用?而且,你说Firmata的伺服系统有点问题,对吗?那么,最好的方法是什么呢?两个选项:不使用附加到计时器的管脚详细信息:如果您只需要伺服功能,请参阅我的帖子中的编辑或ServoFirmata