Arduino для BAIT BOAT...

yus12

ссылку давал я, но он к лаки не подходит. Плюс сейчас они меняют протокол. Некоторые новые приемники не видят старых датчиков и наоборот

Probelzaelo
yus12:

Плюс сейчас они меняют протокол. Некоторые новые приемники не видят старых датчиков и наоборот

они просто защищаются от “подделок” вернее друг от друга. меняют длину первого, стартового импульса например и все. есть варианты с частотой 315,433,916мгц. все остальное пока еще неизменно.

1 month later
Filipp23

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

#include <Servo.h>
Servo servo1;
Servo servo2;
int Val;

int Val1;
boolean vLED1 = false;//Hilfsvariable wird zusammen mit der LED auf “true” gesetzt, wenn if-Bedingung erfüllt wurde. Am Ende des loop-teils werden, wenn das Einganssignal in der “Mittelstellung” ist, alle Hilfsvariablen wieder auf “false” gesetzt. Somit kann die LED wieder umgeschaltet werden.
boolean vLED2 = false;//
int iLED1;
int iLED2;

void setup ()
{
pinMode(2, INPUT); //Вход канал1
servo1.attach(4); //Сервомашинка 1
servo2.attach(5); //Сервомашинка2

pinMode (6, OUTPUT); //Выход на реле света1
pinMode (7, OUTPUT); //Выход на реле света2
pinMode (3, INPUT); //Вход канал3
}

void loop (){
Val = pulseIn(2, HIGH, 75000);
if (Val<1500) servo1.write(map(Val, 1000,1500,0,90 )); //Упровление сервой
if (Val>1500) servo2.write(map(Val, 1500,2000,0,90 ));

Val1 = pulseIn(3,HIGH,75000);//Ließt Eingangssignal
iLED1 = digitalRead(6);//Ließt Status von LED1
iLED2 = digitalRead(7);

//if-Bedinung für LED1
if (Val1>1850 && Val1<1950 && iLED1==LOW && vLED1 == false){//Wenn Eingangssignal zwischen 1228 und 1242, Ausgang an LED1 aus und der Status des Ausgangs in diesem loop-durchgang noch nicht verändert wurde, dann
digitalWrite (6,HIGH);//schalte Ausgang an
vLED1 = true;//Setze Hilfsvariable auf true. Nächste if-bedinung stimmt somit nicht mehr (bis Eingangssingal in “Mittelstellung” und die LED bleibt an.
}
if (Val1>1850 && Val1<1950 && iLED1==HIGH && vLED1 == false){//Gleich wie oben, bloß umgekehrt zum ausschalten der LED
digitalWrite (6,LOW);
vLED1 = true;
}
//if-Bedinung für LED2
if (Val1>1024 && Val1<1250 && iLED2==LOW && vLED2 == false){
digitalWrite (7,HIGH);
vLED1 = true;
}
if (Val1>1024 && Val1<1250 && iLED2==HIGH && vLED2 == false){
digitalWrite (7,LOW);
vLED1 = true;
}
//if-Bedinung zum Zurücksetzen der Hilfsvariablen bei Mittelstellung des Eingangssignals
if (Val1>1490 && Val1<1600){
vLED1 = false;
vLED2 = false;
}

}

Суть работы ардуинки такова , один канал работает как серворазделитель , а другой канал отвечает за включение и выключение габаритов и фары.

Probelzaelo
Filipp23:

есть так называемый дребезг сигнала, что не очень хорошо.

Давай разберемся для сначала, что за дребезг, в чем именно он выражается?

Filipp23
Probelzaelo:

Давай разберемся для сначала, что за дребезг, в чем именно он выражается?

Он выражается: при снятии сигнала команда не сразу фиксируется, то есть например я хочу дать команду на вкл LED1 поднимаю стик в верх а он вместо того чтобы зафиксировать мою команду начинает то включать то выключать. приходиться несколько раз давать команду.

Панкратов_Сергей

После подачи команды на включение( отключение) нужно ввести паузы, чтоб хватало времени убрать команду.
То есть, к примеру ,после
digitalWrite (6,HIGH);
пишем
delay(1500); // полторы секунды защитный интервал
и так после всех четырех команд digitalWrite.
Сейчас у вас цикл очень короткий и пока вы переместили стик в крайнее положение и вернули в среднее происходит несколько включений-выключений светодиода, для вас это выглядит как переключение случайным образом ( дребезг).

Probelzaelo
Filipp23:

например я хочу дать команду на вкл LED1 поднимаю стик в верх а он вместо того чтобы зафиксировать мою команду начинает то включать то выключать.

Для начала, есть подозрение что у тебя переключения происходят у самой границы, когда стик находится у самого края?
Если есть сервотестер, попробуй подавать комманды с него. У него заметно шире диаппазон ШИМ чем у пульта. Либо вариант 2 сразу изменить точки переключения.

Filipp23
Панкратов_Сергей:

После подачи команды на включение( отключение) нужно ввести паузы, чтоб хватало времени убрать команду.
То есть, к примеру ,после
digitalWrite (6,HIGH);
пишем
delay(1500); // полторы секунды защитный интервал
и так после всех четырех команд digitalWrite.
Сейчас у вас цикл очень короткий и пока вы переместили стик в крайнее положение и вернули в среднее происходит несколько включений-выключений светодиода, для вас это выглядит как переключение случайным образом ( дребезг).

Сергей большое спасибо помогло. Теперь стик на управление светом отрабатывает как надо.

Probelzaelo:

Для начала, есть подозрение что у тебя переключения происходят у самой границы, когда стик находится у самого края?
Если есть сервотестер, попробуй подавать комманды с него. У него заметно шире диаппазон ШИМ чем у пульта. Либо вариант 2 сразу изменить точки переключения.

К сожалению сервотестера нет, а о каких точках идет речь?

Probelzaelo
Filipp23:

о каких точках идет речь

Речь была о моментах включения Val1>1850 и Val1<1250, но врядли бывают передатчики с более узким диаппазоном. Но на самом деле нужный диаппазон от 1250 до1850 перекрывают все, практически гарантировано. Тем более Сергей уже предложил простой и совершенно рабочий вариант.

appolinari
Панкратов_Сергей:

после
digitalWrite (6,HIGH);
пишем
delay(1500); // полторы секунды защитный интервал

Есть один неприятный эффект при таком варианте кода. Ваша программа эти полторы секунды будет “висеть”. Если это не критично, то такой вариант приемлем.

Probelzaelo
appolinari:

неприятный эффект при таком варианте кода. Ваша программа эти полторы секунды будет “висеть”.

Если у контроллера нет других задач то пусть висит… Если что можно время сократить. либо выбрать другой вариант для отработки “паузы”

Панкратов_Сергей
appolinari:

Есть один неприятный эффект при таком варианте кода.

Я б для себя такой код в целом вообще не писал.
Но вопрос был в том что изменить ( добавить) в этом коде.
Это решение на поверхности и в данном случае вполне рабочее.
А вообще задача может быть выполнена тысячей способов…

Filipp23
appolinari:

Если это не критично, то такой вариант приемлем.

Приветствую всех. По поводу кода это вообще не критично так как мне надо что бы происходил вкл и выкл без всяких проблем, а длительность задержки не играет не какой роли. Насчет того что бы написать код по другому, я не умею, по этому он такой как есть ( то есть собран из кодов найденных в интернете) , если есть желание у кого то помочь правильно его написать то от помощи не откажусь, но и за эту подсказку большое спасибо Сергею.
Еще хотелось бы спросить как побороть в моем коде дрожание сервы, или это не получиться? серва самая обычная MG90 9g

appolinari

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

Probelzaelo
Filipp23:

Еще хотелось бы спросить как побороть в моем коде дрожание сервы, или это не получиться? серва самая обычная MG90 9g

С сервой все сложнее. она может дрожать даже в том случае если будешь подавать на нее совершенно стабильный сигнал. Проблема в том, что в серве есть собственная электроника, да еще и плюс механика, включая потенциометр обратной связи и каждая из деталей пытаеся внести свой вклад в нестабильность. Можно, конечно попытаться сделать персональную подстройку под каждую серву, предварительно протестировать все состояния(для ардуино это всего 256 позиций) и пытаться отловить все нестабильные позиции, а впоследствии этих позиций избегать. сложно и главное все равно не надежно.

Filipp23

Понятно, тогда даже не буду замарачиваться.

V_Alex
Probelzaelo:

для ардуино это всего 256 позиций

256 тиков - это только на ход сервы или от нуля до 2 мс?

Probelzaelo
V_Alex:

256 тиков - это только на ход сервы или от нуля до 2 мс?

У процессора ATMega есть маленькая особенность, за длительность импульсов шим сигнала отвечает встроенный таймер, с разрядностью всего 8 бит.
Поэтому у чипа есть возможность сформировать всего 256 значений для шим сигнала. и как бы мы не пытались “увеличить точность” и как сильно не дробили бы сигнал задавая очень точно милисекунды для Servo(), но при
позиционировании сервомотора реальный сигнал все равно
будет округляться. просто самые младшие биты задаваемого значения будут потеряны…
В то же время контроллер встроенный в серву понимает и якобы умеет отрабатывать значительно больше позиций, заявляется аж до 1024.
Вывод простой, АТМега как будто относительно грубый инструмент, но для нужд радиоуправления его более чем достаточно.
Если посчитать дискретность поворота без учета дальнейшей механики 180град./256поз. получаем шаг в 0.7 градуса.
Итого, в нашем распоряжении 256 позиций для всего диаппазона используемых значений. это и на ход и на яркость и на все что угодно,
от минимума(800мс) угол =0, и до максимума (2400мс) угол=180, при этом каждая 1 шага = 6.25мс(шим импульса) или 0.7градуса поворота серво.

Панкратов_Сергей
Probelzaelo:

У процессора ATMega есть маленькая особенность, за длительность импульсов шим сигнала отвечает встроенный таймер, с разрядностью всего 8 бит.

А что мешает применить 16-ти битный таймер?

Probelzaelo
Панкратов_Сергей:

А что мешает применить 16-ти битный таймер?

Разве что то мешает?
Мысль понятна, сейчас Вы очевидно и расскажите по простому, как человек должен будет воспользоватсься 16(10) битным ШИМом?