Как правильно управлять серводвигателем с помощью библиотеки TimerOne и ServoTimer2?

В этом проекте я хочу периодически плавно вращать сервопривод (штифт (D10) с периодом времени, выбираемым потенциометром (на самом деле я буду использовать датчик давления на этом штифте, теперь он недоступен для меня, поэтому я использую g-потенциометр). Период времени, управляемый изменением положения потенциометра (два) на контакте A0. Два светодиода (синий и красный) (D7, D9) (на этом контакте я буду использовать два сервопривода контроллера клапана) мигают с одинаковым периодом, а другой желтый светодиод мигают с одинаковым периодом, но наоборот. Все работает, кроме сервопривода, вращение которого не плавное. Иногда его вращение поддерживает правильный период, а иногда останавливается без необходимости. Прежде чем я пробовал TimerOne и Servo Library, но они создают некоторый конфликт и не загружаются на плату. Uno Board. Какие изменения я должен внести либо в Circuit, либо в Code. Я новичок в этой области. Спасибо за любую помощь. И мой код

#include <TimerOne.h>
#include "ServoTimer2.h"
const int potPin = A0;
const int bluePin =7;
const int redPin =8;
const int whitePin = 9;
const int yellowPin = 11;
const int myServoPin = 10;
ServoTimer2 myServo;
int angle;
int speed;
int potVal;
int breathPress;
int lowPress=12;
int upPress=24;
int lowCount=0;
int upCount =0 ;
int time1;
int time2;
int timeDiff;
int temp;
int potPin1 = A2;
int breathRatio;
int ratioVal;
void setup() {
  pinMode(potPin,INPUT);
  pinMode(bluePin,OUTPUT);
  pinMode(redPin,OUTPUT);
  pinMode(potPin1,INPUT);
  pinMode(whitePin,OUTPUT);
  pinMode(yellowPin,OUTPUT);
  myServo.attach(10);


  Timer1.initialize(100000);
  Timer1.attachInterrupt(Blink);
  Serial.begin(9600);
 }

void loop() {
  breathRatio=analogRead(potPin1);
  ratioVal = map(breathRatio,0,1023,1,6);

  digitalWrite(bluePin,HIGH);
  digitalWrite(yellowPin,HIGH);
  digitalWrite(whitePin,LOW);
  myServo.write(90);


  delay(timeDiff);
  digitalWrite(bluePin,LOW);
  digitalWrite(yellowPin,LOW);
  digitalWrite(whitePin,HIGH);
  myServo.write(60);
  delay(timeDiff);

}

void Blink(){
  potVal = analogRead(potPin);
  breathPress = map(potVal,0,1023,0,30);
  Serial.print("Pressure=");
  Serial.println(breathPress);
  Serial.println(time1);
  Serial.println(time2);
  Serial.print("Time Difference :");
  Serial.println(timeDiff);
  if(breathPress<10){
  digitalWrite(redPin,LOW);
  }
  if(breathPress>27){
    digitalWrite(redPin,LOW);
  }
  else {
    digitalWrite(redPin,HIGH);
  }
  if ((breathPress - 10 )<= 0){
    lowCount = 1;
    upCount =0;
    time1 = millis();
  }
  if((breathPress - 27)>=0){
    lowCount = 0;
    upCount = 1;
    time2 = millis();
  }
  if(time1-time2 >= 0){
    timeDiff = time1-time2;
  }
  else{
    timeDiff = time2-time1;
  }

И вывод, показывающий

13096 14994 Разница во времени: 1898 г. Давление=15 13096 14994 Разница во времени: 1898 г. Давление=15 13096 14994 Разница во времени: 1898 г. Давление=15 13096 14994 Разница во времени: 1898 г. Давление=15

, 👍-1

Обсуждение

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

Если бы вы использовали оператор if в стиле «мигание без задержки» и миллисекунды для обработки времени как для этого, так и для светодиодов, тогда вы могли бы использовать обычную библиотеку Servo, и ваша жизнь была бы намного проще., @Delta_G

Вы скопировали текст вопроса 2 раза в вопрос. Я удалил дублированный текст для вас, @chrisl


1 ответ


0

То, что вы утверждаете, не имеет для меня смысла. В вашем коде вы не плавно перемещаете датчик. Вы устанавливаете его на 60 и 90 градусов последовательно. Вы не контролируете движение между этими значениями. Это то, что делает сервопривод. Он движется прямо туда, куда вы говорите ему двигаться. Вы не можете контролировать, как сервопривод перемещается между двумя значениями, которые вы установили. Чтобы двигаться медленнее (можно назвать это плавным) между значениями, вам нужно установить промежуточные значения для сервопривода. Таким образом, вместо прямого перехода от 60 к 90 вы будете двигаться пошагово, от 60 до 61, затем до 62, ... до 89, до 90 градусов.

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


Обратите внимание, что это

if((breathPress - 27)>=0)

это слишком сложный способ написания

if(breathPress >= 27)
,

с помощью цикла for? На самом деле я пробовал это, но сервопривод не движется., @baponkar

Да, например, с циклом for. Мы не видим ваш прежний код. Также ваш текущий вопрос довольно плохо сформулирован. Я примерно половину понял. Пожалуйста, улучшите свой вопрос, чтобы было более понятно, в чем ваша проблема. Если вы уже знали, что вам нужно использовать цикл for, почему бы не спросить, почему ваш код цикла for не работает?, @chrisl