Как правильно управлять серводвигателем, используя TimerOne и библиотеку ServoTimer2? - PullRequest
0 голосов
/ 14 апреля 2020

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

#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
Time Difference :1898
Pressure=15
13096
14994
Time Difference :1898
Pressure=15
13096
14994
Time Difference :1898
Pressure=15
13096
14994
Time Difference :1898
Pressure=15

 }
...