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