قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية funky112233
funky112233
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2009
المشاركات: 666
نشاط [ funky112233 ]
قوة السمعة:88
قديم 17-07-2012, 10:53 PM المشاركة 1   
افتراضي تعلم كيفية صنع ريموت كنترول (مرسل + مستقبل) بالميكروسى ((الجزء الثانى المستقبل)) Twitter FaceBook Google+




بسم الله الرحمن الرحيم
السلام عليكم ورحمه الله وبركاته

اولا:
هذا رابط المرسل وشرحة للى عايز يطلع علية
http://www.qariya.info/vb/showthread.php?t=112123

__________________________________________________ ___
ثانيا :
كود الاستقبال لو فهمناه كويس هنقدر ننفذ من خلالة مشاريع كثيرة جدا
لانة يقيس عرض النبضات بدقة
وهذا مفيد جدا فى بعض المشاريع زى التعامل مع Ultrasonics
__________________________________________________ ___
ثالثا :
هذا هو كود الاستقبال
كود:
sbit ir_in at RA0_bit;                      // Infrared receiver input
sbit ir_in_direction at TRISA0_bit;         // Infrared receiver input
unsigned int retint;                        // general purpose integer
unsigned char ir_byte,COUNT,bouton;
unsigned char ir_result[3];
void interrupt()
{
     count++;
     intcon=0b00100000;
     TMR0=0;
}
unsigned int get_mark(){
      TMR0= 0; count=0;
      for(;!ir_in;){}
      retint=2*(TMR0+(count*256));
      return retint;
}

unsigned int get_space(){
      TMR0= 0; count=0;
      for(;ir_in;){}
      retint=2*(TMR0+(count*256));
      return retint;
}
unsigned char get_sony_byte(char nbits){
char n;
unsigned char ir_byte;
unsigned int temp_ir;

    ir_byte = 0;                                  // initialise
    for(n=0 ; n<nbits ; n++){
        temp_ir = get_space();                    // expect ~510uS
        temp_ir = get_mark();
          ir_byte >>= 1;                   // 650uS = 0, 1.2uS = 1
        if ((temp_ir > 1000)&&(temp_ir < 1300)) {
            ir_byte += 0x80;
        }
    }
    ir_byte >>= 8-nbits;
    return ir_byte;
}
void sony_read(){
unsigned int temp_ir;

    ir_result[0] = 0;                            // return 0, 0 if glitch
    ir_result[1] = 0;                            // return 0, 0 if glitch
    while(ir_in);                                // wait for IR to go low
    temp_ir = get_mark();
    if((temp_ir>2000)&&(temp_ir<3000)) {     // expect 2.4mS mark
        ir_result[0] = get_sony_byte(7);          // 7 bit command
        ir_result[1] = get_sony_byte(5);         // 5 bit address
        Delay_ms(10);                           // wait for repeat messages to clear

    }
}
void main() {
    TRISA=0x0F;
    TRISB=0;
    PORTB=0;
    PORTA=0;
    cmcon=7;
    option_reg=0b10000000;
    intcon=0b10100000;
    TMR0 = 0;
    while(1){
        sony_read();
        if(ir_result[1]==1){                 // Sony address 01 is TV
            bouton = ir_result[0];
            switch (bouton){
                case 0: Portb.F0 = ~Portb.F0;Delay_ms(150);break;        // button TV '0'
                case 1: Portb.F1 = ~Portb.F1;Delay_ms(150);break;        // button TV '1'
                case 2: Portb.F2 = ~Portb.F2;Delay_ms(150);break;        // button TV '2'
                case 3: Portb.F3 = ~Portb.F3;Delay_ms(150);break;        // button TV '3'
                default:break;
            }
        }
    }
    while(1);              // loop forever
}
__________________________________________________ ____
__________________________________________________ ____
سوف اقوم بشرح الكود
ولكن سوف ابدء من التعريفات للمتغيرات ثم الداله الرئيسية void main
اى كما يفعل الميكرو بالزبط لنفهم عمله جيدا خطوة خطوة ان شاء الله
__________________________________________________ ____
__________________________________________________ ____
هذه
هى التعريفات
كود:
sbit ir_in at RA0_bit;                      // Infrared receiver input
sbit ir_in_direction at TRISA0_bit;         // Infrared receiver input
unsigned int retint;                        // general purpose integer
unsigned char ir_byte,COUNT,bouton;
unsigned char ir_result[3];
فى البداية جعلت الطرف رقم 0 فى البورت A هو الدخل لكى يركب علية المستقبل
وسميتة ب ir_in
اى بدل ان اقول porta.f0 سوف اقول بدلا عنها ir_in
ثم عرفت 3 متغيرات لاستخدمهم فى البرنامج
وبعد ذلك مصفوفة مكونة من 3 خانات اسمها ir_result
وهى المصفوفة التى سوف تحمل قيم (الكومند بيت ===والادريس بيت)
____________________________________________
نبدء مع اول البرنامج
كود:
void main() {
    TRISA=0x0F;
    TRISB=0;
    PORTB=0;
    PORTA=0;
    cmcon=7;
هنا جعلت البورت A مدخل لكى يتم الاستقبال من خلال ارجلة
ثم جعلت البورت B خرج لكى يتم اخراج الاوامر من خلالة
ثم قمت بعمل تصفير للبورتان لكى لا يحدث اى اخطاء عند تنفيذ البرنامج
ثم جعلت كل الارجل تعمل كا ديجتال من خلال هذا الامر CMCON=0;
وهو لكى يتم قفل الكومبرتور وعمل الارجل بشكل عادى كما قلت
__________________________________________________ _______

ثم قمت باعدادات الانتربت interrupt من اجل استخدام ال timer 0
كود:
    option_reg=0b10000000;
    intcon=0b10100000;
    TMR0 = 0;
فى الاول جعلت التايمر يعمل عند تغير الفولت علية من 5 فولت الى صفر
_______
((وهذا لان المستقبل يعمل بطريقة عكسية
يعنى هو فى الوضع الطبيعى يخرج 5 فولت اما عند قدوم النبضات
يخرج 0 فولت))
_______
ثم جعلت معامل القسمة فى التايمر 0 2:1
اى كل 2 ميكرو ثانية سوف يعد التايمر 1 وبعد 2 ميكرو ثانية اخرى سوف يصبح 2
وجعلت التايمر 0 يعد بنبضات داخلية اى نبضات الكريستالة

وفى حالتنا الكريستالة 4 ميجا
ااقسم على 4 كما نعلم من القانون
يبقى التردد 1 ميجا
وهذا يعنى انه يعد بالميكرو ثانية

وهذا من خلال الامر option_reg
________
ثم فعلت التايمر 0 من خلال الامر intcon
ثم جعلت قيمة التايمر تساوى صفر TMR0=0
__________________________________________________ ____
الان سوف اتحدث عن المقاطعه وماذا سوف يحدث عن حدوث المقاطعة

كود:
void interrupt()
{
     count++;
     intcon=0b00100000;
     TMR0=0;
}
اولا
عندما يصل التايمر فى العد الى 256 سوف تحدث مقاطعه وسوف يذهب الى الانتربت هذة
وعندها سوف ينفذ هذه الاوامر
وهى زيادة المتغير count فى كل مرة بقيمة 1 اى كل 256 عدة من التايمر
سوف يزيد المتغير 1
وبعد ذلك جعل التايمر يعمل ثانيا وازاله العلامة من الميكرو لكى تحدث مقاطعه اخرى
وبعد ذلك صفرت التيمر وانتهى
__________________________________________________ _
((ملحوظة هامة))

التايمر طوال الوقت ومن اول ما يبدء البرنامج العمل يعد ويذهب الى الانتربت
وكما نعلم ها لا ياثر على عمل البرنامج فى شىء
ويمكنك ان تقول اذا سوف يحدث خطا لانة يعد طوال الوقت ونحن نريدة يعد عند ارسال اشارة فقط
الاجابة فى الشرح باذن الله....................
__________________________________________________ __
ملحوظة :
اذا اردت التعلم اكثر عن التايمر والمقاطعات
فهذا الموضوع ممتاز جازة الله صاحبة خيرا
http://www.qariya.info/vb/showthread.php?t=46338
__________________________________________________ __
نكمل بقيت الداله الرئيسية
_________
اول حاجة هيعملها البك فى الداله الرئيسية انوا هيروح الى sony_read()
وهى الداله المسئولة عن معرفة النبضات والبيانات وهى اهم داله

______________________
كود:
void sony_read(){
unsigned int temp_ir;

    ir_result[0] = 0;                            // return 0, 0 if glitch
    ir_result[1] = 0;                            // return 0, 0 if glitch
    while(ir_in);                                // wait for IR to go low
    temp_ir = get_mark();
    if((temp_ir>2000)&&(temp_ir<3000)) {     // expect 2.4mS mark
        ir_result[0] = get_sony_byte(7);          // 7 bit command
        ir_result[1] = get_sony_byte(5);         // 5 bit address
        Delay_ms(10);                           // wait for repeat messages to clear

    }
}
فى البداية عرفت متغير لمعرفة نبضة البداية temp_ir
ثم وكا امر احطياطى جعلت قيم المصفوفة الخاصة بالنتائج تساوى صفر
وبعد ذلك جعلت ينتظر ولا يفعل اى شى ابدا طلاما ان المدخل يساوى 5 فولت
((اى ان المستقبل لا يستقبل شىء))
ويفضل البرنامج ثابت على هذا الى ان يتغير الى الصفر ((اى تم استقبال اشارة))
وهذا من خلال الامر
كود:
while(ir_in);
بعد كدا او ما هينخفض الفولت على طرف الدخل A0 اى ir_in = 0
_______
سوف اجعل المتغير temp_ir يساوى القيمة النتجة من هذه الداله get_mark()
وسوف يذهب اليها البك وينفذ ما فيها ويرجع بالناتج لكى يساوية بالمتغير كما قلت

وهذ اوامرها

كود:
unsigned int get_mark(){
      TMR0= 0; count=0;
      for(;!ir_in;){}
      retint=2*(TMR0+(count*256));
      return retint;
}
فى البداية جعلت التايمر 0 والمتغير count يساويان صفر اى يبدان العد من جديد
وهذا هو شرح العملية التى تحدثت عنها فى الاول عند التايمر 0
وبعد ذلك جعلت البيك ينتظر طلاما الدخل مازال يساوى صفر وفى نفس الوقت سوف يعد التايمر 0 وال count ايضا
واول ما يرجع الدخل الى 5 فولت
(هذا هو الفاصل الذى تحدثت علية فى المرسل)
سوف يحسب قيمة عرض هذه النبضة
وهى كالاتى اضرب المتغير count * 256 لكى نحصل على الناتج منه لانة كما نعلم كل 256 عدة من التايمر هذا المتغير سوف يزداد واحدا
اى اذا اصبحت قيمتة 1 مثلا
عند ضربه فى 256 سوف يكون الناتج 256 ميكروثانية
ثم جمعت هذا الناتج على قيمة التايمر 0 فى هذه اللحظة وممكن ان يكون مثلا
0 او يكون رقم بين 0و256 على حسب عرضة النبضة بقى
وبعد ذلك ضربت هذا النتج فى 2
لماذا لان معامل القسمة للتايمر يساوى2:1
اى كل 2 ميكرو ثانية سوف يعد التايمر 1
ولنفرض مثلا ان قيمة التايمر فى هذه اللحظة 44
اذن 256*1+44*2=600 ميكرو ثانية
اظن واضح الامر
اذا كانت صعبة فى الفهم هذه النقطة
فاخبرونى وسوف اشرحه مفصله اكثر بمفردها ان شاء الله
لانها الاساس فى العملية كلها
_____________________________________________
وبعد ما خلص العمليات وطلع الناتج لعرض النبضة
سوف يعود مرة اخرى
ويجعل قيمة المتغير temp_ir تساوى هذه القيمة

____________________________________
ثم يختبر هذه القيمة اذا كانت تساوى ما بين 2000 و 3000 اى نبضة البداية

((ملحوظة:قيمة النبضات ليست ثابتة اى نبضة البداية من المفروض انها 2400
ميكروثانية ولكن فى الواقع يمكن ان تكون 2420 او 2380 هكذا اى ليست 2400
بالسنتوفة يعنى ههههه وايضا كل النبضات هكذا))
__________
وهذا الامر لمعرفة هل هى نبضة البداية لليريموت سونى ام لا
اذا كانت لا سوف يعيد البرنامج مرة اخرى
ام اذا كانت القيمة سليمة
سوف يبدء فى حساب ال 7 كومند وال 5 ادريس
واولا ال 7 كومند
كود:
ir_result[0] = get_sony_byte(7);
وهو جعل قيمة اول خانة فى المصفوفة تساوى قمية البايت لل كومند
وذلك عن طريق الذهاب الى الداله get_sony_byte واجراء العمليات التى بداخلها
ولكن ترونى وضعت الرقم 7 بداخلها ترى لماذا ؟؟؟؟؟

سوف تعلم لماذا بعد قليل
______________________________________________
هذه هى داله get_sony_byte

كود:
unsigned char get_sony_byte(char nbits){
char n;
unsigned char ir_byte;
unsigned int temp_ir;

    ir_byte = 0;                                  // initialise
    for(n=0 ; n<nbits ; n++){
        temp_ir = get_space();                    // expect ~510uS
        temp_ir = get_mark();
          ir_byte >>= 1;                   // 650uS = 0, 1.2uS = 1
        if ((temp_ir > 1000)&&(temp_ir < 1300)) {
            ir_byte += 0x80;
        }
    }
    ir_byte >>= 8-nbits;
    return ir_byte;
}
فى البداية هذه المتغير nbits سوف تكون قيمتة 7 او اى رقم تم وضعه
فى الداله سابقا
ولكن ما فائدتة بعد قليل
ثم تم تعريف بعض المتغيرات للمساعدة فى سير البرنامج

ثم عمل حلقة تكرار وهى جملة for
ولكن الرقم الذى سوف يكرر العملية متوقف على قيمة هذا المتغير nbits
وهنا قيمتة 7 اى سوف يتم تكرار العملية 7 مرات
_____________
ولكن ما فائدتة
ببساطة فائدتة اننا نحتاج الى 7 بيت للكومند
ونحتاج ان نكرر امر القراءة 7 مرات للحصول على قيمة هذا الكومند
ولهذا سوف تجد بعد ذلك نفس الامر
ولكن قيمة المتغير nbits تساوى 5
وهو للادريس
_____________________________
اذن سوف يتم تكرار الاوامر 7 مرات
والاوامر كالاتى
كود:
temp_ir = get_space();
وهذه الداله لحساب المساحة بين البتات كما شرحت فى المرسل
وهى غير مهمة اوى ولكن يجب انتظار مدتها حتى لا يحدث خطا

وبعد ذلك
كود:
 temp_ir = get_mark();
وهى لحساب عرض النبضة المرسلة وهذه الداله تم شرح كيفية عملها
وايضا الداله get_space() تعمل بنفس الطريقة
_________________

ثم ويجب التركيز هنا وهو امر جديد وفكرة جديدة

كود:
 ir_byte >>= 1;
عملت حركة ازاحة بواحد للقيمة المتغير ir_byte
ولكن ماذا تعنى الازاحة
تعنى هكذا
اذا كانت قيمة البايت تساوى 10000000
بعد هذا المر سوف تصبح هكذا
01000000
اى تم تحريك اول رقم من على الشمال الى جه اليمين بخانة واحدة
ولكن لماذا فعلانا قمنا بعمل الازاحة
هذا لسبب بسيط
وهو انك اذا لم تقم بعمل ازاحة سوف يكون الاستقبال كا الاتى
مثلا رقم الادريس هو 10000 هكذا يتم استقبالة وقيمتة بالديسمال 16
ولكن تجد فى المواقع انه يساوى 1 بالديسمال اى 00001
وهذا من الممكن ان يحدث خطا عند التعامل مع الريموت
لهذا قمنا بعملية الازحاجة فمثلا سوف يتم استقبال الرقم 1 قبل الاربعه اصفار
10000
اذن شكل البايت هاكذا بالترتيب
هذا الوضع الافتراضى
00000000
عند استقبال الرقم 1 سوف يصبح هكذا
10000000 وعند عمل الازاحة مرة يصبح
01000000 وبعد ثانى مرة يصبح
00100000 وهكذا الى ان يتم ارجاع الرقم الاول الى اول البايت
اى تصبه هنا القيمة 1 فعلا بالديسمال
وهذا لكى يسهل عليك التعامل مع المكتوب فى المواقع سواء لشركة سونى او غيرها
________________________________________
نرجع لموضوعنا
كود:
 if ((temp_ir > 1000)&&(temp_ir < 1300)) {
            ir_byte += 0x80;
        }
بعد عمل الازاحة سوف يختبر الشرط اذا كانت قيمتة المتغير بين 1000 و 1300
اى ان النبضة المستقبلة تساوى 1
سوف يجعل البايت يساوى 10000000+قيمة ir_byte
مثال على الزر رقم 4 فى الريموت الذى قيمتة بالديسمال 3
اى هكذا
00000011 ولكن الاستقبال يكون معكوس اى هكذا
11000000
وهنا فائدة الازاحة

فى البداية طبعا قيمة ir_byte =00000000
اذا سوف تكون البضة الاولى تساوى واحد
وكانت قيمة المتغير ir_byte تساوى 00000000
سوف يكون الناتج النهائى بعد جمع
كود:
ir_byte += 0x80;
هو 10000000
وبعد ذلك يعود مرة اخرى ليختبر المساحة وبعد المساحة عرض النبضة
وبعد عرض النبضة يتم عمل ازاحة
اذا اصبح الناتج 01000000
وبعد ذلك سوف يستقبل عرض النبضة الثانية بواحد
اى
11000000
وبعد ذلك يتم الاختبارات مرة اخرى فسوف يجد ال 5 بيت الى فاضلين من 7 بتوع الكومند
بصفر
وعند ايجاد النتيجة بصفر سوف يزيح فقط بدون اضافة 1
ومع عملا الازاحة كل مرة
وفى النهاية وبعد عمل تكرار 7 مرات وهو عدد الكومند اذا تم استقبال كل القيم المتبقية ب 0
سوف يصبح
00000110
ولكن ما زالت القيمة ليست 3 كما نريد
اذا نحتاج الى عمل ازاحة مرة اخيرة بالرقم المتبقى فى البايت وهو 1 هنا
وهذا فائدتة هذا الامر
كود:
ir_byte >>= 8-nbits;
هنا طرحت قيمة nbits وفى هذه الحالة هو ب 7 وهو عدد الكومند - عدد البايت وهو8
وعمل ازاحة بالناتج
وهنا الناتج 1 وهكذا يصبح الناتج النهائى للقرائة هو
00000011 وهو فعلا 3 بالديسمال مظبوط 10/10
___________________________________________
ويعد مرة اخرى للدالة sony_read() بالنتج للكومند مظبوط
ويجعل الخانة الاولى من المصفوفة ir_result يساوى هذه القيمة
وبعد ذلك ينفذ نفس العملية ولكن هذه المرة سوف يكون قيمة nbits
تساوى 5 وهو عدد الادريس

ولكن عند قراءة قيمة الادريس وهى 5 ارقام للتلفزيون سونى وهى 10000
اى 16 بالديسمال
وبالنظام الى بيتكتب بيه فى المواقع 00001 اى 1 بالديسمال
سوف يكون البايت بعد الازاحة
00001000
اذن نحتاج الى ازاحة 3 مرات حتى يصبح الرقم صحيح

وهنا دور هذا الامر مرة اخرى
كود:
ir_byte >>= 8-nbits;
5-8 يساوى 3
ويتم عمل الازاحة بثلاث خانات اى يصبح
00000001 وهو الرقم المطلوب والمزبوط

ويعود ليساوى الخانة رقم 2 فى المصفوفة ir_result
يساوى قيمة الادريس
وهنا انتهى دور الدوال ودور حساب الانبضات
ويعود ليختبر هل الاوامر والنبضات صحيحة ام لا لينفذ الاوامر
__________________________________________________ _____________
__________________________________________________ _____________
كود:
 if(ir_result[1]==1){                 // Sony address 01 is TV
            bouton = ir_result[0];
            switch (bouton){
                case 0: Portb.F0 = ~Portb.F0;Delay_ms(150);break;        // button TV '0'
                case 1: Portb.F1 = ~Portb.F1;Delay_ms(150);break;        // button TV '1'
                case 2: Portb.F2 = ~Portb.F2;Delay_ms(150);break;        // button TV '2'
                case 3: Portb.F3 = ~Portb.F3;Delay_ms(150);break;        // button TV '3'
              default:break;
            }
        }
سوف يختبر اذا كانت قيمة الخانةالثانية من المتغير ir_result
وهى الخاصة بالادريس تساوى 1 اى هذا الريموت يخص ريموت التلفزيون لشركة سونى
سوف يختبر اوامر الكومند ويرى ما تريد تنفيذة من الازرار وينفذ الاوامر المرادة اذا كان مثلا الكومند يساوى الكومند للزر 1 وهو 00000000
او اذا كان يساوى الكومند للزر 2 فى الريموت وهو 00000001 ينفذ كذا وهكذا
كود:
 default:break;
وهذا الامر يعنى اذا كانت القيم غير ذلك فلا تفعل شىء وعود مرة اخرى

وبعد ذلك يكرر البرنامج الموضوع من اول وجديد وهكذا الى الابد
وهنا انتهى الشرح والحمد لله
__________________________________________________ __________
__________________________________________________ __________
__________________________________________________ __________
__________________________________________________ __________

ملاحظات :
1 - اعلم ان الكود ممكن يكون فية لف كثير والشرح ممكن يكون متوة
لكن انا حاولت اوصل المعلومات على اد ما ااقدر وافصل على اد ما ااقدر
لذلك اذا كان فى اى نقطة غير واضحة
ممكن تسيبها فى تعليك وان شاء الله اوضحها حتة حتة بمفردها .


2 - اوامر الازاحة يمكن الغائها ولكن قمنا بعملها من اجل غير المحترف
لكى يستطيع التعامل مع الكود كما فى المواقع اى اذا اراد تنفيذ امر محدد
مثلا 2 يكتب فى الاختبارات النهائية 2 فقط
بكل سهولة
وهى للتسهيل ليس الا .

3 - يمكن الابقاء على الكود كما هو وفقط تعدل على الرقام بتاعت الاختبارات الى تحت
بمعنى انك لو عايز تتحكم فى لليد ينور ويطفى من خلال الزر رقم 1 فى الريموت
اذا تكت فى الاختبار لو 0 وهو قيمة الزر واحد فى الكومند اطلع على هذا
http://www.kucher.org/projects/tvcontrol/

ينور الليد ويطفية كما تريد من اوامر بدون تعب ولا عناء انقل كما فى الموقع .

4 - اذا كنت تستخدم ريموت سونى ولكن مثلا ل CD Player يبقى هنغير قيمة الادريس
من 1 الى 17
اى هكذا
كود:
if(ir_result[1]==17){
وبعد ذلك اكواد الزراير للريموت زى الموقع بالزبط
وهذا للتسهيل عليك .....


السلام عليكم ورحمه الله وبركاته





التعديل الأخير تم بواسطة : ماجد عباس محمد بتاريخ 28-10-2018 الساعة 03:28 PM السبب: تعديل الرابط للموقع الجديد
اعلانات

الصورة الرمزية نوفلsys
نوفلsys
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: الاردن
المشاركات: 51
نشاط [ نوفلsys ]
قوة السمعة:0
قديم 17-07-2012, 11:50 PM المشاركة 2   
Smile


بارك الله فيك اخي ولك جزيل الشكر

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

islamyhayati
:: مهندس ::
تاريخ التسجيل: Mar 2010
المشاركات: 15
نشاط [ islamyhayati ]
قوة السمعة:0
قديم 18-07-2012, 04:45 AM المشاركة 3   
افتراضي


جزاكم الله خيرا ونفع بكم


الصورة الرمزية funky112233
funky112233
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2009
المشاركات: 666
نشاط [ funky112233 ]
قوة السمعة:88
قديم 18-07-2012, 06:42 PM المشاركة 4   
افتراضي


شكرا اخوتى ونفع بكم ايضا ان شاء الله


kishoko
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2011
المشاركات: 122
نشاط [ kishoko ]
قوة السمعة:0
قديم 19-07-2012, 07:16 AM المشاركة 5   
افتراضي


اخى العزيز هل يعمل هذا الكود لاى ريموت سونى ام لريموتات محددة و كيف يمكن معرفة طريقة ارسال ريموتات السونى و اكوادها بحيث اذا اردت تغيير الريموت استطيع و ضع الكود المناسب لة و اعذرنى اذا كنت بتقل عليك بس عندى مشروع باستخدام خاصية capture لقياس مدة ضغطة و بالتالى كان هدفى منها صنع ريموت بالتقاط نبضات الكومند و منها تحليل فرق الوقت لمعرفة مدة القياس كما انة كان فى رأسى ايضا استخدام نفس الخاصية فى عمل ltrasonic sensor خاصة ان خاصية capture تتميز بسرعة و دقة زمن الالتقاط و يمكننى و ضع الكود الخاص بقياس مدة ضغطة زر و عرض القيم على شاشة LCD للتأكد من النتائج و طريقة الحساب و ارجو منك الرد للمساعدة فى عمل الريموت و حساس الموجات فوق الصوتية باستخدام تلك الخاصية من اجل ان يستفيد منها الجميع و اشكرك جدا لشرحك البسيط لهذا الكود و مجهودك الكبير


الصورة الرمزية funky112233
funky112233
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2009
المشاركات: 666
نشاط [ funky112233 ]
قوة السمعة:88
قديم 19-07-2012, 09:06 AM المشاركة 6   
افتراضي


بسم الله الرحمن الرحيم

نعم يا اخى يعمل على كل ريموتات سونى الخاصة بالتلفزيون
ولكن اذا كنت ستستخدم ريموت سونى لل CD Player فيجب ان تغير قيمة فى الكود وهكذا مع كل انواع الريموتات لشركة سونى فقط
وهذا الكلام تحدثت عنة فى اخر الشرح


______________________________

افضل طريقة لمعرفة اى اشارة لريموت هى بالتاكيد باستخدام الاوسلوسكوب
اى راسم الاشارة
ولكن اذا لم يتوافر يمكنك البحث على النت ومفيش تتقيل ولا حاجة
انا تحت امرك ان شاء الله
________________________________________
يمكن استخدامه فى اكثر من مشروع
نعم لهذا قلت ان هذا الكود له اكثر من فائدة وهو هام جدااااا ولهذا كتبت فى شرحة كثر من الكلام علشان لازم يتفهم ههههههههههه
وبالنسبة لاستخدامة لقراءة الريموت فهذا يحتاج الى شغل فى الكود كبير
لان هناك اكثر من طريقة للارسال فى الريموتات
وهذا شىء مرهق جدا
اما مثلا اذا اردت معرفة كل اكواد شركة سونى فقط واظهارها على شاشة LCD
فهذا ليس صعب
لكن لكل الريموتات الامر يحتاج الى شغل كثير

واستخدامة مع الاترسونيك
Ultrasonics
سهل وبسيط الكود واضح جدا على فكرة فى جزئية قياس عرض النبضة

ولو محتاج منى اى شىء انا تحت امرك
وكل سنة وانتوا طيبين


الصورة الرمزية mohamedalikahli
mohamedalikahli
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2010
الدولة: مصر -- الاسكندرية
المشاركات: 155
نشاط [ mohamedalikahli ]
قوة السمعة:0
قديم 19-07-2012, 02:00 PM المشاركة 7   
افتراضي


بسم الله ما شاء الله ......
عمل راااااااااااااااااااااائع اخي محمد (funcky) ...
و شرح و الله روعة ....
بارك الله فيك و جزاك الله خيرا في هذه اليام المفترجة ....
__________________________________________________ _____________

و السلام عليكم و رحمة الله و بركاته...


الصورة الرمزية funky112233
funky112233
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2009
المشاركات: 666
نشاط [ funky112233 ]
قوة السمعة:88
قديم 19-07-2012, 09:55 PM المشاركة 8   
افتراضي


شكرا لك يا اخى
mohamedalikahli
وكل سنة وانت طيب

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 08:11 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2024