زمان بچگی، ما که کلاً اسم چندتا شغل رو بیشتر بلد نبودیم. اکثرمون در جواب اینکه “بزرگ شدی میخوای چه کاره بشی؟” معمولاً میگفتیم: خلبان هواپیما
قاعدتاً هیچکدوم از ما و شمایی که این مطلب رو میخونید یا اصلاً پیگیر این آرزو نشدیم یا درصدکمی تلاش کردیم و موفق نشدیم. طبیعتاً الانکه بااین چشمهایی که توی مانیتور دیگه جونی براشون نمونده و موقع رانندگی هم آبجکتهایی که از روبروی ماشین رد میشن رو به زحمت تشخیص میدم(!)، دیگه دنبال خلبان شدن نیستم اما خب الزاماً که همه نباید خلبان ایرباس باشن، هرکسی به شیوهی خودش! تاالان دقتکردید چقدر این بردبوردها شبیه هواپیما هستن؟ اصلاً شاید از روز ازل قسمت ما اینبوده که خلبان بردبورد بشیم! درسته که همینطوری بردبورد رو با دستتون بگیرید توی هوا بچرخونید و صدای هواپیما دربیارید هم شبیه خلبانها میشید! اما یه چندتا آیتم ساده هم برای آموزش آردوینو بهش اضافه میکنیم تا حس بهتری بده!
ماژولهای موردنیاز
برای قسمت اول، از سهتا ماژول از همون بستهی کذایی استفاده میکنیم. بهترتیباز سمتراست معرفی میکنم:
Tilt Switch Shock Sensor SMD Color
هدف پروژه
هدف پروژه این است که برای مطلعکردن خلبان از وضعیتاضطراری که بهوجود اومده، از این سنسورها استفادهکنیم. سنسور Tilt یک بیلبیلک (!) داخلش داره که به چپ و راست حرکت میکنه و طبیعتاً میتونه ازطریق خروجی دیجیتالش به ما هم اطلاع بده. سنسور شوک هم لرزش و ویبره رو تشخیص میده و SMD Color هم که مفصلاً اینجا ازش استفاده کردیم.
مراحل کار
اول سنسور Tilt رو بهتنهایی برروی بورد نصب میکنیم. چون باید درراستای افق تراز باشه، طبیعتاً باید روی بورد قرار بگیره. پایه منفی به منفی، پایه وسط به ۵ ولت و پایه S یا سیگنال هم خروجی این شیلد هست. مدار رو من بهاینصورت طراحی کردم و اون سیم متصلبه سنسور هم برای اینهکه اینقدر وول نخوره و بشینه سرجاش!
خروجی سنسور رو به پایهی دوم آردوینو متصلکردم. این شیلد وقتی اون گلوله سمتراست باشه، مقدار ۰ و وقتی سمت چپ قرار بگیره، مقدار ۱ رو روی خروجی قرارمیده؛ اما میتونید برای این اطمینان مقادیر رو (همونطور که قبلاً دیدیم) روی خروجی سریال نمایش بدیم. پس نمونهکد زیر رو برای مرحلهی اول مینویسیم:
int TiltInputPin=2; int TiltInputValue; void setup() { // put your setup code here, to run once: pinMode(TiltInputPin,INPUT); Serial.begin(9600); Serial.print("Hi Capitan"); Serial.println(); } void loop() { TiltInputValue=digitalRead(TiltInputPin); Serial.print(TiltInputValue); delay(500); }
خب تا همینجا هم حداقل تونستیم وضعیت تعادل هواپیما رو متوجه بشیم. اما برایاینکه به اطلاع خلبان برسونیم، SMD Color رو هم وارد بازی میکنیم. پینهای شمارهی ۲ و ۳ آردوینو رو بهعنوان رنگ سبز و قرمز، به پایههای SMD Color متصل میکنیم. از اونجاکه توی حالت تعادل، سنسور تیلد مقدار صفر رو بر میگردونه، معکوسش رو به پایه سبز و معادل خروجیاش رو به پایه قرمز متصل میکنیم. زمین هم که نباید فراموش بشه.
digitalWrite(RedLed,TiltInputValue); digitalWrite(GreenLed,!TiltInputValue);
دقتداشتهباشید که درسته داریم همون مقداری که سنسور تیلد میده رو به پایه قرمز منتقل میکنیم، اما نمیتونیم برای صرفهجویی به همون پایهی ۱ متصلش کنیم؛ چون از نوع ورودی تعریف شده و اتصال سیم کناری روی مقدارش تأثیر میذاره. خب تااینجا اگه خلبان تعادل رو بهمبریزه متوجه میشه؛ اما اگه توی شرایطی قرار بگیره که هواپیما شروع به لرزش کنه چی؟ برای اینکار شیلد سوم رو هم وارد بازی میکنیم: نحوهی اتصال پایهها دقیقاً مشابه سنسور تیلد هست. پایه سیگنالش رو به پین شمارهی ۵ متصل میکنیم. برای روشنشدن چراغ باید یکم تغییر توی الگوریتمش ایجادکنیم؛ چون ۲ نوع ورودی داریم. پس درصورتیکه یکیاز شرایط اضطراری فعال شد، چراغ قرمز رو روشن میکنیم حتی اگر دومی شرایط عادی داشته باشه، مثلا درحال لرزش نباشه، اما تعادل مناسبی هم نداشته باشه. مدار به شکلزیر دراومد:
TiltInputValue=digitalRead(TiltInputPin); shakeValue=digitalRead(ShakePin); if(shakeValue || TiltInputValue) digitalWrite(RedLed,HIGH); else digitalWrite(GreenLed,HIGH);
کار کرد؟ نه خیلی درست. چون صدبار گفتم که وقتی ورودی رو فعال میکنیم اون وضعیت باقی میمونه. یعنی اگر شما یک بار چراغ سبز رو روشن کنید، خب همیشه سبز هست دیگه! پس درابتدا باید خاموشش کنید تا براساس شرایط، روشنشدن اون مشخص بشه.
کدنهایی
کد نهایی بهصورتزیر هست. برای تست لرزش هواپیما رو بهسمتی بگیرید که شیلد Tilt باعث قرمزشدن چراغ نشه و گلوله بهسمت پایین گیرکنه:
int TiltInputPin=2; int RedLed=3; int GreenLed=4; int TiltInputValue; int ShakePin=5; int shakeValue; void setup() { pinMode(TiltInputPin,INPUT); pinMode(ShakePin,INPUT); pinMode(RedLed,OUTPUT); pinMode(GreenLed,OUTPUT); Serial.begin(9600); Serial.print("Hi Capitan"); Serial.println(); } void loop() { digitalWrite(RedLed,LOW); digitalWrite(GreenLed,LOW); TiltInputValue=digitalRead(TiltInputPin); shakeValue=digitalRead(ShakePin); if(shakeValue || TiltInputValue) digitalWrite(RedLed,HIGH); else digitalWrite(GreenLed,HIGH); delay(200); }
منبع: سیسوگ