Arduino для BAIT BOAT...

Панкратов_Сергей
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 битный таймер и черта в ступе…

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

Мешает…

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

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

У меня попкорн закончился,

Вы с этим завязывайте… Если советуете, то головой не жевать нужно.
А так у вас таймеры не только 16 битные у атмеги пропадут, а и 8-ми битные.

Probelzaelo:

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

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

А так у вас таймеры не только 16 битные у атмеги пропадут, а и 8-ми битные.

Не не не, не отпадут, я их намертво присобачил синей изолентой…

V_Alex
Probelzaelo:

Нет, 256 это протяженность импульса, пауза специально отрабатывается…

Сам импульс меняется не от 0% до 100%, а от 50% до 100% (от 1 до 2 мс). Если 100% - 255 тиков, то 50% - это 127 тиков.

Probelzaelo
V_Alex:

Сам импульс меняется не от 0% до 100%, а от 50% до 100% (от 1 до 2 мс). Если 100% - 255 тиков, то 50% - это 127 тиков.

это для случая когда есть нейтраль где то по середине но сигнал может быть и 1 и 50 тиков 0-50% одним словом примерно такие должны быть параметры – 700мс=0%=0, 1510мс=50%=127, 2200мс=100%=255
так что если у вас положение 0, это среднее положение стика, то да, это 127.

V_Alex

Мы опять не понимаем друг друга. В Вашем примере 100% импульса - 2200 мкс и 255 тиков. В таком случае один тик равен 2200/255 = 8,63 мкс. Для формирования импульса в 700 мкс нам понадобится 81 тик. Диапазон полезного сигнала составит 2200-700 = 1500 мкс или 174 тика (условно). Перед информационной частью импульса в любом случае идет “пустышка” - 700 мкс.
По Вашему сценарию, когда 700 мкс - это 0%, 2200 мкс - это 100%, а один тик равен (2200-700)/255 = 5,8 мкс, таймер придется запускать дважды.
В первом цикле он должен сформировать “пустышку” в 700 мкс (119 тиков по 5,8 мкс каждый), а во втором - информационную часть импульса - от 0 до 255 тиков по 5,8 мкс. На практике импульс формируется за один цикл работы таймера, а ход ручки соответствует изменению импульса от 1150 до 1850 мкс, остальная часть достается триммеру и дуалрайтам. По факту на управление сервой от ручки остается (1850-1150)/8,63 = 81 тик.

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

Александр, не утруждайтесь. Это не “не понимаем”.
Дурака включать или уводить спор в сторону на месте где нужно было написать: извините, ошибся- это обычное поведение оппонента.

Probelzaelo
V_Alex:

В Вашем примере 100% импульса - 2200 мкс и 255 тиков. В таком случае один тик равен 2200/255 = 8,63 мкс.

понимаем! но жуем одно и то же. дело еще и в том что 0 тоже далеко не 0мкс , минимуму соответствует примерно 700мкс(для апаратуры) поэтому делить нужно не 2200.

V_Alex:

По Вашему сценарию, когда 700 мкс - это 0%, 2200 мкс - это 100%, а один тик равен (2200-700)/255 = 5,8 мкс, таймер придется запускать дважды.

он и работает “дважды” один отрабатывает период, запускает процес формирования импульса заданной частотой(порядка 50 гц), а второй отслеживает скважность(длительность) каждого импульса. А за протяженностью оставшегося времени(паузы) ни кто специально не следит, ибо оно не нужно

V_Alex:

Перед информационной частью импульса в любом случае идет “пустышка” - 700 мкс.

Именно! А я не учитываю что это время тоже кушает тики того же самого таймера. Исправляюсь!

V_Alex:

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

Вот в этом мнении мы точно расходимся. я не учитываю что импульс то формируется аппаратно. Таймер в течении отработки импульса не работает два раза чтобы отработать 700, а потом остальное. Тут вы правы 100%

И больше того 2200 которые “предел” для сервы, но тоже еще не край для таймера. он же после срабатывания должен будет и дальше щелкать …

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

Дурака включать … … - это обычное поведение оппонента.

Нам это давно понятно и вАм не хворать…

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

Александр, не утруждайтесь. Это не “не понимаем”…

Сергей, тут дело чуть сложнее. Я для себя пытаюсь разобраться в возможностях Ардуино при работе со стандартными библиотеками. Пока я пришел в выводу, что библиотеки для работы с сервами годятся для построения наглядных пособий по робототехнике.
Получается, что для обработки и генерации сервоимпульсов нормального качества нужно использовать 16-разрядный таймер, либо делать это программно.
Учитывая тот факт, что сервоимпульс максимальной длительности 2 мс занимает 10% от такта в 20 мс, то на прием и выдачу на выход такого импульса требуется не более 20% рабочего времени контроллера, остальные 80% спокойно идут на математику. У меня программно получается сделать один тик равный 6 тактам микроконтроллера. При 8 МГц получается разрешение 2667 тиков на импульс в 2 мс. Соответственно, никакого джиттера нет и в помине.