ساخت عصای هوشمند برای نابینایان با آردوینو یکی از پروژههایی است که میتواند کمک کند تا روشندلان یا افرادی که کمبینا هستند، بهتر و راحتتر مسیر خود را پیدا کنند. حالا امروز در بلاگ بهنام رباتیک میخواهیم شما را با این پروژه آشنا کنیم؛ با ما همراه باشید.
آیا تاکنون نام هوگ هرر را شنیدهاید؟ او یک کوهنورد آمریکایی بود که موفق شد محدودیتهای مربوط به معلولیتش را پشت سر بگذارد. هرر معتقد بود که تکنولوژی میتواند به انسانهای معلول کمک کند تا آنها نیز زندگی عادی خودشان را داشته باشند. او میگوید:«« انسانها معلول نیستند. یک شخص هیچگاه از کار افتاده نخواهد بود. این در حالی است که ما محیط پیرامون خود را نشناختهایم و تکنولوژی ناتوان است. ما به عنوان انسان نباید محدودیتهایمان را بپذیریم بلکه باید با نوآوریهای فناورانه، آنها را از بین ببریم»».
کلماتی که هرر به زبان آورد، در حد شعار نبود زیرا گفته میشود که او امروزه با پاهای مصنوعی و رباتیک، زندگی معمول خود را دارد. با این اوصاف، تکنولوژی میتواند معلولیت انسانها را از بین ببرد. با این ذهنیت، باید بتوانیم با یک سنسور اولتراسونیک، اقدام به ساخت عصای هوشمند برای نابینایان با آردوینو بکنیم.
این عصای هوشمند یک سنسور اولتراسونیک برای تشخیص فاصله با موانع، یک سنسور LDR برای شناسایی شدت نور محیط و یک کنترل از راه دور RF برای مکانیابی دارد. تمامی بازخوردهایی که از عصا ساطع میشوند، از طریق بازر به اطلاع فرد نابینا میرسد. ضمناً، شما میتوانید از یک موتور لرزشی به جای بازر استفاده کنید و یا با خلاقیت خودتان، به امکانات این عصای هوشمند بیفزایید.
لوازم مورد نیاز برای پروژه ساخت عصای هوشمند برای نابینایان با آردوینو
برد آردوینو نانو
سنسور اولتراسونیک SRF04
سنسور LDR
یک بازر
یک LED
آیسی 7805
گیرنده و فرستنده 433 مگاهرتز RF
چند مقاومت
چند خارن
دکمه فشاری
چند باتری کتابی
فیبر مدار چاپی
یک تکه چوب یا دسته
دیاگرام مدار پروژه ساخت عصای هوشمند برای نابینایان با آردوینو
در این پروژه آردوینو دو مدار جداگانه وجود دارد. یکی از آنها مدار اصلی است که به عصا وصل میشود و دیگری مدار کنترل از راه دور فرستنده RF است که برای مکانیابی عصا به کار میرود. دیاگرام مدار اصلی این پروژه را در تصویر زیر مشاهده میکنید:
همانطور که میبینید، آردوینو نانو برای کنترل همه سنسورها استفاده میشود ولی شما میتوانید این عصای هوشمند را با آردوینو Uno نیز بسازید هرچند باید مدار را به همین شکلی که دیدید، ببندید. برد کامل این مدار، با یک باتری کتابی تأمین انرژی میشود تا با استفاده از آیسی رگولاتور ولتاژ 7805، مقدار 5 ولت به برد تزریق گردد.
ماژول اولتراسونیک با ولتاژ 5 ولت کار میکند و پینهای محرک و اکو آن به ترتیب به پینهای 3 و 2 آردوینو وصل میشوند. سنسور LDR هم با یک مقاومت 10 کیلو اهم به مدار متصل شده تا نوعی منقسم را به وجود بیاورد. بر این اساس، تفاضل ولتاژ توسط پین شماره 1 آردوینو یعنی ADC انجام میپذیرد. پین A0 هم برای خواندن سیگنالهای گیرنده RF به کار میرود. خروجی برد یک بازر میباشد که به پین شماره 12 وصل شده است.
شماتیک مدار برد ریموت کنترل پروژه ساخت عصای هوشمند برای نابینایان با آردوینو در تصویر زیر قابل مشاهده است.
برای کنترل این مدار از پروژه ساخت عصای هوشمند برای نابینایان با آردوینو، از یک ترفند استفاده شده است. معمولاً برای اینکه ماژول 433 مگاهرتز RF فعالیت کند، به یک رمزگذار و یک رمزگشا نیاز داریم اما در اینجا ما تنها به یک گیرنده احتیاج خواهیم داشت تا ببینیم آیا فرستنده سیگنالی ارسال میکند یا خیر. با این اوصاف، پین دیتا فرستنده به پین GND یا VCC منبع نیرو وصل میشود.
پین دیتا گیرنده از طریق فیلتر RC و سپس به آردوینو متصل میگردد. اینک هر وقت دکمه فشار داده میشود، گیرنده مقادیر ADC متداولی را ساطع میکند. لازم به ذکر است که وقتی دکمه را فشار میدهیم، نمیتوانیم متوجه این موضوع شویم به همین خاطر کدهای آردوینو را مینویسیم تا مقادیر تکراری را بررسی نماییم و ببینیم آیا دکمه فشار داده شده یا خیر. با این روش، شخص نابینا میتواند عصای خود را مکانیابی کند.
برای اینکه قطعات الکترونیکی مدار پروژه ساخت عصای هوشمند برای نابینایان با آردوینو به یکدیگر نزدیک باشند، میتوانید از فیبر مدار چاپی بهره ببرید هرچند امکان قرار دادن آنها روی برد بورد نیز وجود دارد. ضمناً، به منظور ساخت یک عصا که از نظر ظاهری نیز مرتب است، میتوان از یک تکه چوب استفاده کرد.
کدنویسی پروژه ساخت عصای هوشمند برای نابینایان با آردوینو
حال که سختافزار و لوازم مورد نیاز این پروژه را به یکدیگر وصل کردهایم، میتوانیم فرآیند کدنویسی پروژه ساخت عصای هوشمند برای نابینایان با آردوینو در نرمافزار Arduino IDE را آغاز کنیم. کدهای مورد نیاز این پروژه، را میتوانید در ادامه مشاهده و با کپی آنها، در نرمافزار Arduino IDE آپلود کنید.
/*
* Program for Blind Man Stick
* Code by B.Aswinth Raj
* Dated: 03-11-2017
* Website: www.behnamrobotic.com
*/
const int trigger = 3; //Trigger pin of 1st Sesnor
const int echo = 2; //Echo pin of 1st Sesnor
const int Buzz = 13; //Echo pin of 1st Sesnor
const int Remote = A0; //Echo pin of 1st Sesnor
const int Light = A1; //Echo pin of 1st Sesnor
long time_taken;
int dist;
int Signal;
int Intens;
int similar_count;
void setup() {
Serial.begin(9600);
pinMode(Buzz,OUTPUT);
digitalWrite(Buzz,LOW);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}
/*###Function to calculate distance###*/
void calculate_distance(int trigger, int echo)
{
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
time_taken = pulseIn(echo, HIGH);
dist= time_taken*0.034/2;
if (dist>300)
dist=300;
}
void loop() { //infinite loopy
calculate_distance(trigger,echo);
Signal = analogRead(Remote);
Intens = analogRead(Light);
//Check if Remote is pressed
int temp = analogRead(Remote);
similar_count=0;
while (Signal==temp)
{
Signal = analogRead(Remote);
similar_count++;
}
//If remote pressed
if (similar_count<100)
{
Serial.print(similar_count); Serial.println("Remote Pressed");
digitalWrite(Buzz,HIGH);delay(3000);digitalWrite(Buzz,LOW);
}
//If very dark
if (Intens<200)
{
Serial.print(Intens); Serial.println("Bright Light");
digitalWrite(Buzz,HIGH);delay(200);digitalWrite(Buzz,LOW);delay(200);digitalWrite(Buzz,HIGH);delay(200);
digitalWrite(Buzz,LOW);delay(200);
delay(500);
}
//If very bright
if (Intens>800)
{
Serial.print(Intens); Serial.println("Low Light");
digitalWrite(Buzz,HIGH);delay(500);digitalWrite(Buzz,LOW);delay(500);digitalWrite(Buzz,HIGH);delay(500);
digitalWrite(Buzz,LOW);delay(500);
}
if (dist<50)
{
Serial.print(dist); Serial.println("Object Alert");
digitalWrite(Buzz,HIGH);
for (int i=dist; i>0; i--)
delay(10);
digitalWrite(Buzz,LOW);
for (int i=dist; i>0; i--)
delay(10);
}
//Serial.print("dist=");
//Serial.println(dist);
//Serial.print("Similar_count=");
//Serial.println(similar_count);
//Serial.print("Intens=");
//Serial.println(Intens);
}
توضیحات کدهای پروژه ساخت عصای هوشمند برای نابینایان با آردوینو
همچون بسیاری دیگر از پروژههای آردوینو، کدهای خود را با تعیین پینهای ورودی و خروجی آغاز میکنیم. بر این اساس، در این پروژه پین محرک و بازر خروجی، و پین اکو ورودی دستگاه است. به علاوه، در اینجا سریال مانیتور نیز اجرا میشود تا مشکلات احتمالی مدار بررسی گردد.
void setup()
{
Serial.begin(9600);
pinMode(Buzz,OUTPUT);
digitalWrite(Buzz,LOW);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}
در بخش Loop، همه دادههای مربوط به سنسورها را میبینیم. این دادهها با اطلاعات حسگر اولتراسونیک برای تشخیص فاصله شروع میشود و با اطلاعات حسگر LDR برای تشخیص شدت نور و سیگنالهای کنترل RF در زمان فشرده شدن دکمه پایان مییابد. همه این دادهها در یک متغیر جمعآوری شدهاند تا در آینده بتوانیم از آنها استفاده کنیم.
calculate_distance(trigger,echo);
Signal = analogRead(Remote);
Intens = analogRead(Light);
حالا کار خود را با سیگنال کنترل از راه دور از سر میگیریم. در این مرحله از کدهای پروژه ساخت عصای هوشمند برای نابینایان با آردوینو از یک متغیر با عنوان similar_count بهره میبریم تا ببینیم یک نوع داده از ریموت کنترل، چند بار تکرار شده است. این تکرار تنها زمانی رخ خواهد داد که دکمه را فشار دادهایم. بر این اساس، کاری میکنیم که اگر عدد مربوطه از 100 فراتر رفت، هشدار صدای ریموت به صدا دربیاید.
//Check if Remote is pressed
int temp = analogRead(Remote);
similar_count=0;
while (Signal==temp)
{
Signal = analogRead(Remote);
similar_count++;
}
//If remote pressed
if (similar_count<100)
{
Serial.print(similar_count); Serial.println("Remote Pressed");
digitalWrite(Buzz,HIGH);delay(3000);digitalWrite(Buzz,LOW);
}
شما همچنین میتوانید نتایج را در سریال مانیتور ببینید.
در مرحله بعد باید سراغ بررسی شدت نور اطراف فرد نابینا برویم. اگر سنسور LDR با مقدار کمتر از 200 روبهرو شد، اینطور به نظر میرسد که محیط تاریک است و به او از طریق بازر و تن صدای خاص با تأخیر 200 میلیثانیهای هشدار داده خواهد شد. در سمت دیگر، چنانچه شدت نور از 800 بیشتر بود، با صدای دیگری هشدار خواهیم داد. تن صدا و شدت آن را میتوان به آسانی و از طریق دستکاری مقادیر در کدهای زیر، تغییر داد.
//If very dark
if (Intens<200)
{
Serial.print(Intens); Serial.println("Bright Light");
digitalWrite(Buzz,HIGH);delay(200);digitalWrite(Buzz,LOW);delay(200);digitalWrite(Buzz,HIGH);delay(200);digitalWrite(Buzz,LOW);delay(200);
delay(500);
}
//If very bright
if (Intens>800)
{
Serial.print(Intens); Serial.println("Low Light");
digitalWrite(Buzz,HIGH);delay(500);digitalWrite(Buzz,LOW);delay(500);digitalWrite(Buzz,HIGH);delay(500);digitalWrite(Buzz,LOW);delay(500);
}
در نهایت، باید فاصله تا مانع اندازهگیری شود. اگر فاصله شخص نابینا تا مانع 50 سانتیمتر یا بیشتر بود، صدای هشداری پخش نخواهد شد اما اگر کمتر بود، بازر به صدا درخواهد آمد. همزمانی که شخص به مانع نزدیک میشود، فاصله زمانی پخش صدای بازر کاهش مییابد و در نهایت صدای بیپ خواهد داد. میتوان این کار را با ایجاد تأخیر نسبت به فاصله محاسبه شده انجام داد. از آن جایی که تابع تأخیر آردوینو یعنی delay() نمیتواند متغیر قبول کند، باید مانند کدهای زیر از حلقه for استفاده کنیم.
if (dist<50)
{
Serial.print(dist); Serial.println("Object Alert");
digitalWrite(Buzz,HIGH);
for (int i=dist; i>0; i--)
delay(10);
digitalWrite(Buzz,LOW);
for (int i=dist; i>0; i--)
delay(10);
}
لازم به ذکر است که شما میتوانید بسته به پروژهای که دارید، مقادیر نوشته شده در کدهای ارائه شده در این مطلب را تغییر دهید. ضمناً، برای عیبیابی عملکرد و مشاهده خروجیها، از سریال مانیتور استفاده میکنیم.
آزمایش محصول نهایی پروژه ساخت عصای هوشمند برای نابینایان با آردوینو
حالا باید عصای ساخته شده را آزمایش کنیم. اطمینان حاصل نمایید که اتصالات بدرستی انجام شدهاند و کدنویسی نیز مشکلی ندارد. سپس هر دو مدار را به باتری بزنید. سنسور اولتراسونیک را به مانع نزدیک کنید تا بازر صدا بدهد. در ادامه هر چه به مانع نزدیکتر میشوید، صدای بیپ بازر شدیدتر خواهد شد. همچنین، اگر نور کم بود یا حتی نور زیادی در محیط وجود داشت، بازر به صدا درخواهد آمد. این در حالی است که اگر همه چیز عادی بود، بازر بیصدا باقی خواهد ماند.
وقتی دکمه روی کنترل بازر را فشار میدهید، بازر صدای بیپ طولانی پخش خواهد کرد.
اگر بازر مدام صدای بیپ میدهد، یعنی سیستم هشداردهی به خوبی تنظیم نشده است. شما میتوانید سریال مانیتور را اجرا کنید تا پارامترهای مختلف را بررسی نمایید و ببینید کدام بخش از کدنویسی اشتباه بوده است.