در این پست از سایت اِمیک, سنسور تشخیص گاز MQ9 را با استفاده از میکروکنترلر AVR راه اندازی خواهیم کرد. سنسور گاز MQ9 قابلیت تشخیص گاز مونو اکسید کربن CO و گاز شهری LPG و گاز CH4 را دارد. این سنسور در بازار معمولا به صورت ماژول موجود هست و ما هم در این اموزش از ماژول طراحی شده با این سنسور استفاده خواهیم کرد, که کار را برای راه اندازی این سنسور بسیار راحت می کند. شکل این ماژول به صورت زیر است :
همانطور که می بینید این ماژول دارای 4 پایه است که دو پایه مربوط به تغذیه ماژول است (GND,VCC) و باید به ولتاژ 5 ولت متصل کنید, همچنین دقت کنید که جریان مصرفی این ماژول 180 میلی امپر می باشد. دو پایه دیگر خروجی انالوگ و دیجیتال ماژول است که بسته به نیاز می توان از خروجی دیجیتال (D0) یا خروجی انالوگ (A0) استفاده کرد. تغییرات ولتاژ خروجی در حالت آنالوگ بین 0 تا 5V است, که با افزایش غلظت گاز ولتاژ خروجی بالاتر می رود. در این پروژه ی اموزشی ما از هر دو خروجی این ماژول استفاده خواهیم کرد.
پروژه راه اندازی سنسور گاز MQ9 با میکروکنترلر AVR :
در این پروژه ما از میکروکنترلر ATmega16 استفاده کرده ایم, همچنین برای نمایش درصد گاز موجود در محیط از یک LCD کاراکتری 2*16 استفاده شده است. عملکرد این پروژه به این صورت است که میکرو با توجه به میزان گاز اندازه گیری شده توسط سنسور, در صورتی که این میزان گاز بیشتر از مقداری که مشخص می کنیم باشد یک بازر هشدار دهنده را به صدا در می اورد و همچنین بطور مداوم درصد گاز موجود در محیط را روی یک LCD کاراکتری نمایش می دهد. شماتیک این پروژه به صورت زیر است :
همانطور که در بالا گفته شد, در این پروژه ما از هر دو خروجی انالوگ و دیجیتال این ماژول استفاده خواهیم کرد. خروجی دیجیتال ماژول که با D0 مشخص شده, در زمانی که سنسور گازی را در محیط حس نکند برابر یک منطقی یا 5 ولت است و زمانی که سنسور گاز را در محیط تشخیص دهد برابر 0 منطقی (0 ولت) می شود. حساسیت خروجی دیجیتال ماژول از طریق پتانسیومتری که در پشت برد ماژول است تنظیم می شود. در این پروژه ما به این دلیل خروجی دیجیتال ماژول را به پایه 1 میکرو (یا پین 0 پورت B میکرو) متصل کرده ایم, تا میکرو خروجی را برای ما برعکس کند, یعنی زمانی که خروجی ماژول 1 منطقی است میکرو پایه 2 خود (پین 1 پورت B) را 0 کند و زمانی که خروجی ماژول 0 است میکرو پایه 2 خود را 1 منطقی کند. به این ترتیب زمانی که سنسور گازی را تشخیص داد, بازری که از طریق ترانزیستور و مقاومت به پایه 2 میکرو متصل است فعال می شود و زمانی که گازی در محیط نبود (یا مقدار ان کم بود) بازر غیرفعال است. از انجایی که جریان خروجی پایه های میکرو کم است و نمی تواند یک بازر را راه اندازی کند ما از یک مدار راه انداز شامل ترانزیستور و مقاومت استفاده کرده ایم.
همانطور که گفته شد خروجی انالوگ ماژول در بازه 0 تا 5 ولت تغییر می کند که این تغییرات به غلظت یا میزان گاز موجود در محیط بستگی دارد. ما توسط مبدل انالوگ به دیجیتال میکروکنترلر (ADC) این تغییرات را اندازه گیری می کنیم و به این ترتیب می توانیم میزان گاز محیط را اندازه گیری کرده و ان را به صورت درصدی روی LCD کاراکتری نمایش دهیم.
برنامه کدویژن :
برنامه این پروژه بصورت زیر است که به زبان C و با کامپایلر کدویژن نوشته شده است :
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 |
/************ WWW.EMIC.IR ************/ #include <mega16a.h> #include <delay.h> #include <alcd.h> #include <stdio.h> // sprintf براي استفاده از تابع stdio فراخواني کتابخانه // #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR)) /* ايجاد مي شوند adc که توسط خود کدويژن با فعالسازي adc از خط 8 تا 17 دستورات مربوط به */ unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; delay_us(10); ADCSRA|=(1<<ADSC); while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCW; } void main(void) { float i ; //از خط 21 تا 23 سه متغير تعريف شده است که در برنامه از انها استفاده مي شود// int MQ9 ; unsigned char lcd[16]; DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (0<<DDB0); PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (1<<PORTB0); DDRC=(1<<DDC7) | (1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0); PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); ADMUX=ADC_VREF_TYPE; /* که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند adc از خط 31 تا 33 رجيسترهاي مربوط به */ ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); lcd_init(16); while (1) { PORTB.1=~PINB.0; // مي ريزد B بود را برعکس مي کند و در پين 1 پورت B دستور روبرو هر مقداري که در پين 0 پورت // i=read_adc(0); // i خواندن عددي بين 0 تا 1023 که نشان دهنده مقدار ولتاژ انالوگ روي ان پين ميکرو است و ريختن ان در متغير // MQ9=(i*100)/1023 ; // دستور روبرو عدد خوانده شده بين 0 تا 1023 را در بازه ي 0 تا 100 تبديل مي کند // sprintf(lcd,"Gas amount=%d",MQ9); // براي نمايش روي ال سي دي کاراکتري lcd به رشته اي از کاراکتر و ذخيره ان در متغير MQ9 تبديل مقادير موجود در متغير // lcd_gotoxy(0,0); // رفتن به ستون 0 و سطر 0 از ال سي دي کاراکتري // lcd_puts(lcd); // ذخيره کرده بوديم lcd نمايش درصد گاز که به صورت کاراکتر در متغير // lcd_putsf("%"); // % نوشتن کاراکتر // delay_ms(500); // ايجاد تاخير به مدت 500 ميلي ثانيه يا 0.5 ثانيه // lcd_clear(); // پاک کردن ال سي دي کاراکتري // } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می تونید در قسمت نظرات مطرح کنید.
نکات :
- پایه های 10 و 11 میکرو برای تغذیه میکرو هستند که باید به ترتیب به مثبت و منفی منبع تغذیه 5 ولت متصل شوند, در شماتیک بالا بدلیل اینکه در شبیه سازی پروتئوس این پایه ها وجود ندارند من وصل نکردم ولی شما در عمل حتما این پایه ها را باید به تغذیه متصل کنید
- برای تنظیم کنتراست LCD می توانید پین ۳ ان را به یک پتانسیومتر متصل کنید یا در غیر این صورت پین ۳ را به منفی تغذیه وصل کنید
- از اونجایی که از ADC میکرو استفاده کرده ایم حتما پین های ۳۰ و ۳۲ رو به ۵ ولت (VCC) متصل کنید
- از بازر 5 ولت استفاده کنید (در صورتی که از بازر با ولتاژ بیشتر می خواهید استفاده کنید نیاز به تغذیه جداگانه برای ان دارید)
- در صورتی که با ADC در میکروکنترلر AVR و نحوه راه اندازی ان اشنا نیستید این پست را مطالعه کنید
- برای اشنایی با LCD کاراکتری و نحوه راه اندازی ان این پست را مطالعه کنید
کلیپ تست عملی پروژه :
من برای تست پروژه از اونجایی که بازر نداشتم بجاش از یک LED استفاده کردم
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…
سلام به جای ماژول mq9 میشه از mq4 در این پروژه استفاده کرد؟
سلام من کد رو توی کد ویژن نوشتم ولی ارور ال سی دی میده ارور رو ترجمه زدم میگه : خطای کتابخانه بسته بندی شده: C:\cvavr\lib\alcd.lib(131): دستورالعمل #خطا: کتابخانه LCD الفبایی عددی در پیکربندی پروژه تنظیم نشده است.
به زبان انگلیسی هم میشه : Packed library error: C:\cvavr\lib\alcd.lib(131): #error directive: Alphanumeric LCD library not set in the project configuration.
چه مشکلی داره لطفا کمکم کنید ممنون
سلام ببخشید سنسوری که توی پروتئوس برای من میاد به جای پایه های AO و DO پایهای OUT و test pin داره چه فرقی دارن
سلام کلا هیچ کدوم از نسورهای mqرو نمیشه در پروتئوس تست کرد؟ این برنامه برای mq5 هم همینه؟ تفاوتش چیه؟
سلام, بله برنامه راه اندازی هر دو یکی است و تفاوت سنسورها در نوع گاز قابل تشخیص است
سلام وقتتون بخیر
من توی پروتیوس که میخوام ماژول رو بیارم برای شبیه سازی، برام نمیاره. انگار توی کتابخونه ش نیست.
چطوری باید وارد کنم؟
سلام مجدد
جریان مصرفی این پروژه چقده؟
به نظر شما با چه مداری اینو به برق مستقیم وصل کنیم؟
اگه از این ماژول سنسور استفاده کنیم ایا باز هم نیاز به کالیبره کردن هست؟
سلام, جریان زیادی لازم ندارد فکر می کنم 0.5 امپرم کافی باشه. خودتون می تونید مشخصات قطعات پروژه مثل سنسور گاز, lcd و… را مطالعه کنید و ببینید که هر کدام چه میزان جریانی نیاز دارند. تغذیه مدار می تواند با اداپتور, منبع تغذیه و یا باتری تامین شود. مثلا می تونید از تغذیه های سوئیچینگ استفاده کنید.
ماژول نیاز به کالیبره ندارد فقط یک پتانسیومتر برای تنظیم حساسیت دارد.
سلام
وقتتون بخیر
اگه ما از ماژول برای سنسور استفاده نکنیم و خود سنسور رو بخیرم چه تغییراتیی باید بدیم؟
سلام, در این صورت باید مدار راه اندازی سنسور را هم ببندید. توصیه می کنم ماژول ان را تهیه کنید تا کارتون سخت نشه
سلام ال سی دیه این مداره درست کار نمیکنه یعنی عبارت
Gas mount رو نشون نمیده و به چیز دیگه نشون میده درصدش هم درست نشون نمیده
سلام, برنامه را بدون تغییر روی میکرو پروگرام کنید و مطمئن بشید که میکرو بدرستی پروگرام شده باشد. اتصالات پروژه را هم بررسی کنید اشتباهی انجام نداده باشید
سلام و خسته نباشید ممنون از سایت خوبتون
این مدار 100 درصد کار میکنه ؟!
نریم بسازیم سر کار بریم کار نکنه!!!!
سلام, دوست عزیز کلیپ تست عملی پروژه را می تونید در انتهای مطلب مشاهده کنید
سلام..این سنسور چطور درصد گاز هوا رو نشون میده اخه مگه تا ۱۰۰۰۰ پی پی ام رو سنس نمیکنه .هزار پی پی ام هم که میشه یک درصد..پس بیشتر از اون رو چطور سنس میکنه. مگه این که الکی درصد بزنه…درسته؟
سلام, اون مقدار یا میزان گازی که سنسور میتواند تشخیص بدهد را ببن 0 تا 100 درصد نشان میدهد. هرچه گاز موجود در هوا بیشتر باشد درصد بیشتری نشان میدهد
چجوری میشه توی پروتئوس مدار را تست کرد؟
باید بصورت عملی تست کنید در پروتئوس امکان شبیه سازی وجود ندارد
کلاک میکرو را چند بزاریم ؟؟؟
1 مگاهرتز
سلام.
خط 44 کد نباید 100- در اول داشته باشه؟
سلام, نه نیازی نیست. فکر کنم شما در پروژه های دیگه سایت اینو دیدید و دلیلشم این هست که اون ماژولها خروجیشون برعکس بوده
سلام من هر کاری که گفتید رو گردم حتی کد خودتون رو بی هیچ تغییری پروگرم کردم و تمام اتصالات رو مجدد برقرار کردم . سنسور هم درسته میکرو هم درسته ولی با وجود اینکه کد خودتون رو پروگرم کردم ال سی دی فقط چن تا مربع سفید نشون میده . قبلا با کد شما ک خودم تغییرش دادم حد اقل عبارت روی ال سی دی میامد الان ک همونم نمیاد . اگه میشه بگید تنظیمات کد ویزارد رو روی چه مقادیری قرار بدم
سلام, برای پروگرام کردن از برنامه avr studio استفاده کنید و از اونجایی که LCD به پورت C وصله حتما فیوزبیت jtag را غیرفعال کنید. نرم افزار avr studio و اموزش پروگرام کردن با ان در سایت هست که می تونید مطالعه کنید. برای پروگرام کردن میکرو از کدویژن استفاده نکنید چون نسخه هایی که ما استفاده می کنیم کرک شده هست و مشکلات زیادی داره.
شما اول از فایل هگز اماده و تست شده که قرار دادیم جواب بگیرید, بعدش برید سراغ اینکه تنظیمات کدویزارد را انجام بدید و کدها را تغییر بدید و… بهرحال اموزش راه اندازی ADC و همچنین اموزش راه اندازی LCD کاراکتری در سایت موجوده که در اون پست ها گفته شده تنظیمات کدویزارد به چه شکلیه, این پروژه هم تنظیماتش مثل همونا هست
jtag رو غیر فعال کردم . مطلب سایتتون راجع به ADC رو مطالعه کردم . میکروی من atmega16A هستش . چیپ کلاک رو روی 8 مگاهرتز گذاشتم . پورت سی دات صفر رو خروجی کردم . اتصالات رو چک کردم . ADC enabled رو تیک زدم . use 8 bit و intrupt رو غیر فعال کردم . clock ADC رو روی 1000000 کیلو هرتز گذاشتم ( یه بارم روی 500000 گذاشتم ) . بخش auto trigger source رو هم روی ADC stopped گذاشتم . توی بخش project گزینه ی configure رو زدم و از بخش c compiler و بخش sprintf features رو روی float , width , precision گذاشتم . سنسور و اتصالات رو چک کردم . باززززز هم کار نکرد !!! پیر شدیم مهندس!
فرکانس میکرو را روی 1 مگ قرار بدید و تمام پورت C را خروجی کنید نه فقط PORTC.0 و باید ال سی دی کاراکتری را هم از قسمت Alphanumeric LCD فعال کنید و در این قسمت Characters/Line را روی 16 بزارید و در پایین در قسمت LCD Module AVR هم تمام گزینه ها را روی پورت C بزارید. clock ADC را هم روی 31.250k بزارید.
سلام . میشه لطف کنید و تنظیمات بخش کدویزارد رو توضیح بدید ؟ بخش adc و پورت ها باید به چه شکلی تنظیم بشن .
سلام, برای تنظیمات adc پست “راه اندازی ADC در میکروکنترلر AVR” را مطالعه کنید. برای اتصال lcd به میکرو پورت C خروجی شده و از پورت B هم پین 0 ورودی و پین 1 خروجی شده است. در برنامه کاملا مشخص هست که چه پایه هایی ورودی و خروجی شده اند
سلام مجدد . من این سنسور رو راه اندازی کردم ولی مقدار گاز تقریبا ثابته و با قرار دادن فندک مثل ویدیو مقدار گاز تغییر نمیکنه . علت چی میتونه باشه ؟
سلام, دلایل زیادی می تونه داشته باشه, ممکنه میکروتون بدرستی پروگرام نشده باشه یا اگر برنامه را تغییر داده باشید ممکنه برنامتون مشکل داشته باشه. دقت کنید که پایه های تغذیه میکرو و همچنین پایه های 30 و 32 که مربوط به adc هستند را به تغذیه متصل کرده باشید. همچنین دقت کنید که پایه های سنسور را به درستی به میکرو متصل کرده باشید و در اخر اگه بازم جواب نداد ممکنه که سنسورتون مشکل داشته باشه
شاید مشکلم توی تنظیمات ADC در کد ویزارد باشه . میشه بگید تنظیماتش چجوریه ؟
شما اول این پروژه را دنلود کن و فایل هگز را روی میکرو پروگرام کن ببین پروژه جواب میده, اگر مشکلی نبود بعد کدها را تغییر بده و یا…
سلام خسته نباشید از سنسور mq135 نیز می توان استفاده کرد به جای mq9?
سلام, بله فقط این سنسورها نوع گازی که تشخیص می دهند متفاوت است.
در این پروژه به جای ماژول MQ9 از ماژول MQ2 میشه استفاده کرد؟؟؟
بله می تونید استفاده کنید
برای تست در پروتئوس چیکار باید کرد؟!
این سنسور در پروتئوس وجود ندارد و نمیشه شبیه سازی کرد باید بصورت عملی تست کنید