Prólogo
Tengo un par de buenos sistemas de altavoces soviéticos en casa. Pero esta técnica es bastante antigua y simplemente no puede encenderse desde el control remoto o automáticamente, sino que se acerca constantemente al amplificador de sonido y lo enciende / apaga simplemente de forma diferida. Resolví este problema. Al principio, se compró Arduino y se realizó el proyecto, pero la calidad del trabajo no me convenía y el proyecto se rehizo para STM32F103C8. Como resultado, obtuve un dispositivo que tiene 4 entradas de audio, 1 salida de audio, entrada de 220V y salida de 220V. Si hay al menos una entrada de audio activa, aparece un voltaje en la salida de 220V, que incluye un amplificador de sonido, y el canal de audio activo se transmite a la salida.
Desafíos de desarrollo
Parecería simple: si el ADC no recibe 0, entonces considere el canal como activo. Casi todo es así, pero solo funciona si enciende la fuente de audio y apaga el sonido. Cuando se apaga, diferentes dispositivos dan diferentes interferencias, ya que no están completamente desenergizados. Y con malas fuentes de sonido, el microcontrolador podía captar ruido cuando el sonido se apagaba y era bastante fuerte. Y esta es precisamente la fuente de interferencia, el STMka no ve interferencia en mi tarjeta de audio externa, además, el sonido silencioso es 0.
¿Cómo hacerlo tú mismo?
Primero decidamos qué necesitamos. No escribiré el costo, porque Depende mucho de su ubicación.
Lo que necesitamos
- placa de circuito
- programador ST-Link v2
- 1 chip STM32f103C8
- 4 relés para cambiar el canal de audio de entrada a la salida
- 1 relé para cambiar 220V para encender el amplificador
- Convertidor reductor de CA-CC 220 V - 5 V (puede extraerse de una carga de teléfono antigua)
- cable de red y conector para suministrar corriente a nuestro dispositivo y amplificador
- salida
- resistencias, condensadores y otras cosas pequeñas
Naturalmente, necesitamos cables de audio y un conector minijack con conectores.
Me gustaría centrarme en la elección de los relés ... Si todo está muy claro con la elección del relé de 220V: debería ser capaz de cambiar el voltaje alterno de 220V y ser controlado por 3.3V. La elección de los relés de sonido no es tan simple. No todos los relés, incluso los de estado sólido, no darán interferencia en la salida, y esto es muy importante para nosotros. Vivo en Minsk y no pude encontrar nada adecuado y a un precio adecuado, por lo que se solicitaron 4 relés PVT322A en una conocida tienda china. Quizás en su área pueda encontrar algo más barato.
Desde que comenzamos, continuaremos estudiando las características del hardware. En el diagrama que puede encontrar en el
repositorio en la carpeta Eagle, debe seleccionar resistencias limitantes de corriente (R4-7) para sus relés. En mi caso, son 30 ohmios. También hay una bobina L1: elija cualquier filtro que suavice el ruido de alta frecuencia.
Puede solicitar una placa de circuito en PCBWAY o JLCPCB. Sus precios son bajos, ordené a JLCPCB y me cobraron solo $ 2. Al ordenar una placa de circuito impreso, necesitará archivos gerber, puede encontrar todo desde la misma carpeta o generarlo usted mismo.
Pasemos a la parte del software
No hablaré sobre cómo conectar el programador a la computadora, instalar el entorno de programación y el controlador, porque Hay muchas de estas instrucciones y son extremadamente accesibles. En mi circuito se proporcionan salidas para programadores. Usé Visual Studio 2017 + VisualGDB. Después de descargar el proyecto desde el mismo
repositorio, podemos abrir el proyecto. Vaya inmediatamente al archivo Settings.cpp.
Todas las configuraciones en este archivo están documentadas, pero nos detendremos en cada configuración de todos modos.
#define DEBUG0 0 #define DEBUG1 1 #define DEBUG2 0
Si asignamos una unidad a DEBUG0, nuestro dispositivo dejará de hacer cualquier cosa, excepto que generará los valores que recibe de las entradas de audio en un formato que SerialPortPlotter puede "digerir" por UART.
Si asigna la unidad DEBUG1, el dispositivo ya estará completamente funcional, pero mostrará un poco de información sobre el trabajo en UART. Todo esto es necesario exclusivamente para la depuración.
Asignar DEBUG2 solo le dará la inicialización de UART. Si no entiende por qué es esto, entonces no :-)
#define MaxEqualToZeroValue 3
A continuación, tenemos un parámetro cuyo valor correspondiente o menos se considerará cero. Como se mencionó anteriormente, algunas fuentes de sonido son de baja calidad y muy ruidosas.
#define MaxAvarageForNoise (float)0.4
Si el canal de audio está actualmente inactivo (es decir, el canal que actualmente no se ha cambiado a salida) y el valor de medición promedio para un ciclo de medición en este canal es menor que el valor de este parámetro, entonces el canal se considera sin sonido.
#define MaxAvarageForActiveNoise (float)0.06
Este parámetro es casi el mismo que el anterior, solo para el canal que está actualmente activo. El hecho es que cuando el canal está activo y el amplificador está funcionando, el voltaje del canal de audio cae. Y si descuida esta configuración, el dispositivo considerará que hay sonido incluso cuando el cable no está conectado a ningún dispositivo.
#define CountOfConsecutiveZeroValueForNoise 250
Este parámetro es únicamente para optimizar el consumo de CPU. Si el dispositivo cumple con un número predeterminado de ceros en una fila, entonces considera que esta señal no es un sonido.
#define MinCountOfZeroValue 550
Y este es un escenario importante. Algunos dispositivos, cuando están apagados, crean un ruido extraño, pero destaqué un factor común entre ellos: muy rara vez caen a valores cero. Es por eso que tuve que ingresar este parámetro. Si el número de valores cero por ciclo de medición es menor que el valor especificado, entonces la señal se considera ruido.
#define USE_LED 1 #define LED_GPIO_PERIPH RCC_APB2Periph_GPIOC #define LED_GPIO_GROUP GPIOC #define LED_GPIO_PIN GPIO_Pin_13 #define USE_AMP 1 #define AMP_GPIO_PERIPH RCC_APB2Periph_GPIOB #define AMP_GPIO_GROUP GPIOB #define AMP_GPIO_PIN GPIO_Pin_12
Este bloque es extremadamente comprensible para aquellos que ya han programado microcontroladores. Selecciona el pin en el que se ubicará el LED y la salida al relé de control del amplificador. Si no va a cambiar mi esquema, entonces no necesita estos parámetros.
Pasemos a la siguiente configuración:
Al abrir el archivo main.cpp, al comienzo de la función
int main()
Encontrará una definición de un montón de variables.
Detengámonos en esto con más detalle. Hay muchos parámetros responsables de la configuración del hardware del microcontrolador. No los tocaremos.
const uint8_t channelsCount = 2;
Este es el número de canales de entrada de audio que se utilizarán.
const uint8_t countOfIterationsForSwitch = 5;
El número de ciclos de medición necesarios para cambiar el estado activo / pasivo.
const uint8_t ADCSampleTime = ADC_SampleTime_239Cycles5;
Este parámetro es responsable de la calidad de la medición. Está configurado al máximo, no recomiendo cambiarlo.
const uint16_t measurementsDuration = 2000;
Este es el tiempo en ms durante el cual se realizará un ciclo de medición.
const uint32_t measurementFrequencies[] = { 1000, 1000, 1000, 1000 };
No sé por qué, pero implementé una función que me permite medir canales de entrada con diferentes frecuencias para cada canal. Quizás alguien necesite esta característica.
Conclusión
Bueno, eso es todo. He descrito todas las configuraciones necesarias. Solo queda ensamblar el circuito, compilar el proyecto, llenar el firmware en el microcontrolador y alegrarse.
En conclusión, me gustaría decir que no puede dejar el cable de audio de entrada "no atascado" en nada, debe insertarlo en cualquier dispositivo o enchufarlo en forma de un miniconector en el que todos los contactos estén interconectados.
Si sus fuentes de sonido son bastante buenas, puede establecer configuraciones bajas, pero cambiar el estado del sonido puede requerir apagarlo (no desde un tomacorriente). Quizás algún día agregue un enlace al modelo 3D de la carcasa, pero hasta ahora no tengo una impresora 3D y la carcasa es actualmente tal. Pero esto es solo por ahora: la impresora 3D ya funciona :-)
Este es mi primer artículo, estaré encantado de cualquier crítica razonada. Entiendo que esto no es una obra maestra, pero hice mi mejor esfuerzo.
Gracias por leerUPD1: Se agregaron imágenes esquemáticas y de cableado en el artículo.
UPD2: Se agregaron imágenes esquemáticas y de cableado al repositorio, se agregaron nuevos comentarios en el código.