Arduino для BAIT BOAT...

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) битным ШИМом?

V_Alex
Probelzaelo:

Итого, в нашем распоряжении 256 позиций для всего диаппазона используемых значений. это и на ход и на яркость и на все что угодно,

Вы не совсем поняли мой вопрос. Канальный импульс изменяется от 1 мс до 2 мс. АТМEGA своим 8-разрядным таймером формирует этот импульс целиком. Т.е. для 1 мс это составляет 127 тиков, а для 2 мс - 255 тиков. В этом случае на рабочий ход сервы приходится не 255, а 255-127=128 тиков. Если Вы сперва принимаете сервосигнал с такой-же точностью, а при этом он составляет, например, 201,5 тика, то контроллер его воспринимает то, как 201 тик, то как 202 тика. При обработке это колебание импульса передается на выход и серва, подключенная к этому выходу, будет скакать между этими двумя состояниями (зудеть), поскольку нормальное разрешение аналоговой сервы составляет примерно 0,5% хода и один тик больше этого значения.
Скачки импульса должны с запасом помещаться в эту мертвую зону, поэтому разрешение сервосигнала и должно составлять 1024 бита или лучше. Точность, которую обеспечивает Ардуино, достаточна для работы РЦ-свичей. Если сигнал вырабатывается контроллером, а не приходит извне и не обрабатывается, то разрешения 128 тиков вполне достаточно и для сервы. Для робота эти “ступеньки” будут незаметны. А вот для построения V-микшера под сервы Ардуино не годится, хотя с регуляторами такой микшер работать будет вполне терпимо.

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

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

Или обойтись вовсе без таймера 😃

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

Разве что то мешает?

Probelzaelo:

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

Мешает… То что Атмеге незаслуженно приписали какую то несуществующую особенность

Probelzaelo
V_Alex:

АТМEGA своим 8-разрядным таймером формирует этот импульс целиком. Т.е. для 1 мс это составляет 127 тиков, а для 2 мс - 255 тиков.

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

V_Alex:

Или обойтись вовсе без таймера

При использовании библиотеки Servo про таймер можно не думать. Просто нужно помнить что зависимость от него ни куда не делась и что при использовании ШИМ, все завязано “аппаратно” и просто не нужно использовать соответствующий таймер для каких то других целей, благо таймеров несколько и можно выбрать каким пользоваться для чего.
Совсем без таймера будет сложновато. хотя, если нет ни каких других задач то возможно написать и собственный программный ШИМ, например тупо работающий “в лоб” или на выдержках пауз типа delay() только при этом будет совсем не эффективное использование процессора. В принципе(для лекторов), можно использовать и 16 битный таймер и черта в ступе…

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

Мешает…

У меня попкорн закончился, вернусь и внимательно слушаю дальше… вдруг что полезное мелькнет …