¿Cómo puedo controlar un servo RC?

26

Me gustaría controlar un pequeño servo RC (5 V, 500 mA) desde los pines GPIO a través de Python .

Hardware

  • ¿Cuáles son las conexiones eléctricas requeridas?
  • ¿Puedo conectar varios servos a la Raspberry Pi?
  • ¿Hay alguna limitación actual? ¿Necesito proteger el pin de salida con un transistor?
  • ¿Puedo alimentar el servo directamente desde la Raspberry Pi o debo usar una fuente de alimentación externa? ¿Necesito un condensador para suavizar el consumo de energía desigual del servo?

Software

  • ¿Qué software / código de Python necesito? Sé que necesito pulsos de 20 ms, ¿cómo puedo lograr esto?
  • ¿Qué tipo de carga de CPU puedo esperar al usar Raspberry Pi de esta manera?
Alex L
fuente
Esta es una pregunta similar que podría ayudarlo a comenzar: raspberrypi.stackexchange.com/questions/27/…
Andrew Larsson

Respuestas:

9

Las conexiones eléctricas requeridas dependen del servo que tenga. El GPIO proporciona 3.3 V y hasta 16 mA , lo cual es insuficiente para su servo, por lo que deberá protegerlo con un transistor.

Hay 8 pines GPIO en el encabezado de expansión , aunque se pueden reconfigurar otros pines para dar hasta 17 pines GPIO en total. Si necesita más, tendrá que agregar algún tipo de multiplexor.

Obtener señales cronometradas con precisión será complicado en Raspberry Pi o en cualquier sistema operativo que no sea en tiempo real, ya que las interrupciones y los cambios de tareas pueden ocurrir en cualquier momento. Probablemente necesitará componentes electrónicos externos para proporcionar señales temporizadas con precisión.

Andrew te ha señalado algún software. La carga de la CPU dependerá de lo que esté haciendo, pero el GPIO en sí no agrega ninguna carga.

David Sykes
fuente
2
Por otro lado, 20 ms es MUCHO tiempo, incluso para los términos de CPU de Raspberry Pi. No me preocuparía demasiado la precisión del tiempo para los servos RC.
2
@Tibor: 20 ms es el período de pulsos de servo, no el ancho en.wikipedia.org/wiki/Servo_control#Pulse_duration . Y el requisito de resolución es mucho peor que eso: para obtener 8 bits de resolución, necesita 256 pasos en 2 milisegundos, por lo que ~ 8us.
Martin Thompson
8

Si está ejecutando un sistema operativo en tiempo real en su Raspberry Pi, esto es realmente posible. Como ya han dicho otros, necesitará una fuente de alimentación externa para los servos, pero a excepción de eso, no necesita ningún otro hardware adicional.

Si está ejecutando Xenomai (parche en tiempo real para Linux) puede ejecutar un sistema Linux completamente familiar, pero con capacidades adicionales en tiempo real.

He escrito una pequeña biblioteca C con el propósito de controlar servos desde la Raspberry Pi. He intentado controlar 3 servos al mismo tiempo, pero realmente no hay ninguna razón por la que no debería funcionar con más.

Puede encontrar mi pequeña biblioteca aquí: https://github.com/simonfi/pi-servo Agregar un envoltorio de Python para ello debería ser trivial. Xenomai para Raspberry Pi se puede encontrar aquí: http://powet.eu/2012/07/25/raspberry-pi-xenomai/

Generar las señales necesarias para tres servos está básicamente consumiendo una cantidad insignificante de CPU. No he probado con más de tres todavía.

simonfi
fuente
5

Si no le importa usar un controlador de kernel de Linux, hay un servoblaster que expone los servos como un dispositivo char.

https://github.com/richardghirst/PiBits

He bifurcado una nueva versión que no consume todos los pines gpio para el uso de servos. Actualmente lo estoy usando en un pequeño robot servo impulsado por el que construí y demostré para nuestro club de robots usando IPGamePad para controlarlo.

https://github.com/jronald/PiBits

Además, realmente no desea la potencia de los servos a través del RPI, sino que utiliza una fuente de alimentación separada. Por supuesto, necesitas unir esos motivos. Dado que las salidas RPI al servo no se requieren cambios de voltaje, pero debe tener mucho cuidado de no cablear las cosas incorrectamente.

James Ronald
fuente
fyi: el repositorio richartghrist parece haberse mantenido mientras que el tenedor jronald parece anticuado y roto. Además, recomiendo leer cómo ignorar todos menos los dos primeros controles servo y Instalación Servoblaster
cwd
3

Los servos son, en general, controlados utilizando señales PWM; debe referirse a GPIO como salida PWM .

Hay soporte PWM en el chip, por lo que deberíamos poder usarlo en el futuro. Básicamente, todo lo que hace el software es decirle al hardware que produzca pulsos a una frecuencia determinada. Algunas personas han tenido éxito usando controladores PWM externos sobre I2C.

Alex Chamberlain
fuente
3

Hay una placa de extensión disponible para la Raspberry Pi llamada Gertboard que se usa para controlar servos y otras cargas que la Pi no puede manejar por sí misma.

Brandon Bailey
fuente
También debo agregar que debido a la popularidad de este producto, creo que está agotado en la mayoría de los sitios que ofrecen la frambuesa pi y sus accesorios.
Brandon Bailey
3

El conocimiento de cómo hacer las cosas en el Pi ha mejorado bastante en los años transcurridos desde que se hizo esta pregunta.

Hay al menos cuatro formas de generar pulsos PWM / Servo temporizados por hardware en los gpios de Pi sin usar hardware externo.

El uso de módulos de kernel para hacer esto es bastante obsoleto. Las siguientes soluciones de usuario están disponibles.

  • Mi propio pigpio generará pulsos Servo y PWM generales independientemente en cualquiera de los gpios 0-31 (C, Python, socket, pipe).
  • Servoblaster generará pulsos Servo y PWM generales de forma independiente en hasta 21 gpios (tubería).
  • RPIO generará pulsos Servo y PWM generales independientemente en cualquiera de los gpios 0-31 (Python).
  • pi-blaster derivado de Servoblaster (tubería)
joan
fuente
2

Me sorprendería si puede cronometrar las salidas lo suficientemente bien mientras ejecuta Linux para controlar con precisión un servo.

El pulso debe controlarse en un rango de 2 milisegundos. Incluso si la marca del planificador tiene una resolución de 100us (que la está presionando, generalmente es de 10 ms), solo puede resolver 20 pasos. Y eso sin tener en cuenta la inquietud introducida por el cambio de tareas.

Si hay otro temporizador disponible, podría escribir un controlador de muy bajo nivel que pueda adelantarse incluso al sistema operativo para que su sincronización sea precisa. ¡Suena divertido!

Martin Thompson
fuente
2

Creo que tratar de ejecutar un servo directamente desde el puerto GPIO sería difícil y causaría una sobrecarga de la CPU si es posible. Utilizo un servocontrolador USB y funciona muy bien y casi no usa CPU, aunque es un poco complicado de configurar. El que tengo es de 24 canales, pero hacen una versión de 6 canales. También he visto controladores de 2 y 4 canales de otros proveedores que usan serie que sería más fácil y más barato que USB si no necesita controlar tantos servos.

Vic320
fuente
0

Hay un servicio web GPIO en pleno funcionamiento para el que puede escribir sus propios complementos. Parece que ya tiene soporte para controlar cualquier número de servos. Vea su directorio de "Contenido" para ver un montón de imágenes y también para el diseño del tablero.

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

Parece estar en C # ejecutando Mono en el Pi.

usuario2737646
fuente