در این جمعه تابستانی - که آخرین جمعه ماه مرداد هم هست - قراره با هم یک پروژه باحال انجام بدیم. قراره که در این پروژه، بیاییم و با کمک آردوینو یک چراغی که با دستورات سریال روشن و خاموش میشه درست کنیم و بعدش با کمک پایتون، یک دستیار صوتی بنویسیم که دستورها رو به سمت آردوینو بفرسته.
به نظر پیچیده میاد، نه؟ اما اینطور نیست واقعا. یک پروژه نسبتا سادهست، اما میتونه بخشی از یک پروژه بسیار بزرگتر و پیچیدهتر باشه. مثلا دستیار صوتی که کل خونه رو کنترل میکنه یا چنین چیزی.
خب، این پروژه از اونجایی که یکم پیچیده به نظر میرسه، بهتره که قبل از انجامش کمی دانش برنامهنویسی و کمی دانش الکترونیک داشتن، بد نیست. البته این رو هم بگم که به دست آوردن این دانش، این روزها اصلا سخت نیست و با یک جستجوی ساده در اینترنت میتونید بهش برسید :)
بعد از این که کلی دیزاین و ... انجام بدیم، خروجیمون میشه چیزی شبیه به این ویدئو:
خب همونطوری که میبینید، کاتد LED رو توسط مقاومت به GND (اتصال به زمین) آردوینو و آندش رو به پین شماره ۸ آردوینو متصل کردیم. لازم به ذکره که شماره پین اصلا مهم نیست، اما روی بعضی مدلهای آردوینو بهتره که پینهای ۱ و ۲ - چون ارتباط سریال سختافزاری هستند - متصل نشن. همچنین اگر پینی کنارش علامت ~ بود هم بهتره برای کاری مثل روشن و خاموش کردن LED استفاده نشن، چرا که با اونها میشه PWM و ... رو هندل کرد.
مقاومت رو اصلا و ابدا فراموش نکنید. دیودها، استعداد خوبی در جریان ناگهانی کشیدن از منبع دارند و اگر مقاومت باهاشون سری نکنید، میتونن به خودشون یا مدار آسیب بزنن.
این کد رو برای آردوینو مینویسیم و توسط Arduino IDE اون رو به برد منتقل میکنیم:
در این کد ابتدا گفتیم که پین شماره ۸ رو میخوایم برای LED رزرو کنیم. بعد در تابع setup اومدیم و با تابع pinMode تعیین کردیم که این پین، از نوع خروجیه. بعدش هم ارتباط سریال رو با Baud rate معادل ۹۶۰۰ راهاندازی کردیم.
در تابع loop اول یک متغیر به اسم input_text تعریف کردیم و اون رو معادل رشتهای که از سریال میخونیم قرار دادیم. به این شکل، هربار که loop اجرا شد، این متغیر ریست میشه به یک رشته خالی.
حالا اگر Serial Monitor خود آردوینو رو باز کنیم و تایپ کنیم on و اینتر بزنیم چی میشه؟ LED روشن میشه. اگر بزنیم off چی؟ خاموش میشه. حالا وقتشه که مدار رو - همونطور که به کامپیوترمون متصله - رها کنیم و بریم سراغ پایتون :)
اولین کاری که باید بکنیم، اینه که کتابخونههایی که نیازن رو نصب کنیم:
دقت کنید که برای لایبرری Speech Recognition احتمالا نیازه که port audio هم روی سیستمتون نصب باشه، پس نگران نباشید اگر اروری مبتنی بر نصب این لایبرری خاص دریافت کردید.
بعد از نصب اینها، بیایید یک کنترلر سریال ساده بنویسیم:
در این کد، ابتدا کتابخونه Serial رو فراخوانی کردیم و بعدش هم time رو (بعضی وقتا نیازه که وقفههای زمانی داشته باشیم که البته در این کد نیاز نشده) و بعد اومدیم یک متغیر به اسم target تعریف کردیم و توسط Serial گفتیم که روی پورت dev/cu.usbmodem142101 و کانال ۹۶۰۰ دنبال آردوینو بگرده.
اگر ویندوزی هستید پورت شما احتمال قوی COM3 و COM4 یا چنین چیزی باشه. اگر لینوکسی هستید هم احتمالا dev/ttyUSB0 یا چیزی مشابه این. برای دیدن این پورتها میتونید از Arduino IDE کمک بگیرید.
بعد از اون، یک تابع به اسم write_serial داریم که تکستی که ما بهش دادیم رو به سمت سریال میفرسته. به شدت هم سادهست. اینجا نیمثانیه هم تاخیر داره که مطمئن شه دیتا رو فرستاده و در آخر با readline مطمئن میشه که دیتا به مقصد رسیده.
در حلقه اصلی هم، یک متن ورودی میگیریم، فرمت درست رو بهش میدیم و میفرستیمش سمت سریال. حالا میتونیم LED رو کنترل کنیم، نه؟ راستش هنوز اونطوری که دلمون میخواد نشده :)
حالا با اضافه کردن چند خط کد ساده، میشه دستیار صوتی فارسی هم به سریال کنترلر اضافه کرد (این کد رو توضیح نمیدم، ببینم خودتون متوجهش میشید یا نه ?)
حالا کافیه همونطور که آردوینو به کامپیوتر متصله (و پورت سریال درست و حسابی در کد وارد شده) این کد رو اجرا کنید و باهاش حرف بزنید.
البته تشخیص گفتار گوگل، تا حد زیادی کنده و این خودش یک مسالهست. اما به عنوان proof of concept یکی از بهترین ابزارهای موجوده.
خب الان بحث دیگه بحث کنترل لوازم برقی توی خونهست! یعنی مثلا چطور میشه یک لامپ رو باهاش خاموش روشن کرد؟ یا قهوهساز رو کنترل کرد؟ برای اون کافیه که LED رو با یک رله جایگزین کنید. البته همچنان این قضیه طراحی مدارات مرتبط با خودش رو میطلبه و در آینده ازش صحبت خواهیم کرد.
این پروژه گرچه پروژه خوبیه اما هنوز خیلی جای کار داره. سادهترینش، اینه که یه تشخیص گفتار لوکال نیاز داره که وابسته به سرویس خارجیای مثل گوگل نباشه. همینطور نیاز داره تا تاخیر ارسال دیتاش کمی پایینتر بیاد و ... . اما پروژه خوبیه. چرا که شما رو با خیلی از مفاهیم آشنا میکنه و از همه مهمتر، باعث میشه که ترس شما از مفاهیم و پروژههای پیچیده بریزه.
در آینده، سعی میکنم بیشتر از این تیپ پروژهها بنویسم، چرا که مهمه که بدونیم تکنولوژی از چیزی که ما فکر میکنیم سادهتر و در عین حال، پیچیدهتره.
در نهایت هم دعوت میکنم ازتون که اگر این مطلب مفید بود، علاوه بر زدن دکمه لایک، باقی مطالب رو بخونید و چنانچه محتوای این طوری رو میپسندید، به وبلاگ شخصیم هم سری بزنید :)