#1 2017-07-13 13:25:58

Женя_7
Учасник
Зареєстрований: 2017-07-13
Повідомлень: 7

Дребезжат сервы.

Всем доброго времени суток.
Пожалуйста, помогите правильно прописать  команду servo.detach();
Передатчик:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10); 
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte potent0 = 0; // потенциометр на 0 аналоговом
byte potent1 = 1; //
byte transmit_data[2]; // массив, хранящий передаваемые данные
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
radio.begin(); //активировать модуль
radio.setAutoAck(0);         //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(1, 15);    //(время между попыткой достучаться, число попыток)
radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(64);     //размер пакета, в байтах
radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
radio.setChannel(0x5f);  //выбираем канал (в котором нет шумов!)
radio.setPALevel (RF24_PA_LOW); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
 //должна быть одинакова на приёмнике и передатчике!
 //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
radio.powerUp(); //начать работу
radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}
void loop() {
transmit_data[1] = map(analogRead(potent1), 0, 1023, 10, 164); // получить значение
 // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
transmit_data[0] = map(analogRead(potent0), 0, 1023, 10, 164);
radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
}

Приёмник:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>
RF24 radio(9, 10); //
byte recieved_data[2]; // массив принятых данных
byte servo = 3; // сервопривод на 3 цифровом
byte servo2 = 5; //
Servo myservo1;
Servo myservo2;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
myservo1.attach(servo);
myservo2.attach(servo2);
radio.begin(); //активировать модуль
radio.setAutoAck(0);         //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(1, 15);    //(время между попыткой достучаться, число попыток)
radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(64);     //размер пакета, в байтах
radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
radio.setChannel(0x5f);  //выбираем канал (в котором нет шумов!)
radio.setPALevel (RF24_PA_LOW); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
radio.powerUp(); //начать работу
radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}
void loop() {
byte pipeNo;
while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
radio.read( &recieved_data, sizeof(recieved_data) );         // чиатем входящий сигнал
  //то бишь 0 или 1
myservo1.write(recieved_data[1]); // повернуть серво на угол 0..180
  // значение получено с 1 элемента массива
myservo2.write(recieved_data[0]); // сигнал
 // в соответствии с принятыми данными со 2 места массива, диапазон 0...180
  }
Serial.print(recieved_data[1]);
Serial.print("  ");
Serial.println(recieved_data[0]);
delay(1);
}

Неактивний

#2 2017-07-13 14:20:53

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: Дребезжат сервы.

вам же вроде на arduino.ru подсказали.

Неактивний

#3 2017-07-13 14:29:28

Женя_7
Учасник
Зареєстрований: 2017-07-13
Повідомлень: 7

Re: Дребезжат сервы.

vvr пише:

вам же вроде на arduino.ru подсказали.

На Амперке, Вы мне советовали, я спросил как прописать, Вы так и не ответили )

Неактивний

#4 2017-07-14 07:56:25

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: Дребезжат сервы.

но вы же и не попробовали

Неактивний

#5 2017-07-14 09:32:02

Женя_7
Учасник
Зареєстрований: 2017-07-13
Повідомлень: 7

Re: Дребезжат сервы.

vvr пише:

но вы же и не попробовали

Я вам ещё на Амперке написал что пробовал, + В инете искал по ключевым словам. Нашёл ТРИ абсолютно разных по реализации скетча, которые делают то же, что и мой скетч.
Человек учится на примерах, я вас попросил привести пример, вы промолчали.

Неактивний

#6 2017-07-14 09:37:42

Женя_7
Учасник
Зареєстрований: 2017-07-13
Повідомлень: 7

Re: Дребезжат сервы.

vvr пише:

но вы же и не попробовали

Я решил проверить, может быть сервы дребезжат потому что они принимают такой дребезжащий искажёный сигнал. Прописал на приемнике Serial.print, а он все показания в одну строку выдаёт, получается каша. Я пол дня потратил, что бы написать код, что бы выводило в ДВЕ строки!

Вот часть кода, зацените:

Serial.print(recieved_data[1]);
Serial.print("  ");
Serial.println(recieved_data[0]);
delay(1);

А вы говорите что не пробовал..

Неактивний

#7 2017-07-14 09:57:09

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: Дребезжат сервы.

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

Неактивний

#8 2017-07-14 11:34:53

Женя_7
Учасник
Зареєстрований: 2017-07-13
Повідомлень: 7

Re: Дребезжат сервы.

vvr пише:

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

1, Я уже писал - Я решил проверить, может быть сервы дребезжат потому что они принимают такой дребезжащий искажённый сигнал.
Вы наверно не заметили, что я убрал из скетча строки отвечающие за энергосбережение. Потому что с ними приёмник получал данные рывками.
2, Как я заведу переменные на отслеживание положения сервы для её отключения при достижении нужного положения если я никогда этого НЕ делал, и НЕ представляю как это сделать! Примеров нет..

Неактивний

#9 2017-08-06 23:27:26

ВАлерий99
Учасник
Зареєстрований: 2017-08-06
Повідомлень: 8

Re: Дребезжат сервы.

Я вообще начинающий, делаю первый прект.
Для прикола создал свою программу управления сервами на беспилотник
Может кому интересно, а дрожания не было
Смысл в том, что все импульсы на сервы стартуют сразу, потом до 700мкс я вычисляю требуемые длительности импульсов с учётом перегрузок, угловых скоростей и тд, в цикле считываю время и сравниваю с требуемым для каждого импульса.После того как счётчик посчитал прекращение всех 4 импульсов программа идёт дальше.
Если я отключал коррекции по параметрам движения самолёта, то сервы практичеси не дёргались
А в стандартном варианте самолёт должен парировать резкие движения неопытного пилота, коим я и являюсь
Стабилизатор дифференциальный, ибо нет элеронов на крыльях

void servoAUT()  {
  volatile unsigned long TG, Tr;
      //  Serial.print("R=");Serial.println(srvR);///ЭТО ОТ ПРЕДИДУЩЕГО ЦИКЛА
       // Serial.print("K=");Serial.println(srvK);
       // Serial.print("L=");Serial.println(srvL);               
   TG=micros();   
  byte s1=1,s2=1,s3=1,s4=1;
  digitalWrite(8, HIGH);// установили 1 -начало импульса
  digitalWrite(7, HIGH);//
  digitalWrite(6, HIGH);//
  digitalWrite(5, HIGH);//

      srvR=3000-pals[2]-GY/9+GX/10-80*AY -100*AX;
      srvR=constrain(srvR,830,2100);
        srvK=pals[3]+GZ/20;
        srvK=constrain(srvK,830,2100);
      srvL=pals[2]+GY/9+GX/10-80*AY+100*AX;
      srvL=constrain(srvL,830,2100);
     
   unsigned long Tp1=TG+srvK;//  руль !!! от крена!!!
   unsigned long Tp2=TG+pals[1];// газ 
   unsigned long Tp3=TG+srvR;     // тангаж прав
    unsigned long Tp4=TG+srvL;// тангаж лев !!!
 
   do{ 
    Tr=micros();
  if(Tr>Tp1 && s1==1) {digitalWrite(6, LOW);s1=0;} //  руль, ножка 6
  if(Tr>Tp2 && s2==1) {digitalWrite(8, LOW);s2=0;}  // газ,
  if(Tr>Tp3 && s3==1) {digitalWrite(5, LOW);s3=0;}//
  if(Tr>Tp4 && s4==1) {digitalWrite(7, LOW);s4=0;}//   левый, ножка 7
   }
    while((s1+s2+s3+s4)>0);     
}

А может сервы дёргаются из-за нестабильного питания на передатчике и соответственно опорного напряжения на потенциометрах джойстиков?
Осциллографом я наблюдал импульсные помехи в питании до 0,3 вольта.

Остання редакція ВАлерий99 (2017-08-06 23:34:24)

Неактивний

#10 2017-08-07 20:08:21

ВАлерий99
Учасник
Зареєстрований: 2017-08-06
Повідомлень: 8

Re: Дребезжат сервы.

.

Вячеслав Азаров пише:
ВАлерий99 пише:

Я вообще начинающий, делаю первый прект.
Для прикола создал свою программу управления сервами на беспилотник
Может кому интересно, а дрожания не было
Смысл в том, что все импульсы на сервы стартуют сразу, потом до 700мкс я вычисляю требуемые длительности импульсов с учётом перегрузок, угловых скоростей и тд, в цикле считываю время и сравниваю с требуемым для каждого импульса.После того как счётчик посчитал прекращение всех 4 импульсов программа идёт дальше.
Если я отключал коррекции по параметрам движения самолёта, то сервы практичеси не дёргались
А в стандартном варианте самолёт должен парировать резкие движения неопытного пилота, коим я и являюсь
Стабилизатор дифференциальный, ибо нет элеронов на крыльях

void servoAUT()  {
  volatile unsigned long TG, Tr;
      //  Serial.print("R=");Serial.println(srvR);///ЭТО ОТ ПРЕДИДУЩЕГО ЦИКЛА
       // Serial.print("K=");Serial.println(srvK);
       // Serial.print("L=");Serial.println(srvL);               
   TG=micros();   
  byte s1=1,s2=1,s3=1,s4=1;
  digitalWrite(8, HIGH);// установили 1 -начало импульса
  digitalWrite(7, HIGH);//
  digitalWrite(6, HIGH);//
  digitalWrite(5, HIGH);//

      srvR=3000-pals[2]-GY/9+GX/10-80*AY -100*AX;
      srvR=constrain(srvR,830,2100);
        srvK=pals[3]+GZ/20;
        srvK=constrain(srvK,830,2100);
      srvL=pals[2]+GY/9+GX/10-80*AY+100*AX;
      srvL=constrain(srvL,830,2100);
     
   unsigned long Tp1=TG+srvK;//  руль !!! от крена!!!
   unsigned long Tp2=TG+pals[1];// газ 
   unsigned long Tp3=TG+srvR;     // тангаж прав
    unsigned long Tp4=TG+srvL;// тангаж лев !!!
 
   do{ 
    Tr=micros();
  if(Tr>Tp1 && s1==1) {digitalWrite(6, LOW);s1=0;} //  руль, ножка 6
  if(Tr>Tp2 && s2==1) {digitalWrite(8, LOW);s2=0;}  // газ,
  if(Tr>Tp3 && s3==1) {digitalWrite(5, LOW);s3=0;}//
  if(Tr>Tp4 && s4==1) {digitalWrite(7, LOW);s4=0;}//   левый, ножка 7
   }
    while((s1+s2+s3+s4)>0);     
}

А может сервы дёргаются из-за нестабильного питания на передатчике и соответственно опорного напряжения на потенциометрах джойстиков?
Осциллографом я наблюдал импульсные помехи в питании до 0,3 вольта.

Наврядли из-за питания, скорее из-за неправильных вычислений и/или формирования управляющих сигналов. Почитайте ТАУ, может поможет.

читал, читал...
Мне кажется, Вы меня спутали с инициатором темы, но моя система работает нормально, если выключаю ОС,метания рулей нет нет.
Включаю-на земле стоящий самолёт начинает качать, как и положено, от дёрганья рулей, которое передаётся всему самолёту
Ибо ОС, собственная частота, моменты инерции продольный поперечный и тд и тп

Остання редакція ВАлерий99 (2017-08-07 20:21:45)

Неактивний

#11 2017-08-14 16:24:24

ВАлерий99
Учасник
Зареєстрований: 2017-08-06
Повідомлень: 8

Re: Дребезжат сервы.

а про дёргание от питпния вы правы. ибо запитка потенциометров на передатчике происходитот напряжения питания, так же как и запитка линейки R-2R в АЦП
Я не прав, и не будем вносить сумятицу в головы другим.

По этой причине дёрганья не будет

Остання редакція ВАлерий99 (2017-08-14 16:25:23)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму