Может кто-нибудь объяснить, как добавить объект слайдера, чтобы он управлял своим отдельным серводвигателем? - PullRequest
0 голосов
/ 22 апреля 2019

Проблема в том, что каждый раз, когда я добавляю объект ползунка и пытаюсь подключить его к другому сервомотору через другой вывод, ползунки управляют только одним и тем же серводвигателем. Это не позволит мне добавить серводвигатель, который управляет каждым серводвигателем независимо через пользовательский интерфейс. Я использую Processing в качестве интерфейса и Arduino в качестве IDE.

Я пытался добавить другие объекты-слайдеры, но все они по-прежнему контролируют один и тот же сервопривод. Я не знаю, является ли проблема через Arrduino или Processing. Когда я добавляю другие ползунки, я соединяю их с их собственными контактами, но это по-прежнему не позволяет управлять ими по отдельности.

Код обработки:

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 голосов
/ 24 мая 2019

полностью зависит от того, какое оборудование вы используете.но я думаю, что вам нужно изменить несколько мест

(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) связать аппаратный вывод.полностью зависит от оборудования, не уверен, какой из них вы используете.ill jus tput здесь как образец

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

, который должен более или менее сделать это.Вы знаете, много лет назад, мы должны записать нашу собственную обработку в последовательный протокол Arduino, чтобы сделать это.

...