در آموزشهای قبلی آموزش آردوینو به واکنش به ریموت کنترل مادون قرمز و رمزگشایی سیگنالهای آن پرداختیم. در این قسمت قصد داریم در مورد تقلید سیگنالهای ریموت کنترل و کنترل یک دوربین دیجیتال صحبت کنیم.
فرض کنید میخواهید از Arduino برای کنترل یک تلویزیون یا وسیله دیگری که با ریموت کنترل کار میکند استفاده کنید، به این صورت که سیگنال مادون قرمز آن را شبیهسازی کنید. این بخش برعکس کد زیر است؛ یعنی به جای دریافت فرمانها، آنها را ارسال میکند.
این sketch از کدهای ریموت کنترل برای کنترل یک دستگاه استفاده میکند. کدهای کنترل شما احتمالاً متفاوت خواهند بود، بنابراین حتماً کد Solution همان دستورالعمل را اجرا کنید و از مقادیری استفاده کنید که مخصوص کنترل شما هستند. پنج دکمه، یکی از پنج کد را انتخاب و ارسال میکنند. یک LED مادون قرمز را برای ارسال سیگنال، مطابق شکل (57-1) متصل کنید:
|
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 |
/* * irSend sketch * this code needs an IR LED connected to pin 3 * and 5 switches connected to pins 6 - 10 */ #include <IRremote.h> // IR remote control library const int numberOfKeys = 5; const int firstKey = 6; // the first pin of the 5 sequential pins connected // to buttons bool buttonState[numberOfKeys]; bool lastButtonState[numberOfKeys]; long irKeyCodes[numberOfKeys] = { 0x18E758A7, //0 key 0x18E708F7, //1 key 0x18E78877, //2 key 0x18E748B7, //3 key 0x18E7C837, //4 key }; IRsend irsend; void setup() { for (int i = 0; i < numberOfKeys; i++) { buttonState[i] = true; lastButtonState[i] = true; int physicalPin=i + firstKey; pinMode(physicalPin, INPUT_PULLUP); // turn on pull-ups } Serial.begin(9600); } void loop() { for (int keyNumber=0; keyNumber<numberOfKeys; keyNumber++) { int physicalPinToRead = keyNumber + firstKey; buttonState[keyNumber] = digitalRead(physicalPinToRead); if (buttonState[keyNumber] != lastButtonState[keyNumber]) { if (buttonState[keyNumber] == LOW) { irsend.sendSony(irKeyCodes[keyNumber], 32); Serial.println("Sending"); } lastButtonState[keyNumber] = buttonState[keyNumber]; } } } |

شکل 1-57 دکمهها و LED برای فرستنده IR
زمانی که کدها ارسال میشوند چیزی مشاهده نخواهید کرد، زیرا نور LED مادون قرمز با چشم غیرمسلح دیده نمیشود. با این حال، میتوانید کارکرد یک LED مادون قرمز را با یک دوربین دیجیتال بررسی کنید. باید بتوانید چشمک زدن آن را در منظرهیاب LCD دوربین ببینید.
آردوینو دستگاه را با چشمکزدن یک LED مادون قرمز کنترل میکند تا سیگنالی را که از ریموت کنترل شما ارسال میشود تکرار کند. برای این کار به یک LED مادون قرمز نیاز است. مشخصات آن چندان حساس و بحرانی نیست؛ برای قطعات مناسب به Appendix A مراجعه کنید.
کتابخانه IR تبدیل کد عددی به چشمکهای LED مادون قرمز را انجام میدهد. شما باید یک object برای ارسال پیامهای IR ایجاد کنید. خط زیر یک object از نوع IRsend ایجاد میکند که LED روی پایه ۳ را کنترل خواهد کرد. شما نمیتوانید پایه مورد استفاده را مشخص کنید؛ این مقدار داخل کتابخانه بهصورت hardcoded تعریف شده است:
|
1 |
IRsend irsend; |
بسته به بردی که استفاده میکنید، کتابخانه IRremote ممکن است برای LED مادون قرمز به پایه متفاوتی نیاز داشته باشد. برای مثال، بردهای Teensy 3.x از پایه ۵ استفاده میکنند. به فایل README کتابخانه IRremote مراجعه کنید. اگر برد شما از پایهای استفاده میکند که با محدوده پایههای استفادهشده برای دکمهها همپوشانی دارد (پایههای ۶ تا ۱۰ در sketch بخش Solution)، ممکن است لازم باشد محدوده پایهها را تغییر دهید.
کد از یک آرایه با نام irKeyCodes استفاده میکند تا مجموعه مقادیری را که میتوانند ارسال شوند نگهداری کند. این sketch پنج کلید را بررسی میکند تا مشخص شود کدام یک فشرده شده است و در خط زیر کد مربوطه را ارسال میکند:
|
1 |
irsend.sendSony(irKeyCodes[keyNumber], 32); |
object مربوط به irSend دارای توابع مختلفی برای قالبهای رایج کد مادون قرمز است، بنابراین اگر از یکی از قالبهای دیگر ریموت کنترل استفاده میکنید، مستندات کتابخانه را بررسی کنید. اگر میخواهید قالب استفادهشده در ریموت کنترل خود را نمایش دهید، میتوانید از کد بالا استفاده کنید.
این sketch کد را از آرایه به تابع میفرستد و عدد بعد از آن به تابع میگوید که طول این عدد چند bit است. عبارت 0x در ابتدای اعداد در تعریف irKeyCodes در بالای sketch به این معناست که کدها به صورت hex نوشته شدهاند. هر کاراکتر در hex یک مقدار ۴ بیتی را نمایش میدهد. کدهای اینجا از هشت کاراکتر استفاده میکنند، بنابراین طول آنها ۳۲ بیت است.
LED با یک مقاومت محدودکننده جریان متصل شده است.
اگر نیاز دارید برد ارسال را افزایش دهید، میتوانید از چند LED استفاده کنید یا آن LED را انتخاب کنید که خروجی قویتری داشته باشد.
TV-B-Gone ساخته Mitch Altman یک کاربرد هوشمندانه از ریموت کنترل است.
فرض کنید میخواهید Arduino یک دوربین دیجیتال را کنترل کند تا تحت کنترل برنامه عکس بگیرد. ممکن است بخواهید عکاسی Time-lapse انجام دهید یا عکسهایی بگیرید که با رویدادی که توسط Arduino تشخیص داده شده فعال میشوند.
چند روش برای انجام این کار وجود دارد. اگر دوربین شما ریموت مادون قرمز دارد، از کد بالا استفاده کنید تا کدهای مربوط به ریموت را یاد بگیرید و از کد زیر برای اینکه Arduino آن کدها را به دوربین ارسال کند استفاده کنید.
اگر دوربین شما ریموت مادون قرمز ندارد اما سوکتی برای ریموت سیمی دارد، میتوانید از این دستورالعمل برای کنترل دوربین استفاده کنید.
کانکتور شاتر دوربین، که معمولاً کانکتور TRS یا همان (tip, ring, sleeve) نامیده میشود، معمولاً در اندازههای ۲٫۵ میلیمتر یا ۳٫۵ میلیمتر وجود دارد، اما طول و شکل نوک آن ممکن است استاندارد نباشد. مطمئنترین راه برای تهیه پلاگ صحیح این است که یک ریموت سیمی ارزانقیمت مناسب مدل دوربین خود بخرید و آن را تغییر دهید، یا یک کابل مبدل را از یک تأمینکننده تخصصی تهیه کنید (در گوگل عبارت کابل شاتر دوربین TRS را جستوجو کنید).
شما Arduino را با استفاده از اپتوکوپلرها به کابل مناسب دوربین خود متصل میکنید؛ همانطور که در شکل 57-2 نشان داده شده است.
این sketch تعداد ۱۰ عکس میگیرد، هر ۲۰ ثانیه یک عکس:
|
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 |
/* * camera sketch * takes 20 pictures with a digital camera * using pin 4 to trigger focus * pin 3 to trigger the shutter */ int focus = 4; // optocoupler attached to focus int shutter = 3; // optocoupler attached to shutter long exposure = 250; // exposure time in milliseconds long interval = 10000; // time between shots, in milliseconds void setup() { pinMode(focus, OUTPUT); pinMode(shutter, OUTPUT); for (int i=0; i<20; i++) // camera will take 20 pictures { takePicture(exposure); // takes picture delay(interval); // wait to take the next picture } } void loop() { // once it's taken 20 pictures it is done, // so loop is empty // but loop still needs to be here or the // sketch won't compile } void takePicture(long exposureTime) { int wakeup = 10; // camera will take some time to wake up and focus // adjust this to suit your camera digitalWrite(focus, HIGH); // wake the camera and focus delay(wakeup); // wait for it to wake up and focus digitalWrite(shutter, HIGH); // open the shutter delay(exposureTime); // wait for the exposure time digitalWrite(shutter, LOW); // release shutter digitalWrite(focus, LOW); // release the focus } |

شکل 57-2. استفاده از اپتوکوپلرها با کانکتور دوربین TRS
توصیه نمیشود پایههای Arduino را مستقیماً به دوربین متصل کنید. ممکن است ولتاژها با هم سازگار نباشند و خطر آسیبزدن به Arduino یا دوربین وجود داشته باشد. از اپتوکوپلرها برای ایزولهکردن Arduino از دوربین استفاده میشود.
برای شناسایی کانکتور TRS مناسب، باید دفترچه راهنمای دوربین خود را بررسی کنید.
ممکن است لازم باشد ترتیب روشن و خاموش شدن پایهها در تابع takePicture را تغییر دهید تا به رفتاری که میخواهید برسید. برای اینکه یک دوربین Canon بتواند نوردهیهای bulb انجام دهد، باید ابتدا focus را روشن کنید، سپس بدون آزاد کردن focus شاتر را باز کنید، بعد شاتر را آزاد کنید و سپس focus را آزاد کنید (مانند همین sketch). برای گرفتن عکس در حالتی که دوربین خودش نوردهی را محاسبه کند، دکمه focus را فشار دهید، آن را رها کنید و سپس شاتر را فشار دهید.
همچنین کتاب The Canon Camera Hackers Manual: Teach Your Camera New Tricks نوشته Berthold Daum از انتشارات Rocky Nook را ببینید.
همچنین امکان کنترل دوربینهای ویدئویی به روشی مشابه با استفاده از LANC وجود دارد. این کتابخانه از این قابلیت پشتیبانی میکند.
یک شیلد Arduino نیز برای کنترل تجهیزات ویدئویی حرفهای Black Magic Design، از جمله دوربینها، با استفاده از پروتکل باز آنها وجود دارد.
فرض کنید میخواهید با استفاده از یک سوئیچ ریموت کنترل، جریان برق AC را بهطور ایمن قطع و وصل کنید و از این طریق چراغها و وسایل برقی را کنترل کنید.
Arduino میتواند با استفاده از یک optocoupler دکمههای یک سوئیچ ریموت کنترل را تحریک کند. این کار ممکن است برای ریموتهایی لازم باشد که به جای فناوری مادون قرمز از فناوری بیسیم استفاده میکنند.
از این تکنیک تقریباً برای هر نوع ریموت کنترل میتوان استفاده کرد. هککردن یک ریموت بهخصوص از این جهت کاربردی است که شما و آردوینو را از ولتاژهای AC بالقوه خطرناک دور نگه میدارد؛ چون فقط کنترلر باتریخور تغییر داده میشود.
باز کردن ریموت کنترل باعث باطل شدن گارانتی میشود و ممکن است به دستگاه آسیب بزند. دستورالعملهای مادون قرمز که در این فصل توضیح داده شدهاند، گزینه های بهتری هستند، چون نیازی به تغییر در خود ریموت کنترل ندارند.
اگر میخواهید با استفاده از این دستورالعمل یک سوئیچ را کنترل کنید، اما در عین حال همچنان از ریموت اصلی هم استفاده کنید، بهتر است یک ریموت کنترل یدکی برای دستکاری تهیه کنید. بیشتر سازندگان معمولاً ریموت یدکی را جداگانه میفروشند؛ فقط دقت کنید مدلی را انتخاب کنید که فرکانس آن با وسیله برقی، چراغ یا پریزی که قصد کنترلش را دارید سازگار باشد. پس از دریافت ریموت یدکی، ممکن است لازم باشد کانالی را که از آن استفاده میکند تنظیم کنید.
ریموت کنترل را باز کنید و optocoupler را بهگونهای متصل کنید که فرستنده نوری آن (پایههای 1 و 2 در شکل 3-57 ) به آردوینو وصل شود و photo transistor (پایههای 3 و 4) در دو سر کنتاکتهای ریموت کنترل قرار گیرد.

شکل 3-57 -optocoupler هایی که به ریموت کنترل متصل هستند
در این sketch از کلیدهای فشاری لحظهای (با فشار دادن و رها کردن) برای فعال کردن دکمههای روشن و خاموش ریموت استفاده میشود:
|
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 |
/* * OptoRemote sketch * Switches connected to pins 2 and 3 turn a remote device on and off * using optocouplers. * The outputs are pulsed for at least half a second when a switch is pressed */ const int onSwitchPin = 2; // input pin for the On switch const int offSwitchPin = 3; // input pin for the Off switch const int remoteOnPin = 4; // output pin to turn the remote on const int remoteOffPin = 5; // output pin to turn the remote off const int PUSHED = LOW; // value when button is pressed void setup() { pinMode(remoteOnPin, OUTPUT); pinMode(remoteOffPin, OUTPUT); pinMode(onSwitchPin, INPUT_PULLUP); // turn on internal pull-ups pinMode(offSwitchPin, INPUT_PULLUP); } void loop(){ int val = digitalRead(onSwitchPin); // read input value // if the switch is pushed then switch on if not already on if(val == PUSHED) { pulseRemote(remoteOnPin); } val = digitalRead(offSwitchPin); // read input value // if the switch is pushed then switch off if not already off if(val == PUSHED) { pulseRemote(remoteOffPin); } } // turn the optocoupler on for half a second to blip the remote control button void pulseRemote(int pin) { digitalWrite(pin, HIGH); // turn the optocoupler on delay(500); // wait half a second digitalWrite(pin, LOW); // turn the optocoupler off } |
کلیدهای بیشتر ریموتکنترلها از مسیرهای مسی بدون پوشش و درهمتنیدهای تشکیل شدهاند که با فشردن یک دکمه رسانا، اتصال بین این مسیرها برقرار میشود. در برخی مدلهای کمتر رایج، از کلیدهای فشاری معمولی استفاده شده است؛ کار با این نوع مدلها سادهتر است، چون پایههای آنها محل مناسبی برای برقراری اتصال در اختیار شما قرار میدهند.
اگرچه میتوان دکمه اصلی ریموت و اپتوکوپلر را بهطور همزمان استفاده کرد و با فعال شدن هرکدام از آنها، یعنی فشردن دکمه یا روشن شدن اپتوکوپلر، عمل سوئیچ انجام میشود، اما سیمهایی که ریموت را به آردوینو متصل میکنند ممکن است استفاده از آن را کمی دستوپاگیر کنند.
ترانزیستور موجود در optocoupler فقط اجازه میدهد جریان الکتریکی در یک جهت عبور کند. بنابراین اگر مدار در اولین اتصال کار نکرد، جای اتصالات سمت ترانزیستور را با یکدیگر عوض کنید و ببینید مشکل برطرف میشود یا خیر.
در بعضی ریموتها، یک سمت همه کلیدها به یکدیگر متصل است که معمولاً به زمین مدار وصل میشود. برای بررسی این موضوع میتوانید مسیرهای روی برد را دنبال کنید یا با استفاده از مولتیمتر، مقاومت بین مسیرهای مربوط به کلیدهای مختلف را اندازه بگیرید. اگر چند مسیر اتصال مشترک داشته باشند، کافی است برای هر گروه مشترک فقط یک سیم متصل کنید. هرچه تعداد مسیرهایی که باید سیمکشی شوند کمتر باشد، کار سادهتر میشود. چون در ریموتهای کوچک، اتصال سیمها میتواند کمی ظریف و دردسرساز باشد.
ممکن است ریموت کنترل برای هر دکمه چند کنتاکت مجزا داشته باشد. در این صورت، شاید برای اتصال همه کنتاکتها به بیش از یک اپتوکوپلر برای هر دکمه نیاز داشته باشید. شکل 4-57 سه اپتوکوپلر را نشان میدهد که همگی از طریق یک پایه آردوینو کنترل میشوند.
روش دیگری برای کنترل جریان برق AC استفاده از یک رله ایزوله است که بتوان آن را مستقیماً با پایههای آردوینو روشن و خاموش کرد. برای مثال، رله Digital Loggers IoT Power Relay که از طریق Adafruit با شماره قطعه 2935 یا SparkFun با شماره قطعه 14236 عرضه میشود. این رله جایگزین بسیار مناسبی برای PowerSwitch Tail است که تولید آن متوقف شده است.

شکل 4-57 – چندین optocoupler متصل به یک دکمه ریموت کنترل
من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.