AVR, توصیه شده, کتابخانه برنامه نویسی, مقاله

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

متأسفانه سورس های زیادی وجود دارند که از منابع متن‌باز (OpenSource) کپی شده‌اند و به‌صورت تجاری در فضای اینترنت به فروش می‌رسند. سورس ریموت های کدلرن نیز از این دسته است. اگر سورس های متن‌باز وجود نداشتند شاید این میزان از پیشرفت در حوزه علم و تکنولوژی حاصل نمی‌شد. پس شایسته است که به‌جای منفعت شخصی خود به منفعت جمعی بیندیشم و سورس هایی ازاین‌دست را بفروش نرسانیم و با انتشار رایگان آنها نقشی در بالا بردن سطح دانش داشته باشیم.

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است. بسترهای متفاوتی برای ارسال اطلاعات وجود دارد که از پرکاربردترین آن‌ها، امواج مادون‌قرمز است که نمونه‌اش را همگی در ریموت‌های تلویزیون و وسایل خانگی دیده‌ایم و نوع دیگر، ریموت‌های رادیویی هستند که از امواج رادیویی برای ارسال داده‌ها استفاده می‌کنند. موضوع بحث ما، مورد دوم است: ریموت‌های رادیویی. این ریموت‌ها برای این‌که بتونند اطلاعات را منتقل کنند نیاز دارند که اول اطلاعات را روی یه موج دیگر که به آن موج حامل گفته می‌شود سوار (مدولاسیون) کنند. با این کار اطلاعات قابلیت انتشار در فضا را به‌دست خواهند آورد.

مدلاسیون دو نوع آنالوگ و دیجیتال دارد که خود به انواع دیگری تقسیم‌بندی می‌شوند. در مدولاسیون، سیگنال فرکانس بالا (حامل) بر اساس سیگنال پیام تغییر داده می‌شود. سیگنال حامل خواص مختلفی ازجمله دامنه، فرکانس و فاز دارد که می‌توانند بر اساس سیگنال پیام تغییر داده شوند و ازاین‌رو انواع مختلفی از مدولاسیون پدید می‌آید. (عکس زیر)

انواع مدلاسیون

همان‌طور که در عکس فوق مشاهده می‌کنید، در مدلاسیون AM سیگنال داده بر روی دامنه‌ی موج حامل تأثیر می‌گذارد و در مدلاسیون FM سیگنال داده بر روی فشردگی سیگنال حامل (فرکانس) تأثیر می‌گذارد. این مدلایسون به‌مراتب داری برد بیشتری نسبت به مدلاسیون AM است؛ چراکه در مدلاسیون AM کاهش دامنه به معنی کاهش توان فرستنده است. نوع بعدی مدلاسیون دیجیتال (Keying) است که درواقع نوعی از مدلاسیون FM محسوب می‌شود.

در مدارات دیجیتال ما با دو منطق صفر و یک سروکار داریم که برای انتقال به فرکانس‌های F0 و F1 تبدیل می‌شوند. فرکانس F0 یعنی منطق 0 و فرکانس F1 یعنی منطق 1. در این روش کار گیرنده خیلی ساده است و باید بتواند تفاوت بین فرکانس F0 و F1 را تشخیص دهد و آشکار کند. در ریموت‌کنترل‌های رادیویی برای ارسال داده از این نوع مدلاسیون یا مدلاسیون های مشابه استفاده می‌شود.

ریموت‌های کدلرن از مدلایسون ASK برای ارسال داده استفاده می‌کنند. مدلاسیون ASK زیرشاخه‌ی ساده‌شده‌ای از مدلاسیون دیجیتال است؛ فرکانس F0 از آن حذف شده است و فقط فرکانس F1 در آن استفاده می‌شود. یعنی وقتی‌که منطق 1 باشد فرکانس F1 تولید می‌شود و وقتی‌که منطق صفر است فرستنده خاموش می‌شود و هیچ سیگنالی تولید نمی‌شود.

مدلاسیون ASK

ترفند هم باعث ساده‌سازی فرستنده و هم گیرنده می‌شود؛ چراکه در فرستنده فقط باید فرکانس حامل با فرکانس F1 تولید شود و در گیرنده هم فقط باید فرکانس F1 شناسایی شود.

 

انواع گیرنده ریموت

تا اینجا با نحوه‌ی ارسال اطلاعات آشنا شدیم. برای ساخت یک ریموت کنترل ابتدا لازم است که امواج ارسالی از ریموت (فرستنده) را دریافت کنیم که بعد از پردازش بتوانیم عملی مناسب با درخواست کاربر را اجرا کنیم. با توجه به نوع فرستنده نیاز داریم که یک گیرنده ASK داشته باشیم که فرکانس آن با فرکانس ریموت یکی باشد، یعنی اگر از ریموت با فرکانس 433 مگاهرتز استفاده می‌کنیم گیرنده ASK نیز باید با همان فرکانس کار کند. در غیر این صورت مدار به‌درستی کار نخواهد کرد.

مطابق عکس زیر می‌توانیم مدار گیرنده را خودمان بسازیم؛ اما با توجه به پیچیدگی‌های بحث RF این کار توصیه نمی‌شود و بهتر است که از مدارها و ماژول‌های آماده‌ی موجود در بازار استفاده کنید.

مدار گیرنده ASK

 

معمولاً ریموت‌ها در دو فرکانس 433 و 315  مگاهرتز موجود هستند. در خرید گیرنده دقت کنید که گیرنده‌ی تهیه‌شده با فرکانس ریموت شما هم‌خوانی داشته باشد. در حال حاضر دو نوع گیرنده ASK در بازار ایران یافت می‌شود:

مدل قدیمی‌تر درواقع یک گیرنده‌ی ترانزیستوری ساده از نوع super regenerative است که دارای حساسیت و دقت کمتر و قیمت پایین‌تری است. این گیرنده نیاز به ولتاژ کاری 55 ولت دارد و خروجی داده صفر و یک دارد، ولی به دلیل ساختار و نحوه آشکارسازی، بسیار تحت تأثیر نویزهای محیطی قرار می‌گیرد. (عکس زیر)

ASK Regenerative Receiver

مدل جدیدتر درواقع یک گیرنده super heterodyne است و دارای مدار پیچیده‌تری برای آشکار‌سازی داده است. این گیرنده از کریستال کوارتز استفاده می کند؛ همین امر سبب می‌شود که هم کیفیت گیرندگی و هم دقت بالاتری داشته باشد.

ASK super heterodyne

این گیرنده‌ها علاوه بر 5 ولت قادرند با 3.3 ولت نیز به خوبی کار کنند و خروجی داده هم دارند. درواقع چینش پایه‌های این دو نمونه گیرنده به نحوی است که به‌راحتی می‌توان آن‌ها را جایگزین هم کرد. پس اگر گیرنده‌ای دارید که از برد آن راضی نیستید می‌توانید فقط ماژول ASK را به super heterodyne تغییر دهید و شاهد برد بهتر باشید.

 

پروتکل ریموت کدلرن

بعد از دریافت داده‌ها و هموار شدن مسیر، نیاز است که پروتکل ارسال اطلاعات این‌گونه ریموت ها را بشناسیم تا قادر به رمزگشایی آن‌ها باشیم. اولین نکته‌ی مبهی که در خصوص ریموت‌های کدلرن به ذهن می‌آید، خود واژه کدلرن است. درواقع تا قبل از فراگیر شدن این نوع ریموت‌ها، ریموت‌های کدفیکس وجود داشتند. ریموت‌های کدفیکس دارای 8 پایه بودند که برای کد کردن آن‌ها باید این پایه‌ها را در حالات مختلفی به صفر و یک وصل می‌کردید و همین کار را در گیرنده نیز تکرار می‌کردید تا گیرنده و فرستنده باهم هم‌خوانی داشته باشند و کار کنند. این عمل را کد دادن می‌گفتند.

کد کردن ریموت کدفیکس

دلیل نام‌گذاری کدفیکس هم این است که گیرنده‌های این نوع ریموت، کد ثابتی دارند و اگر بخواهید ریموت دیگری نیز با این گیرنده کار کند باید دقیقاً مطابق دیگر ریموت‌ها کددهی شود. که البته این موضوع به لحاظ امنیتی مساله ساز است؛ چراکه اگر کد انتخابی شما را کسی متوجه شود به‌راحتی می‌تواند یک ریموت سازگار با گیرنده شما بسازد.

اما ریموت‌های کدلرن دارای امنیت بالاتری هستند. به این معنی که توسط شرکت یک کد 20 بیتی اتفاقی در حافظه آنها نوشته شده است. هر ریموت یک کد منحصربه‌فرد دارد و دو ریموت با کد یکسان وجود ندارد: بنابر این برای همگام کردن ریموت‌ها با گیرنده، گیرنده باید قادر باشد که کد هر ریموت را در خود ذخیره کند تا در مواقع درخواست، چک کند که آیا ریموت معتبر هست یا نه. این عمل را  اصطلاحاً لرن کردن می‌گویند. یعنی شما باید ریموت موردنظر خود را در گیرنده لرن کنید و برای همین هم به آنها ریموت‌های کدلرن می‌گویند.

خوشبختانه پروتکل مورداستفاده در ریموت‌های کد لرن مشابه است و فرقی نمی‌کند که شما از آی‌سی HS1527 یا EV1527 یا خانواده‌های مشابه استفاده می‌کنید. همه از انکدر OTP استفاده می‌کنند.

Otp Encoder

 

در این روش 24 بیت داده از ریموت ارسال می‌شود که بیست بیت اول همان کد منحصربه‌فرد برای هر ریموت است و 4 بیت انتهایی مربوط به وضعیت کلیدهای فشرده‌شده ریموت است. در ابتدای هر ارسال، یک وضعیت همزمانی (Preamble) ارسال می‌شود که ما با دریافت این همزمانی باید منتظر دریافت 24 بیت داده باشیم. با توجه به توضیحات ارائه‌شده، ما نیاز 3 حالت منحصربه‌فرد داریم: حالت اول برای ایجاد سیگنال همزمانی (Preamble)، حالت دوم برای ایجاد وضعیت 1 منطقی و حالت سوم برای ایجاد 0 منطقی.

  1. حالت همزمانی: در این حالت اگر میزان یک بودن سیگنال مثلاً 1 میکروثانیه باشد، میزان صفر آن باید 30 میکروثانیه باشد.
  2. حالت یک منطقی : در این حالت اگر میزان یک بودن سیگنال مثلا 3 میکروثانیه باشد میزان صفر بودن آن باید 1 میکروثانیه باشد.
  3. حالت صفر منطقی: در این حالت اگر میزان یک بودن سیگنال مثلا 1 میکروثانیه باشد میزان صفر بودن آن باید 3 میکروثانیه باشد.

توجه داشته باشید زمان‌های ذکرشده به‌عنوان مثال هستند. برای روشن‌تر شدن موضوع و درواقع میزان این زمان‌ها با توجه به نوسان‌ساز داخلی آی‌سی تعیین می‌شود ولی نسبت‌ها به‌صورت توضیح داده شده حفظ می‌شوند.

 

تپولوژی برنامه ریموت

نمونه کدهای زیادی را در این راستا دیده‌ام؛ چه سورس هایی که در اینترنت به فروش می‌رسند و چه سورس هایی که به‌صورت آموزشی منتشرشده است، هیچکدام از روش اصولی برای این کار استفاده نکرده‌اند. نمونه‌هایی دیده‌ام که حتماً باید ریموت مورداستفاده مقاومت نوسان سازش مقداری خاص باشد (چون در کد صرفاً مقدار صفر بودن بررسی می‌شده)، برد خوبی نداشته‌اند،‌ با ضعیف شدن باطری ریموت درست کار نمی‌کنند و مسائل زیادی که به وجود می‌آورند.

اما حال که با نحوه‌ی عملکرد ریموت آشنایی پیدا کردید، نوبت به آن می‌رسد که با توجه به امکانات و اختیارات موجود در میکروکنترلرها، برنامه‌ای بنویسیم که قادر باشد کد دریافتی را شناسایی کند و نسبت به آن عکس العمل نشان دهد. برای این‌که بتوانید به بهترین نحو داده‌های ارسالی را دکد کنید، باید به این صورت عمل کنید: با دریافت لبه بالارونده، یک کانتر شروع به شمارش کند و با لبه پایین‌رونده مقدار کانتر را خوانده و دوباره کانتر را صفر کنید  و با لبه بالارونده بعدی مقدار قبلی خونده شده از کانتر را با وضعیت فعلی کانتر مقایسه کنید که باید شامل یکی از حالات بالا باشد. دقت داشته باشید که حتماً باید پترن ارسال داده توسط ریموت را دنبال کنید (اول همزمانی بعد 24 بیت داده معتبر) چراکه نویزهای محیطی خود باعث به وجود آمدن حالات بالا به‌صورتی تصادفی می‌شوند که اگر پترن را رعایت نکرده باشید ممکن است گیرنده شما عکس العمل نشان دهد و خروجی را به‌صورت اتفاقی قطع یا وصل نماید (اتفاقی که در برخی از گیرنده‌ها شاهد آن هستیم).

خوب سؤال کلیدی این است که تایمر کانتر ما با چه سرعتی باید شروع به شمارش کند تا بتوانیم به‌درستی طول پالس‌ها را با دقت مناسب اندازه‌گیری کنیم. برای پاسخ به این سؤال، به برگه مشخصات آی‌سی مذکور مراجعه می‌کنیم و با جدول زیر مواجه می‌شویم:

که درواقع مدت‌زمان لازم برای ارسال یک فریم داده را با مقدار ولتاژهای مختلف و مقاومت رزوناتورهای مختلف رسم کرده است. کمترین زمانی که این چیپ قادر به ارسال یک فریم از داده است (24 بیت به‌علاوه همزمانی) 1.34 میلی‌ثانیه است که با توجه به این‌که هر فریم شامل 126 پالس است طول هر پالس 10 میکروثانیه خواهد بود. پس اگر تایمر کانتر ما با فرکانس 1 مگاهرتز شروع به شمارش کند (1 میکروثانیه) قادر خواهیم بود طول یک پالس را با دقت بالایی اندازه بگیریم.

 

توضیح سورس موجود

سورس قرارگرفته، در دو نسخه کدویژن و GCC موجود است که با استفاده از میکروکنترلر ATMega8 پیاده‌سازی شده است. خروجی داده ماژول گیرنده به پایه شماره 4 آی‌سی وصل شده است که درواقع پایه ورودی انتراپت صفر است (جهت تشخیص لبه‌ها) و از تایمر کانتر صفر برای اندازه‌گیری طول هر پالس استفاده شده است. برنامه به‌گونه‌ای نوشته‌شده که به‌راحتی قابل‌حمل باشد و شما بتوانید آن را بر روی هر میکروکنترلر دلخواهی پیاده‌سازی کنید.
فرکانس کاری میکروکنترلر 8 مگاهرتز است که از کریستال خارجی تامین شده است.
این کد با سه نمونه ریموت آزمایش شده است؛ هم با فرکانس ۳۱۵ و هم با فرکانس ۴۳۳. با ریموت ۴۳۳ بدون آنتن گیرنده، تا حدود ۸ متر جواب داده است!

 

 

دانلود سورس کد ریموت

* برای دانلود ورژن جدید کتابخانه بهپروژه ریموت کنترل 4 کانال کاملا رایگان به همراه مستنداتپست مراجعه کنید.

 


Sisoog_GNU_GCC_EV1527 (7681 دانلود ها)
Sisoog_CodeVision_EV1527 (11130 دانلود ها)

 

نوشته های مشابه

74 دیدگاه در “ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

  1. سجاد گفت:

    سپاس.مطلب بسیار با ارزشی بود.

    1. زئوس Zeus زئوس Zeus گفت:

      خواهش می کنم دوست عزیز

  2. رضا گفت:

    سلام دوست عزیز
    ضمن تشکر از شما
    میخواستم یه راهنمایی بکنید که چطور ریموت هارو در حافظه eeprome ذخیره کنم و در اصل کدام متغییر را باید ذخیره کنم؟
    یه کم گیج شدم، لطفا راهنماییم کنید

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      قبلا توضیح دادیم که هر ریموت 24 بیت داده ارسال میکنه ؛ 4 بیت کم ارزش وضعیت کلید ها رو نمایش میده و 20 بیت پر ارزش تر کد یونیک خود ریموت هست ؛ برای این که بعدا بتونیم مجداا ریموت رو شناسایی کنیم نیازه که این 20 بیت رو ذخیره کنیم از اونجایی که متغییر 20 بیتی وجود نداره ما داده ها رو توی متغییر های 32 بیتی ذخیره میکنیم به همین سادگی

  3. عبدالله گفت:

    اگر کد ارسالی یک ریموت همیشه یکی باشه و کسی یک گیرنده بگذارد و کد را دریافت و همان را تکرار کند در این صورت امنیت این کد به چیست؟ یعنی به همین راحتی میشود مثلا درب منزل کسی را باز کرد؟

    1. زئوس Zeus زئوس Zeus گفت:

      بله دقیقا ، به همین راحتی میتوان این مدل ریموت ها رو هک کرد دوست عزیز ؛ به همین دلیل ریموت های هاپینگ به وجود اومدن
      قبلا در مورد ریموت های هاپینگ مقاله ای نوشتم که میتونید از سیسوگ مطالعه اش کنید.
      همه چیز در مورد ریموت هاپینگ

  4. امیر گفت:

    دست شما درد نکنه امیدوارم هر روز پیشرفت داشته باشید

  5. پورطباطبایی گفت:

    سلام
    اگر لطف کنید کد ها را دوباره آپلود کنید ممنون میشم
    مثل اینکه مشکلی ایجاد شده

    1. زئوس Zeus زئوس Zeus گفت:

      هر دو فایل چک شدند مشکلی مشاهده نشد ؛ در دانلود فایل ها مشکل دارید ؟

  6. ايوب گفت:

    سلام مهندس
    ممنونم از مطالبتون.
    من برنامه Avr دانلود كردم ولى بوشهEEPRAM رو نداره ميشه يبار ديكه لطف كنيد توى تلكرام سوري برنامه رو واسم بفرستيد خيلي خيلي ممنون

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      چزا فکر میکنید باید پوشه EEPROM وجود داشته باشه ؟ سورس رو چک کردم درسته و چیزی کم نداره

      1. ایوب گفت:

        سلام مهندس
        ممنون
        فقط اگه مشه در مورد حالتهای همزمانی
        یک منطقی و صفر منطقی یه توضیحی بدید

        1. زئوس Zeus زئوس Zeus گفت:

          سلام دوست عزیز
          در واقع برای تشخص هر کدام از حالت ها تنها کافی است که مدت زمان یک بودن به صفر بودن سیگنال را اندازه گیری کنید ؛ در واقع یعنی نسبت را به دست بیاورید.

          1. ايوب گفت:

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

          2. زئوس Zeus زئوس Zeus گفت:

            امم والا کتابی که در این خصوص وجود نداره ؛ منوال خود چیپ در همین حدی که توضیح دادم اشاره کرده ؛ اگر به شکل دقت کنید به خوبی مشخص هست ؛ متوجه نمیشم کدوم بخشش بررای شما نامفهوم هست

          3. ايوب گفت:

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

          4. زئوس Zeus زئوس Zeus گفت:

            سلام دوست عزیز ؛ خواهش میکنم ؛
            نسبت ها کاری به ولتاژ باتری نداره و همیشه ثابت خواهند بود ؛ اما چیزی که به ولتاژ باتری مربوط میشه فرکانس کلاک آیسی و در نتیجه دوره زمانی تکرار کد ارسال ریموت هست ؛ اما چرا این موضوع به ولتاژ باتری مربوط میشه ؛ خیلی ساده است چون آیسی از نوسان ساز RC استفاده میکنه که خیلی وابسته است به ولتاژ ! اگر از نوسان ساز کریستالی استفاده میشد وابستگی به ولتاژ از بین می رفت ! خوب بگذریم اما لازمه که بدونید این نسبت ها بهم نمیخوره تنها چیزی که ممکنه اتفاق بیفته اینه که پالس ها کوتاه تر یا کشیده تر بشن

      2. ايوب گفت:

        مهندس عزيز سلام شرمنده بزركوارى كنيد تو دستور زير منظور از T1و T2 جيه ؟
        T1> min_pulse_len
        T2<(T1*2(

        1. زئوس Zeus زئوس Zeus گفت:

          سلام دوست عزیز
          در واقع زمان یکی بیانگر زمان یک بودن و دیگری بیانگر مدت زمان صفر بودن یک سیکل هست !

  7. مجید ملوندی گفت:

    درود بر شما.
    تشکر بابت به اشتراک گذاشتن مطالب زیبا
    موفق و پیروز و سربلند باشید

    1. زئوس Zeus زئوس Zeus گفت:

      متشکرم دوست عزیز
      متشکر از نظر دل گرم کننده شما

  8. Milad گفت:

    سلام ممنون از اطلاعات خوبتون یک سوال داشتم خدمتتون در ریموت های بلوتوثی که بصورت روبروی هم قرار دادن کد هاشون گپی میشه از چه آی سی استفاده میکنن ؟ مثلا شما در ریموت لرن فرمودید از آی سی EV1527 استفاده میشه برای اون ریموت ها چه آی سی هستش؟

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      دو سه مدل ریموت بلوتوثی که باز کردم ؛ ظاهرا از میکروکنترلر استفاده می کنند ، در واقع کاری که ریموت بلوتوثی انجام میده اینه که احتمالا طول پالس ها رو میخونه و ذخیره میکنه و بعد موقع ارسال همون ها رو ارسال میکنه !
      اگر قصد دارید چنین چیزی بسازید باید برنامه اش رو با میکروکنترلر بنویسید که کار چندان دشواری نیست

  9. hamid گفت:

    سلام و خسته نباشید خدمت شما
    من برنامه نویسیم زیاد خوب نیست امکانش هست کدشو برام توضیح بدید که چجوری این مدار عمل لرن ریموت انجام میده؟

    1. زئوس Zeus زئوس Zeus گفت:

      سلام و درود
      ببینید برای ذخیره کد هر ریموت اول اونو به یع عدد 4 بایتی تبدیل میکنیم یعنی فشرده ترین حالت ممکن ؛ بعد داخل EEPROM ذخیره میکنیم کد رو ، به همین سادگی !
      اما چطور چند ریموت رو ذخیره میکنیم ، به این صورت که در ایتدا کل حافظه EEPROM رو با مقدار FF پر میکنیم ، برای ذخیره اولین چهار بایتی که FF باشند رو پیدا میکنیم و کد ریموت رو ذخیره میکنم ، و این روند ادامه پیدا میکنه تا کل حافظه EEPROM پر بشه.

  10. hamid گفت:

    سلام و خسته نباشید خدمت شما و همکارانتون
    یه سوال داشتم من برنامه کد ویژن دیدم به این تابع برخوردم چرا +48 میشه؟
    putchar(Remode_Data[i]+48);

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز ؛ ببینید کارکتر ‘0’ با عدد صفر متفاوت هستند ؛ برای نمایش کارکتر 0 باید عدد 48 ارسال شود و برای نمایش عدد 1 باید 49 و … تا عدد 9 همین روال پشت سر هم ادامه پیدا میکنه ؛ برای جزییات بیشتر به جدول Ascii کد کارکتر ها مراجعه کنید.
      خوب حالا برای این که اعداد توی ترمینال درست نشان داده شوند با توجه به جدول Ascii نیازه که اونها رو با عدد 48 جمع کنیم که اگر عدد صفر بود معادل اسکی اون یعنی 48 به ترمینال اسال بشه و کارکتر ‘0’ به نمایش در بیاد.

  11. مجتبى گفت:

    سلام من ريموت دزدگير رو گم كردم از كجا بفهمم گيرنده دزدگيرم فركانسش چيه؟به ريموت آوردم بازش كردم روى كريستاليش ١٣٣١٥ نوشته بود با ريسيور دزدگير مچ نشدممنون ميشم راهنماى كنيد

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      دزگیر شما احتمالا باید ماژول گیرنده RF داشته باشه – مثل همون چیزی که توی تصاویر این پست موجوده ، معمولا روی گیرنده ها یه کریستال هست که مقدار اون کریستال فرکانس کاری رو مشخص میکنه ! به همین سادگی
      در ضمن 315 که روی کریستال ریموت درج شده – نشون میده که فرکانس کاری ریموت شما احتمالا 315 مگاهرتز هست ، یه غیر از 315 مگاهرتز معمولا ریموت ها در فرکانس 433 مگاهرتز نیز موجود هستند
      در ضمن تنها فرکانس ریموت برای خرید ریموت کافی نیست ، ریموت ها انواع مختلفی دارن به لحاظ پروتکل که ممکنه هاپینگ باشه ، معمولی باشه و …
      اگر مدل دزگیر رو بگید شاید بشه بهتر در این مورد کمک کرد

  12. ali گفت:

    سلام باید به نوع ترانزیستوری 55 ولت برق بدیم؟؟؟

    1. زئوس Zeus زئوس Zeus گفت:

      سلام
      سوالتون رو متوجه نشدم دوست عزیز

  13. محمد گفت:

    با سلام
    ممنون از اطلاعات ارزشمندتون
    مدار را مونتاژ کردم و برنامه رو پروگرم کردن . ولی بعضی از اوقات کار می کنه بعضی اوقات نه. یک ال ای دی به خروجی ماژول وصل کردم که موقع فشاردادن ریموت چشمک میزنه. همه چیزی رو چک کردم ظاهرا مشکلی نیست اما گاهی اوقات کار نمی کنه

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز ، چرا از ورژن جدید این کتابخونه استفاده نکردید ؟
      این کار نکردن میتونه دلایل مختلفی داشته باشه ، یکی از عمده ترین دلایلش عدم زمان بندی درست ریموت مروبط است ، که غالبا توی تشخیص بیت شروع اتفاق می افته و برای اینه که ما برای ساده تر شدن زمان ها رو محدود کردیم ، ممکنه ریموت شما با فاصله گرفتن از گیرنده از این زمان بندی خارج بشید ، در ضمن از چه نوع گیرنده ای استفاده کردید ؟

  14. سعید گفت:

    بسیار ممنون.فقط زمانیکه ما این اطلاعاتو دریافت کردیم چطور بفرستیم؟

    1. زئوس Zeus زئوس Zeus گفت:

      خواهش میکنم دوست عزیز
      چرا باید بخواید دوباره بفرستید ؟

      1. سعید گفت:

        خب وقتی ما کد ریموتو بگیریم،اصطلاحا لرن کنیم باز باید اینو واسه گیرنده بفرستیم.وقتی ما یک کانال از ریموتو لرن کنیم بقیشم لرن میشن؟

        1. زئوس Zeus زئوس Zeus گفت:

          آها یعنی شما میخواید چیزی شبیه ریموت های بلوتوثی بسازید ؟
          ببینید بعد از خودن کد یه کلید از ریموت شما در واقع کد ریموت رو دارید میشه به بیانی گفت هر 4 تا رو ، اگر مقاله ببینید گفتیم که کد ارسالی 24 بیت هست که 20 بیت اول ثابت است و برای همه کلید های اون ریموت تکرار میشه و 4 بیت آخر وضیعت کلید ها رو گزارش میکنه !
          برای ارسال مجدد کد باید سینگال رو شبیه سازی کنید

          1. سعید گفت:

            بسیار عالی.
            متشکر از پاسختون

          2. زئوس Zeus زئوس Zeus گفت:

            خواهش میکنم دوست عزیز 🙂
            موفق باشید
            اگر سوالی دارید حتما مطرح کنید

  15. سینا گفت:

    متشکر برای این مطلب کاربردی و البته بسیار کامل

    1. زئوس Zeus زئوس Zeus گفت:

      سلام
      خواهش میکنم دوست عزیز 🙂

  16. مسعود گفت:

    “” با توجه به این‌که هر فریم شامل 126 پالس است طول هر پالس 10 میکروثانیه خواهد بود “”

    طول فریم از کجا بدست اومده

    1. زئوس Zeus زئوس Zeus گفت:

      جدول بالا رو نگاه کنید ، زمان کل فریم رو برای ولتاژ و مقاومت رزوناتور نوشته

  17. مبین گفت:

    سلام و خسته نباشید خدمت شما
    از مطالب اموزنده و کاربردی که در اختیار عموم میزارین بسیار ممنونم
    اگه امکانش هست این سورس رو به زبان بیسیک (بسکام)هم اضافه کنید.
    با تشکر

    1. زئوس Zeus زئوس Zeus گفت:

      سلام و درود دوست عزیز
      متاسفانه تسلط چندانی به بیسکام ندارم و برای تبدیل اول باید بیسکام رو یادبگیرم :/
      ولی اگر فرصتی پیش اومد حتما این کار رو انجام میدم

  18. محمدمهدی گفت:

    با عرض سلام و تشکر فراوان بابت مطلب خیلی خوبتون
    برای افزایش برد این ارتباط چیکار باید کرد ؟
    ریموت من کد لرن ، گیرنده هم rxb22 هستش
    حدودا بیست یا سی متر جواب میده حداکثر
    آنتن هم زدم به گیرنده

    1. زئوس Zeus زئوس Zeus گفت:

      شرایط تست رو باید دید ، ولی تا اونجایی که اطلاع دارم برد این نوع ریموت ها همین حدود است شاید تا 50 متر

  19. dave گفت:

    سلام، خیلی ممنون متن بسیار مفیدیه! یه سوال داشتم
    #define Min_Pulse_Len 200 /* In us */
    #define Max_Pulse_Len 16000 /* In us*/
    این زمان ها رو از کجا بدست اوردید؟

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست گرامی
      خوب با مراجعه به یوزرمنوال آیسی قسمت فرکانس اسیلاتور ، میتونید این زمان ها رو که بیشترین و کم ترین زمان های موجود قابل قبول هستند رو ببینید.

  20. علی گفت:

    سلام
    ممنون از مطلب مفیدتون!
    من یه atmega 8a خریدم و برنامه رو روش پروگرم کردم.چه با کریستال خارجی ، چه با کریستال داخلی جواب نداد ( 8مگاهرتز)
    به نظرتون مشکل میتونه از کجا باشه!
    اینم بگم که من وقتی یه LED مستقیم به پایه دیتا ماژول متصل کردم و کلید ریموت رو فشار دادم روی LED تاثیر گذاشت (یعنی روشن و خاموش شد) آیا این موضوع میتونه گواه آن باشد که فرکانس فرستنده با فرکانس ماژول گیرنده برابر است؟! (همچنین وقتی LED رو به ماژول متصل کردم، LED روشن بود و چشمک میزد ولی وقتی کلید ریموت رو فشار میدادم با نور بیشتری چشمک میزد. مگه نباید LED کاملا خاموش باشد؟ مگر ماژول گیرنده هنگامی که ارسالی صورت نمیگیرد نباید در دیتا خروجی صفر داشته باشد؟)
    توی ریموت فرستنده یه کریستال 433 مگاهرتز وجود داره! اما نمیدونم چطور باید فرکانس گیرنده رو تسشیص بدم!؟
    ماژول گیرنده ای که استفاده میکنم ماژول pc-jc02 هست! (روی کریستال آن نوشته 6.7458) آیا این ماژول میتونه این کار رو به درستی انجام بده؟ (بدون آنتن) ماژول پیشنهادی شما کدام است؟!
    آیا میشه که دیتا ارسالی از فرستنده (با آیسی ev1527) کمتر یا بیشتر از 24 بیت باشه؟! یعنی با اینکه آیسی یکسان است اما دیتا ارسال متفاوت باشد؟ یا خیر حتما 24 بیت است؟!
    به نظر شما مشکل چیست؟
    با تشکر

    1. زئوس Zeus زئوس Zeus گفت:

      سلام درود دوست عزیز
      اگر کریستال ماژول شما 6.7458 هست یعنی فرکانس ماژول شما 433 مگاهرتز هست
      اگر LED رو به خروجی ماژول وصل میکنید و بعد فشردن کلید ریموت چشمک زدن LED قائده مند و مرتب میشه یعنی فرکانس گیرنده و فرستنده با هم یکی است
      در مورد atmega8 هم سری a و غیر a فرقی نمی کنه و باید با هر دو به صورت صحیح کار کنه
      شما مطمئن هستید که فیوز بیت های میکرو رو درست تنظیم میکنید ؟ ، وقتی میکرو رو روشن میکنید روی پورت سریال چیزی میفرسته ؟

  21. مجتبی گفت:

    با تشکر از مطالب و سایت بسیار خوبتون

    1. Sisoog Os Sisoog Os گفت:

      متشکر از حسن توجه شما

  22. هنرفر گفت:

    سلام
    من میخوام ریموت کدفیکس رو بر روی میکروی خودم لرن کنم
    با این سورس فقط ریموت کدلرن عمل میکنه
    ظاهرا باید تغییراتی بر روی قسمت اینتراپت اعمال بشه ولی من هر کاری میکنم جواب نمیده
    در صورت امکان بفرمائید این تغییر چطوری باید صورت بگیره که ریموت کدفیکسم دارای آی سی pt هم لرن بشه
    ممنون

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      این کد فقط برای ریموت های کدلرن هست و برای ریموت های کدفیکس باید قسمت دکد رو عوض بفرمایید ، چرا که پروتکل ارسال ریموت های کدفیکس مقداری متفاوت هست ، اگر شما اصول کارکرد کد در خصوص دکد کردن کد های ارسالی رو درک کرده باشید به راحتی قادر خواهید بود که پروتکل ریموت های کدفیکس رو پیاده سازی کنید ، تفاوت ها شامل محل قرار گیری پالس همزمانی و نحوه ارسال صفر و یک منطقی هست بعلاوه این که در ریموت های کدفیکس علاوه بر صفر و یک حالت سومی هم وجود دارد برای آدرس دهی ، تمام این مشخصات را می توانید با مراجعه به برگه فنی مثلا آسی pt2262 پیدا کنید.

  23. علی فلاح گفت:

    سلام
    خیلی عالی بود
    ممنون

    1. زئوس Zeus زئوس Zeus گفت:

      خواهش میکنم دوست عزیز
      خواشحالم که این مقاله مورد توجه شما قرار گرفته

  24. Hamed Akbari گفت:

    سلام
    اگر ممکن هست مطلبی در مورد ریموت های هاپینگ و دکد کردن آنها قرار دهید.
    با تشکر سایت خوبتون

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      خواشحالیم که مطالب مورد توجه شما قرار گرفته ،
      بله در برنامه هست انشالله در فرصت مناسب در مورد این نوع ریموت ها مطلبی منتشر خواهیم کرد.

  25. m.a گفت:

    ممنون بابت اطلاعات مفیدتون

    1. زئوس Zeus زئوس Zeus گفت:

      خواهش میکنم دوست عزیز

  26. reza گفت:

    سلام
    چرا نسخه GCC که گذاشتید کامپایل نمیشه ظاهرا مشکلی داره یا کتابخونه ها براش فراخوانی نشده ؟؟

    1. زئوس Zeus زئوس Zeus گفت:

      نسخه GCC مشکلی نداره ، اول باید توی نرم افزار ایکلیپس ایمپورت کنید بعد کامپایل کنید ، میک فایل مستقیم نداره که بتونید تو کامند لاین کامپایل کنید.

  27. وحید گفت:

    باتشکر از برنامه خوبتون
    اگر بخواهیم از کریستال 16 مگا هرتز استفاده کنیم باید کجای برنامه تغییر کنه ؟
    کدوم دستورات رو باید تغییر بدیم ؟

    1. زئوس Zeus زئوس Zeus گفت:

      برای این تغییر اول باید از توی کانفیگ پروژه فرکانس رو 16 تغییر بدید که تاخیر ها درست انجام بشه
      بعد باید تایمر 0 رو جوری کانفیگ کنید که سرریزش 1 میکرو ثانیه بشه !
      البته شما از کدوم سورس استفاده میکنید ؟ کدویژن یا GCC ، توضیحات من برای کدویژن هست

      1. وحید گفت:

        من با کد ویژن انجام دادم
        شما در کتابخانه تایمر مقدار Clock value: 1000.000 kHz انتخاب کردید در صورتی اگه بخوایم از کریستال 16 مگ استفاده کنیم باید مقدار آن و همچنین ریجیستر TCCR1B=0x02 تغییر کنه یعنی چون فرکانس ما دوبرابر میشه باید مقدار تایمر ما نصف بشه که تاثیری در برنامه نویسی نداشته باشه حالا از شما سوال داشتم که باید مقدار ریجیسترها چگونه تغییر کنه ؟؟ ممنون میشم راهنمایی کنید متشکر

        1. زئوس Zeus زئوس Zeus گفت:

          سلام دوست عزیز ، همانطور که مطلع هستید برنامه بر اساس زمان بندی 1 میکروثانیه نوشته شده است و زمان ها بر این اساس وارد شده است ، برای تغییر فرکانس میکرو ، باید زمان های مورد استفاده در قسمت کتابخانه EV رو اصلاح کنید.
          چرا که متاسفانه نمیتوان با استفاده از سخت افزار میکرو زمان 1 میکرو ثانیه را در فرکانس 16 مگ ایجاد کرد.

  28. احمد رضا گفت:

    نه ببینید
    منظورم این بود که وقتی به عنوان مثال دکمه A ریموت فشرده شد و رها شد خروجی یک بمونه و وقتی که دوباره دکمه A زده شده خروجی صفر بشه و صفر بمونه تا وقتی که دوباره دکمه A زده بشه مثل کلید تاگل ( پوش باتن )
    بعد نکته بعدی اینکه شما گفتید اگر کد تغیییر کرد و کد جدید آمد حالت عوض بشه اصلا کد عوض نمیشه دکمه A ویا B در یک ریموت یک کد اختصاصی داره که هربار فشرده بشه همون کد ارسال میشه نرم افزار از کجا میخواد بفهمه که کد جدید آمده ؟؟ کد همون کده
    نکته آخر اینکه شما در برنامه تون در داخل whil از delay_ms استفاده کردید که یک اشتباه بزرگه و نباید استفاده بشه و تو کل سیستم تاخیر می اندازه کافیه این delay رو بردارید متوجه میشید مشکلات برنامه چیه
    ببیند من زیاد با این برنامه کار کردم و میخوام به کمک شما برنامه مشکلاتش حل بشه تا دوستان عزیز ازش استفاده کننند خواهشا اگه میتونید به آی دی بنده در تلگرام مراجعه کنید تا بهتر بشه روی این پروژه کار کرد کرد ممنون
    آی دی بنده :xxxxxxxxxxx

    1. زئوس Zeus زئوس Zeus گفت:

      ببینید دوست عزیز ، کدهایی که من به شما ارائه میدم فقط نمونه هست و برای کاربردی شدن خودتون باید کامل کنید. من راهکار رو عرض کردم خدمتتون. حالا شما اونطوری که دوست دارید یا نیاز دارید پیاده سازی کنید !
      ببینید همونطور که در توضیحات پست عرض کردم 20 بیت کد ثابت وجود داره و 4 بیت آخر وضعیت کلید ها رو ارائه میکنه ، پس شما باید وضعیت کلید ها رو از بیت های شناسه جدا کنید و مورد بررسی قرار بدید.
      دلیل وجود اون تاخیر هم این بوده که توی کدویژن ما نوع volatile نداریم به همین دلیل متغیر های موجود ممکنه توی اینتراپت مقدار درستی رو دریافت نکنند (البته راهکار داره)، و دلیل دوم هم این بوده که کد ها رو توی سریال نمایش میداده است و شما لزومی در استفاده از اونها ندارید.
      این کد مشکلی نداره به نظر من ، فکر میکنم منظور شما اینه که برای منظور خودتون تغییرش بدید ، مشکلی نیست ، اتفاقا خوشحال میشم که یه کد کاربردی هم در این زمینه منتشر کنیم !
      آیدیتون توی تلگرام موجود نبود :/

  29. احمد رضا گفت:

    سلام خدمت شما
    با تشکر از برنامه خوبی که گذاشتید
    من با این برنامه کار کردم مشکلی نداره و بدرستی کار میکنه ولی یک مشکلی که داره هر روشی سعی کردم روش پیاده کنم که درستش کنم نشد اینه که وقتی دکمه ریموت رو نگه میدارید پورت خروجی حالت چشمک زن پیدا میکنه و برنامه یک بار اجرا نمیشه یعنی تا وقتی که دست روی دکمه ریموت هست دائم خروجی چشمک میزنه در صورتی که باید طوری باشه اگر دست روی کلید بود خروجی 1 بشه و وقتی که دست رو برداشتی و دوباره زدی 0 بشه
    امیدوارم درست سوالم رو مطرح کرده باشم بسیار بسیار ممنون میشم که مننو کمک کنید چون نزدیک به چند ماه دارم روش کار میکنم ولی نتیجه نگرفتم
    ممنون

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز ، وقت شما بخیر
      خواهش می کنم
      خوب اگر درست متوجه شده باشم شما نیاز دارید کدی داشته باشید که تا مادامی که کلید ریموت فشرده هست خروجی مورد نظر 1 باشه و بعد از رها کردن خروجی صفر بشه !
      توجه داشته باشید که کد منتشر شده فقط یک مثال بوده جهت نحوه استفاده از کتابخانه مربوطه ، اما حالا چطور میشه کد رو به این شیوه تغییر داد ، باید عرض کنم خدمتتون که کار زیاد پیچیده ای نیست ، روش کار به این شکله که شما آخرین کد دریافتی از ریموت رو باید توی یک متغییر ذخیره کنید و کد جدید رو با کد آخر مقایسه کنید اگر یکی بودن یعنی همان کلید قبلی است و نیاز نیست عکس العملی انجام بشه و اگر به مدت مشخصی از ریموت کدی دریافت نکردید آخرین کد دریافتی رو صفر کنید تا با این کار رها شدن کلید شناسایی بشه
      به نمونه زیر دقت کنید

      https://paste.ofcode.org/JMPZdeVCupCuvm9D3PBebQ

  30. علی گفت:

    سلام‌…در دیکد کردن ریموت های لرن چگونه سیگنال اصلی فرستنده را از نویز جدا کنم…لطفا هر کس بلده کمک کنه…نویز اجازه هیچ کاری نمیدهد…

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز ، یک مقداری سوال شما مبهم هست. در خصوص این که اجازه هیچ کاری رو نمیده. ببینید محیط پیرامون ما مملو از انواع مختلف نویز هست !
      در واقع نیازی به جدا کردن نیست؛ شما باید سیگنال صحیح را شناسایی کنید. درست مثل وقتی که در یک جمع شلوغ ، کسی اسم شما را صدا میزند ، در میان تمام سر و صدای محیط ، مغز الگوی اسم شما را شناسایی میکند؛ اما باز جانب احتیاط را رعایت میکند و جواب نمیدهد. منتظر میماند تا دوباره صدا را بشنود !
      خوب اینجا هم دقیقا باید همین رفتار تکرار شود: یعنی اول اسم(الگوریتم ریموت) را درست تشخیص دهد که کد این کار رو انجام میده ، و در مرحله بالا تر ، چند بار یا حداقل دو بار اون الگوریتم درست تکرار بشه و این طور به راحتی میتونید بگید که ریموت بوده که کد رو فرستاده چراکه نویز قادر نخواهد بود دو بار پشت سر هم یک کد یونیک ایجاد کنه !

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *