در قسمت سی و دوم از آموزش آردوینو به بررسی آردوینو با سنسورهای داخلی متعدد و تشخیص حرکت در آن پرداختیم. در این قسمت قصد داریم درباره تشخیص نور و تشخیص حرکت موجودات زنده صحبت کنیم.
اگر شما میخواهید تغییرات سطح نور را تشخیص دهید. مثلاً وقتی چیزی از جلوی سنسور نور عبور میکند یا اگر بخواهید میزان نور محیط را اندازه بگیرید—برای نمونه، تشخیص دهید چه زمانی یک اتاق بیش از حد تاریک شده است، سادهترین روش برای تشخیص سطح نور، استفاده از فوتوسنسور یا مقاومت نوری (LDR) است. این قطعه با تغییر میزان نور، مقاومتش را تغییر میدهد. وقتی طبق مدار شکل 1 به سیستم متصل شود، ولتاژی متغیر تولید میکند که پایههای ورودی آنالوگ آردوینو میتوانند آن را حس کنند.
کدی که برای این کاربرد نوشته میشود نیز ساده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* * Light sensor sketch * * Varies the blink rate based on the measured brightness */ const int ledPin = LED_BUILTIN; // Built-in LED const int sensorPin = A0; // connect sensor to analog input 0 void setup() { pinMode(ledPin, OUTPUT); // enable output on the led pin } void loop() { int rate = analogRead(sensorPin); // read the analog input digitalWrite(ledPin, HIGH); // set the LED on delay(rate); // wait duration dependent on light level digitalWrite(ledPin, LOW); // set the LED off delay(rate); } |
فوتوسنسورها (مقاومتهای نوری) حاوی ترکیبی به نام سولفید کادمیوم هستند که یک مادهی خطرناک محسوب میشود. یک جایگزین مناسب برای فوتوسنسور، فوتوترانزیستور است.
فوتوترانزیستور ظاهری شبیه به LED دارد و دارای یک پایه بلند و یک پایه کوتاه است. میتوانید آن را مانند شکل 1 به مدار متصل کنید، با این تفاوت که باید پایه بلند را به ولتاژ ۵ ولت و پایه کوتاه را به مقاومت و پایه ۰ آردوینو متصل کنید.
حتماً فوتوترانزیستوری تهیه کنید که بتواند نور مرئی را تشخیص دهد—مثل مدل 2831 از Adafruit— تا بتوانید آن را با یک منبع نوری معمولی (مثلاً چراغ یا نور اتاق) آزمایش کنید.
شکل 1: نحوه اتصال یک مقاومت نوری (LDR) به مدار
مداری که در این پروژه استفاده شده، روش استاندارد برای بهکارگیری هر نوع سنسوری است که مقاومت آن بر اساس یک پدیدهی فیزیکی تغییر میکند (برای اطلاعات بیشتر دربارهی واکنش به سیگنالهای آنالوگ به قسمتهای قبلی مراجعه کنید).
در مدار نشاندادهشده در شکل 1، ولتاژ ورودی در پایهی آنالوگ شماره ۰ آردوینو با تغییر مقاومت فوتوسنسور (مقاومت نوری) یا فوتوترانزیستور تغییر میکند که این تغییر مقاومت به میزان نور محیط بستگی دارد.
مداری مانند این، تمام بازهی ممکن ورودی آنالوگ (از ۰ تا ۱۰۲۳) را تولید نمیکند، چون ولتاژ مدار بین ۰ تا ۵ ولت نوسان کامل نخواهد داشت.
علت این است که همیشه در هر مقاومت، مقداری افت ولتاژ وجود دارد، بنابراین ولتاژی که در نقطهی اتصال مقاومتها (مثلاً بین مقاومت نوری و مقاومت ثابت) اندازهگیری میشود، هیچگاه به طور کامل به صفر یا ۵ ولت نمیرسد.
هنگام استفاده از چنین سنسورهایی، بسیار مهم است که مقدار واقعیای که سنسور در شرایط کاری شما تولید میکند را بررسی کنید. سپس باید تصمیم بگیرید که چگونه این مقادیر را به بازهای که برای کنترل دستگاه یا عملکرد موردنظر نیاز دارید، تبدیل کنید.
فوتورزیستور (مقاومت نوری) نوع سادهای از سنسور است که به آن سنسور مقاومتی گفته میشود. مجموعهای از سنسورهای مقاومتی وجود دارند که به تغییرات در ویژگیهای فیزیکی مختلف واکنش نشان میدهند.
آردوینو نمیتواند مقاومت را به طور مستقیم اندازهگیری کند، بنابراین در این راهحل، از یک مقاومت با مقدار ثابت همراه با یک سنسور مقاومتی (مثل مقاومت نوری) استفاده میشود تا با هم یک تقسیمکنندهی ولتاژ بسازند.
پایههای آنالوگ آردوینو ولتاژ را اندازهگیری میکنند، نه مقاومت. پس تنها راه برای اینکه آردوینو بتواند مقدار مقاومت را تشخیص دهد، این است که آن مقاومت باعث تغییر در ولتاژ شود.
در مدار تقسیم ولتاژ، از دو مقاومت استفاده میشود تا ولتاژ خروجیای تولید شود که به نسبت بین ولتاژ ورودی و مقدار این دو مقاومت بستگی دارد؛ بنابراین، اگر یک مقاومت ثابت را با یک قطعهی دارای مقاومت متغیر (مثل فوتورزیستور) ترکیب کنید، پایه آنالوگ آردوینو ولتاژی را میبیند که بسته به شدت نور محیط (یعنی چیزی که فوتورزیستور حس میکند) تغییر میکند.
مدارهای مشابهی را میتوان برای انواع دیگر سنسورهای مقاومتی ساده نیز استفاده کرد، هرچند ممکن است لازم باشد مقدار مقاومت ثابت را بسته به نوع سنسور تغییر دهید.
انتخاب بهترین مقدار مقاومت ثابت به نوع فوتورزیستوری که استفاده میکنید و همچنین به بازهی نوریای که قصد دارید اندازهگیری کنید، بستگی دارد.
مهندسان معمولاً از نورسنج و دیتاشیت فوتورزیستور برای انتخاب مقدار دقیق مقاومت استفاده میکنند.
اما اگر شما یک مولتیمتر دارید، میتوانید مقاومت فوتورزیستور را در شرایط نوریای که تقریباً وسط بازهی موردنظر شماست اندازهگیری کنید. سپس مقدار اندازهگیریشده را یادداشت کرده و نزدیکترین مقدار مقاومت استاندارد را برای استفاده در مدار انتخاب کنید.
همچنین، میتوانید خروجی فوتورزیستور را از طریق آردوینو بخوانید، آن را روی پورت سریال چاپ کنید و با استفاده از Serial Plotter تغییرات ولتاژ (بالاترین و پایینترین مقادیر) را بهصورت نمودار مشاهده کنید.
به منابع نور مصنوعی در محیط اطراف خود توجه داشته باشید، بهویژه آنهایی که با سرعت غیرعادی خاموش و روشن میشوند—مثل برخی لامپهای نئون یا LEDها.
حتی اگر این چشمکزدنها آنقدر سریع باشند که برای چشم انسان قابلتشخیص نباشند، ممکن است آردوینو آنها را بهعنوان شرایط نور کم تشخیص دهد.
برای جبران این مشکل، میتوانید از میانگینگیری متحرک (moving average) روی دادههای خواندهشده استفاده کنید.
اگر میخواهید تشخیص دهید که وقتی افراد یا حیوانات در نزدیکی سنسور حرکت میکنند، باید از یک سنسور حرکتی مانند سنسور مادونقرمز غیرفعال (PIR) استفاده کنید که هنگام حرکت یک موجود زنده (یا هر جسمی که گرما ساطع میکند) در نزدیکی، مقدار پایه دیجیتال را تغییر میدهد.
سنسورهایی مانند سنسور PIR آدافروت (Adafruit) با شماره قطعه ۱۸۹ و سنسور PIR پارالاکس (Parallax) با شماره 555-28027 بهراحتی قابل اتصال به پایههای آردوینو هستند، همانطور که در شکل 2 نشاندادهشده است.
برخی سنسورهای PIR، مانند سنسور حرکت PIR اسپارکفان (SparkFun) مدل SEN-13285، نیاز به مقاومت پولآپ (pull-up resistor) در خروجی سنسور دارند.
اگر از مقاومت پولآپ استفاده کنید، باید پایه مربوطه را در حالت INPUT_PULLUP تنظیم کنید و منطق برنامه (اسکچ) را مطابق توضیحات بخش “Discussion” معکوس کنید.
شکل 2: اتصال سنسور حرکت PIR
برای شناسایی پایههای صحیح، دیتاشیت سنسور خود را بررسی کنید.
برای مثال، سنسور Adafruit پایههایی با برچسبهای “OUT”، “–” و “+” دارد (به ترتیب خروجی، زمین و ۵ ولت) و سنسور Parallax با پایههای GND،VCC و OUT علامتگذاری شده است. برنامهی زیر (اسکچ) وقتی سنسور حرکت را تشخیص دهد، LED داخلی برد آردوینو را روشن میکند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | * PIR sketch a Passive Infrared motion sensor connected to pin 2 lights the LED on the built-in LED */ const int ledPin = LED_BUILTIN; // choose the pin for the LED const int inputPin = 2; // choose the input pin (for the PIR sensor) void setup() { pinMode(ledPin, OUTPUT); // declare LED as output pinMode(inputPin, INPUT); // declare pin as input } void loop(){ int val = digitalRead(inputPin); // read input value if (val == HIGH) // check if the input is HIGH { digitalWrite(ledPin, HIGH); // turn LED on if motion detected delay(500); digitalWrite(ledPin, LOW); // turn LED off } } |
این کد شبیه مثالهای استفاده از دکمه فشار در قسمتهای قبلی است، چون سنسور مانند یک کلید عمل میکند وقتی حرکتی شناسایی میشود.
انواع مختلفی از سنسورهای PIR وجود دارد و بهتر است اطلاعات مربوط به سنسوری که به کار بردهاید را بررسی کنید.
برخی سنسورها، مانند سنسورهای PIR پارالاکس و آدافروت، یک جامپر (Jumper) دارند که تعیین میکند خروجی سنسور هنگام تشخیص حرکت چگونه رفتار کند.
در یک حالت، خروجی بهصورت HIGH باقی میماند تا وقتی حرکت وجود دارد و در حالت دیگر خروجی فقط به طور کوتاه HIGH میشود و سپس به LOW بازمیگردد.
اسکچ نمونهای که در این بخش آمده، در هر دو حالت کار میکند.
برخی سنسورها هنگام تشخیص حرکت، خروجیشان به حالت LOW میرود.
اگر خروجی سنسور شما هنگام حرکت LOW میشود، باید خطی که مقدار ورودی را بررسی میکند تغییر کند تا LED وقتی مقدار ورودی LOW بود روشن شود:
1 | if (val == LOW) // motion detected when the input is LOW |
اگر در داکیومنت سنسور شما ذکر شده که به مقاومت پولآپ (pull-up resistor) نیاز دارد، باید در قسمت setup کد، تنظیم پایه ورودی (inputPin) را تغییر دهید:
1 | pinMode(inputPin, INPUT_PULLUP); // declare pin as input with pull-up resistor |
سنسورهای PIR در انواع مختلفی عرضه میشوند و هر کدام حساسیتشان نسبت به فاصله و زاویهی دید متفاوت است.
انتخاب دقیق و جایگذاری مناسب این سنسورها میتواند باعث شود که فقط حرکت در بخشی از یک اتاق تشخیص داده شود، نه کل فضا.
برخی سنسورهای PIR دارای یک پتانسیومتر هستند که با پیچگوشتی میتوانید حساسیت آنها را تنظیم کنید.
من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.