Как я могу управлять RC-сервоприводом?

26

Я хотел бы управлять небольшим RC сервоприводом (5 В, 500 мА) с выводов GPIO через Python .

аппаратные средства

  • Каковы необходимые электрические соединения?
  • Могу ли я подключить несколько сервоприводов к Raspberry Pi?
  • Есть ли текущие ограничения? Нужно ли буферизовать выходной контакт с транзистором?
  • Могу ли я питать сервопривод напрямую от Raspberry Pi или использовать внешний источник питания? Нужен ли конденсатор, чтобы сгладить резкое энергопотребление сервопривода?

Програмное обеспечение

  • Какое программное обеспечение / код Python мне нужен? Я знаю, что мне нужно 20 мс импульсов, как мне этого добиться?
  • Какую нагрузку на процессор можно ожидать от использования Raspberry Pi таким образом?
Алекс Л
источник
Это похожий вопрос, который может помочь вам начать: raspberrypi.stackexchange.com/questions/27/…
Эндрю Ларссон,

Ответы:

9

Необходимые электрические соединения зависят от вашего сервопривода. GPIO обеспечивает 3.3 V и до 16 мА , что недостаточно для серво, так что вам нужно будет в буфер с транзистором.

В заголовке расширения имеется 8 выводов GPIO , хотя другие выводы можно перенастроить, чтобы в общей сложности получить до 17 выводов GPIO. Если вам нужно больше, вам придется добавить какой-то мультиплексор.

Получение точно синхронизированных сигналов будет непростым делом на Raspberry Pi или на любой ОС не в реальном времени, поскольку прерывания и переключение задач могут произойти в любое время. Вам, вероятно, понадобится внешняя электроника для обеспечения точно синхронизированных сигналов.

Эндрю указал вам на какое-то программное обеспечение. Загрузка процессора будет зависеть от того, что вы делаете, но сам GPIO не добавляет нагрузки.

Дэвид Сайкс
источник
2
С другой стороны - 20 мс - это ДОЛГОЕ время, даже для процессора Raspberry Pi. Меня не слишком беспокоит точность времени для RC-сервоприводов.
2
@Tibor: 20 мс - это период сервоимпульсов, а не ширина en.wikipedia.org/wiki/Servo_control#Pulse_duration . И требование к разрешению намного хуже, чем это - чтобы получить разрешение 8 бит, вам нужно 256 шагов за 2 миллисекунды, то есть ~ 8us.
Мартин Томпсон
8

Если вы используете операционную систему реального времени на Raspberry Pi, это действительно возможно. Как уже говорили другие, вам потребуется внешний источник питания для сервоприводов, но кроме этого вам не нужно никакого другого дополнительного оборудования.

Если вы используете Xenomai (исправление для Linux в реальном времени), вы можете запустить полностью знакомую систему Linux, но с дополнительными возможностями в реальном времени.

Я написал крошечную C-библиотеку с целью управления сервоприводами от Raspberry Pi. Я пытался управлять 3 сервоприводами одновременно с ним, но на самом деле нет никаких причин, почему он не должен работать с большим количеством.

Вы можете найти мою крошечную библиотеку здесь: https://github.com/simonfi/pi-servo Добавление оболочки Python для нее должно быть тривиальным. Xenomai для Raspberry Pi можно найти здесь: http://powet.eu/2012/07/25/raspberry-pi-xenomai/

Генерация необходимых сигналов для трех сервоприводов в основном потребляет незначительное количество процессора. Я не тестировал больше трех.

simonfi
источник
5

Если вы не возражаете против использования драйвера ядра Linux, существует сервобластер, который выставляет сервоприводы как символьное устройство.

https://github.com/richardghirst/PiBits

Я разветвлял новую версию, которая не использует все контакты GPIO для сервоприводов. В настоящее время я использую его на небольшом роботе с сервоприводом, который я построил и продемонстрировал для нашего клуба роботов, используя IPGamePad для управления им.

https://github.com/jronald/PiBits

Кроме того, вы действительно не хотите питания этих сервоприводов через RPI, а вместо этого использовать отдельный источник питания. Конечно, вам нужно связать это основание вместе. Так как RPI выводит на сервопривод, сдвиг напряжения не требуется, но вы должны быть очень осторожны, чтобы не связать вещи неправильно.

Джеймс Рональд
источник
fyi - репо ричартхриста, похоже, сохранилось, в то время как вилка Джрональда выглядит устаревшей и сломанной. Кроме того, я рекомендую прочитать, как игнорировать все, кроме первых двух сервоуправлений, и установить Servoblaster
cwd
3

Сервоприводы, как правило, управляются с использованием сигналов ШИМ; Вы должны обращаться к GPIO как к ШИМ-выходу .

На чипе есть поддержка ШИМ, поэтому мы сможем использовать ее в будущем. По сути, все программное обеспечение сообщает аппаратному обеспечению, чтобы оно генерировало импульсы с определенной частотой. Некоторые люди имели успех, используя внешние контроллеры ШИМ через I2C.

Алекс Чемберлен
источник
3

Для Raspberry Pi имеется плата расширения, называемая Gertboard, которая используется для управления сервоприводами и другими нагрузками, которые Pi не может управлять самостоятельно.

Брэндон Бэйли
источник
Я должен также добавить, что из-за популярности этого продукта я считаю, что он продается на большинстве сайтов, которые предлагают Raspberry Pi и аксессуары.
Брэндон Бэйли
3

С тех пор, как был задан этот вопрос, знания о том, как делать вещи на Пи, значительно улучшились.

Существует как минимум четыре способа генерирования аппаратно синхронизированных импульсов ШИМ / Серво на чипах Pi без использования внешнего оборудования.

Использование модулей ядра для этого в значительной степени не рекомендуется. Доступны следующие пользовательские решения.

  • Мой собственный pigpio будет генерировать импульсы сервопривода и общего ШИМ независимо от любого из gpios 0-31 (C, Python, socket, pipe).
  • Сервобластер будет генерировать импульсы сервопривода и общего ШИМ независимо до 21 gpi (труба).
  • RPIO будет генерировать импульсы сервопривода и общего ШИМ независимо от любого из gpios 0-31 (Python).
  • пи-бластер, полученный из сервобластера (труба)
Джоан
источник
2

Я был бы удивлен, если бы вы могли достаточно хорошо рассчитать время вывода при использовании Linux для точного управления сервоприводом.

Импульс должен контролироваться в диапазоне 2 миллисекунд. Даже если тик планировщика имеет разрешение 100 мкс (что толкает его - обычно это 10 мс), это всего лишь 20 шагов, которые вы можете решить. И это без учета дрожания, вносимого переключением задач.

Если есть другой доступный таймер, вы могли бы написать драйвер очень низкого уровня, который может опередить даже ОС, чтобы получить точную синхронизацию. Звучит забавно!

Мартин Томпсон
источник
2

Я думаю, что попытка запустить сервопривод напрямую из порта GPIO будет сложной и вызовет большую нагрузку на процессор, если это вообще возможно. Я использую сервоконтроллер USB, он прекрасно работает и практически не использует процессор, хотя его немного сложно настроить. У меня есть 24 канала, но они делают 6-канальную версию. Я также видел 2-х и 4-х канальные контроллеры других производителей, которые используют последовательные порты, которые были бы проще и дешевле, чем USB, если вам не нужно управлять таким количеством сервоприводов.

Vic320
источник
0

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

https://bitbucket.org/PaulTechGuy/raspberrypi.dotnet.gpioweb

Похоже, в C # работает Mono на Pi.

user2737646
источник