Kata Pengantar
Saya memiliki beberapa set sistem speaker Soviet yang baik di rumah. Tetapi teknik ini cukup lama dan tidak bisa dihidupkan dari kendali jarak jauh atau secara otomatis, tetapi terus-menerus mendekati penguat suara dan nyalakan / matikan hanya karena malas. Saya memecahkan masalah ini. Pada awalnya, Arduino dibeli dan proyeknya selesai, tetapi kualitas pekerjaannya tidak cocok untuk saya dan proyek itu diulang untuk STM32F103C8. Akibatnya, saya mendapat perangkat yang memiliki 4 input audio, 1 output audio, input 220V dan output 220V. Jika ada setidaknya satu input audio aktif, tegangan muncul pada output 220V, dengan demikian termasuk penguat suara, dan saluran audio aktif ditransmisikan ke output.
Tantangan Pembangunan
Tampaknya sederhana: jika ADC menerima bukan 0, maka pertimbangkan saluran tersebut sebagai aktif. Hampir semuanya demikian, tetapi itu hanya berfungsi jika Anda menghidupkan sumber audio dan mematikan suara di atasnya. Ketika dimatikan, perangkat yang berbeda memberikan interferensi yang berbeda, karena mereka tidak sepenuhnya mati energi. Dan dengan sumber suara yang buruk, mikrokontroler dapat menangkap suara ketika suara dimatikan, dan cukup kuat. Dan ini justru gangguan sumber, STMka tidak melihat gangguan pada kartu audio eksternal saya, apalagi, suara pelan dari itu adalah 0.
Bagaimana cara melakukannya sendiri?
Mari kita putuskan dulu apa yang kita butuhkan. Saya tidak akan menulis biayanya, karena itu sangat tergantung pada lokasi Anda.
Apa yang kita butuhkan:
- papan sirkuit
- programmer ST-Link v2
- 1 chip STM32f103C8
- 4 relay untuk mengalihkan saluran audio input ke output
- 1 relai untuk mengganti 220V untuk menghidupkan amplifier
- AC-DC buck converter 220V - 5V (dapat diambil dari biaya telepon lama)
- kabel listrik dan konektor untuk memasok arus ke perangkat dan amplifier kami
- outlet
- resistor, kapasitor dan hal-hal kecil lainnya
Secara alami, kita membutuhkan kabel audio dan colokan minijack dengan jack.
Saya ingin fokus pada pilihan relay ... Jika semuanya sangat jelas dengan pilihan relay 220V: itu harus dapat beralih 220V tegangan bolak dan dikendalikan oleh 3.3V. Pilihan sound relay tidak sesederhana itu. Tidak setiap relay, bahkan yang solid-state, tidak akan memberikan gangguan pada output, dan ini sangat penting bagi kami. Saya tinggal di Minsk dan tidak dapat menemukan sesuatu yang cocok dan dengan harga yang memadai, jadi 4 relay PVT322A dipesan dari toko Cina yang terkenal. Mungkin di daerah Anda, Anda dapat menemukan sesuatu yang lebih murah.
Sejak kami mulai, kami akan terus mempelajari fitur perangkat keras. Dalam diagram yang dapat Anda temukan di
repositori di folder Eagle, Anda harus memilih resistor pembatas arus (R4-7) untuk relay Anda. Dalam kasus saya, ini 30 ohm. Ada juga kumparan L1: pilih filter apa pun yang menghaluskan noise frekuensi tinggi.
Anda dapat memesan papan sirkuit di PCBWAY atau JLCPCB. Harga mereka rendah, saya memesan dari JLCPCB dan mereka hanya menagih saya $ 2. Saat memesan papan sirkuit tercetak, Anda akan memerlukan file gerber, Anda dapat menemukan semuanya dari folder yang sama atau membuatnya sendiri.
Mari kita beralih ke bagian perangkat lunak
Saya tidak akan berbicara tentang cara menghubungkan programmer ke komputer, menginstal lingkungan pemrograman dan driver, karena Ada banyak instruksi ini dan sangat mudah diakses. Pada output sirkuit saya untuk programmer disediakan. Saya menggunakan Visual Studio 2017 + VisualGDB. Setelah mengunduh proyek dari
repositori yang sama
, kita dapat membuka proyek tersebut. Segera buka file Settings.cpp.
Semua pengaturan dalam file ini didokumentasikan, tetapi kami akan tetap berhenti di setiap pengaturan.
#define DEBUG0 0 #define DEBUG1 1 #define DEBUG2 0
Jika kami menetapkan unit ke DEBUG0, perangkat kami akan berhenti melakukan apa pun kecuali bahwa itu akan menampilkan nilai yang diterimanya dari input audio dalam format yang dapat "digali" oleh SerialPortPlotter oleh UART.
Jika Anda menetapkan unit DEBUG1, maka perangkat sudah akan berfungsi penuh, tetapi akan menampilkan sedikit informasi tentang pekerjaan di UART. Semua ini diperlukan secara eksklusif untuk debugging.
Menetapkan DEBUG2 hanya akan memberi Anda inisialisasi UART. Jika Anda tidak mengerti mengapa ini terjadi, maka jangan :-)
#define MaxEqualToZeroValue 3
Selanjutnya, kami memiliki parameter yang nilainya sesuai atau kurang akan dianggap nol. Seperti disebutkan sebelumnya, beberapa sumber suara berkualitas buruk dan sangat bising.
#define MaxAvarageForNoise (float)0.4
Jika saluran audio saat ini tidak aktif (mis., Saluran yang saat ini tidak beralih ke output) dan nilai pengukuran rata-rata untuk satu siklus pengukuran pada saluran ini kurang dari nilai parameter ini, maka saluran tersebut dianggap tanpa suara.
#define MaxAvarageForActiveNoise (float)0.06
Parameter ini hampir sama dengan yang sebelumnya, hanya untuk saluran yang sedang aktif. Faktanya adalah bahwa ketika saluran aktif dan amplifier bekerja, tegangan saluran audio turun. Dan jika Anda mengabaikan pengaturan ini, perangkat akan mempertimbangkan bahwa ada suara bahkan ketika kabel tidak terhubung ke perangkat apa pun.
#define CountOfConsecutiveZeroValueForNoise 250
Parameter ini semata-mata untuk mengoptimalkan konsumsi CPU. Jika perangkat memenuhi jumlah nol yang telah ditentukan dalam satu baris, maka perangkat ini menganggap bahwa sinyal ini bukan suara.
#define MinCountOfZeroValue 550
Dan ini adalah pengaturan yang penting. Beberapa perangkat, ketika dimatikan, membuat suara aneh, tetapi saya menyoroti satu faktor umum di antara mereka: mereka sangat jarang turun ke nilai nol. Itu sebabnya saya harus memasukkan parameter ini. Jika jumlah nilai nol per siklus pengukuran kurang dari nilai yang ditentukan, maka sinyal dianggap noise.
#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
Blok ini sangat bisa dimengerti bagi mereka yang sudah memprogram mikrokontroler. Dia memilih pin di mana LED akan ditempatkan dan output ke relay kontrol amplifier. Jika Anda tidak akan mengubah skema saya, maka Anda tidak perlu parameter ini.
Mari kita beralih ke pengaturan berikut:
Dengan membuka file main.cpp, di bagian paling awal dari fungsinya
int main()
Anda akan menemukan definisi sekelompok variabel.
Mari kita bahas ini lebih detail. Ada banyak parameter yang bertanggung jawab untuk konfigurasi perangkat keras mikrokontroler. Kami tidak akan menyentuh mereka.
const uint8_t channelsCount = 2;
Ini adalah jumlah saluran input audio yang akan digunakan.
const uint8_t countOfIterationsForSwitch = 5;
Jumlah siklus pengukuran yang diperlukan untuk mengubah keadaan aktif / pasif.
const uint8_t ADCSampleTime = ADC_SampleTime_239Cycles5;
Parameter ini bertanggung jawab atas kualitas pengukuran. Ini diatur ke maksimum, saya tidak menyarankan mengubahnya.
const uint16_t measurementsDuration = 2000;
Ini adalah waktu dalam ms di mana satu siklus pengukuran akan dilakukan.
const uint32_t measurementFrequencies[] = { 1000, 1000, 1000, 1000 };
Saya tidak tahu mengapa, tetapi saya menerapkan fungsi yang memungkinkan saya mengukur saluran input dengan frekuensi berbeda untuk setiap saluran. Mungkin seseorang akan membutuhkan fitur ini.
Kesimpulan
Yah, itu saja. Saya telah menjelaskan semua pengaturan yang diperlukan. Tetap hanya untuk merakit sirkuit, mengkompilasi proyek, mengisi firmware ke dalam mikrokontroler dan bersukacita.
Sebagai kesimpulan, saya ingin mengatakan bahwa Anda tidak bisa membiarkan kabel audio input "tidak macet" dalam apa pun, Anda perlu memasukkannya ke perangkat apa pun atau colokkan dalam bentuk jack minijack di mana semua kontak saling berhubungan.
Jika sumber suara Anda cukup bagus, maka Anda dapat mengatur pengaturan rendah, tetapi beralih ke kondisi suara mungkin perlu mematikannya (bukan dari outlet). Mungkin suatu hari nanti saya akan menambahkan tautan ke model kasus 3D, tetapi sejauh ini saya tidak memiliki printer 3D dan kasusnya saat ini. Tapi ini hanya untuk sekarang: printer 3D sudah berjalan :-)
Ini adalah artikel pertama saya, saya akan senang dengan kritik yang beralasan. Saya mengerti bahwa ini bukan sebuah mahakarya, tetapi saya mencoba yang terbaik.
Terima kasih sudah membaca.UPD1: Menambahkan gambar skematis dan kabel dalam artikel.
UPD2: Menambahkan gambar skematis dan kabel ke repositori, menambahkan komentar baru dalam kode.