السلام عليكم
سأطرح في هذا الموضوع طريقة وكود إستخدمته في قراءة النبضات القادمة من قطعة الاستقبال
الموجودة في ريموت الاقفال المركزي للسيارة central lock حيث هي عبارة عن RF modul
ومداها جيد يمكن أن يصل إلى 80 متر هذه القطةأي ال RF modul يمكن شرائها منفصلة مع المرسل الخاص بها
وهي رخيصة لكن غالبا ما تكون في البلدان العربية غالية الثمن بسبب الشحن والتجار ..مثلا
في نابلس فلسطين يصل ثمنها 120 شيكل (35 دولار) أما لوحة الcentral lock الخاصة بالسيارات
كنت قد إشتريتها من محل كماليات سيارات هي وريموتها وأربع محركات الخاصة بأمانات
الابواب ب 100 شيكل ويمكن شرائها بدون المحركات بنصف
السعر ... ليس السعر وحده ما دفعني لإستخدام النظام الخاص بالسيارة ..ولكن غلاف الريموت وتجهيزه
حيث ليس من السهل على الهواة والافراد تجهيز ريموت بشكل لائق ناهيك عن مصدر الطاقة ...ايضا هذه
اللوحة الخاصة بالسيارة تحتوي غالبا حوالي خمس ريليهات ...أي انه يمكن استخدامها مباشرة في التحكم بأي جهاز
تجربتي :
أحضرت لوحة السنترال لوك .. ثم أزلت القطعة المسؤولة عن قراءة الاشارة او الكود المستقبل من خلال ال RF modul وتشغيل الريليهات حسب
ما يتطلبه نظال الاقفال ..وبالصدفة كانت هذه القطعة هي pic16f57 وهي من ما يسمى baseline أي أن التعامل معها يختلف عن
البيك العادي مثل pic16f877a و pic16f628a وليض الوقت لم أشأ أن أدخل في تفاصيلها وطريقة التعامل معها
من خلال الداتاشيت الخاصة بالقطعة التي أزلتها عرفت أين أطراف التغذية .. وأيضا تتبعت الخط القادم من ال rf modul وعرفت مكانه
في ال socket ثم وضعت البيك pic16f628a مكان القطعة التي أزلتها طبعا صنعت بوردة صغيرة لموائمة الاطراف ...في ما يلي الكود والشرح
هذه الصورة اخذتها بإستخدام المبرمجة pickit2 ويمكن استخدام الاوسيليسكوب لقراءة الداتا وتحديد الكود المرسل
الفكرة كالتالي :الريموت سيرسل كود(رقم) معين عندالضغط على أحد الازرار ثم يتم إستقبال هذا الكود (الرقم)
في المستقبل ومن ثم يمرر إلى المتحكم pic16f628a ... على فرض أنه سيرسل الرقم 4 يعني بالثنائي (الباينري) 101 وبما
أننا نتحدث عن نظام إلكتروني إذا سيتم التعبير عن هذا الرقم بإستخدام نبضات إلكترونية ...حيث يعبر عن الواحد المنطقي ب نبضة موجبة طولها
حوالي 1000 مايكرو ثانية (us) ويعبر عن الصفر المنطقي بنبضة طولها 300 مايكرو ثانية ... حقيقة هو سيرسل رقم مكون من 25 خانة قسم من هذه
الخانات ستكون ثابتة والاخرى تختلف من زر إلى آخر للتمييز بينها إذا ما سنقوم به في البيك هو استقبال النبضة وقياس مدتها (طولها ) وتحديد
إذا ما كانت تعبر عن صفر أو واحد .. ثم التأكد من أننا إستلمنا الرقم (الكود ) المطلوب وعلى أساسه نقوم بعمل معين (مثل تشغيل احد الريليهات )
وسيتم قياس طول النبضة (مدتها) بإستخدام التايمر زيرو (بدون إستخدام المقاطعة ) حيث سيظل البرنامج ينتظر حتى تأتي نبضة موجبة أي حتى يتغير
الدخل من 0 فولت إلى 5 فولت
عندها سنقوم بتصفير التايمر
ثم سيظل البرنامج ينتظر حتى تنتهي النبضة
وبمجرد إنتهائها سيقرأ قيمة التايمر
والتي تكون تناسب زمن النبضة ثم نخزن(نضيف) صفر او واحد (حسب طول النبضة) إلى متغير ومع كل عملية نفحص قيمة المتغير بحيث إذا إحتى التسلسل المطلوب
ننفذ أمر معين
كود:
#define rxd PORTB.F3
void main() {
int data1;
option_reg=0b00000010;
INTCON=0B10100000;
CMCON=0X07;
TRISB.F3=1;
TRISB.f7=0;
TRISB.f6=0;
UART1_Init(1300);
//---------------------------
while(1){
while(!rxd);
TMR0=0;
while(rxd);
if(TMR0>=117 && TMR0<= 125)
{data1=data1<<1; data1=data1| 1;}
if(TMR0>=37 && TMR0<= 45)
{data1=data1<<1;}
switch(data1){
case 28784:PORTB.f7=0;PORTB.f6=1;break;
case 28776:PORTB.f6=0;PORTB.f7=0;break;
case 28772:PORTB.f6=0;PORTB.f7=1;break;
}
} }
شرح الكود : بداية المتحكم المستخدم هو pic16f628a وتم اختياره لأن عدد أطرافه يناسب عملنا ... أيضا لإحتوائه على مذبذب داخلي فيمكننا
الاستغناء عن توصيلة الكرستالة ومكثفاتها ..أيضا به خاصية الاستغناءعن توصيلة ال mclr أي أنه يلزمه فقط تغذية ليعمل وينفذ المطلوب منه ..
لقد وصلت طرف الdata القادم من المستقبل على الرجل RB3
ولقد سميت هذه الرجل ب rxd
كود:
#define rxd PORTB.F3
لسهولة وسرعة التعامل معها خلال كتابة البرنامج
ثم عرفت متغير اسمه data1
ولم أستخدم data فقط لأنها كلمة محجوزة للبرنامج ... وعرفت هذا المتغير على أنه int اي بطول 16 بت .. بما أنه سيتم إستقبال
25 بت وأن أول 7 بت تختلف من زر إلى آخر وباقي البتات ثابتة لكل الازرار فيمكنني أن اجعل البرنامج يفحص وصول تسلسل ال 7 بت الطلوبات فقط
ولكني لزيادة الأمان وخوفا من التشويش سأفحص وصول اول 16 بت بالتسلسل الصحيح .
كود:
option_reg=0b00000010;
INTCON=0B10100000;
هذان السطران لضبط إعدادات التايمر زيرو السطر الاول يحدد عدد النبضات القادمة من المذبذب الداخلي التي ستزداد عندها قيمة التايمر يمقدار واحد
هنا ضبطه على أن يزداد واحد بعد وصول 8 نبضات من المذبذب ...وبما أنني أستخدم المذبذب الداخلي والذي قيمته 4 ميجا هيرتز إذا كل نبضة زمنها واحد مايكرو
أي أن التايمر ستزداد قيمته بمقدار واحد بعد كل 8 مايكرو ثانية .. فإذا جاءت نبضة من المستقبل وصفرنا التايمر مباشرة ليبدأ العد من صفر ثم بعد
إنتهاء النبضة قرأنا قيمة التايمر مباشر وجدنا أن قيمته 100 فهذا يعني أن طول النبضة 800 مايكرو ...
في حالتنا سيكون هناك طولان للنبضة يجب أن نفحصهما 300 مايكرو في حالة الصفر وعندها يكون التايمر يحتوي القيمة 300\ 8 ونحن سنفحص اذا ما كانت
قيمت التايمر بن ال 45 و37 حيث هذا الرقم يغطي النبضة 300 مايكرو وأعلى منها قليلا وأقل منها قليلا وهي النبضة التي تعبر عن الصفر المنطقي
كود:
if(TMR0>=37 && TMR0<= 45)
وعندها سنضيف بت قيمته صفر الى المتغير data1 وذلك من خلال عمل ازاحة له بمقدار بت واحد لليسار
وأيضا سنفحص إذا ما كانت قيمة التايمر
بين 117 و125 حيث هذه القيم تغطي النبضة التي تعبر عن الواحد المنطقي وطولها حوالي 1000 مايكرو ثانية ومن ثم نضيف بت قيمته واحد للمتغير نفسه وذلك
من خلال ازاحته بمقدار بت واحد لليسار فيصبح اول بت في المتغير قيمته صفر لذلك نعمل عملية OR المنطقية مع القيمة واحد فيصبح أول بت قيمته واحد
كود:
{data1=data1<<1; data1=data1| 1;}
بعد كل عمليه(اي بعد استلام انبضة وقياسها وتخزين المناسب في المتغير ) نختبر قيمة المتغير data1
فإذا تم استلام الرقم البتات بالتسلسل الصحيح
ليتكون عندنا الرقم المطلوب عندها ينفذ البيك الاوامر التي نحددها له
وبنفس الفكرة يمكن اختبار الكود القادم من ريموت التلفاز ولكني لم اجرب لضيق الوقت
الجيد في هذا الكود البرنامج أنه يتلافى التشويش بسهوله والتشويش في ال rf modul لايستهان به وهذه لصورة للتشويش في حالة لم يكن هناك اي ضغط على احد ازرار الريموت
أعتذر عن عدم تدعيم الشرح بالصور الكافية ...
وأعتذر عن الرد بسرعة على الاستفسارات في حال وجودها بسبب فترة الامتحانات
لا تنسونا من صالح دعائكم