Comment puis-je contrôler un servo RC?


26

Je voudrais contrôler un petit servo RC (5 V, 500 mA) à partir des broches GPIO via Python .

Matériel

  • Quelles sont les connexions électriques requises?
  • Puis-je connecter plusieurs servos au Raspberry Pi?
  • Y a-t-il des limitations actuelles? Dois-je tamponner la broche de sortie avec un transistor?
  • Puis-je alimenter le servo directement à partir du Raspberry Pi, ou dois-je utiliser une alimentation externe? Ai-je besoin d'un condensateur pour lisser la consommation d'énergie saccadée du servo?

Logiciel

  • De quel logiciel / code Python ai-je besoin? Je sais que j'ai besoin d'impulsions de 20 ms, comment puis-je y parvenir?
  • À quel type de charge processeur puis-je m'attendre en utilisant le Raspberry Pi de cette manière?

Voici une question similaire qui pourrait vous aider à démarrer: raspberrypi.stackexchange.com/questions/27/…
Andrew Larsson

Réponses:


9

Les connexions électriques requises dépendent du servo dont vous disposez. Le GPIO fournit 3,3 V et jusqu'à 16 mA , ce qui est insuffisant pour votre servo, vous devrez donc le tamponner avec un transistor.

Il y a 8 broches GPIO sur l'en-tête d'extension , bien que d'autres broches puissent être reconfigurées pour donner jusqu'à 17 broches GPIO au total. Si vous en avez besoin de plus, vous devrez ajouter une sorte de multiplexeur.

Obtenir des signaux précisément synchronisés sera difficile sur le Raspberry Pi ou sur tout système d'exploitation non en temps réel, car les interruptions et les changements de tâches peuvent se produire à tout moment. Vous aurez probablement besoin d'une électronique externe pour fournir des signaux temporisés avec précision.

Andrew vous a indiqué un logiciel. La charge du processeur dépendra de ce que vous faites, mais le GPIO lui-même n'ajoute aucune charge.


2
D'un autre côté - 20 ms, c'est long, même pour les termes CPU du Raspberry Pi. Je ne m'inquiéterais pas trop de la précision du temps pour les servos RC.

2
@Tibor: 20 ms est la période des impulsions d'asservissement, pas la largeur en.wikipedia.org/wiki/Servo_control#Pulse_duration . Et l'exigence de résolution est bien pire que cela - pour obtenir 8 bits de résolution, vous avez besoin de 256 pas sur 2 millisecondes, donc ~ 8us.
Martin Thompson

8

Si vous utilisez un système d'exploitation en temps réel sur votre Raspberry Pi, cela est en effet possible. Comme d'autres l'ont déjà dit, vous aurez besoin d'une source d'alimentation externe pour les servos, mais à part cela, vous n'avez besoin d'aucun autre matériel supplémentaire.

Si vous exécutez Xenomai (correctif en temps réel pour Linux), vous pouvez exécuter un système Linux complètement familier, mais avec des capacités en temps réel supplémentaires.

J'ai écrit une petite bibliothèque C dans le but de contrôler les servos du Raspberry Pi. J'ai essayé de contrôler 3 servos en même temps, mais il n'y a vraiment aucune raison pour que cela ne fonctionne pas avec plus.

Vous pouvez trouver ma petite bibliothèque ici: https://github.com/simonfi/pi-servo L'ajout d'un wrapper Python pour cela devrait être trivial. Xenomai pour Raspberry Pi peut être trouvé ici: http://powet.eu/2012/07/25/raspberry-pi-xenomai/

La génération des signaux nécessaires pour trois servos consomme essentiellement une quantité négligeable de CPU. Je n'ai pas encore testé avec plus de trois.


5

Si cela ne vous dérange pas d'utiliser un pilote Linux Kernel, il y a servoblaster qui expose les servos comme un périphérique char.

https://github.com/richardghirst/PiBits

J'ai créé une nouvelle version qui ne consomme pas toutes les broches gpio pour les servos. Je l'utilise actuellement sur un petit robot à servocommande que j'ai construit et démo pour notre club de robot en utilisant IPGamePad pour le contrôler.

https://github.com/jronald/PiBits

En outre, vous ne voulez vraiment pas que les servos soient alimentés via le RPI, mais utilisez plutôt une alimentation séparée. Bien sûr, vous devez lier ces motifs ensemble. Étant donné que les sorties RPI vers le servo, aucun décalage de tension n'est requis, mais vous devrez faire très attention à ne pas câbler les choses de manière incorrecte.


fyi - le repo richartghrist semble avoir été maintenu tandis que la fourche jronald semble obsolète et cassée. En outre, je recommande de lire comment ignorer tous les servocommandes sauf les deux premiers et l' installation de Servoblaster
cwd

3

Les servos sont généralement contrôlés à l'aide de signaux PWM; vous devez vous référer à GPIO comme sortie PWM .

Il y a un support PWM sur la puce, nous devrions donc pouvoir l'utiliser à l'avenir. Fondamentalement, tout ce que le logiciel fait est de dire au matériel de produire des impulsions à une certaine fréquence. Certaines personnes ont réussi à utiliser des contrôleurs PWM externes sur I2C.


3

Il existe une carte d'extension disponible pour le Raspberry Pi appelée Gertboard qui est utilisée pour contrôler les servos et autres charges que le Pi ne peut pas piloter seul.


Je dois également ajouter qu'en raison de la popularité de ce produit, je pense qu'il est vendu sur la plupart des sites qui proposent le Raspberry Pi et ses accessoires.
Brandon Bailey

3

La connaissance de la façon de faire les choses sur le Pi s'est beaucoup améliorée au fil des ans depuis que cette question a été posée.

Il existe au moins quatre façons de générer des impulsions PWM / Servo chronométrées sur les gpios du Pi sans utiliser de matériel externe.

L'utilisation de modules du noyau pour ce faire est à peu près obsolète. Les solutions suivantes de l'espace utilisateur sont disponibles.

  • Le mien pigpio générera des impulsions servo et PWM générales indépendamment sur l'un des gpios 0-31 (C, Python, socket, pipe).
  • Servoblaster générera des impulsions servo et PWM générales indépendamment sur un maximum de 21 gpios (pipe).
  • RPIO générera des impulsions servo et PWM générales indépendamment sur l'un des gpios 0-31 (Python).
  • pi-blaster dérivé de Servoblaster (pipe)

2

Je serais surpris si vous pouviez synchroniser suffisamment les sorties tout en exécutant Linux pour contrôler avec précision un servo.

L'impulsion doit être contrôlée sur une plage de 2 millisecondes. Même si le tick du planificateur a une résolution de 100us (ce qui le pousse - c'est généralement 10 ms), vous ne pouvez résoudre que 20 étapes. Et c'est sans tenir compte de la gigue introduite par le changement de tâche.

Si un autre minuteur est disponible, vous pouvez potentiellement écrire un pilote de très bas niveau qui peut préempter même le système d'exploitation pour obtenir un timing précis. Cela semble amusant!


2

Je pense qu'essayer d'exécuter un servo directement à partir du port GPIO serait difficile et entraînerait une surcharge de CPU si c'est possible. J'utilise un servo-contrôleur USB et il fonctionne très bien et n'utilise presque pas de CPU, bien qu'il soit un peu difficile à configurer. Celui que j'ai est de 24 canaux, mais ils font une version à 6 canaux. J'ai également vu des contrôleurs à 2 et 4 canaux d'autres fournisseurs qui utilisent la série, ce qui serait plus facile et moins cher que l'USB si vous n'avez pas besoin de contrôler autant de servos.


0

Il existe un service Web GPIO complet pour lequel vous pouvez écrire vos propres plugins. Il semble déjà avoir un support pour contrôler n'importe quel nombre de servos. Voir leur répertoire "Contenu" pour un tas d'images ainsi que pour la disposition du tableau.

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

Semble être en C # exécutant Mono sur le Pi.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.