晚安,我的Arduino有一个运行在上面的Firmata示例程序,StandardFirmata,我在使用Firmata和一个名为Game的库中编写了一个处理程序。我的程序将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


发布于 2020-03-26 06:20:35
答案可能是:
Timer1:
Timer1是一个16位计时器。
在Arduino世界中,伺服库在Arduino Uno上使用timer1
引脚9和10:由timer1控制
由于firmata是一个复杂的程序,依赖计时器和插槽,这可能是您所附加的原因。
....
left = 10,
right = 9,
....确切地说是那些别针。
为什么一个简单的测试程序是有效的?因为你在那里不使用插槽/套接字。
我查看了firmata,他们调用servo.h库=>,因此为您的servos选择两个不同的引脚
关于计时器的更多细节:https://www.robotshop.com/community/forum/t/arduino-101-timers-and-interrupts/13072
ServoFirmata:https://github.com/firmata/arduino/tree/master/examples/ServoFirmata
还应阅读与奴役有关的问题(公开/非公开)
https://stackoverflow.com/questions/60859580
复制相似问题