Управление сервоприводами с помощью Firmata и Game Control Plus - PullRequest
0 голосов
/ 26 марта 2020

Доброй ночи, 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

Arduino and Servos Connections

Robotic Arm Finished

1 Ответ

1 голос
/ 26 марта 2020

Ответ может быть следующим:
Таймер1:
Таймер1 - это 16-битный таймер.
В мире Arduino серво-библиотека использует таймер1 на Arduino Uno
Выводы 9 и 10: управляется таймером1
поскольку firmata - это сложная программа, использующая таймеры и прерывания, это может быть причиной того, что вы добавляете

....
  left = 10,
  right = 9,
  ....

для точного определения этих выводов.
Почему работает простая тестовая программа`? Поскольку вы не используете там interupts / tmers.
Я проверил в источнике firmata, они вызывают библиотеку servo.h =>, поэтому выберите два разных вывода для ваших сервоприводов
Подробнее о таймерах: https://www.robotshop.com/community/forum/t/arduino-101-timers-and-interrupts/13072
ServoFirmata: https://github.com/firmata/arduino/tree/master/examples/ServoFirmata
Читайте также вопросы (открытые / закрытые), касающиеся сервоприводов

...