首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Firmata和游戏控制+控制伺服系统

用Firmata和游戏控制+控制伺服系统
EN

Stack Overflow用户
提问于 2020-03-26 00:59:44
回答 1查看 671关注 0票数 0

晚安,我的Arduino有一个运行在上面的Firmata示例程序,StandardFirmata,我在使用Firmata和一个名为Game的库中编写了一个处理程序。我的程序将PS4操纵杆的值​​转换为Firmata作为命令传递给Arduino的数字,但是由于某种原因,左、右伺服电机的数字不超过90,甚至有时在执行动作时停止。我想到的第一件事是引擎在强迫,或者程序发送了错误的值,所以我为伺服系统做了一个简单的Arduino程序,他们可以在90以下执行值​​,我还在屏幕上进行了处理打印--他传递的值​​和值​​正在正确地运行。无论如何,我会留下代码和接线图,我在下面。我希望有人能帮我解开这个谜团。

代码语言:javascript
复制
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兼容

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-26 06:20:35

答案可能是:

Timer1:

Timer1是一个16位计时器。

在Arduino世界中,伺服库在Arduino Uno上使用timer1

引脚9和10:由timer1控制

由于firmata是一个复杂的程序,依赖计时器和插槽,这可能是您所附加的原因。

代码语言:javascript
复制
....
  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

还应阅读与奴役有关的问题(公开/非公开)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60859580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档