¿Cómo puedo manejar 88 solenoides con un Arduino con PWM?

Para un (loco) próximo proyecto escolar, estoy convirtiendo un piano para que sea una pianola controlada por computadora. Actualmente estoy planeando usar solenoides montados debajo del extremo de las teclas (obviamente, en el lado de la acción, como el sistema DiskClavier de Yamaha y el sistema PianoDisc).

Estoy planeando usar un Arduino para tomar señales MIDI y controlar todos los solenoides. Necesito PWM en los solenoides para poder controlar la velocidad a la que los solenoides golpean las teclas, determinando así el volumen. El problema es que no es una tarea fácil de controlar, usando PWM, 88 solenoides usando un Arduino.

Pensé que podría usar un generador PWM genérico para generar las señales, y hay placas generadoras servo PWM de 16 canales que son MUY baratas. Sin embargo, los servos requieren un tipo de señal muy específico que es bastante diferente al PWM genérico que necesito aquí. ¿Alguien sabe si estos funcionarán para generar PWM genérico? (enlace: http://www.ebay.com/itm/PCA9685-16-Channel-12-bit-PWM-Servo-motor-Driver-I2C-Module-For-Arduino-Robot-/272557014281?hash=item3f75a9fd09: g:6SIAAOSwax5Yozsi )

Una vez que recibo una señal PWM, ¿puedo usar un MOSFET y un diodo (para protección contra el voltaje de retroceso) para controlar los solenoides directamente?

¿Algo que me esté perdiendo por completo aquí?

Cualquier ayuda y orientación es muy apreciada.

PD Sé que estoy un poco loco tratando de hacer esto.

(Me gusta la locura. Es parte de cómo uno aprende. Saltar a lo más profundo tiene riesgos, pero también tiene lecciones). Pero primero, debe averiguar exactamente cómo va a manejar las teclas. Mencionaste PWM, pero ¿logrará lo que quieres? ¿Se puede hacer de manera más sencilla sin perder de vista los objetivos? ¿Qué otros métodos podría probar también? Si viniste aquí con todo esto resuelto, creo que el resto podría ser más fácil de abordar. Pero realmente necesitas resolver esto, primero. Y asegúrese de que la idea funcione igual de bien desde la A más baja hasta la C más alta. Las teclas se ponderan de manera diferente.
Deje a un lado el Arduino por ahora y pregúntese qué rey del poder requerirán 88 solenoides. Claro, no activará todos a la vez, pero activar 10 simultáneamente es realista. Además, la naturaleza espasmódica y el consumo repentino de corriente de un solenoide son demasiado inconvenientes. Puede ser más fácil usar 88 motores de juguete de CC económicos para tirar suavemente de las llaves. Pero incluso esto requerirá hardware de interfaz entre el procesador Atmel en Arduino y los motores. Servomotores por pasos. Mucho más caro que los motores de juguete, pero directamente controlable desde un Arduino. Y ahora puedes usar PWM.
¡Este proyecto suena caro! Teniendo en cuenta las tasas de respuesta de los solenoides pequeños que son lo suficientemente potentes como para accionar las teclas de manera adecuada, es posible que pueda salirse con la suya con un conjunto de once registros de desplazamiento 74HC595 en cascada para proporcionar los pulsos que ingresan a las puertas MOSFET. Sin embargo, tendrías que cronometrarlos bastante rápido (probablemente varios megahercios). Los pines de habilitación de salida (EN) simplemente se pueden atar alto todo el tiempo y solo usar DATA y SCLK para registrar los bits PWM y finalmente activar y desactivar RCLK una vez que se hayan enviado 88 bits. Probablemente necesite más potencia de CPU de la que puede proporcionar un Arduino.
@Wossname Si no me equivoco, ese enfoque solo me dará control PWM sobre toda la configuración, y no señales PWM de solenoide individuales. ¿O me equivoco? Específicamente, necesito poder controlar la velocidad de los solenoides individuales, y no todos a la vez.
@st2000 Pensé en los servos por un tiempo, pero el problema es que los servos lo suficientemente rápidos y que tienen suficiente torque para esta aplicación son MUY caros en comparación con los solenoides comparables. He pensado en los requisitos de energía de este proyecto, y es un problema. Los solenoides que funcionarían para esto dibujarían alrededor de 1A, lo que significa que si todos ellos fueran disparados, serían casi 100A a 12V, lo cual no es una locura (aunque todavía bastante loco, seré justo). Tendría límites de software que no permitirían que todos los solenoides se dispararan a la vez.
Piano, ¿verdad? Mirar dentro. Mira cómo se acopla la acción de la tecla al martillo. Una vez que comprenda esto, se dará cuenta de que (en la mayoría de los casos) puede jalar el martillo directamente con mucha menos fuerza. Esto se debe a que el movimiento lento de alta presión de la tecla (de un dedo) se traduce en un movimiento rápido de martillo de presión ligera. Conecte su solenoide o motor o servo allí. No a las llaves.
@willem.hill, está algo equivocado :) Marque los bits que corresponden a las teclas que desea controlar y luego module el pin de habilitación de salida para activar los solenoides. Esto entonces se convierte en una tarea de software. El algoritmo para impulsar esto sería relativamente simple pero con algunos matices aquí y allá y debería optimizarse bien. Pero mantiene el hardware barato y simple. Sin embargo, tendría que ejecutar la velocidad de salida a una frecuencia bastante alta, los Arduinos no son realmente adecuados para este tipo de cosas. Para un proyecto serio como este, solo use un microcontrolador simple.

Respuestas (1)

Olvídese de las locuras: bien por usted, investigar y experimentar es una excelente manera de aprender.

El módulo NXP PCA9685 que identificó controlará los FET, como usted describe. Coloque una resistencia en serie de 1 K entre cada salida PCA9685 y su puerta FET. Esto limita la corriente hacia/desde la capacitancia de la puerta durante la conmutación de la salida PWM a 5 mA máx., de lo contrario, la salida PWM genera un cortocircuito en su flanco ascendente.

También permitiría, o colocaría, un menú desplegable de 10 K a GND en cada salida PWM. La hoja de datos PCA9685 establece que las salidas bajarán durante el reinicio del IC. En el momento del encendido, no desea que docenas de solenoides hagan clic porque no es lo suficientemente inmediato o por algún otro imprevisto. Esto es puramente una precaución, lo que le permite poner un menú desplegable en el pin PCA9685 / OE y hacer que Arduino active la lógica alta una vez que el suministro se haya estabilizado y el circuito se haya asentado. No debería ser necesario, pero es mejor planificarlo y no encajar las piezas en su amarre experimental.

¡Gracias por esto! ¡No me di cuenta de que las placas "Servo PWM" de Adafruit están usando el NXP PCA9685, que es simplemente un controlador PWM estándar diseñado para aplicaciones de control de LED! Estúpido de mí, debería haber hecho esta investigación.
@willem.hill, nada estúpido: esta es una buena opción de módulo PWM. Puede conducir lo que quiera, la conducción LED era solo el mercado previsto por el fabricante. Mire las matrices FET en los circuitos integrados y también puede obtener su cuenta regresiva de componentes allí.