шим и сервопривод конфликт.
- Войдите на сайт для отправки комментариев
Пнд, 26/02/2018 - 10:44
Прошу прощения если было, ткните носом.
Строю кораблик для завоза прикорма. управление от РУ машинки киоша трех канальное, ардуино нано, драйвер моторов пока на HG7881, моторов два, и две сервы для сброса прикорма.
драйвера подключены
#define mot1_F 5 // выходы на драйвер
#define mot1_R 6
#define mot2_F 9 // выходы на драйвер
#define mot2_R 10
сервы
servo1.attach (15);
servo2.attach (14);
написан/стырен обработчик сигналов с приемника для рулежки/езды на прерываниях второй и третьей ноги.
типа
void gaz_ppm() { // PPM read interrupt
ct = micros(); // read current time
ms_gaz=ct-lt; // ms = current time - last time
lt=ct; // last time
if(ms_gaz>2200) // fix time bug
ms_gaz=tmp; // fix time bug
tmp=ms_gaz; // fix time bug
и обработка третьего канала для управления двумя сервами
ch1 = pulseIn(pulse1_pin1, HIGH, 25000);
if (ch1 < 1000) servo1.write(180); else servo1.write(0);
if (ch1 > 2000) servo2.write(180); else servo2.write(0);
по одельности в коде все работает.
работа серв меня устраивает.
работа двигателей тоже (вперед,назад, повороты, раздрай)
в библиотеке SERVO сказано что при ее использовании "На контроллерах отличных от Mega использование библиотеки отключает возможность использовать выходы 9 и 10 в режиме ШИМ даже если привод не подключен к этим выводам"
Есть альтернативная библиотека SERVO2 , аналогичная штатной библиотеке, с ее помощью удалось крутить моторы и к сожалению только одну серву из двух.
библиотека серво я так понял использует TIMER1 для своих нужд , он же используется для ШИМ, если возможность переключить таймер , и как это сделать?
Servo.h использует таймеры #1, #3, #4 и #5, т.е. 16-битные таймеры. У 328-го МК (Arduino Nano) 16-битный таймер только один - #1. Так что переключить вы ничего никуда не сможете.
а какое решение проблемы пожете подсказать, сменить ардуинку?
" Катер из потолочки " читали?
Лично я бы начал крутить сервы без библиотеки.
Для поворота им нужно на протяжении некоторого времени подавать импульс, продолжительность которого пропорциональна углу поворота. Для разных моделей он отличается, однако Servo.h пользуется такими: 544мкс для поворота на 0 и 2400мкс для поворота на 180. Если вам удерживать их не надо, то, думаю, что для вашей задачи даже блокирующий код с delay() подойдёт. Синяя SG90 у меня на столе проворачивается на 180 за 0.5сек максимум.
А чем не устраивают другие ШИМ-пины? 3 и 11? Используйте их, чего Вы прицепились к 9 и 10?
Лично я бы купил Турнигу и забыл про Ардуину.
Ищите FlySky er9x
Кстати в этой, старой , стоит Атмега64 стоит и софт конфигуратора чудесный есть - er9x eePe.
Можно хоть летать, хоть на экскаваторе работать.
нашел такой код
изменил строку
if (Serial.available() > 0) step_on=(Serial.read())*10;
на step_on= значения подставлял от 0 до 180
но чего то он не работает
А чем не устраивают другие ШИМ-пины? 3 и 11? Используйте их, чего Вы прицепились к 9 и 10?
Серве не надо всегда подавать сигнал,
она будет стоять без сигнала в последнем положении.
Даже команда в библиотеке есть: detatch
купить каждый может ))), а эту выкинуть? а зачем тогда мудрить что то, когда можно готовый кораблик за 40 к взять!
Если нет проворачивающий нагрузки, то конечно будет стоять - кто же спорит.
Здесь что-то не так, на 3-ем пине ШИМ есть, а на втором - нет, А Вы их используете одинаково. Так нужен ШИМ для PPM или нет?
И прекрасно - 5, 6, 3 и 11 - первый таймер никак не задействован. Что мешает?
с дуней одной кнопкой или серией кнопок через резисторы можно творить чудеса, ИМХО, например открывать крышку сброса прикорма оч. медленно или очень быстро, включить выключить свет. .... два раза нажал, один раз коротко, нажал по держал.
купить каждый может ))), а эту выкинуть? а зачем тогда мудрить что то, когда можно готовый кораблик за 40 к взять!
Тогда я не понял.
У вас уже есть аппаратура?
Какой модели?
Обычно один пин управляет одним устройством: сервой, мотором......
При этом сигнал - это не включено-выключено.
на 2 и 3 пине есть прерывание которое используется для захвата ппм сигнала, кусок кода в первом сообщении, 5,6 ноги используются для плавного запуска двигателей вперед, 9 и 10 соответственно назад.
вот весь код.
вместо библиотеки SERVO , эксперементировал с библиотекой SERVO2 результат , с первой сервы крутятся как надо, моторы работают не правильно, со второй библиотекой моторы крутятся адекватно, но работает только одна серва.
аппа KT-200, с добавленым третьим каналом, приемник от нее же четырех канальный.
на 2 и 3 пине есть прерывание которое используется
Так используйте прерывание на других пинах, чего Вы к ШИМ'овским привязались?
кусок кода в первом сообщении,
Я не читал Ваш код. Вставляйте правильно, если хотите, чтобы читали.
Так используйте прерывание на других пинах, чего Вы к ШИМ'овским привязались?
прошу прощения... а на других пинах прерывания есть?
Поторопился не указал ДУНЮ NANO она.
Можно, но будет ли это для вас проще, чем крутить серву вручную, например - большой вопрос.
не понял
Т.е. "да, можно на других пинах поймать прерывания"
А в библиотеке серво2 может кто поковыряться с ней работает корректно, но только одна серва. библиотека есть здесь в конце статьи http://wiki.amperka.ru/робототехника:сервоприводы
прошу прощения... а на других пинах прерывания есть?
А то! На всех есть, кроме А6 и A7. Только attachInterrupt на них не работает. Возьмите какую-нибудь библиотеку для них и пользуйте, благо это добра (библиотек) как биоматериала за баней.
ну так это и есть внешнее прерывание.
Что "это"? Вы, если хотите помощи, объясняйтесь понятнее. Я вот не понимаю в чём у Вас вообще проблема.
Вам нужно 4 ШИМ-пина. Они у Вас есть, но Вы зачем-то один из них заняли под прерывание, и из этого пальца высосали несуществующую проблему.
Я же Вам говорю, оставьте ШИМ-пины в покое и используйте для прерываний другие пины, т.к. на них тоже есть прерывания типа PCINT. Библиотек для PCINT навалом. Пользуйтесь.
В чём Ваша проблема-то? Я никак понять не могу.
по тому что я так делал и оно работает, по тому что я не делал по другому и не представляю как это получится. в таком случае ППМ сигнал можно считать еще проще всего одной строкой на и на любой ноге.
ch1 = pulseIn(pulse1_pin1, HIGH, 25000);
могу сильно ошибаться но, "железное" прерывание более надежно для основной функции движеня, дабы не ездить за большой лодкой в случае подвисания ДУНИ.
опять же можно не мудрить а купить "нормальные" регуляторы хода, многоканальную апу, несколько RC свичей, а дунку выкинуть!
Эта музыка будет вечной! Вы бы хоть прочитали что-нибудь, я же ссылки давал. PCINT тоже железное прерывание. Ничуть не менее железное, чем LEVEL, которым Вы пользуетесь.
Ну, впрочем, как говорила Рая Абельская: "не хочите, не ешьте". У меня и своих дел хватает.