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

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

hosam_eldin
:: مهندس متواجد ::
تاريخ التسجيل: Jun 2008
المشاركات: 185
نشاط [ hosam_eldin ]
قوة السمعة:0
قديم 09-10-2009, 11:00 PM المشاركة 1   
افتراضي مع الصور, اصنع بنفسك ريموت الكاميرا نيكون دى إس إل آر Twitter FaceBook Google+



السلام عليكم,

لكل من يمتلك كاميرا ديجيتال نيكون DSLR طبعا هى تأتى بدون ريموت للتصوير عن بعد , بعد الإضطلاع على الأكواد الخاصة بالريموت, أصبح من السهل كتابة برنامج لتوليد نفس الأكواد مع العلم أن الريموت الأصلى هو مزود بزر واحد فقط.

تم استخدام PIC16f84A نظرا لبساطتها واستهلاكها تيار بسيط جدا , مع كريستال 4MHZ

بعد اتمام اختبار البرنامج, يمكنك أستخدام علبة أى ريموت قديم ووضع الدائرة به واستخدام حجرين بطارية ريموت AAA لتشغيل الدائرة.

البرنامج يعمل على معظم كاميرات نيكون DSLR
وقد تم اختباره على الكاميرا الخاصة بى Nikon D60

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




الدائرة بسيطة جدا والمدى وصل إلى أكثر من 3 أمتار بدون استخدام أى ترانزيستور



الكود مكتوب بلغة ميكروسى, ولكن سوف تلاحظ وجود Assembly language بداخل الكود وذلك لأن فكرة عمل أى ريموت أشعة تحت الحمراء هو إرسال نبضات ولكن ليست مستمرة وإنما بتردد من 38 إلى 40 كيلو هرتز كيلو هرتز أى أنه وبالتالى عرض الموجة سوف يكون صغير ولغة السى غير قادرة على توليد نبضات بهذه السرعة, حيث أن أرسع كود على الإطلاق هو المكتوب بلغة الأسمبلى

طبعا يمكن استخدام الميكروسى مباشرة ولكن باستخدام كريستال أسرع 10 أو 20 ميجا هرتز.

unsigned pulsecntr;
unsigned waitcntr;
unsigned waittmp ;
unsigned maincntr;
// unsigned LED_BIT;

void main() {

TRISB = 0x0;
PORTB = 0x0;

// Port B output
pulsecntr =0;
waitcntr =0;
waittmp =0;
maincntr =0;
//LED_BIT = 2;

asm {

//org 0x000 // startup
goto mainprog


doLedToggling:
movwf _pulsecntr // store argument W into pulsecounter

doLedToggLoop:
// ON for 13us
bsf PORTB, RP0 // 1/13us PORTB RB0 IR LED high
nop // 2/13us just use NOPs instead of complicated loop,
nop // might even be a bit less powerhungry
nop
nop // 5/13us
nop
nop
nop
nop
nop // 10/13us
nop
nop
nop // 13/13us
nop // added ---------------

// OFF for 12us total
bcf PORTB,RP0 // 1/12us GPx low to disable IR LED
nop // 2/12us
nop
nop
nop // 5/12us
nop
nop
nop
nop // 9/12us
nop // added ---------------
nop //added ----------------
decfsz _pulsecntr,F // 10/12us (or +2us on exit)
goto doLedToggLoop // 11&12/12us (+2us)
return // (+2us)


do25usPauses:
movwf _pulsecntr // store argument W into pulsecounter
movf _waitcntr,W // load waitcntr argument to W
movwf _waittmp // place waitcntr into actual temp counter

do25outer:
do25inner: // delay for 25us
nop
nop
nop
nop
nop // 5us
nop
nop
nop
nop
nop // 10us
nop
nop
nop
nop
nop // 15us
nop
nop
nop
nop
nop // 20us
nop
nop // 22us

nop //added
nop //added
nop //added

decfsz _waittmp,F // +1us (+2us on end)
goto do25inner // +2us
movwf _waittmp // put back waitcntr into actual counter
// (also +1us on end so condition check always takes 3us)

decfsz _pulsecntr,F
goto do25outer

return



//------------- MAIN

mainprog:


initOneFullSeq:
movlw 2 // send same sequence twice
movwf _maincntr

performSequences:
decfsz _maincntr,W // if maincntr==1, do a longer pause
goto doOneSeq // skip pause, send directly
// long pause of 63000us between first and second time sending
// (25us*waitcntr + 3us)*W + 4us : (25*15+3)*167+4=63130us
movlw 15
movwf _waitcntr
movlw 167
call do25usPauses

// send the sequence
// ON 2250us = 90 * 25us
doOneSeq:
movlw 90
call doLedToggling
// Off 27600us-(ON call 3us + w/f 3us + OFF call 2us)=27592us
// (25us*waitcntr + 3us)*W + 4us : (25*15+3)*73+4=27598
movlw 15
movwf _waitcntr
movlw 73
call do25usPauses
// ON 650us = 26 * 25us
movlw 26
call doLedToggling
// Off 1375us-(3us+3us+2us)=1367us : (25*18+3)*3+4=1363
movlw 18
movwf _waitcntr
movlw 3
call do25usPauses
// ON 575us = 21 * 25us
movlw 21
call doLedToggling
// Off 3350us-(3us+3us+2us)=3342us : (25*2+3)*63+4=3343
movlw 2
movwf _waitcntr
movlw 63
call do25usPauses
// ON 650us = 26 * 25us
movlw 26
call doLedToggling
decfsz _maincntr,F
goto performSequences

// to completely stop:
sleep

}


}

يمكنك رؤية البرنامج على Proteus
حمله من هنا
لاحظ أن النبضات هى معدلة ب Square wave with 40KHZ

اعلانات

الصورة الرمزية hassan_ahmed
hassan_ahmed
:: مهندس ::
تاريخ التسجيل: Apr 2009
الدولة: EGYPT
المشاركات: 16
نشاط [ hassan_ahmed ]
قوة السمعة:0
قديم 10-10-2009, 05:30 AM المشاركة 2   
افتراضي جزاك الله خيرا


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

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

hamzazayyad
:: مهندس متميز ::
تاريخ التسجيل: Aug 2005
الدولة: موزنبيق
المشاركات: 701
نشاط [ hamzazayyad ]
قوة السمعة:0
قديم 10-10-2009, 10:55 AM المشاركة 3   
افتراضي


بارك الله فيك اخي
ولكن ما هو تطبيقات هدا المشروع


hosam_eldin
:: مهندس متواجد ::
تاريخ التسجيل: Jun 2008
المشاركات: 185
نشاط [ hosam_eldin ]
قوة السمعة:0
قديم 10-10-2009, 08:10 PM المشاركة 4   
افتراضي


أخى العزيز حسن,
أنا فعلا قد نفذت هذا المشروع من قبل , وبالفعل عندك حق هذا الموضوع بالذات ليست له معلومات كافية على الإنترنت فدائما إما أن تلاقى مشروع ولكنه بلغة الأسمبلى أو يستخدم فيه دوائر متكاملة جاهزة تقوم بعمل ال Encoding and Decoding

سوف أعطيك خلاصة بحثى فى هذا المجال:

بخصوص لغة الميكروسى, للأسف من الصعب عمل المستقبل بهذه اللغة لسبب بسيط هو أن فكرة البرنامج تعتمد على قياس عرض النبضة المرسلة وغالبا ما يكون فى حدود 1 ميللى ثانية أو أقل, وللأسف هذا الأمر غير متوفر بالميكروسى ولكنه لحسن الحظ موجود فى البيك بيسك, وبالرغم من أنى لا أستخدم هذه اللغة كثيرا ولكننى أضططرت لاستخدامها فقط فى هذه التطبيقات

هذا الأمر هو Pulsein وهو يقيس عرض ال Pulse سواء كانت صفر أو واحد
وهو المطلوب بالضبط فى هذا المشروع.

إليك هذا المشروع الرائع الذى قمت بتنفيذه واشتغل بكفاءة عالية جدا
http://www.rentron.com/PicBasic/IR_Chips.htm

طبعا الكود مكتوب بلغة PicBasic والجميل هنا هو أن نفس الكود يستخدم مع الميكروكونترولر فى دائرة الإرسال أو الإستقبال والذى يحدد هو مجموعة من Ports كما هو موضح بالمشروع.

- إذا أردت أن تستخدم الميكروسى فهذا ممكن فى دائرة الإرسال واستخدم كريستال سريعة كما ذكرت سابقا ولكن بعد فهم الكود المرسل بالضبط.
وتذكر جيدا أنها نبضات معدلة ب 40KHZ أى النبضة التى عرضها مثلا 1 ميللى ثانية هى مكونة من نبضات صغيرة بتردد 40 كيلو هرتز لمدة 1 ميلى ثانية.

وإن أردت استخدام الميكروسى فى الإستقبال فسوف تضطر لاستخدام Timers and interrupts وهذا ممكن طبعا ولكن بمجهود أكبر وتعقيد للبرنامج

ملحوظة هامة:
========

سوف تلاحظ أن الأكواد المستخدمة فى الإرسال هى خاصة بشركة سونى وهى أشهر طريقة لإرسال بيانات عبر الأشعة تحت الحمراء وهى باختصار كالآتى:

يتم إرسال 5 bits For Address ثم تليها
7 bits Data
وبالتالى المجموع 12 بت
عرض الصفر 1.2 ميلى ثانية وعرض الواحد 0.6 ميلى ثانية

ولكن البرنامج لم يستخدم 7 بت فى البيانات بل استخدم 8 بت

وبالتالى الفائدة الكيرى من البرنامج هى كالآتى:
استخدام أى ريموت تلفزيون سونى وبهذه الطريقة تكون قد وفرت بناء الريموت وأصبح جاهزا عندك, ما عليك إلا معرفة الأكواد المرسلة مقابلة لكل زر ووضعها فى البرنامج المستقبل

ولمعرفة الأكواد الخاصة بسونى, فضلا إلقى نظرة على هذا اللينك:
http://users.telenet.be/davshomepage/sony.htm

ولكن ماهو التعديل بالبرنامج ليعمل على ريموت السونى :
==================================

هذه هى أهم نقطة للأسف البرنامج ليس عندى الآن ولكنى أتذكر ما قد قمت به:

بعد كلمة Verify
هناك 3 For , قم بتعديل ال3 For إلى الآتى:

Verify: '// Read, Decode, then verify data
FOR Index = 0 TO 11

FOR Index = 0 TO 6

FOR Index = 7 TO 11

وأعمل Comment لهذا السطر

' IF ABYTE != (H_Add & ABYTE1) THEN Decode2 '// Does address match?

وهو يقوم باختبار العنوان المكون من 5 بت وهذا ال Address يختلف من ريموت لآخر ولكنه غالبا على ما أتذكر هو 00000

حظ موفق , وأبلغنى عند الحاجة لأى تفسير.

شكرا ومنتظر ردك


الصورة الرمزية mohamedse
mohamedse
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2008
الدولة: مصر الأسكندرية
المشاركات: 681
نشاط [ mohamedse ]
قوة السمعة:123
قديم 12-10-2009, 09:30 AM المشاركة 5   
افتراضي


السلام عليكم

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

جهاز متطور لرسم الأشارة و قياس التردد

و أرجو منك شرح الكود السابق بلغة الميكرو سى أن أمكن و ذلك لكى نتمكن من برمجة أكواد الريموت


hosam_eldin
:: مهندس متواجد ::
تاريخ التسجيل: Jun 2008
المشاركات: 185
نشاط [ hosam_eldin ]
قوة السمعة:0
قديم 12-10-2009, 10:15 AM المشاركة 6   
افتراضي


الأخ محمد, لقد اضطلعت على المشاركة, مجهود رائع ومميز

ولكنى بعد كثير من التجارب أخيرا توصلت إلى كيفية كتابة كود بالميكروسى لعمل أى ريموت بأى أكواد وبدون استخدام Assemble language

وهناك أيضا طريقة سهلة جدا لمعرفة أكواد أى ريموت , سوف أكتب بها موضوع منفصل عند الإنتهاء منها.

شكرا
م.حســام


الصورة الرمزية mohamedse
mohamedse
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2008
الدولة: مصر الأسكندرية
المشاركات: 681
نشاط [ mohamedse ]
قوة السمعة:123
قديم 12-10-2009, 04:15 PM المشاركة 7   
افتراضي


السلام عليكم

منتظرك ان شاء الله و جزاك الله خيرا


الصورة الرمزية 5282
5282
:: عضو ذهبي ::
تاريخ التسجيل: Jun 2008
الدولة: مصر- الاسكندرية
المشاركات: 1,630
نشاط [ 5282 ]
قوة السمعة:112
قديم 13-10-2009, 11:22 AM المشاركة 8   
افتراضي


مشكورررررر على الشرح الجميل جداااااااا ونحن فى انتظار الشرح وشكراااااااااااا
ووفقك الله
ولكن لماذا لا نستخدم الrs232 rx tx واحد عند المرسل وواحد عند المستقبل


التعديل الأخير تم بواسطة : 5282 بتاريخ 13-10-2009 الساعة 11:26 AM
إضافة رد

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

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

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


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

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