title: Controlling Servos with Firmata and Game Control Plus
body: <p>Good Night,
  My Arduino has the example program of Firmata running on it, StandardFirmata, and I made a program in Processing using Firmata and a library called Game Control Plus.
  My program takes the values ​​of the PS4 joystick and converts them into numbers that the Firmata passes as commands to the Arduino and everything seems to work well, however, for some reason, the left and right servo motors do not perform numbers under 90 and even sometimes they stop when executing movements.
  First thing I thought was that the engines were forcing or that the program was sending the wrong values, so I made a simple Arduino program for the servo and they can execute values ​​under 90, and I also did the processing print on the screen the values ​​he was passing and the values ​​are going correctly.
  Anyway, I will leave the code and the wiring diagram I made below. I hope someone can help me solve this mystery.</p>
  
  <pre><code>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);
  }
  </code></pre>
  
  <p>Controller config using Gcpconfig, compatible with PS4   </p>
  
  <pre><code>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
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/XCLbK.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/XCLbK.png" alt="Arduino and Servos Connections"></a></p>
  
  <p><a href="https://i.stack.imgur.com/6q9UM.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/6q9UM.jpg" alt="Robotic Arm Finished"></a></p>