ریموت کنترل ۴ کاناله
در مقالههای قبل راجع به ریموت کدلرن و نحوه دکد کردن آن بهتفصیل توضیح دادهایم و سورس کتابخانهی مربوط به دکد ریموتهای مبتنی بر چیپست EV15xx را منتشر کردهایم. سورس مربوطه به زبان C و برای میکروکنترلر atmega8 نوشته شده بود. البته سورس فقط مربوط به نحوه دکد کردن کد ریموت بود و برای ساخت یک ریموت واقعی باید قسمتهای موردنظر را خود به آن اضافه میکردید. با توجه به استقبال و درخواست دوستان در خصوص تکمیل کد کتابخانه و همچنین ایجاد یک پروژه عملی، بر آن شدیم که با استفاده از کتابخانه مذکور، یک ریموت کنترل ۴ کاناله کاملاً عملی بسازیم.
مجوز انتشار
قبلا در خصوص نرمافزار آزاد توضیح دادهایم. بر همین اساس این پروژه را نیز کاملاً تحت همین مضمون است و آن را با مجوز GPL V3 منتشر میکنیم. تمام سورسکد و داکیومنتها در دسترس خواهند بود و کاربران برای ساخت و تغییر آن مجاز هستند. باوجود چنین مجوزی باز افرادی پیدا میشوند که نام نویسنده اصلی و ایجادکننده را از کد حذف میکنند و آن را به نام خود منتشر میکنند و یا حتی به فروش نیز میرسانند. ایجاد تغییرات و فروش این سورسکد مشکلی ندارد ولی حذف نام ایجادکننده و نویسندهی اصلی غیراخلاقی و غیرقانونی است.
توضیح اجمالی در خصوص پروژه ریموت کنترل 4 کاناله
برای ساخت پروژه از میکروکنترلر ATmega328p استفاده شده است. البته بهراحتی و با کمترین تغییر میتوان کد را برای دیگر میکروکنترلرها ازجمله mega8 نیز تغییر داد. دلیل استفاده از این میکروکنترلر وجود آن بر روی بردهای آردوینو است تا استفادهکنندگان قادر باشند در کمترین زمان ممکن با استفاده از بردهای آردوینو مدار را بسازند. در نمونه تستشده از برد Arduino Nano استفاده شده است با فرکانس کاری 16 مگاهرتز؛ چراکه مقدار پیشفرض بردهای آردوینو همین مقدار است ولی بهسادگی و با تعویض مقدار فرکانس در کامپایلر میتوان کد را روی پردازندههای دیگر نیز کامپایل کرد. جهت نوشتن کد از کامپایلر GCC و محیط توسعه Eclipse استفاده شده است. اما در صورت نیاز و با ساخت یک Makefile ساده میتوان کد را در محیط Shell یا کامپایلر Winavr نیز کامپایل کرد. البته برای استفاده در شبه کامپایلر کدویژن لازم است تغییرات مربوط به کامپایلر را در کد لحاظ کنید. البته تغییرات زیاد نخواهد بود و این کار بهراحتی قابل انجام است.
اصلاحات مربوط به کتابخانهی ریموت کدلرن
با توجه به اینکه کتابخانهی ریموت کدلرن در سال 2009 نوشته شده و بعدازآن هیچ تصحیحی روی آن صورت نگرفته بود، بخشهایی از کتابخانه برای عملکرد بهتر و اصولیتر شدن کد نوشتهشده، بازنویسی شد. اصلیترین قسمت بازنویسی شده مربوط به روال دکد کتابخانه است. در کتابخانهی قدیمی، حداکثر و حداقل طول پالس بر اساس میکروثانیه در برنامه تعریف شده بود. این مقادیر هنگام تغییر فرکانس کاری تایمر، مشکلساز میشدند و با تغییر این فرکانس، کد دیگر بهدرستی کار نمیکرد.
#define Min_Pulse_Len 200 /* In us */ #define Max_Pulse_Len 15000 /* In us*/
مقادیر فوق بهکلی از برنامه حذف شد تا در صورت نیاز و تغییر فرکانس کاری تایمر موردنظر، خللی در اجرای برنامه و دکد به وجود نیاید. در بخش جایگزین شده، فقط از نسبت پالسها برای شناسایی نوع آنها استفاده شده است. با این راهکار شما میتوانید فرکانس کاری تایمر را با خیال آسوده تغییر دهید.
#define IS_Sync_Start_Pulse(T1,T2) (T2 > (T1*29) && T2 < (T1*32)) #define Bit_IS_Zero(T1,T2) (T2 > (T1*2) && T2 < (T1*4)) #define Bit_IS_One(T1,T2) (T1 > (T2*2) && T1 < (T2*4))
فرکانس 1 مگاهرتز و 2 مگاهرتز بهعنوان فرکانس شمارش تایمر مورد تست قرار گرفت که در هیچکدام مشکلی وجود نداشت و برنامه بهدرستی کار میکرد. تغییر صورت گرفتهی بعدی، مربوط به روال ذخیرهسازی بیتهای دریافتی از ریموت است. در کتابخانه قدیمی از یک آرایه برای نگهداری هر بیت استفاده میشد که 24 بایت از حافظه Ram را اشغال میکرد.
uint8_t Remode_Data[24]; . . . . if(Start_Sync==1) // Start Sended { if(Bit_Index < 24) { Remode_Data[Bit_Index] = !Bit_IS_Zero(Time_Rising,Time_Falling); Bit_Index++; } else { // All Bit Recive Bit_Index = 0; Start_Sync = 0; Revice_Flag = 1; } } // End of Start Sync Send . . .
در بازنویسی کتابخانه، هر بیت واقعاً یک بیت از حافظه را اشغال میکند و دادهها در یک متغییر Long ذخیره میشوند که تنها 4 بایت از حافظه را اشغال میکند. البته جدول lookup برای افزایش سرعت اضافه شده است که 128 بایت از حافظه Flash را اشغال میکند که با توجه به حجم 32 کیلوبایتی فلش، مقدار زیادی نیست.
volatile uint32_t EV_Code = 0; const uint32_t Bit_Shift[32] PROGMEM = { 0x00000001,0x00000002,0x00000004,0x00000008, 0x00000010,0x00000020,0x00000040,0x00000080, 0x00000100,0x00000200,0x00000400,0x00000800, 0x00001000,0x00002000,0x00004000,0x00008000, 0x00010000,0x00020000,0x00040000,0x00080000, 0x00100000,0x00200000,0x00400000,0x00800000, 0x01000000,0x02000000,0x04000000,0x08000000, 0x10000000,0x20000000,0x40000000,0x80000000, }; . . . . if(Start_Sync==1) // Start Sended { if(Bit_Index < 23) { if(Bit_IS_Zero(Time_Rising,Time_Falling)) { Bit_Index++; } else if(Bit_IS_One(Time_Rising,Time_Falling)) { Receive_Code |= pgm_read_dword(&Bit_Shift[(23-Bit_Index)]); Bit_Index++; } else { Start_Sync = 0; Bit_Index = 0; } } . . .
و البته چند تغییر کوچک دیگر که باعث بهبود عملکرد کتابخانه شده است. توصیه میشود که برای پروژههای خود، از کتابخانهی اصلاحشده استفاده نمایید.
سخت افزاری
#define Key_Pin 3 #define Key_PORT PORTD #define Key_DDR DDRD #define Key_PIN PIND #define LED_Pin 4 #define LED_PORT PORTC #define LED_DDR DDRC #define CH0_Pin 0 #define CH1_Pin 1 #define CH2_Pin 2 #define CH3_Pin 3 #define CH_PORT PORTC #define CH_DDR DDRC RF_IN -> PORTD.2 Key -> PORTD.3 LED -> PORTC.4 CH0 ~ CH3 -> PORTC.0 ~ PORTC.3
شماتیک ریموت 4 کاناله را میتوانید از این قسمت ریموت 4 کاناله دانلود نمایید. جهت مونتاژ و فراگیری اتصالات، میتوانید توضیحات فوق را مشاهده کنید. تمام پایهها بهجز RF_IN در برنامه قابلتغییر هستند. در برنامه از Timer1 بهعنوان شمارنده استفاده شده است. دقت داشته باشید که به خاطر مسئله دقت در اندازهگیری طول پالسها، نیاز به یک تایمر 16 بیتی است. پس اگر قصد تغییر تایمر را دارید حتماً یک تایمر 16 بیتی را جهت انتقال انتخاب کنید.
توضیح عملکرد برنامه ریموت 4 کاناله
برنامه دارای 3 حالت مختلف، جهت عملکرد است:
enum { Nurmal = 0, Learn, Erase, };
- حالت نرمال
- حالت لرن
- حالت پاک کردن
حالت نرمال:
بعد از روشن شدن مدار، دستگاه در حالت نرمال است. در این حالت، LED بر روی برد، یک ثانیه روشن و یک ثانیه خاموش است. در حالت نرمال، با فشردن هر یک از کلیدهای ریموت خروجی مربوطه تغییر وضعیت میدهد.
حالت لرن:
برای استفاده از یک یا چند ریموت خاص در کنترل خروجیها، لازم است ریموتها را به دستگاه معرفی کنیم. برای معرفی هر ریموت دستگاه باید در مود لرن باشد. برای اینکه دستگاه وارد حالت لرن شود، کلید دستگاه را به مدت 1.5 ثانیه نگهدارید و سپس رها کنید. LED دستگاه شروع به چشمک زدن با سرعت زیاد خواهد کرد. بعدازآن یکی از کلیدهای ریموتی که قصد داریم از آن استفاده کنیم را میفشاریم تا دستگاه کد آن را به خاطر بسپارد. بعد از لرن کردن، ریموت دستگاه به حالت نرمال بازخواهد گشت.
حالت پاک کردن:
برای حذف ریموتهای ذخیرهشده در حافظهی دستگاه، باید کلید را به مدت 10 ثانیه بفشارید و سپس رها کنید. LED به مدت 3 ثانیه روشن میشود و خاموش میشود. بعد از این کار تمام ریموتهای ذخیرهشده از حافظهی دستگاه پاک خواهند شد.
دانلود سورس کد پروژه ریموت کنترل 4 کاناله
برای سهولت در دسترسی به کد و مشاهده بخشهای مختلف بدون نیاز به دانلود، همچنین امکان ارتقاء، سادگی در رفع عیوب احتمالی و نگهداری تاریخچه کد، کدهای پروژه در سرور Github آپلود شده و هماکنون در دسترس است. برای مشاهده repositorie میتوانید به این آدرس مراجعه کنید و در ادامه فایلهای مورد استفاده را دانلود کنید.
منبع: سیسوگ