امواج وای فای دیگر همه جا حضور دارند. آرزوی قدیمی مهندسین برای اتصال ارزان و آسان به این امواج، چند وقتی میشود که به لطف گسترش اینترنت اشیا محقق شده است. در این پست خواهید آموخت که چطور میشود یک ارتباط ساده و ارزان را در شبکهی وای فای راه اندازی نمود.
قبل از انتخاب وای فای به عنوان پروتکل ارتباطی سیستم مورد نظرتان، به نکات زیر توجه بفرمایید:
وای فای برای سیستمهای زیر نامناسب است:
سیستم با باتری کار میکند و توان مصرفی عامل مهمی است.
نیاز است تا زمان پاسخ دهی کوتاه و به عبارت دقیق تر Real Time باشد.
تعداد نودهای متصل بیسیم بسیار زیاد باشد.
اما در موارد زیر وای فای مناسب است:
حجم اطلاعات ارسالی تقریبا زیاد است و اگر کمی هم دیر برسد اشکالی ندارد.
استفاده از بسترهای موجود (مودم، روتر وسخت افزارهای موجود وای فای) شبکه در اولویت است.
میخواهیم به طور مستقیم به گوشیهای هوشمند متصل شویم و از بلوتوث هم خوشتان نمیآید!
خوب برویم سراغ اصل مطلب؛ برای تجربهی اتصال وای فای خودتان، گامهای زیر باید برداشته شود:
سوت اول؛ تهیهی ماژول
ماژولی که در این پست معرفی خواهم کرد، NodeMCU نام دارد. یک ماژول ارزان قیمت که امکان راهاندازی ارتباط وای فای را به شما میدهد. این ماژول بر پایهی ماژول وای فای ESP8266 ساخته شده است. خوشبختانه فرومهای بسیاری در اینترنت برای راه اندازی NodeMCU در انواع کاربردها موجود است. برای اطلاعات بیشتر در مورد این ماژول میتوانید به لینک زیر مراجعه کنید:
http://www.nodemcu.com/index_en.html
همان طور که از یک ماژول ارزان قیمت چینی انتظار میرود، انواع نسخههای کپی و یا توسعه یافته توسط افرادی جز کمپانی اصلی در بازار موجود است که پرداختن به آنها خارج از حوصلهی این پست است. در هر صورت، میتوانید یک نمونه از این ماژول را از فروشگاههای زیر تهیه نمایید:
فروشگاه ای سی ای (اسم فروشگاهش رو دوست ندارم!)
اگر هم حرفه ای هستید میتوانید از این سایت برای کارهای خاص کمک بگیرید.
سوت دوم؛ آمادهسازی محیط توسعه
برای کدنویسی این ماژول از محیط توسعهی Arduino استفاده میکنم، پس لازم است که با زبان C آشنا باشید. مراحلی که توضیح میدهم از اینجا برداشت شده است.
الف؛ دریافت Arduino IDE و نصب آن
ب؛ تنظیم Board Manager، به منوی File->Preferences رفته و در قسمت Additional Board Manager URLs عبارت http://arduino.esp8266.com/stable/package_esp8266com_index.json را وارد نمایید.
ج؛ نصب پکیجهای مربوط به ESP8266، به قسمت Tools->Board->Board Manager بروید.
و در آنجا عبارت ESP8266 را جستجو نمایید. چنانچه پکیج مربوط به آن نصب نشده است، آن را نصب نمایید.
د؛ حالا همه چیز آماده است. کافی است تا در قسمت Tools->Boards، بردی که در حال کار با آن هستید را انتخاب کنید.
سوت سوم؛ برنامهی خودتان را بنویسید
برنامههای از پیش نوشته شدهی بسیاری در اینترنت موجود است که میتوانید با استفاده از آنها برنامهی خودتان را توسعه دهید. به عنوان مثال من به دنبال کاربردی بودم که بتوانم بستههای UDP را از گوشی برای یک برد سختافزاری ارسال کنم. ماژول NodeMCU وظیفهی دریافت این بستهها و سپس ارسال آنها بر روی پورت UART را بر عهده داشت. تصویر زیر نمایی کلی از برنامه را نمایش میدهد.
این برنامه فقط دارای سه جزء ساده است.
اول؛ include ها و تعریف متغیرها
هدر ESP8266WiFi برای کار با هستهی وای فای و WiFiUdp برای ارسال و دریافت بستههای UDP اضافه شده است.
متغیر ssid و password برای اتصال به شبکهی وای فای مورد استفاده قرار میگیرند. نام شبکه خودتان و رمز آن را در این قسمت از کد وارد نمایید.
متغیر Udp آبجکتی است که برای کار با UDP از آن استفاده میشود. مقدار localUdpPort در هنگام راه اندازی تنظیمات UDP، به عنوان پورتی که ماژول به آن گوش میدهد استفاده میشود. پس لازم است که مقدار آن را مطابق نیاز خودتان تنظیم کنید.
آرایهی incomingPacket دادههای دریافت شده از UDP را ذخیره میکند. البته در کاربرد من، این مقدار از سی بایت تجاوز نمیکند پس به همین آرایهی سی بایتی اکتفا کردهام.
دوم؛ پیکربندی اولیه
روتین setup برای پیکربندی اولیهی ماژول استفاده میشود و پس از هر بار روشن شدن (ریست شدن) سیستم، در ابتدای کار، یکبار اجرا میشود.
در ابتدا پورت UART با سرعت 19200 بیت در ثانیه تنظیم شده است. در خطوط بعدی، ماژول تا زمان وصل شدن به شبکهی وای فای صبر میکند و به محض اتصال، پیغامی مبتنی بر اتصال را بر روی UART ارسال میکند.
در پایان این روتین نیز، ارتباط UDP فعال میشود و به طور مستمر، ماژول بر روی پورت تعیین شده، به دادههای دریافتی گوشی میدهد.
سوم؛ برنامهی ابدی
روتین loop تا ابد (تا زمانی که ماژول روشن است) همواره و به صورت چرخشی اجرا میگردد.
چنانچه بستهی UDP بر روی پورت مورد نظر دریافت شود، تابع parsePacket تعداد بایتهای دریافتی را برمیگرداند. در صورت غیر صفر بودن، بستهی دریافتی توسط تابع read بر روی آرایهی incomingPacket کپی میشود و در نهایت تابع printf آن را بر روی UART قرار میدهد . این فرایند تا ابد ادامه پیدا میکند.