رابط فیزیکی شامل یک شبکه 3×3 از دکمههای فشاری است که با شبکهای 3×3 از تصاویر در برنامه پردازش مطابقت دارد. به جای ایجاد یک آرایه دو بعدی از متغیرها برای مطابقت با موقعیت دکمه ها در شبکه، به هر مکان در شبکه یک عدد اختصاص داده می شود. هر دکمه نشان دهنده عدد مربوطه در شبکه تصویر است. برای اهداف نمونه سازی، از یک سیستم 5 دکمه ای استفاده خواهد شد، زیرا طراحی سیستم مقیاس پذیر است.
نمونه سازی شبکه دکمه
لیست اجزاء:
- دکمه فشاری 5 x لحظه ای
- مقاومت 5×10kΩ
- آردوینو اونو
- تخته نان بدون لحیم کاری
- سیم های اتصال
- هر دکمه به برق (5 ولت) وصل می شود،
- هر دکمه فشاری به صورت سری با یک مقاومت کشویی 10 کیلو اهم متصل می شود که به نوبه خود به زمین متصل می شود.
- هر دکمه فشاری در نقطه اتصال بین دکمه و مقاومت به پین های دیجیتال 2-6 متصل می شود.
هر دکمه فشاری به منبع تغذیه 5 ولت متصل است. طرف دیگر دکمه فشاری به یک مقاومت کششی 10KΩ متصل است که به نوبه خود به زمین متصل است. مدار به پین دیجیتال در نقطه اتصال بین دکمه فشاری و مقاومت متصل است. مقاومت دکمه فشاری را با ارجاع به زمین فراهم می کند و به ارائه خوانش های پایدارتر کمک می کند.
تشخیص تغییر حالت به ما امکان می دهد تعیین کنیم که چه زمانی وضعیت دکمه از بالا به پایین تغییر کرده است که نشان می دهد فشار داده شده است. برای این کار، یک متغیر برای ذخیره وضعیت قبلی دکمه ایجاد می کنیم. یک متغیر سراسری برای وضعیت هر دکمه ایجاد می شود، سپس در setup() مقداردهی اولیه می شود. هر دکمه از یک دستور شرطی استفاده می کند که حالت قبلی دکمه را با حالت فعلی آن مقایسه می کند. اگر حالت ها متفاوت باشد، به این معنی است که دکمه فشار داده شده است.
با در نظر گرفتن این واقعیت که آردوینو و پردازش به صورت سریال ارتباط برقرار می کنند، از نقطه نظر کارایی منطقی است که تا حد امکان داده های کمتری ارسال شود. با توجه به این موضوع، ما یک متغیر int به نام "buttonValue" ایجاد کردیم که مقدار دکمه ای را که اخیرا فشار داده شده را ذخیره می کند. این کار با استفاده از مجموعه ای از عبارات شرطی انجام می شود. کد زیر را ببینید:
if (buttonState1 != previousButtonState1){
if(buttonState1 == HIGH){
buttonValue = 1;
}
}
if (buttonState2 != previousButtonState2){
if(buttonState2 == HIGH){
buttonValue = 2;
}
}
if (buttonState3 != previousButtonState3){
if(buttonState3 == HIGH){
buttonValue = 3;
}
}
if (buttonState4 != previousButtonState4){
if(buttonState4 == HIGH){
buttonValue = 4;
}
}
if (buttonState5 != previousButtonState5){
if(buttonState5 == HIGH){
buttonValue = 5;
}
}
با انجام این کار، ما فقط باید یک قطعه از اطلاعات را به برنامه پردازش ارسال کنیم - داده های ذخیره شده در متغیر buttonValue، به عنوان مثال. یک عدد بین 1 تا 5. متغیر previousState هر دکمه روی مقدار فعلی آن تنظیم می شود که برای ارزیابی در چرخه () حلقه بعدی استفاده می شود.
کد طرح آردوینو در اینجا موجود است .
نمونه اولیه کنترل کننده حرکت تند کشیدن
لیست اجزاء:
- 2 x فرستنده LED مادون قرمز (بسته رنگی)
- آشکارساز LED مادون قرمز (بسته شفاف)
- LED قرمز
- 2 مقاومت 220Ω
- مقاومت 1 x 1.5kΩ
- ال ای دی های فرستنده IR به موازات دیجیتال پین 2 با مقاومت 220Ω متصل می شوند.
- گیرنده IR با مقاومت 1.5 کیلو اهم به A0 متصل می شود.
- LED قرمز متصل به digitalPin 13 با مقاومت 220Ω.
ما تصمیم گرفتیم که یک حرکت تند کشیدن را به حالت ناوبری اصلی تبدیل کنیم، زیرا از قبل برای همه کاربران گوشی های هوشمند و بنابراین همه کاربران اینستاگرام آشناست. ما یک حسگر مجاورت ساده با استفاده از LED های مادون قرمز و یک مقاومت نوری LED مادون قرمز (که به صورت جفت از RadioShack در دسترس هستند ) ایجاد کردیم. نور مادون قرمز ساطع شده توسط LED ها از اجسام مجاور منعکس می شود و توسط آشکارساز IR تشخیص داده می شود. نزدیکی جسم با میزان نور دریافت شده توسط سنسور تعیین می شود. به کاربر بازخورد بصری در قالب یک LED قرمز روشن ارائه می شود تا تأیید کند که عملکرد با موفقیت انجام شده است.
بخشی از کد توسط پروژه ای در مورد دستورالعمل ها توسط ریکاردو اووینو، که نحوه ساخت یک حسگر مجاورت ساده را توضیح می دهد، اطلاع رسانی شد. یکی از مشکلات استفاده از آشکارسازهای IR این است که آنها نه تنها نور مادون قرمز ساطع شده توسط LED های IR، بلکه نور مادون قرمز محیطی را نیز دریافت می کنند. کد او شامل یک تابع بسیار هوشمندانه است (به زیر مراجعه کنید) که با ذخیره مقداری در زمانی که LED های IR LOW هستند، که نشان دهنده نور مادون قرمز محیط هستند، و مقایسه آن با مقادیر به دست آمده در هنگام شناسایی یک شی، این را در نظر می گیرد. سپس با تقسیم این مقادیر انباشته شده بر تعداد نمونه ها، یک مقدار متوسط تولید می شود.
int readIR(int times){
for(int x=0;x<times;x++){
// خاموش کردن LED های IR برای اندازه گیری نور مادون قرمز محیط از محیط
digitalWrite(IRemitter,LOW);
// حداقل تاخیر لازم برای خواندن مقادیر
delay(1);