التحكم في مستوى الصوت عن بعد لجهاز فك التشفير IP TV باستخدام Attiny13A

بمجرد تلقي مكالمة من Rostelecom وعرضت توصيل IP TV. حسنًا ، قررت السماح للزوجة والابن بمشاهدة الرسوم المتحركة في غرفة النوم ووافقت. ثم أحضروا لي الصندوق المطلوب. لان ليس لدي جهاز تلفزيون منفصل لذلك ، لذلك قررت توصيله بشاشة قديمة عبر محول HDMI-VGA. بالنسبة للصوت ، كان لدي مكبرات صوت قديمة للكمبيوتر. قرر - انتهى. بدأ كل شيء على ما يرام بشيء واحد: من جهاز التحكم عن بعد الذي يأتي مع جهاز فك التشفير ، من المستحيل ضبط مستوى الصوت. كيف هذا؟ بصراحة ، لم أواجه مثل هذا الشيء من قبل. لم أفهم الأسباب حقًا ، لكن يبدو أن جهاز التحكم عن بُعد من Rostelecom مسجل على التلفزيون ، وبالتالي يتغير مستوى الصوت على التلفزيون نفسه من جهاز التحكم عن بُعد ، وليس عند إخراج جهاز فك التشفير. ملائم؟ بالطبع ، إذا قمت بتوصيل جهاز فك التشفير بجهاز تلفزيون حديث.لكن الخروج من السرير وتشغيل السماعة في كل مرة تحتاج فيها إلى تغيير مستوى الصوت أمر غير مريح. سنتعامل مع هذه القضية. سنقوم بتجميع جهاز منفصل لضبط مستوى الصوت في مكبرات الصوت لدينا وفقًا للإشارة من جهاز التحكم عن بُعد.



أولاً ، دعنا نرى نوع الإشارات التي يولدها جهاز التحكم عن بُعد عند الضغط على أزرار "رفع الصوت" و "خفض الصوت" و "كتم الصوت". لقد استخدمت VS1838B كمستقبل للإشارات من جهاز التحكم عن بعد.



هذا هو جهاز استقبال مفيد لأن يقوم بالفعل بإزالة تشكيل إشارة الأشعة تحت الحمراء 38 كيلو هرتز من جهاز التحكم عن بعد.



اتضح أن الأزرار أعلاه تولد نوعين من الإشارات بالتناوب. الخيار الأول ، في المرة القادمة تضغط على خيار آخر. يوضح الشكل أحد خيارات الإشارة عند الضغط على زر "كتم الصوت". تمت قراءة الإشارات باستخدام محلل منطقي.



الرسم البياني للإشارة محلل المنطق



100 . 24- . ( ) 900 , ( , ) 1800 . , , :



1. .



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0
2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0
1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0
2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0
Mute 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0
Mute 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0


. , 50. .. , , — . "" . X9C103P. 10 . , , , 10 . .



VS1838B. . , , , . , , , . Attiny13A. : , . : 1 64 SRAM. (Atmega 328) 32 2 SRAM.



, , - . , :



const unsigned long UP1_DATA[] =   {860, 900, 1750, 900, 860, 900, 860, 900, 860, 900, 860, 900, 860, 900, 860, 1750, 1750, 900, 860, 900, 860, 900, 860};


, attiny . . — , .. . : , 6- 15-, 19- 20- — . . — . . 8 ( 2).



2 — 1



1 2 3 4 5 6 7 8
1 1 0 0 1 1 0 0 0
2 0 0 1 1 1 0 0 0
1 0 0 1 1 1 0 0 1
2 1 0 0 1 1 0 0 1
Mute 1 0 0 1 0 0 1 1 1
Mute 2 1 0 0 0 0 1 1 1


:



#define UP1_DATA      0b00011001
#define UP2_DATA      0b00011100
#define DOWN1_DATA    0b10011100
#define DOWN2_DATA    0b10011001
#define MUTE_ON_DATA   0b11100100
#define MUTE_OFF_DATA   0b11100001


. , ( ) . . , .



. _timer:



volatile unsigned long _timer = 0;

ISR(TIM0_OVF_vect)
{
    _timer++;
}


Attiny13A 9,6 . 256 , 37500 . 900 33 , 1800 67 . , 9,6 , .



getExpectedTime, ,
#define SHORT_TIME 33UL
#define LONG_TIME 67UL

uint8_t _counter = 0;

unsigned long getExpectedTime(uint8_t data)
{
    uint8_t index;
    if (_counter >= 2 && _counter <= 4)
    {
        index = _counter - 2;
    }
    else if (_counter >= 15 && _counter <= 17)
    {
        index = _counter - 12;
    }
    else if (_counter >= 20 && _counter <= 21)
    {
        index = _counter - 14;
    }
    else
    {
        return SHORT_TIME;
    }
    if (data & (1 << index)) return LONG_TIME;
    return SHORT_TIME;
}




_counter — . data — 6 : UP1_DATA, UP2_DATA, DOWN1_DATA, DOWN2_DATA, MUTE_1_DATA, MUTE_2_DATA.


.. , , ( ) getExpectedTime . — .





volatile bool _hasPulse = false;
volatile unsigned long _RXPreviousTime = 0;
volatile unsigned long _pulseDuration = 0;

ISR(INT0_vect)
{
    _pulseDuration = _timer - _RXPreviousTime;
    _RXPreviousTime = _timer;
    _hasPulse = true;
    _rxPinStatus = !!(PINB & (1 << RX_PIN)); // digitalRead  .
}


,



incrementCounter,
#define SIZE_OF_PATTERNS 6
#define PAUSE_TIME 375UL //10000 
#define HAS_PATTERN_START 0b00111111
#define ERROR_VALUE 19UL
#define SIZE_OF_DATA 23

#define UP1_BT 0
#define UP2_BT 1
#define DOWN1_BT 2
#define DOWN2_BT 3
#define MUTE_ON_BT 4
#define MUTE_OFF_BT 5

//         : UP1_BT, UP2_BT, DOWN1_DATA, DOWN2_DATA, MUTE_ON_BT, MUTE_OFF_BT
const uint8_t PATTERNS[] = {UP1_DATA, UP2_DATA, DOWN1_DATA, DOWN2_DATA, MUTE_ON_DATA, MUTE_OFF_DATA};
uint8_t _hasPattern = HAS_PATTERN_START;

//   ,       PATTERNS.
uint8_t incrementCounter() //   ,       PATTERNS.
{
    if (_pulseDuration > PAUSE_TIME)
    {
        _counter = 0;
        _hasPattern = HAS_PATTERN_START;
        return 255;
    }
    if (_hasPattern)
    {
        unsigned long eTime;
        for (uint8_t i = 0; i < SIZE_OF_PATTERNS; i++)
        {
            if (_hasPattern & (1 << i)) //   .
            {
                eTime = getExpectedTime(PATTERNS[i]);
                if (!((_rxPinStatus ^ !!(_counter % 2)) && _pulseDuration >= eTime - ERROR_VALUE && _pulseDuration <= eTime + ERROR_VALUE)) //  .
                {
                    _hasPattern &= ~(1 << i);
                }
            }
        }
        _counter++;
        if (_counter == SIZE_OF_DATA)
        {
            if (_hasPattern) //-  
            {

                switch (_hasPattern)
                {
                    case 1: return UP1_BT;
                    case 2: return UP2_BT;
                    case 4: return DOWN1_BT;
                    case 8: return DOWN2_BT;
                    case 16: return MUTE_ON_BT;
                    case 32: return MUTE_OFF_BT;
                    default: return 255;
                }
            }
            else
            {
                return 255;
            }
        }
        else
        {
            return 255; //    
        }
    }
    else
    {
        return 255; //   
    }
}


_hasPattern — , . 1. -, , 0. , - . PATTERNS.



, X9C103P.



1020 1024 , , (-Os). GitHub. UNO, .. , Attiny13A. UNO , - . .



( ), .



لوحة الدوائر المطبوعة



9 , , 78L05.



8 : 3 , 3 . UTP , 8 . , .



مجلس العمود



:



وجهة نظر من فوق



الرؤية من القاع



, , , -. , GND , . . , smd 100 , .



, .



:






All Articles