有人可以解释如何添加滑块对象,以便它控制自己的单个伺服电机吗?

时间:2019-04-21 21:59:45

标签: user-interface arduino processing computer-science robotics

问题是每次我添加一个滑块对象并尝试通过一个不同的引脚将其连接到另一个伺服电机时,两个滑块都只能控制同一台伺服电机。不允许我添加一个通过用户界面独立控制每个伺服电动机的伺服电动机。我使用Processing作为接口,使用Arduino作为IDE。

我尝试添加其他滑块对象,但它们仍然控制相同的伺服。我不知道问题是通过Arrduino还是正在处理。当我添加其他滑块时,我将它们连接到它们自己的引脚上,但是仍然不允许单独控制它们。

处理代码:

import processing.serial.*;
import cc.arduino.*;
import controlP5.*;
ControlP5 controlP5;
Arduino arduino;
int servoAngle = 90;
void setup() {

 size(400,400);

 println(Arduino.list());
 arduino = new Arduino(this, Arduino.list()[0], 57600);

 for (int i = 0; i <= 13; i++)
 arduino.pinMode(i, Arduino.OUTPUT);

 controlP5 = new ControlP5(this);
 controlP5.addSlider("servoAngle",0,180,servoAngle,20,10,180,20);

}
void draw() {
 arduino.analogWrite(9, servoAngle);
 //delay(15);
}

Arduino代码:

    #include <Servo.h>
    #include <Firmata.h>
    Servo servos[MAX_SERVOS];
    byte servoPinMap[TOTAL_PINS];
    byte servoCount = 0;

void analogWriteCallback(byte pin, int value)
{
  if (IS_PIN_DIGITAL(pin)) {
    servos[servoPinMap[pin]].write(value);
  }
}

void systemResetCallback()
{
  servoCount = 0;
}

void setup()
{
  byte pin;

  Firmata.setFirmwareVersion(FIRMATA_FIRMWARE_MAJOR_VERSION, 
  FIRMATA_FIRMWARE_MINOR_VERSION);
  Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
  Firmata.attach(SYSTEM_RESET, systemResetCallback);

  Firmata.begin(57600);
  systemResetCallback();

  // attach servos from first digital pin up to max number of
  // servos supported for the board
  for (pin = 0; pin < TOTAL_PINS; pin++) {
    if (IS_PIN_DIGITAL(pin)) {
      if (servoCount < MAX_SERVOS) {
        servoPinMap[pin] = servoCount;
        servos[servoPinMap[pin]].attach(PIN_TO_DIGITAL(pin));
        servoCount++;
      }
    }
  }
}

void loop()
{
  while (Firmata.available())
    Firmata.processInput();
}

我希望能够将3个以上的滑块添加到已创建的滑块中,但是能够控制4个伺服电机,每个伺服电机都由自己的滑块控制,但是我得到的结果是每个其他滑块都在控制相同的电动机。

1 个答案:

答案 0 :(得分:-1)

完全取决于您所运行的硬件。 但我认为您必须更改一些地方

(1)表示所有跟踪栏值和pwm

 int servoAngle = 90; int servoAngle1 = 90; int servoAngle2 = 90; int servoAngle3 = 90;

(2) 是添加轨迹栏

controlP5.addSlider("servoAngle",0,180,servoAngle,20,10,180,20);
controlP5.addSlider("servoAngle1",0,180,servoAngle1,20,10,180,20);
controlP5.addSlider("servoAngle2",0,180,servoAngle2,20,10,180,20);
controlP5.addSlider("servoAngle3",0,180,servoAngle3,20,10,180,20);

(3)链接硬件引脚。完全取决于硬件,不确定使用哪个1 u。病在这里作为样品

 arduino.analogWrite(9, servoAngle);
 arduino.analogWrite(10, servoAngle);
 arduino.analogWrite(11, servoAngle);
 arduino.analogWrite(12, servoAngle);
 //delay(15);
}

应该或多或少地做到这一点。要知道,很多年前,我们必须将自己的处理程序编写为arduino串行协议。