Доброй ночи, My Arduino имеет пример программы Firmata, работающей на нем, StandardFirmata, и я создал программу в Processing с использованием 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