الأشعة تحت الحمراء للتحكم عن بعد على stm32



مرحبا

وصف المكتبة لقراءة وفك تشفير والإرسال اللاحق لإشارات الأشعة تحت الحمراء من أجهزة التحكم عن بعد المنزلية المختلفة باستخدام متحكم stm32. استنادا إلى مكتبة IRremote لاردوينو ، وتكييفها ل stm32.

تستخدم المكتبة مؤقتًا واحدًا ، سواء لاستقبال أو إرسال إشارة. جهاز الاستقبال متصل بأي طرف (GPIO_Input) ، ويتم توصيل جهاز الإرسال بأحد قنوات جهاز ضبط الوقت الذي يعمل في وضع إنشاء PWM (PWM). في المثال ، يتم استخدام القناة الأولى من الموقت رقم 4 - PB6 (جهاز الإرسال) والدبوس PB5 (جهاز الاستقبال).

لاستقبال إشارة ، يعمل المؤقت في وضع المقاطعة - كل 50 دقيقة ، يتحقق من حالة دبوس الإدخال ، وخلال الإرسال ، ينتقل إلى وضع إنشاء PWM ، ويرسل إشارة ، ويعود مرة أخرى إلى وضع المقاطعة.

الإعدادات في الملف IRremote.h

extern TIM_HandleTypeDef htim4; //     -   50  (     72) #define MYPRESCALER 71 //   1 #define MYPERIOD 49 // 50  //     -     #define MYSYSCLOCK 72000000 //     recive_IR #define RECIV_PIN (HAL_GPIO_ReadPin(recive_IR_GPIO_Port, recive_IR_Pin)) 

إذا كنت ستقوم بتكوين مؤقت آخر ، فستحتاج إلى تحديد اسم البنية المقابل - htim4 ، وتفعل الشيء نفسه في ملفات IRremote. و irSend.. كنت كسولًا جدًا لتحديد كل هذا الاقتصاد. عند اختيار جهاز توقيت آخر في كوبا ، يلزمك تحديد القناة ومصدر الساعة الداخلي فقط ...



سيقوم البرنامج بتكوين كل شيء آخر. إذا قمت بتحديد رقم قناة مختلف ، فأنت بحاجة أيضًا إلى إعادة تسميته في ملف irSend.s.

مع بقية الإعدادات ، أعتقد أن كل شيء واضح - استنادًا إلى تردد النظام (في مثال 72 ميجاهرتز) ، يتم استبدال قيم الفاصل المسبق والفيض الفائض بالمقاطعة كل 50 ثانية. ما يلي يشير إلى تواتر وقراءة الدبوس.

فيما يلي التعريفات التي تحدد البروتوكولات المعنية ...

 ////////////////////////////////////   //////////////////////////////////////// #define DECODE_RC5 1 //     RC5   0 #define SEND_RC5 1 //       RC5   0 #define DECODE_RC6 1 #define SEND_RC6 1 ... 

تعطيل البروتوكولات غير الضرورية يقلل من حجم البرنامج. من حيث المبدأ ، يمكنك عمومًا الاستغناء عن وظائف البروتوكولات غير المستخدمة والملفات المقابلة (تحتوي الملفات على أسماء مميزة).

البرنامج بسيط للغاية ، تقوم وظيفة my_decode (& results) بفك تشفير الإشارة المستلمة وتعرض رمز الزر ونوع البروتوكول وطول الحزمة ...



ليس لدي أجهزة التحكم عن بعد الأخرى.

لإرسال إشارة فك الشفرة ، استخدم الوظيفة مع الاسم المقابل ...

 sendSAMSUNG(0x707048b7, 32); my_enableIRIn(); 

وظيفة my_enableIRIn () ضرورية ، فهي تعطل PWM وتضع المؤقت في وضع الاستلام. يتم استخدام نفس الوظيفة للتهيئة (قبل حلقة لا نهائية). بسبب هذه الوظيفة ، لن تكون قادرًا على التقاط الإشارة الخاصة بك - يمكن حل ذلك ، لكنني لا أرى أي جدوى من ذلك.

إذا لم تتمكن من تحديد نوع البروتوكول ...


... ثم لا يوجد شيء يدعو للقلق ، يتم تلقي رمز الزر على أي حال.

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



... وإرسال بيانات القراءة باستخدام وظيفة sendRaw () ...

 uint8_t khz = 38; //    ,    36  40  unsigned int raw_signal[] = {1300, 400, 1300, 400, 450, 1200, 1300, 400, 1300, 400, 450, 1200, 500, 1200, 450, 1250, 450, 1200, 500, 1200, 450, 1250, 1300}; sendRaw(raw_signal, sizeof(raw_signal) / sizeof(raw_signal[0]), khz); my_enableIRIn(); //   ( ) 

إرسال لي "الخام" لا يعمل بالنسبة لي.

تستخدم المكتبة عداد DWT للتأخير microsecond. بقدر ما أعرف ، ليس كل stm32 لديهم ، ومن الممكن أنه ليس في كل مكان تم تكوينه على قدم المساواة. إذا كان الحجر الخاص بك لا يحتوي على DWT ، فأنت بحاجة إلى الخروج بشيء لاستبداله في دالة custom_delay_usec (طويلة غير موقعة لنا) في نهاية ملف irSend.s ، يكون الإعداد في البداية.

هذا كل شيء.

المكتبة

Source: https://habr.com/ru/post/ar456890/


All Articles