اتوماسیون خانه
در این بخش دانلود پروژه راه اندازی ماژول PIR یا سنسور حساس به حرکت بدن انسان با میکروکنترلر AVR, توسط تیم الکترونیک و برنامه نویسی الکترونیک ۹۸ برای شما علاقه مندان به پروژه های میکروکنترلر AVR آماده شده است. در این پروژه به یکی از جنبه های اتوماسیون در خانه (هوشمند سازی منازل) یعنی روشن و خاموش کردن خودکار چراغ های داخل ساختمان (راهروها, اتاق ها و …) با استفاده از حسگر تشخیص دهنده حرکت بدن انسان (Human Motion Detector), می پردازیم و برای پیاده سازی هرچه ارزانتر و ظریفتر, میکروکنترلر ATtiny13 را انتخاب می کنیم که کوچک (با 8 پایه), ظریف و البته ارزان قیمت است.
تشخیص حرکت انسان
اساس کار روش های تشخیص حضور یا حرکت انسان، آشکارسازی پرتو مادون قرمز ساطع شده از بدن انسان است. بدن انسان (همین طور حیوانات) علاوه بر تولید گرما، مقداری اشعه مادون قرمز با طول موجی در حدود 9.4µm نیز تولید می کند که با آشکارسازی آن می توان به حضور وی پی برد. تراشه RE200B تراشه پر کاربرد و مناسبی از نوع PIR برای رسیدن به این هدف است.
حسگرهای PIR از کریستال های خاصی ساخته شده اند که قرار گرفتن در معرض انرژی گرمایی حاصل از پرتو مادون قرمز به افزایش بار الکتریکی در آنها منجر می شود. چنانچه انرژی پرتوی مادون قرمز دریافتی از حد خاصی بالاتر رود، افزایش بار، ترانزیستور اثر میدان (FET) داخل تراشه را راه اندازی می کند و تغییرات در خروجی تراشه ظاهر می شوند. حسگر اصلی داخل تراشه، به طیف وسیعی از امواج الکترومغناطیس از جمله نور مرئی، حساس می باشد، به همین دلیل برای جلوگیری از ورود نور محیط به درون تراشه، از یک فیلتر سیلیکنی مخصوص استفاده شده است. تصویر زیر نمای ظاهری تراشه RE200B را نشان می دهد.
تصویر زیر نمای کلی مدار راه انداز تراشه را نشان می دهد. پرتو مادون قرمز، پس از عبور از یک لنز پلاستیکی مخصوص – که نقش متمرکز کننده را ایفا می کند – به RE200B برخورد می کند. در خروجی تراشه، سیگنال به دست آمده، ابتدا تقویت می شود و در صورت رسیدن دامنه آن به مقدار مطلوب، خروجی مقایسه کننده را فعال می کند.
با استفاده از دو حسگر موجود داخل تراشه می توان حرکت انسان را تشخیص داد. همانطور که در تصویر زیر مشاهده می کنید، هر یک از این دو حسگر، به ترتیب حرکت یک منبع گرمایی (مانند انسان) از محدوده دید PIR را تشخیص می دهند. در نهایت، پالسی مطابق شکل در خروجی تراشه ایجاد می شود.
نقشه شماتیک مدار راه انداز تراشه RE200B
تصویر زیر مدار راه انداز تراشه را به صورت کامل نشان می دهد. در این پروژه از ماژول HP-708 استفاده شده است که تراشه RE200B را همراه مدار کامل راه انداز و لنز پلاستیکی مخصوص در بر دارد. لنز پلاستیکی برای تنظیم شعاع دید حسگر اصلی استفاده شده است. لنز موجود روی ماژول HP-708 تعویض شدنی است و بسته به کاربردهای متفاوت می توان از لنزهای مناسب استفاده کرد.
ماژول HP-708 چهار پایه (پایه + / پایه – / پایه CDS / پایه OUT) دارد. در اینجا، از پایه CDS استفاده نشده است. پایه + به 5 ولت و پایه – به زمین یا همان منفی منبع تغذیه وصل می شود. پایه OUT یک پایه خروجی است که هنگام تشخیص حرکت انسان، برای چند لحظه صفر می شود.
نقشه شماتیک پروژه راه اندازی ماژول PIR با میکروکنترلر AVR
نقشه شماتیک کامل مدار پروژه در شکل زیر نشان داده شده است. در این مدار نسبتا ساده, میکروکنترلر ATtiny13 برای کنترل چراغ های اتاق برنامه ریزی شده است. اگر حضور کسی در اتاق حس نشود, چراغ های اتاق پس از مدت زمان مشخص خاموش می شوند. این کار با فرمان میکروکنترلر AVR به یک رله انجام می گیرد.
تنظیم زمان تاخیر برای خاموش شدن چراغ ها توسط دیپ سوئیچ (Dip Switch) نشان داده شده در شکل, در چهار زمان 10 ثانیه, 1 دقیقه, 2 دقیقه و 10 دقیقه امکان پذیر است.جدول زیر چگونگی تنظیم زمان تاخیر را نشان می دهد. اگر چراغ ها خاموش باشند و شخصی وارد اتاق گردد, بلافاصله تمام چراغ ها روشن می شوند.
همان طور که در نقشه شماتیک مشاهده می کنید, چون خروجی ماژول PIR مدل HP-708 به PB1 متصل شده است, با صفر شدن خروجی ماژول PIR مدل HP-708, وقفه ای سخت افزاری به میکروکنترلر AVR اعمال می شود. برای اطمینان از بالا بودن خروجی HP-708, از مقاومتی 10 کیلو اهمی به عنوان مقاومت بالاکشنده استفاده شده است. عملکرد درست مدار, منوط به وجود این مقاومت است.
برنامه میکروکنترلر در محیط نرم افزار Bascom AVR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
'Human Motion Detector '------------------------ $regfile = "attiny13.dat" $crystal = 9600000 Config Watchdog = 32 Config Timer0 = Timer , Prescale = 1024 Config Int0 = Falling Portb = &H18 Ddrb = &H04 Enable Interrupts Enable Int0 Enable Ovf0 On Int0 Ex0_rut On Ovf0 T0_rut Dim T As Iram Byte Dim Time_delay As Iram Byte , Time_reg As Iram Byte Dim Dip_read As Iram Byte Dim Light As Bit '------------------------ T = 0 Light = 1 Time_reg = 0 Start Watchdog Start Timer0 '------------------------ Do Dip_read = Pinb Dip_read = Dip_read And &H18 Shift Dip_read , Right , 3 Select Case Dip_read Case 0: Time_delay = 2 Case 1: Time_delay = 12 Case 2: Time_delay = 24 Case 3: Time_delay = 120 End Select Portb.2 = Light Waitms 30 $asm wdr $end Asm Loop End '------------------------ Ex0_rut: Waitms 20 If Pinb.1 = 0 Then Time_reg = 0 Light = 1 End If Return '------------------------ T0_rut: If Light = 1 Then If T = 183 Then T = 0 Time_reg = Time_reg + 1 If Time_reg = Time_delay Then Light = 0 End If T = T + 1 End If Return |
برنامه میکروکنترلر در محیط نرم افزار Code Vision AVR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
#include <tiny13.h> #include <delay.h> unsigned char t; unsigned char time_delay; unsigned char time_reg; unsigned char dip_read; bit light; // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { delay_ms(20); if(PINB.1==0) { time_reg=0; light=1; } } // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { if (light==1) { if (t==183) // 5 second delay { t=0; time_reg++; if (time_reg==time_delay) light=0; } t++; } } // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=In // State5=T State4=P State3=P State2=0 State1=T State0=T PORTB=0x18; DDRB=0x04; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 9.375 kHz // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x05; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Falling Edge // Interrupt on any change on pins PCINT0-5: Off GIMSK=0x40; MCUCR=0x02; GIFR=0x40; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x02; // Watchdog Timer initialization // Watchdog Timer Prescaler: OSC/32k // Watchdog Timer interrupt: Off #pragma optsize- WDTCR=0x1C; WDTCR=0x0C; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Global enable interrupts #asm("sei") t=0; light=1; time_reg=0; while (1) { dip_read=PINB; dip_read=(dip_read&0x18)>>3; switch (dip_read) { case 0: time_delay=2; break; case 1: time_delay=12; break; case 2: time_delay=24; break; case 3: time_delay=120; break; }; PORTB.2=light; delay_ms(30); #asm("wdr") }; } |
شرح برنامه میکروکنترلر به زبان بیسیک و زبان C
هر دو برنامه، پس از تعریف متغیرها و مقدار دهی اولیه، طبق معمول وارد یک حلقه بی نهایت می شوند. در این حلقه وضعیت دیپ سوئیچ متصل به میکروکنترلر دائما (با تاخیری حدود 30 میلی ثانیه) توسط ساختار دستور Select Case بررسی می شود. به این ترتیب مقدار متغیر Time_Delay با توجه به وضعیت دیپ سوئیچ، یکی از مقادیر 2 و 12 و 24 یا 120 خواهد بود. همچنین در این حلقه، تایمر نگهبان نیز ریست می شود.
مقدار دهی تایمر صفر به گونه ای است که در هر 5 ثانیه، متغیر time_reg یکی افزایش می یابد. برابر شدن مقادیر time_reg و time_delay بدین معناست که زمان در نظر گرفته شده به اتمام رسیده است و در نتیجه چراغ خاموش می شود. روشن شدن چراغ، مستلزم اعمال یک وقفه خارجی است. در واقع زمانی که حسگر تشخیص حرکت انسان را حس کند، خروجی حسگر صفر می شود و یک وقفه از طریق پایه INT0 به میکروکنترلر اعمال می گردد.
در زیر روال وقفه، ابتدا بررسی می شود تا صفر شدن پایه INT0 ناشی از وجود نویز نباشد. اینکار با استفاده از خواندن وضعیت این پایه، پس از یک تاخیر 20 میلی ثانیه ای انجام می گیرد. سپس چراغ با یک شدن بیت light و فعال شدن رله، روشن می گردد. همزمان با روشن شدن چراغ، متغیر time_reg نیز صفر می گردد تا شمارش معکوس برای خاموش کردن چراغ، آغاز شود.
برای اینکه چراغ روشن بماند، باید حسگر، به طور متوالی حرکت انسان را در محیط حس کند و قبل از برابر شدن مقدار در حال افزایش متغیر time_reg با مقدار time_delay یک وقفه روی پایه INT0 رخ دهد. به این ترتیب time_reg پیش از رسیدن به time_delay ریست می شود.
با سلام ایا می شود به جای مدل HP-708 از مدل HC-SR501 استفاده کرد
مشکلی نداره فقط باید به پایه out سنسور که دارای ولتاژه خروجی و به میکروکنترلر متصل میشه دقت کنید که بیشتر از 5 ولت نباشه.
سلام رله رو به چه صورت در مدار ببندم؟پایه های بوبین به دو سر دیود وصل بشه؟
سلام دوست عزیز
بله باید دو پایه تغذیه رله رو به دو سر دیود متصل کنید و در نهایت طبق نقشه شماتیک اون رو به مدار متصل کنید.
سلام خسته نباشید من یک led 12 ولتی و می آدابتور 12 ولت دی سی دارم که می خوام باهاش با استفاده از سنسور pir (تشخیص حرکت ) , رله روشن و خا موش بشه به محض اینکه شخصی رو احساس میکنه .
حالا در به نظرتون میشه چیکارش کرد….
سلام دوست عزیز
برای انجام اینکار پیشنهاد می کنیم از ماژول های آماده pir استفاده کنید، همچنین می توانید از چشمی ها (سنسور) دزدگیرهای اماکن که به صورت آماده نیز در بازار هستند استفاده کنید.
آیاپروژه ای برای راه اندازی سنسور flc100 مگنومتر دارید ؟