Arduino - Сервомоторное управление и программное обеспечение

Мои два arduino общаются последовательно с XBee. Приемник arduino также управляет серводвигателем. Сервопривод работает стабильно, когда нет соединения XBee. Но при последовательной связи Arduino возникает проблема в работе серводвигателя. Серводвигатель заикается при вращении, поэтому возникает заикание.

Вы можете мне помочь?

Мой код координатора:

#include <SoftwareSerial.h>
#define xBeeRxPin 10
#define xBeeTxPin 9
int deger3;
int deger4;
String d1,d2,d3;
SoftwareSerial xBeeSerial(xBeeRxPin, xBeeTxPin);

void setup() { 
  Serial.begin(38400);
  xBeeSerial.begin(38400); 
}void loop() {
  
  deger3 = analogRead(A0);
  deger4 = analogRead(A2);
  
  String deger5 =  (String)deger3 + ";" + (String)deger4 ;

  xBeeSerial.println(deger5);
  
  delay(50);
}

Мой код приемника:

#include <SoftwareSerial.h>
#include <Servo.h>
#define xBeeRxPin 10
#define xBeeTxPin 9
SoftwareSerial xBeeSerial(xBeeRxPin, xBeeTxPin);
String d1,d2,d3;

const int trigPin = 4;
const int echoPin = 3;
long duration;
int distance;
Servo myServo;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  xBeeSerial.begin(38400);
  Serial.begin(38400);
  myServo.attach(11); 
}
void loop() { 
  for(int i=15;i<=165;i++){  
    myServo.write(i);
     delay(10);
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, 11200); 
    distance= duration*0.034/2;

    
    if(xBeeSerial.available()>0){
      d1=xBeeSerial.readString();
    }
  }
  
  for(int i=165;i>15;i--){  
    myServo.write(i);
     delay(10);
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, 11200); 
    distance= duration*0.034/2;
  

    if(xBeeSerial.available()>0){
      d1=xBeeSerial.readString();
  }
 }  
}

, 👍1

Обсуждение

Что именно представляет собой эта "проблема в работе серводвигателя"? Пожалуйста, внесите это в свой вопрос., @ocrdu

Я все устроил. Заикаясь., @Enes Orhan


1 ответ


1

Когда SoftwareSerial вводит прерывание каждый раз, когда он получает символ, и busy-ожидает (задерживает) время в каждом образце данных по мере поступления битов в символ. Никакие другие процедуры обслуживания прерываний не могут выполняться, пока это происходит. Он также отключает прерывания при отправке.

Библиотека сервоприводов для AVR использует прерывания таймера для генерации сигналов положения сервопривода.

Когда символы принимаются, SoftwareSerial будет мешать генерации сигнала положения сервопривода, поскольку одновременно может выполняться только одна процедура обслуживания прерываний.

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

Существуют также альтернативные библиотеки, которые используют функцию захвата ввода AVR на выводе ICP для выполнения некоторой работы serial in hardware, и это может сработать для вас. Вот один из примеров библиотеки.

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

,

Я удалил некоторые материалы, касающиеся I2C / Wire, потому что это, вероятно, был совершенно бесполезный совет с участием XBee., @timemage

Может быть, можно найти и сервобиблиотеку, которая не использует прерывания?, @ocrdu

Да, у меня была мысль добавить это, но я не знаю ни одного из них. Если у вас есть рекомендация, я внесу ее, или если вы внесете ее в отдельный ответ, я проголосую за нее., @timemage

Возможно, я добавлю в https://www.arduino.cc/reference/en/libraries/servo-hardware-pwm / если вы добавите ответ, я удалю его и специально вызову ваш ответ., @timemage