استند یادداشت هوشمند و تعاملی با آردوینو
دنیای الکترونیک همیشه قرار نیست به ساخت پروژههای جدی و مهندسی ختم بشه؛ خیلی وقتها دلمون میخواد یه گجت فان، متفاوت و حتی کمی روی اعصاب بسازیم! این بار تو آیسیمدار سراغ پروژهای رفتیم که شبیه یه ربات دستآموز اما لجباز رفتار میکنه. در ظاهر با یه استند ساده برای نگه داشتن برگههای یادداشت طرفی، اما وقتی شروع به استفاده ازش میکنی، متوجه شخصیت عجیب و غریبش میشی.
این استند هوشمند حرکات دستت رو موقع ورق زدن تشخیص میده و بازوی نگهدارنده رو محترمانه کنار میکشه. اما قسمت جذاب ماجرا اینجاست که اگه بخوای برگه یادداشت رو از زیر دستش بکشی یا کل دفترچه رو برداری، حسابی عصبانی میشه، بوق میزنه و واکنشهای اغراقآمیز نشون میده. ما تو این پروژه به یه شیء بیجان، حس زنده بودن و تعامل اضافه کردیم.
برای ساخت این گجت بامزه، از سنسور اولتراسونیک برای تشخیص حرکت دست، مقاومتهای نوری (LDR) برای حس کردن حضور دفترچه و یه سروو موتور برای حرکت دادن گیره استفاده میکنیم. بریم سراغ ساخت این پروژه جذاب تا یه همکار عجیب و غریب برای روی میز کارت خلق کنیم.
قطعات موردنیاز
- برد میکروکنترلر (مانند آردوینو)
- سنسور فاصله سنج اولتراسونیک
- سروو موتور
- مقاومت نوری یا LDR (دو عدد)
- ماژول بازر (Buzzer)
- سیمهای جامپر
- قطعات پرینت سهبعدی برای بدنه استند
ایده پشت این ربات روی اعصاب!
طراحی این دستگاه از یه ایده خیلی جالب الهام گرفته شده؛ اینکه یه وسیله ساده رو اونقدر تغییر بدیم تا کاربرد اصلیش جای خودش رو به یک رفتار تخریبی و مزاحم بده. توی نگاه اول به نظر میرسه با یه دستگاه خیلی کاربردی طرفی، اما وقتی شروع میکنی به کار کردن باهاش، متوجه میشی که اصلا باهات راه نمیاد و یه شخصیت لجباز برای خودش داره.
ما به این دستگاه یه جور حس زنده بودن دادیم. ربات ما حرکات دستت رو میبینه اما گاهی نیتت رو اشتباه برداشت میکنه، یه واکنش اغراقآمیز نشون میده و ترکیبی از حس خنده و کلافگی رو برات به وجود میاره.
منطق رفتار سنسورها؛ این ربات چطور میبینه؟
1. ورق زدن کاغذ و حرکت بازوی استند
وقتی میخوای یه صفحه رو ورق بزنی، دستت به طور طبیعی از یه گوشه به گوشه دیگه حرکت میکنه. این حرکت یه مسیر قابل پیشبینی داره. ما یه محدوده تشخیص خاص رو توی گوشه صفحه تعریف کردیم تا دستگاه فقط زمانی که واقعا قصد ورق زدن داری واکنش نشون بده.
به محض اینکه دستت از محدوده تشخیص سنسور خارج بشه، بازوی گیره برمیگرده سر جای اولش. این روند باعث میشه گیره هماهنگ با ورق زدن تو حرکت کنه. منطق این کار دقیقا شبیه درهای اتوماتیکه که تا وقتی جلوشون ایستادی باز میمونن.
- ورودی: فاصلهای که سنسور اولتراسونیک تا دستت اندازه میگیره.
- خروجی: چرخش بازوی سروو موتور از زاویه صفر تا 90 درجه.
- شرط اجرا: قرار گرفتن دست تو بازه 20 تا 25 سانتیمتری (محدوده تقریبی گوشه کتاب).
2. تشخیص برداشته شدن برگه یادداشت
اگه سعی کنی برگه یادداشت رو برداری، نور بیشتری به سطح زیرینش میرسه. ما یه مقاومت نوری (فتوسل) زیر محل قرارگیری یادداشت گذاشتیم که این تغییر روشنایی رو سریعا تشخیص میده.
- ورودی: سطح روشنایی زیر یادداشت که توسط فتوسل خونده میشه.
- خروجی: حرکت عصبی بازوی سروو از زاویه صفر تا 60 درجه (سه بار تکرار) همراه با صدای بوق بازر.
- شرط اجرا: عبور میزان روشنایی از آستانه تاریکی تعیینشده.
3. جلوگیری از برداشتن کل دفترچه
فکر کردی میتونی کل کتاب یا دفترچه رو برداری و بری؟ اگه دفترچه برداشته بشه، نور زیرش یهو زیاد میشه. یه فتوسل دیگه هم دقیقا زیر دفترچه مخفی کردیم که مچت رو میگیره!
- ورودی: سطح روشنایی زیر دفترچه با استفاده از فتوسل.
- خروجی: صدای بوق ممتد بازر.
- شرط اجرا: بیشتر شدن نور محیط از حد آستانه تاریکی زیر دفترچه.
چالشهای ساخت و رفع باگهای سیستم
چالش اول: تداخل نوری موقع ورق زدن
موقع ورق زدن، نور زیر یادداشت یه مقدار خیلی کمی تغییر میکنه و همین باعث میشد سنسور اشتباهی فکر کنه داری یادداشت رو برمیداری و آلارم بده. برای حل این مشکل، یه شرط جدید به کد اضافه کردیم: سنسور تشخیص یادداشت فقط 2 ثانیه بعد از آخرین باری که ورق زدی اجازه فعال شدن داره.
چالش دوم: حساسیت بیش از حد سنسور فاصله
سنسور خیلی حساس بود و حتی اگه دستت یه لحظه از جلوش رد میشد، بازوی گیره سریع حرکت میکرد. برای رفع این باگ دو تا کار انجام دادیم:
- محدوده تشخیص فاصله رو خیلی باریکتر و دقیقتر کردیم.
- شرط گذاشتیم که دستت حتما باید حداقل نیم ثانیه تو اون محدوده بمونه تا فرمان حرکت صادر بشه.
جمعبندی منطق کدنویسی
عملیات ورق زدن صفحه
- ورودی: دیتای فاصله از سنسور اولتراسونیک
- خروجی: چرخش بازو از زاویه صفر به 90 درجه
- شروط اجرا: قرار داشتن دست در فاصله 19 تا 25 سانتیمتری و توقف دست به مدت بیشتر از نیم ثانیه
عملیات برداشتن یادداشت
- ورودی: میزان نور زیر یادداشت
- خروجی: سه بار چرخش سریع بازو از صفر تا 60 درجه همراه با بوق
- شروط اجرا: عبور نور از حد مجاز تاریکی، به شرطی که حداقل 2 ثانیه از آخرین ورق زدن گذشته باشه
عملیات برداشتن کل دفترچه
- ورودی: میزان نور زیر دفترچه
- خروجی: به صدا دراومدن بازر
- شرط اجرا: عبور نور از آستانه مجاز تاریکی
#include <Servo.h>
#define NOTE_A4 440
const int motorPin = 11;
const int trigPin = 10;
const int echoPin = 9;
const int lightPinBack = A2; // Photocell behind memo
const int lightPinBelow = A5; // Photocell below book
const int buzzerPin = 2;
Servo myMemoArm;
// change depends on env
int lightThresholdBack = 750; // memo want dark
int lightThresholdBelow = 600;// book want dark
float distance;
unsigned long lastFlipTime = 0; //cool down: prevent triggering memo removal
unsigned long minFlipTime = 0; //minimum flip time: prevent triggering from other hand movement
float readDistanceCM() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
unsigned long t = pulseIn(echoPin, HIGH, 30000);
if (t == 0) return -1;
return t * 0.0343f / 2.0f; //distance = time × speed of sound
}
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(lightPinBack, INPUT);
pinMode(lightPinBelow, INPUT);
pinMode(buzzerPin, OUTPUT);
myMemoArm.attach(motorPin);
myMemoArm.write(0);
}
void loop() {
distance = readDistanceCM();
int lightValueBack = analogRead(lightPinBack);
int lightValueBelow = analogRead(lightPinBelow);
Serial.print("Distance: ");
Serial.print(distance);
Serial.print(" cm | Memo Back: ");
Serial.print(lightValueBack);
Serial.print(" | Below Book: ");
Serial.println(lightValueBelow);
// ------ Book removal
// condition: photocell at the back of the book detect higher light
if (lightValueBelow > lightThresholdBelow) {
Serial.println("Detect Book Removal");
myMemoArm.write(0);
tone(buzzerPin, 440, 300);
delay(250);
noTone(buzzerPin);
}
// ------ Page flip
// condition: stay in distance range (20-25cm) for more than 1000ms
else if (distance > 20 && distance < 25) {
if (minFlipTime == 0) {
minFlipTime = millis(); // start counting only once when entering range
}
if (millis() - minFlipTime > 500) {
Serial.println("Detect Page Flip, Memo Flip");
myMemoArm.write(90);
delay(800); // cool down
lastFlipTime = millis(); // prevent triggering memo removal
minFlipTime = 0; // reset so it won't retrigger Page Flip immediately
}
}
// ------ Memo removal
//condition: photocell at the back of the memo detect higher light
else if ( millis() - lastFlipTime > 2000 && lightValueBack > lightThresholdBack) {
Serial.println("Detect Memo Removel");
delay(1000);
for (int i = 0; i < 3; i++) {
myMemoArm.write(60);
delay(100);
myMemoArm.write(0);
delay(100);
tone(buzzerPin, 880, 100);
delay(200);
}
noTone(buzzerPin);
}
// ------ Idle behavior
else {
myMemoArm.write(0);
}
delay(100);
}
طراحی بدنه و مخفی کردن قطعات الکترونیکی
برای اینکه پروژه شکل یه محصول واقعی و تمیز رو به خودش بگیره، یه پایه نگهدارنده طراحی کردیم که تمام سیمها، سنسورها و برد اصلی رو تو دل خودش مخفی میکنه، بدون اینکه کارایی دستگاه پایین بیاد. ویژگیهای این بدنه شامل موارد زیره:
- سطح شیبدار ملایم که خوندن و نوشتن رو خیلی راحتتر میکنه.
- یه سوراخ کوچیک برای بیرون اومدن بازوی متحرک گیره.
- محل قرارگیری دقیق برای فتوسل زیر دفترچه.
- یه شیار مخصوص تو بخش جلویی برای قرار گرفتن سنسور اولتراسونیک.
- پنل پشتی توخالی برای مدیریت راحت سیمکشیها و مصرف کمتر متریال پرینت.
نتیجهگیری و ایدههایی برای ارتقای پروژه
طراحی و ساخت این گجت بهمون نشون داد که حتی اگه کدها روی کاغذ یا تو شبیهساز بینقص باشن، باز هم توی دنیای واقعی و شرایط نوری مختلف نیاز به کالیبره کردن و تنظیمات دقیق داریم. تستهای عملی روی میز کار خیلی بهتر از محیطهای نرمافزاری بهمون کمک کرد تا باگهای سیستم رو پیدا کنیم و یه تجربه تعاملی جذاب بسازیم.
- برای قدمهای بعدی، حتی میتونی به جای سنسور فاصله، از دوربین و پردازش تصویر استفاده کنی تا حرکات دست خیلی دقیقتر تشخیص داده بشن و خطاهای سیستم کمتر بشه.
- اضافه کردن افکتهای نوری یا یه نمایشگر کوچیک برای نشون دادن حالتهای چهره (مثل عصبانیت یا تعجب) میتونه این دستگاه رو به شدت زندهتر و تعاملیتر کنه.
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































گفتگوهای کاربران
هنوز نظری ثبت نشده؛ تو شروع کن!
هنوز نظری ثبت نشده؛ تو شروع کن!