اکثر کاربرها از سرویس google assistant برای جستجو کردن موضوعات مختلفی مثل پیدا کردن آهنگ و… استفاده میکنند، ولی ما برقیها کارای جذاب تری هم باهاش انجام میدیم. به عبارتی این گوگل اسیستنت یا همون دستیار صوتی گوگل رو واقعا به یک دستیار کاربردی تبدیل میکنیم. توی این پست یاد میگیریم که چطور به google assistant بگیم سروو موتورمون رو توی زاویه دلخواه قرار بده.
به کمک آردوینو برنامهای رو به برد میکروکنترلر منتقل میکنیم. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
کنترل سروو با IFTTT
قبل از هر چیز میخوام روند کلی رو بهتون توضیح بدم. صدای ما نمیتونه مستقیماً سروو موتور رو کنترل کنه. یعنی گوگل بعد از شنیدن فرمایشات ما، دستور رو به IFTTT میفرسته و ازش میپرسه که آیا این دستور برات آشناست یا نه؛ اگر جملهی ما عیناً در IFTTT ثبت شده باشه، IFTTT دستور رو به سرویسی مثل Adafruit ارسال میکنه. در مرحله آخر Adafruit فرمان رو به نقش اصلی ماجرا یعنی nodemcu میفرسته تا سروو رو توی زاویه دلخواه قرار بده؛به این صورت سروو با google assistant قابل کنترل میشه.
تنظیمات حساب کاربری Adafruit
همونطور که گفته شد، برای کنترل سروو با google assistant به سرویسهای دیگری هم نیاز داریم، از جمله همین adafruit . قدم اول اینه که وارد سایت io.adafruit.com بشید و با وارد کردن اطلاعات زیر حساب شخصیتون رو درست کنید.
بعد در سایت Adafruit وارد قسمت dashboards بشید و درست مثل شکل زیر از منوی کشویی actions گزینه create a new dashboard رو انتخاب کنید.
حالا باید واسش اسم انتخاب کنید. ترجیحاً اسم رو Servo بذارید (چون در غیر این صورت باید یک قسمت از کد آردوینو رو که براتون گذاشتم تغییر بدید). حالا کافیه روی create کلیک کنید تا اولین داشبورد شما توی adafruit ساخته بشه.بعد از باز کردن داشبورد مورد نظر صفحه زیر رو می بینید.
اگر روی علامت + کلیک کنید، بلوکای مختلفی رو بهتون نشون میده.برای این پروژه،یکی از این دو تا رو به دلخواه انتخاب کنید.
بعد از انتخاب بلوک،صفحه زیر رو می بینید. در قسمت Enter new feed name اسم Servo رو وارد کنید تا یک feed با همین اسم ساخته بشه.این feed و بعد گزینه Next Step رو انتخاب کنید.
میدونید که سرووی ما از ۰ تا ۱۸۰ درجه میچرخه،پس توی صفحه ای که باز میشه،باید ماکسیمم (max) و مینیمم (min) اسلایدر رو انتخاب کنید؛حتی میتونید گام رو هم متناسب با نیازتون تغییر بدید.
با کلیک روی create block مراحل تنظیم در سایت به پایان میرسه.
تنظیمات حساب کاربری IFTTT
بعد از این میریم سراغ مقصد دوم یعنی سایت ifttt.com :بعد از درست کردن حسابتون،روی create کلیک کنید. جالبه بدونید که ifttt مخفف عبارت زیره:
همونطور که از اسمش مشخصه،میتونه طبق شرطی که براش تعیین میکنیم،کار خاصی رو انجام بده. با توجه به مقدمه ای که گفته بودم دستوری که ما به ifttt میدیم به صورت زیره:
“اگر google assistant جمله ای رو دریافت کرد،از adafruit بخواه که سروو رو روی زاویه مورد نظر قرار بده.”
حدستون کاملا درسته! بعد از کلیک روی کلمه ی this (شرط) ، باید google assistant رو انتخاب کنید.
در پنجره ای که باز میشه،روی say a simple phrase کلیک کنید.
یک صفحه مطابق شکل زیر می بینید.توی سه قسمت اول باید دقیقاً جملاتی رو مشخص کنید که قراره به google assistant بگید.مثلاً وقتی که میخوام سروو روی زاویه ۵۰ درجه قرار بگیره،جملات زیر رو می نویسم.(شما میتونید هر کلمه یا جمله ی دلخواهی رو جایگزین کنید.فقط باید این جمله ها رو بدون هیچ تغییری به ذهنتون بسپارید)
جمله ای که در قسمت چهارم مینویسید، جوابیه که از گوگل میشنوید.حالا روی create trigger کلیک کنید.
خب،میرسیم به آخرین مرحله در سایت ifttt :
روی that کلیک و adafruit رو انتخاب کنید.
بعد از کلیک روی تنها گزینه موجود یعنی send data to Adafruit IO ، یک صفحه مثل شکل زیر میبینید. در قسمت Feed name، اسم داشبوردی رو که در adafruit درست کرده بودیم انتخاب میکنیم.حالا در جای خالی Data to save ، زاویه ای رو وارد کنید که در قسمت “this” مربوط به این action انتخاب کرده بودید.
بعد از کلیک روی Create action کار ما در این سایت هم تمومه. البته این مرحله رو باید برای همه ی زوایایی که در پروژتون بهش احتیاج دارید انجام بدید.
اتصالات سرو موتور به Nodemcu
سروو سه تا سیم داره:
- سیم قهوه ای (یا مشکی) رو به GND
- سیم قرمز یعنی VCC رو به ۳.۳ ولت(توجه داشته باشید که گاهی با توجه به نوع سروو به تغذیه خارجی هم نیاز داریم)
- سیم نارنجی (زرد،یا سفید) رو که سیم سیگنال سروو موتوره به یکی از پین های دیجیتال Nodemcu وصل کنید.
شروع کار با Nodemcu
واسه اینکه کار رو با nodemcu شروع کنید، بعد از وصل کردنش به لپتاپ، باید سه مرحله ی زیر رو انجام بدید:
- بعد از باز کردن نرم افزار آردوینو،از قسمت files روی preferences کلیک کنید،در جای خالی لینک زیرو وارد کنید و ok رو بزنید.
https://arduino.esp8266.com/stable/package_esp8266com_index.json
- حالا از قسمت tools ، روی Boards و بعد Board Manager کلیک کنید؛esp8266 رو جستجو و اولین گزینه ای که می بینید نصب کنید.حالا از همون قسمت Boards گزینه Genetic ESP8266 رو پیدا و انتخاب کنید. بریم سراغ مرحله آخر:
- موقع کار با nodemcu هم درست مثل UNO باید شماره پورت رو انتخاب کنیم.برای اینکه ببینید شماره پورت توی لپتاپ شما چه عددیه ،از منوی start لپتاپ، device manager رو باز کنید و از قسمت port شماره پورت رو ببینید.ادامه کار هم که مشخصه؛در نرم افزار از قسمت tools همون پورت رو انتخاب میکنیم.
نصب کتابخانه Adafruit IO Arduino
در سومین و آخرین مرحله اول باید کتابخونه adafruit io arduino رو نصب کنید.
بعد از مسیر زیر مثال adafruitio_16_servo رو باز کنید:
کد آردوینو Arduino
برای کنترل سروو با google assistant نیازمند آپلود کدهای زیر روی برد nodemcu به کمک نرم افزار آردوینو هستیم. کدی که میبینید به صورت زیره؛ اما قبل از آپلود باید اطلاعات مورد نیاز مربوط به شبکه و adafruit رو توی قسمت config.h تکمیل کنید تا باب آشنایی بین nodemcu و adafruit باز بشه!
// Adafruit IO Servo Example // Tutorial Link: https://learn.adafruit.com/adafruit-io-basics-servo // // Adafruit invests time and resources providing this open source code. // Please support Adafruit and open source hardware by purchasing // products from Adafruit! // // Written by Todd Treece for Adafruit Industries // Copyright (c) 2016-2017 Adafruit Industries // Licensed under the MIT license. // // All text above must be included in any redistribution. /************************** Configuration ***********************************/ // edit the config.h tab and enter your Adafruit IO credentials // and any additional configuration needed for WiFi, cellular, // or ethernet clients. #include "config.h" /************************ Example Starts Here *******************************/ #if defined(ARDUINO_ARCH_ESP32) // ESP32Servo Library (https://github.com/madhephaestus/ESP32Servo) // installation: library manager -> search -> "ESP32Servo" #include <ESP32Servo.h> #else #include <Servo.h> #endif // pin used to control the servo #define SERVO_PIN 2 // create an instance of the servo class Servo servo; // set up the 'servo' feed AdafruitIO_Feed *servo_feed = io.feed("servo"); void setup() { // start the serial connection Serial.begin(115200); // wait for serial monitor to open while(! Serial); // tell the servo class which pin we are using servo.attach(SERVO_PIN); // connect to io.adafruit.com Serial.print("Connecting to Adafruit IO"); io.connect(); // set up a message handler for the 'servo' feed. // the handleMessage function (defined below) // will be called whenever a message is // received from adafruit io. servo_feed->onMessage(handleMessage); // wait for a connection while(io.status() < AIO_CONNECTED) { Serial.print("."); delay(500); } // we are connected Serial.println(); Serial.println(io.statusText()); servo_feed->get(); } void loop() { // io.run(); is required for all sketches. // it should always be present at the top of your loop // function. it keeps the client connected to // io.adafruit.com, and processes any incoming data. io.run(); } // this function is called whenever a 'servo' message // is received from Adafruit IO. it was attached to // the servo feed in the setup() function above. void handleMessage(AdafruitIO_Data *data) { // convert the data to integer int angle = data->toInt(); // make sure we don't exceed the limit // of the servo. the range is from 0 // to 180. if(angle < 0) angle = 0; else if(angle > 180) angle = 180; servo.write(angle); }
برای پر کردن اطلاعات،باید یک بار دیگه وارد سایت adafruit و داشبورد Servo بشید و روی علامت کلید کلیک کنید.
- Username و Active Key رو به ترتیب توی قسمت IO_USERNAME و IO_KEY وارد کنید.
- WIFI_SSID و WIFI_PASS هم که اطلاعات مربوط به وای فای شماست.
- حالا فقط کافیه کد رو آپلود کنید تا کارمون تموم بشه.
- برای بستن این صفحه عجله نکنید! درسته از کد آماده استفاده کردیم،اما بهتره تنبلی نکنیم و قسمتای مهمش رو با هم یاد بگیریم.
تحلیل کد آردوینو Arduino
در این مثال،پین شماره ۲ به طور پیش فرض برای سروو در نظر گرفته شده.اگه شما از پین دیگه ای استفاده کردید،باید این قسمت از برنامه رو تغییر بدید.
- باید شماره پین های GPIO رو توی برنامه وارد کنید.مثلاً اگه از پین D6 استفاده کردید،طبق شکل زیر باید عدد ۱۲ در برنامه نوشته بشه.
- در این قسمت دو تا کلاس Servo و AdafruitIO_Feed تعریف شده.بله،درست حدس زدید!چیزی که توی پرانتز میبینید،دقیقاً همون اسمیه که در سایت adafruit برای feed انتخاب کرده بودیم.پس اگه خواستید اسم دیگه ای رو انتخاب کنید،یادتون نره که این قسمت از برنامه رو در جریان بذارید!
همونطوری که میبینید،با دستور servo.attach() شماره پینی که سروو به اون وصل شده معرفی میشه.
- io.connect() هم دستوریه که nodemcu رو به adafruit متصل میکنه،به شرطی که اطلاعات وارد شده توی بخش config.h کاملاً درست باشه.
- تابع handlemessage که در کنار اسم feed نوشته شده،زمانی فراخونده میشه که دستگاهمون پیامی رو از طرف اون feed دریافت کنه.
- آخر بخش void setup() هم با حلقه while از nodemcu میخوایم که تا وقتی که به adafruit متصل نشده،”.” رو چاپ کنه و به محض کانکت شدن از حلقه بیاد بیرون و برنامه رو ادامه بده.
- دستور io.run() هم اطلاعات ورودی رو پردازش میکنه و هم باعث میشه دستگاه متصل به adafruit باقی بمونه.
- تابع data->toInt() اطلاعات دریافتی از adafruit رو به int تبدیل میکنه که با قراردادن این مقدار توی دستور servo.write سروو روی زاویه مورد نظرمون قرار میگیره.
- شرط if هم بررسی میکنه که عدد دریافتی کمتر از صفر یا بیشتر از ۱۸۰ نباشه.
جمع بندی
کارمون تموم شده.حالا کافیه گوشی مبارک رو آماده کنید و درخواستتون رو به google assistant بگید. در ضمن اگه قصدتون صرفاً کنترل سروو از طریق اینترنته و نمیخواید از google assistant استفاده کنید،دیگه نیازی به انجام تنظیمات ifttt ندارید و میتونید با اسلایدر سروو رو حرکت بدید.
امیدوارم از این آموزش لذت برده باشید. خوشحال میشم نظراتتون رو هم بدونم.
وسایل مورد نیاز
موبایل
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
سلام ifttt آیا وب سرویسه؟ من دقیق نمیدونم به این اپلیکیشن چی باید گفت؟
سلام.بله،یه وب سرویسه که هم میتونید از سایتش استفاده کنید،هم از اپلیکیشنش
سلام خسته نباشی یه سوال دارم اینکه بدون ایجاد حساب کاربری توی سایت ادافروت نمیشه با این اپ کار کرد؟
سلام.وقتتون بخیر.باید حتما حساب شخصیتونو درست کنید و اطلاعاتش رو توی config.h وارد کنید.کار سختی هم نیست،فقط نیاز به ایمیل دارید.
AdafruitIO_Feed *servo_feed = io.feed(“servo”);
سلام خسته نباشید خطای این خط میده
سلام.وقتتون بخیر.adafruit به حروف کوچک و بزرگ حساسه.اسم feed رو توی adafruit دقیقا “servo” بذارید
‘adafruitIO_Feed’ does not name a type
سلام خسته نباشید
io.run();
این خط پیام ارور میده
‘io’ was not declared in this scope
چیکارش کنم
سلام.ممنونم.
مراحل رو به ترتیب انجام بدید.یعنی بعد از انجام تنظیمات adafruit،قسمت config.h رو کامل کنید،بعد کد رو آپلود کنید.اگه مشکلتون حل نشد اطلاع بدید
سلام. متاسفانه سرور adafruit آی پی ایران را بلاک کرده . با نت adsl متصل نمیشه و عملا بی فایدس .البته با نت همراه وصل میشه . شما راه حلی برای حل این مشکل پیدا نکردید؟
سلام.وقتتون بخیر.با فیلتر شکن خیلی راحت باز میشه،مشکلی نداره
در قسمتgoogle assistant چیزی به نام say a simple phrase ندارد و فقط گوگل هوم دار که اونم اصلا به ifttوصل نمیشه
با سلام
با توجه به آپدیتهای جدید گوگل ممکن است روند این فرآیند کمی تغییر کرده باشد.