Не получается управлять серво приводом

yasenkov
Offline
Зарегистрирован: 09.07.2016

Серво привод как то странно дёргается в момент простоя. Так всё вроде бы работает , может кто знает как убрать эти подёргивания :


#include <Servo.h>
#include <IBusBM.h>

Servo myservo; 
IBusBM ibus;

int val;    
int readChannel(byte channelInput, int minLimit, int maxLimit, int defaultValue) {
  uint16_t ch = ibus.readChannel(channelInput);
    if (ch < 100) return defaultValue;
  return map(ch, 1000, 2000, minLimit, maxLimit);
  }
  bool readSwitch(byte channelInput, bool defaultValue) {
  int intDefaultValue = (defaultValue) ? 100 : 0;
  int ch = readChannel(channelInput, 0, 100, intDefaultValue);
  return (ch > 50);
}


void setup() {
  myservo.attach(3);  
  Serial.begin(115200);
  ibus.begin(Serial1);
  
  }

void loop() {
  val =  readChannel(9, -100, 100, 0);  
  val = map(val, -100, 100, 0, 180);     
  myservo.write(val); 
  Serial.println(readChannel(9, -100, 100, 0));

 delay(100);                          
}

вот собственно видео поведения

https://cloud.mail.ru/public/htJS%2FDSYa845Gc

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Попробуй убрать из кода вывод в сериал.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Так а значения-то какие печатает в этот момент - одно и то же или разные?

Только отладочная печать (строка 31) не совсем корректна. Т.к. в 28 и 31 строках формально могут быть прочитаны разные значения. Выводить в монитор нужно val, который передаётся серве.

Upper
Offline
Зарегистрирован: 23.06.2020

yasenkov пишет:

Серво привод как то странно дёргается в момент простоя. Так всё вроде бы работает , может кто знает как убрать эти подёргивания :

  myservo.write(val); 
 

Вывести в сериал val. Если оно не меняется, то подергивания действительно "странные". Если val меняется соразмерно подергиваниям, то странного нет, надо разбираться, почему val меняется.

П.С. kalapanga уже ответил

sadman41
Offline
Зарегистрирован: 19.10.2016

С Servo.h дерганья происходят по одной причине - что-то блокирует прерывания.

rkit
Offline
Зарегистрирован: 23.11.2016

Нормальные подергивания для дешевого серво, подключенного соплями.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

стандартно с канала должно прилетать по IBUS от 1000 до 2000, у тебя откуда такие значения?

yasenkov
Offline
Зарегистрирован: 09.07.2016

со всеми сервами такое, причём если работать ток с сервой то всё норм

yasenkov
Offline
Зарегистрирован: 09.07.2016

https://cloud.mail.ru/public/cYF4%2FzBhdpFChr если смотреть порт то val стоит на месте , но если померять напряжение то она скачет как и серва  https://cloud.mail.ru/public/P9hL%2FydGgHs626

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ты пробовал все что связано с Serial комментировать или нет?

Для наглядности:

#include <Servo.h>
#include <IBusBM.h>

Servo myservo; 
IBusBM ibus;

int val;    
int readChannel(byte channelInput, int minLimit, int maxLimit, int defaultValue) {
  uint16_t ch = ibus.readChannel(channelInput);
    if (ch < 100) return defaultValue;
  return map(ch, 1000, 2000, minLimit, maxLimit);
  }
  bool readSwitch(byte channelInput, bool defaultValue) {
  int intDefaultValue = (defaultValue) ? 100 : 0;
  int ch = readChannel(channelInput, 0, 100, intDefaultValue);
  return (ch > 50);
}


void setup() {
  myservo.attach(3);  
  ibus.begin(Serial1);
}

void loop() {
  val =  readChannel(9, -100, 100, 0);  
  val = map(val, -100, 100, 0, 180);     
  myservo.write(val); 
  delay(100);                          
}

 

yasenkov
Offline
Зарегистрирован: 09.07.2016

тоже самое .. не могу понять в чём дело. мне там чел написал что нужно не давать сервоприводу команду поворота выполнять , но естественно поможет мне он это сделать за бабло =).. вот думаю сам , наверняка пустяк какой то

 

yasenkov
Offline
Зарегистрирован: 09.07.2016

https://cloud.mail.ru/public/pmx9%2FhvtxXob9f бред какой то происходит

 


  val =  readChannel(5, -100, 100, 0); 

  val = map(val, -100, 100, 0, 3000);    
 myservo.writeMicroseconds(val);
 // myservo.write(val);

тож самое

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Попробуй в коде жестко задать какое-либо значение val.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Чо там в итоге то?

yasenkov
Offline
Зарегистрирован: 09.07.2016

тоже самое, даже если val жёстко задаёшь,.. заметил пока пульт не включен , рывков нет , как только пульт включаешь и начинается дёргание...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Тогда у меня сильное подозрение, что библиотеки конфликтуют (используют одни и те же ресурсы мк одновременно). Изначально я на сериал «грешил», но похоже дело в ibusbm.

yasenkov
Offline
Зарегистрирован: 09.07.2016

вот что обнаружил 

https://cloud.mail.ru/public/icd2%2FUB1viutSQ

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А я не понял - что это за значения и в чем вообще суть видео?

yasenkov
Offline
Зарегистрирован: 09.07.2016
 val =  readChannel(5, -100, 100,0);  
   Serial.println(val);

это вот это , почему значения  скачат  от + до - непонятно , нужно ток одно верхнее, почему появляется нижнее с - нусом

 

 

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ну может быть переполнение, но я не разбирался в вопросе - просто как предположение.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

вам sadman41 четко сказал причину в #4, вы сидите дальше гадаете.

yasenkov
Offline
Зарегистрирован: 09.07.2016

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

Upper
Offline
Зарегистрирован: 23.06.2020

Сколько всего планируется Серво, и какая Ардуина?

yasenkov
Offline
Зарегистрирован: 09.07.2016

3 сервы. Плата Leonardo. Но впринципи есть и уно и нано и Мега

yasenkov
Offline
Зарегистрирован: 09.07.2016

вот более просто код 

#include <IBusBM.h>
#include <Servo.h>

IBusBM IBus;    // IBus object
Servo myservo;  // create servo object to control a servo

void setup() {
  IBus.begin(Serial1);    // iBUS object connected to serial0 RX pin
  myservo.attach(9);     // attaches the servo on pin 9 to the servo object
}

void loop() {
  int val;
  val = IBus.readChannel(1); // get latest value for servo channel 1
  myservo.writeMicroseconds(val);   // sets the servo position 
  delay(20);
}

всё равно дёргается =((( задрала уже

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а не подключая IBUS моросит?

yasenkov
Offline
Зарегистрирован: 09.07.2016

нет

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

на этом скетче всё шикарно, приёмник по IBUS не подключен

#include <IBusBM.h>
#include <Servo.h>

IBusBM IBus;    // IBus object
Servo myservo;  // create servo object to control a servo

void setup() {
  IBus.begin(Serial);    // iBUS object connected to serial0 RX pin
  myservo.attach(9);     // attaches the servo on pin 9 to the servo object
}

void loop() {
  int val = 1500;
  val = IBus.readChannel(1); // get latest value for servo channel 1
  myservo.writeMicroseconds(val);   // sets the servo position
  delay(2000);
  val = 1000;
  myservo.writeMicroseconds(val);   // sets the servo position
  delay(2000);
  val = 2000;
  myservo.writeMicroseconds(val);   // sets the servo position
  delay(2000);
}

 

yasenkov
Offline
Зарегистрирован: 09.07.2016

ну серва крутится , скачков нет

Upper
Offline
Зарегистрирован: 23.06.2020

Что проверить возможное влияние блокировки прерываний, надо или запустить IBusBM в не блокирующем режиме, или использовать Servo не на прерываниях а на PWM

Т.к. я не знаю проверенной библиотеки Servo на PWM то проще начать с IBusBM

#include <IBusBM.h>
#include <Servo.h>

IBusBM IBus;    // IBus object
Servo myservo;  // create servo object to control a servo

void setup() {
  //IBus.begin(Serial1);    // iBUS object connected to serial0 RX pin
  IBus.begin(Serial1, IBUSBM_NOTIMER);
  myservo.attach(9);     // attaches the servo on pin 9 to the servo object
}

void loop() {
  IBus.loop();
  
  int val;
  val = IBus.readChannel(1); // get latest value for servo channel 1
  myservo.writeMicroseconds(val);   // sets the servo position 
  //delay(20);
  delay(1);
}

 

yasenkov
Offline
Зарегистрирован: 09.07.2016

███╗███╗███╗███╗█╗█╗████╗███╗
█╔═╝█╔█║█╔█║█╔═╝█║█║█╔══╝█╔█║
█║──█║█║███║█║──█║█║████╗█║█║
█║──█║█║█╔█║█║──█║█║█╔═█║█║█║
███╗█║█║█║█║███╗███║████║███║
╚══╝╚╝╚╝╚╝╚╝╚══╝╚══╝╚═══╝╚══╝

Работает идеально =))))