Нужна помощь в создании кода, который перемещает двигатель постоянного тока CW или CCW с помощью двух разных кнопок

Я знаю, что могу заставить мотор двигаться вперед и назад с помощью кнопок, но я не хочу, чтобы он двигался на полной скорости. Я хочу, чтобы он увеличивался в очень небольших количествах, чтобы его можно было регулировать очень небольшими количествами за один раз. Я также должен быть в состоянии удерживать кнопку, чтобы она двигалась непрерывно. У меня также есть мотор с энкодером на нем. Может быть, есть способ использовать числа в кодере для увеличения? итак, нажмите кнопку CW, и теперь двигатель хочет двигаться до тех пор, пока датчик не достигнет +10 от того места, где он был? Я понимаю, что я хочу сделать, просто мне нужна помощь, чтобы добраться туда. Спасибо

ВОТ КОД, КОТОРЫЙ Я ВЫЯСНИЛ, КОТОРЫЙ ЗАСТАВЛЯЕТ МОЙ ДВИГАТЕЛЬ ПОСТОЯННОГО ТОКА УВЕЛИЧИВАТЬ CW И CCW


#define MOTOR_DIRECTION_PIN   2
#define MOTOR_SPEED_PIN       3

#define MOTOR_DIRECTION_CW    LOW
#define MOTOR_DIRECTION_CCW   HIGH



void setup() 
{
  //кнопочные входы
  //pullup поэтому нам не нужно включать
  pinMode(12, INPUT_PULLUP);
  pinMode(13, INPUT_PULLUP);
  
  pinMode(MOTOR_DIRECTION_PIN, OUTPUT);
  pinMode(MOTOR_SPEED_PIN, OUTPUT);

  Serial.begin(9600);

  Serial.println("test");
}

void loop() 
{
  int pushedButtonOne = digitalRead(12);
  int pushedButtonTwo = digitalRead(13);

  if(pushedButtonOne == LOW)
  {
    Serial.println("Button number 1 has been pushed");
    digitalWrite(MOTOR_DIRECTION_PIN, MOTOR_DIRECTION_CCW);
    analogWrite(MOTOR_SPEED_PIN, 50);
    delay(7);
    analogWrite(MOTOR_SPEED_PIN, 0);
  }

  else if(pushedButtonTwo == LOW)
  {
    Serial.println("Button number 2 has been pushed");
    digitalWrite(MOTOR_DIRECTION_PIN, MOTOR_DIRECTION_CW);
    analogWrite(MOTOR_SPEED_PIN, 50);
    delay(7);
    analogWrite(MOTOR_SPEED_PIN, 0);
  }
  else
  {
    Serial.println("nothing has been pushed");
  }

  //delay(100);

}

, 👍1

Обсуждение

Ваша первая проблема заключается в выборе типа двигателя. Я бы предложил шаговый двигатель для того, что вы хотите сделать. Они позволяют вам контролировать положение двигателя с очень маленьким шагом., @Duncan C

@DuncanC Да, я использовал шаговый двигатель. Есть еще одно приложение, которое я хочу расширить, и оно привело меня к двигателю постоянного тока. Я хочу, чтобы это работало для обоих, @Thunder Dornhofer

Что вы имеете в виду под «пока не достигнет +10»? 10 щелчков энкодера? Это не будет работать с двигателем постоянного тока, если только он не редукторный. Двигатели постоянного тока созданы для того, чтобы вращаться, а не шагать. Используйте шаговый двигатель, если вы хотите шагать. Вы все еще можете позволить ему вращаться непрерывно, @chrisl

@chrisl да, скажем, двигатель включается и находится в положении 0 на энкодере. Если нажать кнопку, я могу заставить двигатель двигаться по часовой стрелке (или против часовой стрелки, просто зависит от того, какую кнопку я нажимаю), пока энкодер не покажет 10, а затем он выключит двигатель или остановит его? Это то, что может сработать?, @Thunder Dornhofer

Большинство энкодеров имеют более 10 тиков на полный оборот. Это означает, что 10 тиков могут быть равны половине оборота. Двигатели постоянного тока не предназначены для такого точного позиционирования. Вы можете попробовать, но вместо половины оборота вы также можете получить 3/4 или полный оборот (это зависит от вашего двигателя). Также вам необходимо рассчитать время с учетом ускорения и замедления двигателя. Если ваш самый низкий счет находится в диапазоне нескольких полных оборотов, то он может работать с двигателем постоянного тока. Если вам нужна полная точность, используйте шаговый двигатель., @chrisl

@chrisl Хорошо, я попробую, спасибо, @Thunder Dornhofer


2 ответа


0

Сформулировать комментарии в виде ответа:

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

до тех пор, пока кодировщик не достигнет +10 от того места, где он был в

Поскольку большинство энкодеров имеют более 10 тиков на полный оборот (вы не указали, сколько у вас), это может означать вращение только части полного оборота. Предположим, что энкодер имеет 40 тиков на полный оборот. С 10 тиками у вас есть четверть оборота. Похоже, вам нужна точность в диапазоне около 1 тика.

Двигатели постоянного тока предназначены для относительно быстрого вращения. Они не дают вам контроля над позицией с помощью шагов. В основном они имеют очень мало комбинаций катушки и магнита (например, всего 2 катушки, которые переключаются внутри). Таким образом, у вас есть только инертный вал двигателя, который приводится в движение двигателем. Ему потребуется время, чтобы ускориться и замедлиться. С большинством двигателей вы можете даже получить половину или полный оборот, когда вы хотели только четверть оборота (10 тиков). Рассчитать правильное время, чтобы получить его лучше, будет непросто за относительно небольшое вознаграждение. Двигатели постоянного тока не рассчитаны на обороты ниже небольшого числа полных оборотов.

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

Или вы могли бы пойти более правильным путем и просто использовать шаговый двигатель, который рассчитан на небольшие шаги в диапазоне неполного оборота. Управлять им немного сложнее (также в зависимости от схемы привода), но он дает вам тот контроль положения, который вы хотите. И вращаться непрерывно: непрерывное вращение шагового двигателя - это не что иное, как шаг за шагом, выполняемый в быстрой последовательности (подобно тому, как бег - это быстрая последовательность шагов ногами).


Примечание: Шаговый двигатель не имеет обратной связи, подобной энкодеру. Драйвер двигателя просто приводит в движение катушки, чтобы включить двигатель. Если двигатель заглох или перегружен, вы можете потерять некоторые ступени (это означает, что катушки приводятся в движение для ступеней, но двигатель фактически не движется). Вы могли бы почувствовать это с помощью дополнительного датчика на валу двигателя. Но в большинстве случаев в этом нет необходимости. Если вы просто убедитесь, что двигатель ни в коем случае не перегружен, все будет в порядке. Или же вы можете не беспокоиться о том, что иногда некоторые шаги будут потеряны, если общая точность будет достаточно хорошей. Это ваше решение.

,

Я на самом деле несколько понял, что это более простой способ просто отключить двигатель после небольшой задержки. Я добавлю код, сделанный в мой исходный пост., @Thunder Dornhofer


1

Вот код, который я в конце концов разгадал. Он увеличивает мощность моего двигателя постоянного тока, в основном активируя его на небольшое время в направлении того, какая кнопка была нажата.

#define MOTOR_DIRECTION_PIN   2
#define MOTOR_SPEED_PIN       3

#define MOTOR_DIRECTION_CW    LOW
#define MOTOR_DIRECTION_CCW   HIGH



void setup() 
{
  //кнопочные входы
  //pullup поэтому нам не нужно включать
  pinMode(12, INPUT_PULLUP);
  pinMode(13, INPUT_PULLUP);
  
  pinMode(MOTOR_DIRECTION_PIN, OUTPUT);
  pinMode(MOTOR_SPEED_PIN, OUTPUT);

  Serial.begin(9600);

  Serial.println("test");
}

void loop() 
{
  int pushedButtonOne = digitalRead(12);
  int pushedButtonTwo = digitalRead(13);

  if(pushedButtonOne == LOW)
  {
    Serial.println("Button number 1 has been pushed");
    digitalWrite(MOTOR_DIRECTION_PIN, MOTOR_DIRECTION_CCW);
    analogWrite(MOTOR_SPEED_PIN, 50);
    delay(7);
    analogWrite(MOTOR_SPEED_PIN, 0);
  }

  else if(pushedButtonTwo == LOW)
  {
    Serial.println("Button number 2 has been pushed");
    digitalWrite(MOTOR_DIRECTION_PIN, MOTOR_DIRECTION_CW);
    analogWrite(MOTOR_SPEED_PIN, 50);
    delay(7);
    analogWrite(MOTOR_SPEED_PIN, 0);
  }
  else
  {
    Serial.println("nothing has been pushed");
  }

}
,