Проблемы с подключением сервоприводов
- Войдите на сайт для отправки комментариев
Доброго времени суток! Знаю что тема уже заезжена на много раз, но всеже рассчитываю на вашу помощь господа. Мой проект на Ардуино Nano v3.0. Подключаю два сервопривода (MG995) через дополнительный Аккум NICD 7.2v и DC-DC стабилизатор (выставлено 5v на выходе к сервоприводам) к плате на выходы A0,A1 (все остальные выходы заняты), подключена общая земля к GND платы. Для Управления использую стандартную библиотеку Servo. Проблема в том что при двух подключённых сервах схема не работает, при посылке команд на сервы ни одна из них не хочет работать. Если по очереди цепляю только одну из серв к А0 или А1 все работает нормально. Посоветуйте плиз в чем может быть проблема? Может DC-DC на каждую серву по отдельности нужно ставить или питания не хватает???
Может срабатывает ограничение на 6 pwm каналов?
Может срабатывает ограничение на 6 pwm каналов?
А такое ограничение точно есть? Где об этом можно прочитать и как его это ограничение обойти? Судя по описанию то что выдаёт Гугл, практичеки все выхода можно использовать как PWM., ограничений до 6 я не нашёл..
Какие ещё могут быть варианты?
А ежели запустить короткий скетчик, который будет просто крутить сервы на этих двух выходах туда-сюда через какие-нибудь дилэи?
Может срабатывает ограничение на 6 pwm каналов?
А такое ограничение точно есть? Где об этом можно прочитать и как его это ограничение обойти?
Наверное в даташите на атмегу 328P, ограничение точно есть, сам не использовал такое количество каналов ШИМ, надобности не было
Так вроде две сервы работают ноомально, какие ограничения? Посмотрите, как я их запускал, может чем-то поможет. Там ещё и передатчик был для беспроводного управления, но скетч коротенький - разберётесь.
Так вроде две сервы работают ноомально, какие ограничения? Посмотрите, как я их запускал, может чем-то поможет. Там ещё и передатчик был для беспроводного управления, но скетч коротенький - разберётесь.
так товарищ не сказал, сколько каналов задействовано под PWM )))
Тоже хотел декодер шины I-BUS сделать, на 10 каналов, а не посмотрел, сколько ШИМ можно снять...
Servo.h сама ногами дрыгает по таймеру:
Servo.h сама ногами дрыгает по таймеру:
Я вижу здесь 12 серв обрабатывается
А каковы задержки? Если миллисекунд двадцать-тридцать то годится, останется только 10 цифровых выходов задействовать?
Скетч не мой, сдёрнул с экрана видеоролика )))
Всё, как заказывали - 20мс:
Всё, как заказывали - 20мс:
можно ли переделать этот код на использование servo.h
Servo.h делает ненастоящий PWM, просто каждые 20мс включает заданную ногу на 540..2400мкс. А в том скетче, вроде бы, на полной скорости ШИМ нужен?
Servo.h делает ненастоящий PWM, просто каждые 20мс включает заданную ногу на 540..2400мкс. А в том скетче, вроде бы, на полной скорости ШИМ нужен?
чем быстрее тем лучше, чтобы не получилось как с дроном почты России )))
Господа всем большое спасибо за отклики! На данный момент нахожусь в командировке, поэкспериментировать с вашими советами смогу только в пятницу! По результатам отпишусь. Попробую запустить короткий скетч только на две сервы.
Отвечаю на вопрос сколько аппаратных PWM уже задействовано - все 6ть задействованы. Теперь нужно чтобы заработали программные PWM на двух оставшихся пинах A0,A1.
Господа всем большое спасибо за отклики! На данный момент нахожусь в командировке, поэкспериментировать с вашими советами смогу только в пятницу! По результатам отпишусь. Попробую запустить короткий скетч только на две сервы.
Отвечаю на вопрос сколько аппаратных PWM уже задействовано - все 6ть задействованы. Теперь нужно чтобы заработали программные PWM на двух оставшихся пинах A0,A1.
тогда да, определить количество серв
#define SERVOS_PER_TIMER 2
Гы-ы.. а на КАКОЙ таймер, если уже все 6 задействованы? Может приспособить шилд, на PCA9685? Он дает 16 ШИМ каналов с разрешением в 12 бит .. должно хватить и вроде как сервами управлять тоже может. И работает по I2C, то бишь ноги не жрет..
Гы-ы.. а на КАКОЙ таймер, если уже все 6 задействованы? Может приспособить шилд, на PCA9685? Он дает 16 ШИМ каналов с разрешением в 12 бит .. должно хватить и вроде как сервами управлять тоже может. И работает по I2C, то бишь ноги не жрет..
Интерфейс I2C использует пины A4 и A5, которые уже задействованы в проекте.. так что вариант с PCA9685 отпадает, также в просторах интернета пишут что I2C не очень хорошо работает с Nano.
По одному их советов выше также попробовал запустить простой код для управления только сервами - результатов не дало.
Какие еще можно попробовать варианты? Или единственный вариант уходить на более мощную плату с большим количеством PWM?
На заборах тоже много чего пишут. I2C он и в африке интерфейс. Ему без разницы НАНО там или УНО с Мегой. Перекинуть железки с А4,А5 на А1,А0 - разве это проблема? Не вижу какая, мой ХШ на зарядке и протирке. а подключив расширительный шилд получаете 16х 12-и битных каналов. На них же можно перекинуть и работающие 6 под PWM, заодно освободите ещё чего-то для чего-то..
В вашем случае ситуевина банальна: Servo.h использует таймер для организации ногодрыга и если Вы пользуете эту библиотеку, то у Вас перестанут работать аппаратные PWM на этом таймере. Раз Вы не пришли сюда с такой проблемой, то ноги с аппаратным PWM - вы тупо используете для чего-то иного.
Отсюда, перекинуть то что сидит на ногах таймера1 (он обслуживает Servo.h для НАНО, УНО, МИНИ, МИКРО) на ноги А1, А0 и пересадить ваш PWM c A0,A1 на ноги таймера и пользовать analogWrite() без какой-либо библиотеки вовсе, предварительно настроив его на работу в режиме серв.
Подозреваю, что скетч не ваш и перемещать с ноги на ногу код - не под силу..
На заборах тоже много чего пишут. I2C он и в африке интерфейс. Ему без разницы НАНО там или УНО с Мегой. Перекинуть железки с А4,А5 на А1,А0 - разве это проблема? Не вижу какая, мой ХШ на зарядке и протирке. а подключив расширительный шилд получаете 16х 12-и битных каналов. На них же можно перекинуть и работающие 6 под PWM, заодно освободите ещё чего-то для чего-то..
В вашем случае ситуевина банальна: Servo.h использует таймер для организации ногодрыга и если Вы пользуете эту библиотеку, то у Вас перестанут работать аппаратные PWM на этом таймере. Раз Вы не пришли сюда с такой проблемой, то ноги с аппаратным PWM - вы тупо используете для чего-то иного.
Отсюда, перекинуть то что сидит на ногах таймера1 (он обслуживает Servo.h для НАНО, УНО, МИНИ, МИКРО) на ноги А1, А0 и пересадить ваш PWM c A0,A1 на ноги таймера и пользовать analogWrite() без какой-либо библиотеки вовсе, предварительно настроив его на работу в режиме серв.
Подозреваю, что скетч не ваш и перемещать с ноги на ногу код - не под силу..
Добрый вечер, Arhat109-2! Спасибо за отзыв на мое сообщение. Решил последовать вашему совету, сегодня приехала вот такая плата PCA9685:http://s.aliexpress.com/JzmuqyaA
скетч как вы правильно заметили не мой, но с ноги на ногу переставить смогу. Прошу совета какую лучше библиотеку использовать с данной платой?
Я не пользую сторонние библиотеки без их просмотра и анализа. Конкретно для I2C у меня есть свой ресурс, им и пользуюсь. Эти платы у нас есть, библиотек к ним даже не искал, делал все через свой драйвер I2C с чтением даташита .. дело было с полгода назад, уже мало что помню. Там вроде бы никаких сложностей нет.
На каждый канал есть по 4 4/8-и битных регистра, собранных в пару 12-и битных "включено"/"выключено". Счетчик крутится 0..4095 по циклу. Компаратор включает канал, при совпадении счетчика с регистром "включено" и выключает его при совпадении с регистром "выключено" .. собственно и всё. При запуске надо выдержать 500мксек, но про них есть в даташите. Можно собирать платки последовательно, в т.ч. сажать их на единый (программируемый) адрес, так чтобы одной отправкой управлять сразу несколькими платками одновременно. До 62-х плат - всё очень даже кучеряво. I2C способен работать вплоть до 1Мгц, что тоже нефигово. Есть режим от внутреннего генератора (25Мгц с программируемым прескалером), но можно подцепить внешний (нет на этих платах), есть некая дурь в виде 13-го бита в регистрах, но этим можно и пренебречь ..
Что там такого сложного, чтобы накатать свой драйвер "левой-задней пяткой"? :)
twi.h, twi.c у Ардуино ИДЕ последних релизов в общем-то вполне достойный, можно пользоваться и им практически хоть в хвост, хоть в гриву.
Кстати, там есть "автоинкрементный" режим общения, позволяющий иметь копии в SRAM МК всех регистров, управлять платой тупой записью в эту копию, а потом через I2C заливать все регистры "оптом" в "фоновом" или "задачном" режиме.. :)
Я не пользую сторонние библиотеки без их просмотра и анализа. Конкретно для I2C у меня есть свой ресурс, им и пользуюсь. Эти платы у нас есть, библиотек к ним даже не искал, делал все через свой драйвер I2C с чтением даташита .. дело было с полгода назад, уже мало что помню. Там вроде бы никаких сложностей нет.
На каждый канал есть по 4 4/8-и битных регистра, собранных в пару 12-и битных "включено"/"выключено". Счетчик крутится 0..4095 по циклу. Компаратор включает канал, при совпадении счетчика с регистром "включено" и выключает его при совпадении с регистром "выключено" .. собственно и всё. При запуске надо выдержать 500мксек, но про них есть в даташите. Можно собирать платки последовательно, в т.ч. сажать их на единый (программируемый) адрес, так чтобы одной отправкой управлять сразу несколькими платками одновременно. До 62-х плат - всё очень даже кучеряво. I2C способен работать вплоть до 1Мгц, что тоже нефигово. Есть режим от внутреннего генератора (25Мгц с программируемым прескалером), но можно подцепить внешний (нет на этих платах), есть некая дурь в виде 13-го бита в регистрах, но этим можно и пренебречь ..
Что там такого сложного, чтобы накатать свой драйвер "левой-задней пяткой"? :)
twi.h, twi.c у Ардуино ИДЕ последних релизов в общем-то вполне достойный, можно пользоваться и им практически хоть в хвост, хоть в гриву.
Кстати, там есть "автоинкрементный" режим общения, позволяющий иметь копии в SRAM МК всех регистров, управлять платой тупой записью в эту копию, а потом через I2C заливать все регистры "оптом" в "фоновом" или "задачном" режиме.. :)
Спасибо за развёрнутый ответ, но писать самому драйвер для PCA9685 это не мой уровень:) Решил воспользоваться библиотекой adafruit, может кому пригодится: https://learn.adafruit.com/16-channel-pwm-servo-driver/using-the-adafruit-library
по ссылки находится мануал по установке и скетч для запуска. В результате удалось запустить две сервы на arduino nano одновременно что не может не радовать.. спасибо форуму и вашим советам!!! Пока залил только код для Управления сервами на ардуинку, на днях перепаяю пины А4,А5 и попробую наконец собрать весь проект воедино, надеюсь все получится хотя как знать ...
Ну какой там "драйвер"? :) Плюнуть нужное количество байт (регистров, значений) по шине I2C .. делов-то.
И ещё: установив правильно прескалер платки, получаете нормальные 50гц и в этом случае, можно занулив одну пару регистров (напр. "_ON") выводить частоту ШИМ только на вторую пару, что вдвое снижает количество пересылки. Подняв частоту I2C (дуньки тянут до 800Мгц включительно) можно получить очень шустрое управление.