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();
}
}
}
@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
- Я создаю роботизированную руку, используя гибкий датчик, сервопривод и 2 xbees.
- Как подключиться к Arduino с помощью WiFi?
- AT-команда не отвечает на последовательный монитор
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- SIM800L не регистрируется в сети
- Как заставить сервопривод вращаться на угол больше 180°
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
Что именно представляет собой эта "проблема в работе серводвигателя"? Пожалуйста, внесите это в свой вопрос., @ocrdu
Я все устроил. Заикаясь., @Enes Orhan