Préface
J'ai quelques jeux de bons systèmes d'enceintes soviétiques à la maison. Mais cette technique est assez ancienne et ne peut tout simplement pas s'allumer à partir de la télécommande ou automatiquement, mais approchez constamment l'amplificateur de son et allumez-le / éteignez juste trop paresseux. J'ai résolu ce problème. Au début, Arduino a été acheté et le projet a été fait dessus, mais la qualité du travail ne me convenait pas et le projet a été refait pour STM32F103C8. En conséquence, j'ai obtenu un appareil qui a 4 entrées audio, 1 sortie audio, une entrée 220V et une sortie 220V. S'il y a au moins une entrée audio active, une tension apparaît à la sortie 220V, incluant ainsi un amplificateur sonore, et le canal audio actif est transmis à la sortie.
Défis de développement
Cela semblerait simple: si le CAN ne reçoit pas 0, alors considérez le canal comme actif. Presque tout est ainsi, mais cela ne fonctionne que si vous allumez la source audio et désactivez le son dessus. Lorsqu'ils sont éteints, différents appareils produisent des interférences différentes, car ils ne sont pas complètement hors tension. Et avec de mauvaises sources sonores, le microcontrôleur pouvait capter du bruit lorsque le son était coupé, et assez fort. Et c'est précisément l'interférence de la source, la STMka ne voit pas d'interférence sur ma carte audio externe, de plus, le son silencieux est de 0.
Comment le faire soi-même?
Décidons d'abord ce dont nous avons besoin. Je n'écrirai pas le coût, car cela dépend beaucoup de votre emplacement.
Ce dont nous avons besoin:
- carte de circuit imprimé
- programmeur ST-Link v2
- 1 puce STM32f103C8
- 4 relais pour commuter le canal audio d'entrée vers la sortie
- 1 relais pour commuter 220V pour allumer l'amplificateur
- Convertisseur abaisseur AC-DC 220V - 5V (peut être pris à partir d'un ancien téléphone)
- câble secteur et connecteur pour fournir du courant à notre appareil et amplificateur
- sortie
- résistances, condensateurs et autres petites choses
Naturellement, nous avons besoin de fils audio et d'une prise mini-jack avec prises.
Je voudrais me concentrer sur le choix des relais ... Si tout est très clair avec le choix du relais 220V: il doit pouvoir commuter la tension alternative 220V et être contrôlé par 3,3V. Le choix des relais sonores n'est pas si simple. Tous les relais, même ceux à semi-conducteurs, ne donneront pas d'interférence à la sortie, et c'est très important pour nous. J'habite à Minsk et je n'ai rien trouvé de convenable et à un prix adéquat, donc 4 relais PVT322A ont été commandés dans un magasin chinois bien connu. Peut-être que dans votre région, vous pouvez trouver quelque chose de moins cher.
Depuis que nous avons commencé, nous continuerons d'étudier les fonctionnalités matérielles. Dans le schéma que vous pouvez trouver dans le
référentiel dans le dossier Eagle, vous devez sélectionner des résistances de limitation de courant (R4-7) pour vos relais. Dans mon cas, c'est 30 ohms. Il existe également une bobine L1: choisissez n'importe quel filtre qui atténue le bruit haute fréquence.
Vous pouvez commander une carte de circuit imprimé sur PCBWAY ou JLCPCB. Leurs prix sont bas, j'ai commandé chez JLCPCB et ils ne m'ont facturé que 2 $. Lors de la commande d'une carte de circuit imprimé, vous aurez besoin de fichiers Gerber, vous pouvez tout trouver dans le même dossier ou le générer vous-même.
Passons à la partie logiciel
Je ne parlerai pas de la façon de connecter le programmateur à l'ordinateur, d'installer l'environnement de programmation et le pilote, car Il y a beaucoup de ces instructions et elles sont extrêmement accessibles. Sur mon circuit, des sorties pour les programmeurs sont fournies. J'ai utilisé Visual Studio 2017 + VisualGDB. Après avoir téléchargé le projet à partir du même
référentiel, nous pouvons ouvrir le projet. Tournez-vous immédiatement vers le fichier Settings.cpp.
Tous les paramètres de ce fichier sont documentés, mais nous nous arrêterons quand même à chaque paramètre.
#define DEBUG0 0 #define DEBUG1 1 #define DEBUG2 0
Si nous attribuons une unité à DEBUG0, notre appareil cessera de faire quoi que ce soit, sauf qu'il produira les valeurs qu'il reçoit des entrées audio dans un format que SerialPortPlotter peut «digérer» par UART.
Si vous affectez l'unité DEBUG1, l'appareil sera déjà entièrement fonctionnel, mais il affichera quelques informations sur le travail sur UART. Tout cela est nécessaire exclusivement pour le débogage.
L'attribution de DEBUG2 ne vous donnera qu'une initialisation de l'UART. Si vous ne comprenez pas pourquoi c'est le cas, alors :-)
#define MaxEqualToZeroValue 3
Ensuite, nous avons un paramètre dont la valeur correspondante ou moins sera considérée comme nulle. Comme mentionné précédemment, certaines sources sonores sont de mauvaise qualité et très bruyantes.
#define MaxAvarageForNoise (float)0.4
Si le canal audio est actuellement inactif (c'est-à-dire le canal qui n'est pas actuellement commuté en sortie) et que la valeur de mesure moyenne pour un cycle de mesure sur ce canal est inférieure à la valeur de ce paramètre, alors le canal est considéré sans son.
#define MaxAvarageForActiveNoise (float)0.06
Ce paramètre est presque le même que le précédent, uniquement pour le canal actuellement actif. Le fait est que lorsque le canal est actif et que l'amplificateur fonctionne, la tension du canal audio baisse. Et si vous négligez ce paramètre, l'appareil considérera qu'il y a du son même lorsque le fil n'est connecté à aucun appareil.
#define CountOfConsecutiveZeroValueForNoise 250
Ce paramètre sert uniquement à optimiser la consommation du processeur. Si l'appareil rencontre un nombre prédéterminé de zéros consécutifs, il considère que ce signal n'est pas un son.
#define MinCountOfZeroValue 550
Et c'est un cadre important. Certains appareils, lorsqu'ils sont éteints, créent un bruit étrange, mais j'ai souligné un facteur commun parmi eux: ils tombent très rarement à zéro. C'est pourquoi j'ai dû saisir ce paramètre. Si le nombre de valeurs nulles par cycle de mesure est inférieur à la valeur spécifiée, le signal est alors considéré comme du bruit.
#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
Ce bloc est extrêmement compréhensible pour ceux qui ont déjà programmé des microcontrôleurs. Il sélectionne la broche sur laquelle la LED sera située et la sortie vers le relais de contrôle de l'amplificateur. Si vous ne changez pas mon schéma, vous n'avez pas besoin de ces paramètres.
Passons aux paramètres suivants:
En ouvrant le fichier main.cpp, au tout début de la fonction
int main()
Vous trouverez une définition d'un tas de variables.
Arrêtons-nous là-dessus plus en détail. Il y a beaucoup de paramètres responsables de la configuration matérielle du microcontrôleur. Nous ne les toucherons pas.
const uint8_t channelsCount = 2;
Il s'agit du nombre de canaux d'entrée audio à utiliser.
const uint8_t countOfIterationsForSwitch = 5;
Le nombre de cycles de mesure requis pour changer l'état actif / passif.
const uint8_t ADCSampleTime = ADC_SampleTime_239Cycles5;
Ce paramètre est responsable de la qualité de la mesure. Il est réglé au maximum, je ne recommande pas de le changer.
const uint16_t measurementsDuration = 2000;
Il s'agit du temps en ms pendant lequel un cycle de mesure sera effectué.
const uint32_t measurementFrequencies[] = { 1000, 1000, 1000, 1000 };
Je ne sais pas pourquoi, mais j'ai implémenté une fonction qui me permet de mesurer des canaux d'entrée avec des fréquences différentes pour chaque canal. Peut-être que quelqu'un aura besoin de cette fonctionnalité.
Conclusion
C’est tout. J'ai décrit tous les paramètres nécessaires. Il ne reste plus qu'à assembler le circuit, compiler le projet, remplir le firmware dans le microcontrôleur et se réjouir.
En conclusion, je voudrais dire que vous ne pouvez pas simplement laisser le fil audio d'entrée "non coincé" dans quelque chose, vous devez l'insérer dans n'importe quel appareil ou le brancher sous la forme d'une prise mini-jack dans laquelle tous les contacts sont interconnectés.
Si vos sources sonores sont assez bonnes, vous pouvez définir des paramètres bas, mais la commutation de l'état du son peut nécessiter de le désactiver (pas à partir d'une prise). Peut-être qu'un jour j'ajouterai un lien vers le modèle 3D de l'étui, mais pour l'instant je n'ai pas d'imprimante 3D et l'étui est actuellement tel. Mais ce n'est que pour l'instant: l'imprimante 3D est déjà en marche :-)
Ceci est mon premier article, je serai heureux de toute critique raisonnée. Je comprends que ce n'est pas un chef-d'œuvre, mais j'ai fait de mon mieux.
Merci d'avoir lu.UPD1: Ajout d'images schématiques et de câblage dans l'article.
UPD2: Ajout d'images schématiques et de câblage au référentiel, ajout de nouveaux commentaires dans le code.