Пытаясь найти хороший способ управления сервоприводами на разных скоростях, используя johnny-five.io - PullRequest
0 голосов
/ 14 сентября 2018

В настоящее время я пытаюсь выяснить конфигурацию управления сервоприводами, подключенными к Arduinos, с помощью Nodebot johnny-five.io, размещенного на RPi. Моя главная цель - сделать гексапод с нуля; Мне не нравится идея наборов, потому что это весь код и части печенья, которые вы собираете, и это более или менее машина с дистанционным управлением, на которой вы ничего не узнали.

Я только что изучил основы сервоприводов (которые я выбираю сервоприводы вместо шаговых двигателей). И, к сожалению, по умолчанию, серво скорость не может контролироваться через ШИМ, только положение. Таким образом, способ обойти это - создать цикл, который увеличивает сервопривод на 1 градус (или более) за раз с задержкой в ​​X мс в контуре до тех пор, пока сервопривод не достигнет желаемой позиции. Теперь, это хорошо, и все, если вы управляете только одним сервоприводом за раз или количеством сервоприводов за раз для перемещения в одно заданное положение в другое. Но я стреляю для плавного движения здесь; Я хочу, чтобы одна нога начала двигаться раньше, чем другая нога остановилась. Истинная текучесть в движении, для этого мне понадобится бесконечный цикл, который будет проверять входные состояния, установленные управляющими командами, которые получит API.

Проблема здесь в том, что циклы while не асинхронны. Итак, мне нужно найти способ запустить цикл, который устанавливает разные сервоприводы на разных скоростных диапазонах и в разных положениях, а в конце цикла проверяет наличие новых обновлений входного состояния. И мне нужно сделать это без создания утечки памяти.

Одним из способов было бы создать набор сценариев зависимостей, которые работали бы асинхронно для каждого из сервоприводов (3 сервопривода на ногу, 6 ножек, 18 сервоприводов, следовательно, 18 мини-зависимостей), но я не уверен, будет ли это слишком много накладных расходов или нагрузка на RPi.

Я обдумываю это?

1 Ответ

0 голосов
/ 15 сентября 2018

Вы можете создать простой сервокласс и назначить каждому экземпляру собственную скорость и начальную позицию, используя метод update. Используйте более длительную задержку, чтобы сервопривод двигался медленнее. В основном цикле вы можете постоянно проверять наличие каких-либо входных данных, указывать сервоприводам перемещаться при необходимости, используя метод обновления.

#include <Servo.h>

class HexapodLegServo
{
  Servo servo;         // Servo instance
  int pos;             // Position/angle of the servo
  int delay_millis;    // 'Delay' between each update
  long prev_millis;
  int degree_change;       // Angle increase each update
  int start_pos;       // Position to start at
  int pin;             // Pin servo is connected to

  public:
    HexapodLegServo (int whichPin, int delayMillis=15, int startPos=0)
    {
      pin = whichPin;
      delay_millis = delayMillis;
      start_pos = startPos;
      degree_change = 1;
     }

     void attachToPin()
     {
       servo.attach(pin);
       setStartPos();
     }

     void setStartPos()  // Set initial position of the servo
     {
       servo.write(start_pos);
       pos = start_pos;
     }

    void update()  // Servo sweeps from end to end, and back
    {
      if (millis()-prev_millis > delay_millis)
      {
        prev_millis = millis();
        servo.write(pos);
        pos += degree_change;

        if ((pos <= 0) || (pos >= 180))
        {
          degree_change *= -1;  // Start moving in the reverse direction
        }
      }
    }
  };

// Main script
const int BUTTON = 4;  // Button on pin 4
HexapodLegServo right_leg(9);
HexapodLegServo left_leg(10, 30, 90);

void setup()
{
  Serial.begin(9600);
  pinMode(BUTTON, INPUT_PULLUP);  // Using a button to tell servos when to move

  right_leg.attachToPin();
  left_leg.attachToPin();
}

void loop()
{
  if (digitalRead(BUTTON) == LOW)  // If button is pushed (can be any type of input)
  {                                // update the position of the servos continuously 
    right_leg.update();
    left_leg.update();
  }
}
...