مقدمة
لدي مجموعتان من أنظمة اللغة السوفيتية الجيدة في المنزل. ولكن هذه التقنية قديمة جدًا وببساطة لا يمكن تشغيلها من جهاز التحكم عن بُعد أو تلقائيًا ، ولكن مع الاستمرار في الاتصال بمكبر الصوت وتشغيله / إيقاف تشغيله كسولًا. أنا حل هذه المشكلة. في البداية ، تم شراء Arduino وتم تنفيذ المشروع على ذلك ، ولكن نوعية العمل لم تكن مناسبة لي وتم إعادة تصميم المشروع من أجل STM32F103C8. نتيجة لذلك ، حصلت على جهاز به 4 مدخلات صوتية ، مخرج صوت واحد ، مدخل 220 فولت ، خرج 220 فولت. في حالة وجود دخل صوتي نشط واحد على الأقل ، يظهر جهد عند إخراج 220 فولت ، بما في ذلك مكبر صوت ، ويتم إرسال قناة الصوت النشطة إلى الإخراج.
تحديات التنمية
قد يبدو الأمر بسيطًا: إذا لم تستقبل ADC 0 ، فاعتبر القناة نشطة. كل شيء على ما يرام ، لكنه لا يعمل إلا إذا قمت بتشغيل مصدر الصوت وإيقاف تشغيل الصوت. عند إيقاف التشغيل ، تتسبب الأجهزة المختلفة في تداخل مختلف ، نظرًا لعدم تنشيطها تمامًا. ومع وجود مصادر صوت سيئة ، يمكن للمراقب الدقيق التقاط الضوضاء عند إيقاف تشغيل الصوت وقويًا جدًا. وهذا هو بالضبط مصدر التداخل ، ولا ترى STMka أي تداخل على بطاقة الصوت الخارجية الخاصة بي ، علاوة على ذلك ، فإن الصوت الهادئ منه هو 0.
كيف تفعل ذلك بنفسك؟
دعونا أولا نقرر ما نحتاجه. لن أكتب التكلفة ، لأنه ذلك يعتمد كثيرا على موقعك.
ما نحتاجه:
- لوحة الدوائر
- مبرمج ST-Link v2
- 1 رقاقة STM32f103C8
- 4 مرحلات لتحويل قناة إدخال الصوت إلى الإخراج
- 1 تتابع للتبديل 220 فولت لتشغيل مكبر للصوت
- محول باك AC-DC 220V - 5V (يمكن أن تؤخذ من رسوم الهاتف القديم)
- كابل التيار الكهربائي وموصل لتزويد التيار لجهازنا ومكبر للصوت
- مقبس
- مقاومات ، مكثفات وأشياء صغيرة أخرى
وبطبيعة الحال ، نحتاج إلى أسلاك صوتية وقابس صغير مع مقابس.
أود أن أركز على اختيار المرحلات ... إذا كان كل شيء واضحًا جدًا مع اختيار مرحل 220 فولت: يجب أن يكون قادرًا على تبديل جهد 220 فولت بالتناوب والتحكم فيه بنسبة 3.3 فولت. اختيار مرحلات الصوت ليس بهذه البساطة. ليس كل مرحل ، حتى الحالة الصلبة ، لن يتدخل في الإخراج ، وهذا مهم للغاية بالنسبة لنا. أنا أعيش في مينسك ولم أستطع العثور على أي شيء مناسب وبسعر مناسب ، لذلك تم طلب 4 مرحلات PVT322A من متجر صيني مشهور. ربما في منطقتك يمكنك أن تجد شيئا أرخص.
منذ أن بدأنا ، سنستمر في دراسة ميزات الأجهزة. في الرسم التخطيطي الذي يمكنك العثور عليه في
المستودع في مجلد Eagle ، تحتاج إلى تحديد مقاومات مقيدة للتيار (R4-7) لمرحلاتك. في حالتي ، إنها 30 أوم. هناك أيضًا ملف L1: اختر أي مرشح يسهل الضوضاء عالية التردد.
يمكنك طلب لوحة دوائر على PCBWAY أو JLCPCB. أسعارها منخفضة ، وقد طلبت شراءها من شركة JLCPCB وقاموا بإصدار فاتورتي على دولارين فقط. عند طلب لوحة دوائر مطبوعة ، ستحتاج إلى ملفات gerber ، يمكنك العثور على كل شيء من المجلد نفسه أو إنشاؤه بنفسك.
دعنا ننتقل إلى جزء البرنامج
لن أتحدث عن كيفية توصيل المبرمج بالكمبيوتر ، وتثبيت بيئة البرمجة وبرنامج التشغيل ، لأن هناك الكثير من هذه التعليمات ويمكن الوصول إليها بشكل كبير. على بلدي دائرة مخرجات وتقدم للمبرمجين. لقد استخدمت Visual Studio 2017 + VisualGDB. بعد تنزيل المشروع من نفس
المستودع ، يمكننا فتح المشروع. انتقل على الفور إلى ملف Settings.cpp.
تم توثيق جميع الإعدادات في هذا الملف ، لكننا سنتوقف عند كل إعداد على أي حال.
#define DEBUG0 0 #define DEBUG1 1 #define DEBUG2 0
إذا قمنا بتعيين وحدة لـ DEBUG0 ، فسيتوقف الجهاز عن فعل أي شيء باستثناء أنه سينتج القيم التي يتلقاها من المدخلات الصوتية بتنسيق يمكن أن يقوم SerialPortPlotter بهضمه بواسطة UART.
إذا قمت بتعيين الوحدة DEBUG1 ، فسيعمل الجهاز بالفعل بشكل كامل ، لكنه سيعرض القليل من المعلومات حول العمل على UART. كل هذا ضروري حصريًا لتصحيح الأخطاء.
سيؤدي تعيين DEBUG2 فقط إلى منحك تهيئة UART. إذا كنت لا تفهم سبب ذلك ، فلا تفهم :-)
#define MaxEqualToZeroValue 3
بعد ذلك ، لدينا معلمة تعتبر قيمتها المطابقة أو أقل صفرًا. كما ذكرنا سابقًا ، بعض مصادر الصوت رديئة النوعية وصاخبة جدًا.
#define MaxAvarageForNoise (float)0.4
إذا كانت القناة الصوتية غير نشطة حاليًا (على سبيل المثال ، القناة التي لم يتم تحويلها حاليًا إلى مخرجات) ومتوسط قيمة القياس لدورة قياس واحدة على هذه القناة أقل من قيمة هذه المعلمة ، فإن القناة تعتبر بدون صوت.
#define MaxAvarageForActiveNoise (float)0.06
هذه المعلمة هي نفسها المعلمة السابقة ، فقط للقناة النشطة حاليًا. الحقيقة هي أنه عندما تكون القناة نشطة ويعمل مكبر الصوت ، فإن الجهد في القناة الصوتية ينخفض. وإذا أهملت هذا الإعداد ، فسيقوم الجهاز بالنظر إلى وجود صوت حتى عند عدم اتصال السلك بأي جهاز.
#define CountOfConsecutiveZeroValueForNoise 250
هذه المعلمة هي فقط لتحسين استهلاك وحدة المعالجة المركزية. إذا كان الجهاز يلبي عددًا محددًا مسبقًا من الأصفار على التوالي ، فسيعتبر أن هذه الإشارة ليست صوتًا.
#define MinCountOfZeroValue 550
وهذا هو الإعداد المهم. بعض الأجهزة ، عند إيقاف تشغيلها ، تخلق ضوضاء غريبة ، لكنني أبرزت أحد العوامل المشتركة بينها: نادرًا ما تنخفض إلى قيم صفرية. هذا هو السبب في أنني اضطررت إلى إدخال هذه المعلمة. إذا كان عدد القيم الصفرية لكل دورة قياس أقل من القيمة المحددة ، فإن الإشارة تعتبر ضوضاء.
#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
هذه الكتلة هي مفهومة للغاية لأولئك الذين لديهم بالفعل ميكروكنترولر مبرمجة. يقوم بتحديد الدبوس الذي سيتم وضع LED عليه والإخراج إلى مرحل التحكم في مكبر الصوت. إذا لم تقم بتغيير المخطط الخاص بي ، فلن تحتاج إلى هذه المعلمات.
دعنا ننتقل إلى الإعدادات التالية:
عن طريق فتح ملف main.cpp ، في بداية الوظيفة
int main()
ستجد تعريفًا لمجموعة من المتغيرات.
دعونا نتناول هذا بمزيد من التفصيل. هناك الكثير من المعلمات المسؤولة عن تكوين الأجهزة من متحكم. لن نلمسهم.
const uint8_t channelsCount = 2;
هذا هو عدد قنوات إدخال الصوت المطلوب استخدامها.
const uint8_t countOfIterationsForSwitch = 5;
عدد دورات القياس المطلوبة لتغيير الحالة النشطة / الخاملة.
const uint8_t ADCSampleTime = ADC_SampleTime_239Cycles5;
هذه المعلمة هي المسؤولة عن جودة القياس. تم ضبطه على الحد الأقصى ، لا أوصي بتغييره.
const uint16_t measurementsDuration = 2000;
هذا هو الوقت بالمللي ثانية التي سيتم خلالها إجراء دورة قياس واحدة.
const uint32_t measurementFrequencies[] = { 1000, 1000, 1000, 1000 };
لا أعرف السبب ، لكنني نفذت وظيفة تسمح لي بقياس قنوات الإدخال بترددات مختلفة لكل قناة. ربما شخص ما سوف تحتاج هذه الميزة.
استنتاج
حسنًا ، هذا كل شيء. لقد وصفت جميع الإعدادات اللازمة. يبقى فقط لتجميع الدائرة ، وتجميع المشروع ، وملء البرامج الثابتة في متحكم ونفرح.
في الختام ، أود أن أقول أنه لا يمكنك ترك سلك الصوت المدخَّل "غير عالق" في أي شيء ، فأنت بحاجة إلى إدخاله في أي جهاز أو توصيله في شكل مأخذ توصيل صغير يتم فيه ربط جميع جهات الاتصال.
إذا كانت مصادر الصوت جيدة ، فيمكنك ضبط الإعدادات المنخفضة ، لكن تبديل حالة الصوت قد يتطلب إيقاف تشغيله (وليس من منفذ). ربما سأضيف في يوم من الأيام رابطًا إلى النموذج ثلاثي الأبعاد للحالة ، لكن حتى الآن ليس لدي طابعة ثلاثية الأبعاد ، كما أن هذه الحالة موجودة حاليًا. ولكن هذا فقط الآن: الطابعة ثلاثية الأبعاد تسير بالفعل :-)
هذه مقالتي الأولى ، وسأكون سعيدًا لأي نقد مسبب. أنا أفهم أن هذه ليست تحفة فنية ، لكنني بذلت قصارى جهدي.
شكرا للقراءة.UPD1: أضيفت الصور التخطيطية والأسلاك في المقال.
UPD2: أضيفت الصور التخطيطية والأسلاك إلى مستودع ، وأضاف التعليقات الجديدة في التعليمات البرمجية.