Vorwort
Ich habe ein paar gute sowjetische Lautsprechersysteme zu Hause. Aber diese Technik ist ziemlich alt und kann einfach nicht ĂŒber die Fernbedienung oder automatisch eingeschaltet werden, sondern nĂ€hert sich stĂ€ndig dem KlangverstĂ€rker und schaltet ihn einfach zu faul ein / aus. Ich habe dieses Problem gelöst. Zuerst wurde Arduino gekauft und das Projekt wurde darauf durchgefĂŒhrt, aber die QualitĂ€t der Arbeit passte nicht zu mir und das Projekt wurde fĂŒr STM32F103C8 ĂŒberarbeitet. Als Ergebnis habe ich ein GerĂ€t mit 4 AudioeingĂ€ngen, 1 Audioausgang, 220V-Eingang und 220V-Ausgang. Wenn mindestens ein aktiver Audioeingang vorhanden ist, erscheint am 220-V-Ausgang eine Spannung, wodurch ein TonverstĂ€rker eingeschlossen wird, und der aktive Audiokanal wird zum Ausgang ĂŒbertragen.
Entwicklungsherausforderungen
Es scheint einfach: Wenn der ADC nicht 0 empfĂ€ngt, betrachten Sie den Kanal als aktiv. Fast alles ist so, aber es funktioniert nur, wenn Sie die Audioquelle einschalten und den Ton darauf ausschalten. Im ausgeschalteten Zustand stören verschiedene GerĂ€te unterschiedlich, da sie nicht vollstĂ€ndig stromlos sind. Und bei schlechten Schallquellen kann der Mikrocontroller beim Ausschalten des GerĂ€usches GerĂ€usche aufnehmen, die recht stark sind. Und genau das ist die Quellenstörung, der STMka sieht keine Störung auf meiner externen Audiokarte, auĂerdem ist der leise Ton von ihr 0.
Wie geht das selbst?
Lassen Sie uns zuerst entscheiden, was wir brauchen. Ich werde die Kosten nicht schreiben, weil es hÀngt sehr von Ihrem Standort ab.
Was wir brauchen:
- Leiterplatte
- Programmierer ST-Link v2
- 1 Chip STM32f103C8
- 4 Relais zum Umschalten des Eingangs-Audiokanals auf den Ausgang
- 1 Relais zum Schalten von 220 V zum Einschalten des VerstÀrkers
- AC-DC-AbwÀrtswandler 220V - 5V (kann aus einer alten Telefonladung entnommen werden)
- Netzkabel und Stecker zur Stromversorgung unseres GerÀts und VerstÀrkers
- Steckdose
- WiderstÀnde, Kondensatoren und andere kleine Dinge
NatĂŒrlich brauchen wir Audiokabel und einen Minibuchsenstecker mit Buchsen.
Ich möchte mich auf die Auswahl der Relais konzentrieren ... Wenn bei der Auswahl des 220-V-Relais alles sehr klar ist: Es sollte in der Lage sein, die 220-V-Wechselspannung umzuschalten und von 3,3 V gesteuert zu werden. Die Auswahl der Soundrelais ist nicht so einfach. Nicht jedes Relais, auch kein Halbleiterrelais, stört den Ausgang nicht, und dies ist fĂŒr uns sehr wichtig. Ich lebe in Minsk und konnte nichts Passendes und zu einem vernĂŒnftigen Preis finden. Daher wurden 4 PVT322A-Relais in einem bekannten chinesischen GeschĂ€ft bestellt. Vielleicht finden Sie in Ihrer NĂ€he etwas billigeres.
Von Anfang an werden wir die Hardwarefunktionen weiter untersuchen. In dem Diagramm, das Sie im
Repository im Eagle-Ordner finden, mĂŒssen Sie StrombegrenzungswiderstĂ€nde (R4-7) fĂŒr Ihre Relais auswĂ€hlen. In meinem Fall sind es 30 Ohm. Es gibt auch eine L1-Spule: WĂ€hlen Sie einen Filter, der hochfrequentes Rauschen glĂ€ttet.
Sie können eine Leiterplatte auf PCBWAY oder JLCPCB bestellen. Ihre Preise sind niedrig, ich habe bei JLCPCB bestellt und sie haben mir nur 2 Dollar in Rechnung gestellt. Wenn Sie eine Leiterplatte bestellen, benötigen Sie Gerber-Dateien. Sie können alles aus demselben Ordner finden oder selbst generieren.
Fahren wir mit dem Softwareteil fort
Ich werde nicht darĂŒber sprechen, wie man den Programmierer an den Computer anschlieĂt, die Programmierumgebung und den Treiber installiert, weil Es gibt viele dieser Anweisungen und sie sind Ă€uĂerst zugĂ€nglich. Auf meiner Schaltung sind AusgĂ€nge fĂŒr Programmierer vorgesehen. Ich habe Visual Studio 2017 + VisualGDB verwendet. Nachdem Sie das Projekt aus demselben
Repository heruntergeladen haben
, können Sie das Projekt öffnen. Wechseln Sie sofort zur Datei Settings.cpp.
Alle Einstellungen in dieser Datei sind dokumentiert, aber wir werden trotzdem bei jeder Einstellung aufhören.
#define DEBUG0 0 #define DEBUG1 1 #define DEBUG2 0
Wenn wir DEBUG0 eine Einheit zuweisen, hört unser GerĂ€t auf, etwas anderes zu tun, auĂer dass es die von den AudioeingĂ€ngen empfangenen Werte in einem Format ausgibt, das SerialPortPlotter von UART âverdauenâ kann.
Wenn Sie die Einheit DEBUG1 zuweisen, ist das GerĂ€t bereits voll funktionsfĂ€hig, zeigt jedoch einige Informationen zur Arbeit an UART an. All dies ist ausschlieĂlich zum Debuggen erforderlich.
Wenn Sie DEBUG2 zuweisen, wird nur der UART initialisiert. Wenn Sie nicht verstehen, warum das so ist, dann nicht :-)
#define MaxEqualToZeroValue 3
Als nÀchstes haben wir einen Parameter, dessen entsprechender Wert oder weniger als Null betrachtet wird. Wie bereits erwÀhnt, sind einige Tonquellen von schlechter QualitÀt und sehr laut.
#define MaxAvarageForNoise (float)0.4
Wenn der Audiokanal derzeit inaktiv ist (d. H. Der Kanal, der derzeit nicht auf Ausgang geschaltet ist) und der durchschnittliche Messwert fĂŒr einen Messzyklus auf diesem Kanal kleiner als der Wert dieses Parameters ist, wird der Kanal ohne Ton betrachtet.
#define MaxAvarageForActiveNoise (float)0.06
Dieser Parameter ist fast der gleiche wie der vorherige, nur fĂŒr den aktuell aktiven Kanal. Tatsache ist, dass die Spannung des Audiokanals abfĂ€llt, wenn der Kanal aktiv ist und der VerstĂ€rker arbeitet. Wenn Sie diese Einstellung vernachlĂ€ssigen, wird das GerĂ€t auch dann einen Ton hören, wenn das Kabel an kein GerĂ€t angeschlossen ist.
#define CountOfConsecutiveZeroValueForNoise 250
Dieser Parameter dient ausschlieĂlich zur Optimierung des CPU-Verbrauchs. Wenn das GerĂ€t eine vorgegebene Anzahl von Nullen in einer Reihe erfĂŒllt, wird davon ausgegangen, dass dieses Signal kein Ton ist.
#define MinCountOfZeroValue 550
Und das ist eine wichtige Einstellung. Einige GerÀte verursachen beim Ausschalten seltsame GerÀusche, aber ich habe einen gemeinsamen Faktor hervorgehoben: Sie fallen sehr selten auf Null. Deshalb musste ich diesen Parameter eingeben. Wenn die Anzahl der Nullwerte pro Messzyklus kleiner als der angegebene Wert ist, wird das Signal als Rauschen betrachtet.
#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
Dieser Block ist fĂŒr diejenigen, die bereits Mikrocontroller programmiert haben, Ă€uĂerst verstĂ€ndlich. Er wĂ€hlt den Pin aus, an dem sich die LED befindet, und den Ausgang zum VerstĂ€rkersteuerrelais. Wenn Sie mein Schema nicht Ă€ndern, benötigen Sie diese Parameter nicht.
Fahren wir mit den folgenden Einstellungen fort:
Durch Ăffnen der Datei main.cpp ganz am Anfang der Funktion
int main()
Sie finden eine Definition einer Reihe von Variablen.
Lassen Sie uns nĂ€her darauf eingehen. Es gibt viele Parameter, die fĂŒr die Hardwarekonfiguration des Mikrocontrollers verantwortlich sind. Wir werden sie nicht berĂŒhren.
const uint8_t channelsCount = 2;
Dies ist die Anzahl der zu verwendenden AudioeingangskanÀle.
const uint8_t countOfIterationsForSwitch = 5;
Die Anzahl der Messzyklen, die erforderlich sind, um den aktiven / passiven Zustand zu Àndern.
const uint8_t ADCSampleTime = ADC_SampleTime_239Cycles5;
Dieser Parameter ist fĂŒr die QualitĂ€t der Messung verantwortlich. Es ist auf Maximum eingestellt, ich empfehle nicht, es zu Ă€ndern.
const uint16_t measurementsDuration = 2000;
Dies ist die Zeit in ms, in der ein Messzyklus durchgefĂŒhrt wird.
const uint32_t measurementFrequencies[] = { 1000, 1000, 1000, 1000 };
Ich weiĂ nicht warum, aber ich habe eine Funktion implementiert, mit der ich EingangskanĂ€le mit unterschiedlichen Frequenzen fĂŒr jeden Kanal messen kann. Vielleicht braucht jemand diese Funktion.
Fazit
Nun, das ist alles. Ich habe alle notwendigen Einstellungen beschrieben. Es bleibt nur die Schaltung zusammenzubauen, das Projekt zu kompilieren, die Firmware in den Mikrocontroller zu fĂŒllen und zu genieĂen.
AbschlieĂend möchte ich sagen, dass Sie das Eingangs-Audiokabel nicht einfach in nichts stecken lassen können, sondern es in ein beliebiges GerĂ€t einstecken oder in Form einer Minibuchse anschlieĂen mĂŒssen, in der alle Kontakte miteinander verbunden sind.
Wenn Ihre Tonquellen ziemlich gut sind, können Sie niedrige Einstellungen vornehmen. Um den Tonzustand zu Ă€ndern, mĂŒssen Sie ihn möglicherweise ausschalten (nicht an einer Steckdose). Vielleicht werde ich eines Tages einen Link zum 3D-Modell des GehĂ€uses hinzufĂŒgen, aber bisher habe ich keinen 3D-Drucker und das GehĂ€use ist derzeit so. Das ist aber erstmal so: Der 3D-Drucker lĂ€uft schon :-)
Dies ist mein erster Artikel, ich freue mich ĂŒber jede begrĂŒndete Kritik. Ich verstehe, dass dies kein Meisterwerk ist, aber ich habe mein Bestes versucht.
Danke fĂŒrs Lesen.UPD1: Schaltplan- und Verdrahtungsbilder im Artikel hinzugefĂŒgt.
UPD2: Schaltplan- und Verdrahtungsbilder zum Repository hinzugefĂŒgt, neue Kommentare im Code hinzugefĂŒgt.