تابحال به روش های مختلفی اقدام به تولید سیگنال pwm و در نتیجه کنترل سروو موتور ها کردهایم، در این آموزش قصد داریم بصورت متفاوتی این کار را انجام دهیم، یعنی با استفاده از یک وب سرور که توسط برد Wemos ما اجرا میشود قادر خواهیم میزان pwm را کنترل و در نتیجه مقدار چرخش سروو موتور مدنظر را کنترل کنیم. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
سروو موتور SG90
سروو موتور نوعی موتور است که می تواند با دقت زیادی بچرخد. به طور معمول این نوع موتور از یک مدار کنترل تشکیل شده است که بازخوردی را در مورد موقعیت فعلی شافت موتور ارائه می دهد، این بازخورد به موتورهای سروو اجازه می دهد تا با دقت زیادی بچرخند. انواع سرو موتورها بر اساس کاربرد آنها در انواع مختلف طبقه بندی می شوند ، مانند سروو موتور AC و موتور سروو DC.
وب سرور WebServer
وب سرورها برنامه هایی هستند که مسئولیت آن ها قبول کردن درخواست های Http است که از سمت کاربران ارسال می شود، وب سرور ها در پاسخ اطلاعاتی را ارسال می کنند که ما معمولا به نام صفحات Html میشناسیم. خب حالا فرض کنیم که در مرورگر https://digispark.ir را سرچ کردیم، اتفاقی که میافتد به این شکل است که مرورگر شما یک درخواست به دامنهای با نام digispark.ir ارسال میکند. در حالت عادی زمانی که شما آدرس سایتی را در مرورگر جست و جو میکنید از حروف انگلیس استفاده میکنید یعنی کلماتی قابل فهم برای انسان اما در واقع برای ورود به یک سایت باید از طریق ip آن اقدام کنید، اینجاست که مفهومی به نام DNS وارد کار میشود، پس در واقع زمانی که شما URL سایتی را جستجو می کنید مرورگر از طریق سرویس DNS، آی پی مربوط را پیدا میکند و درخواستی ارسال خواهد کرد.
موج مربعی یا PWM
موج مربعی یا pwm یا Pulse Width Modulation به معنی مدولاسیون پهنای پالس، روشی برای تنظیم توان الکتریکی، با تغییردادن زمان قطع و وصل شدن منبع در هر سیکل است. در واقع pwm یک سیگنال مربعی میباشد که در یک زمان می تواند ۱ یعنی ۵لت و یا ۰ که یعنی ۰ولت باشد که در این بین ما با تغییر Duty Cycle به نتیجه دلخواه که در نور led، حرکت در سروو و موارد دیگر می شویم. برای مثال اگر Duty Cycle یک موج PWM برابر با ۸۰% باشد یعنی در هر سیکل ۸۰% ولتاژ برابر ۵ولت و ۲۰% ولتاژ برابر۰ است.در شکل زیر PWM نشان داده شده است.
نحوه کار این پروژه
در این پروژه ابتدا با استفاده از برد Wemos که از تراشه ESP8266 استفاده میکند، یک وب سرور در پورت ۸۰ اجرا میکنیم و همچنین صفحه را بر اساس نیاز سفارشی سازی میکنیم که در این سناریو نیاز به یک اسلایدر برای تغییر مقادیر pwm داریم. در ادامه با تغییر مقادیر اسلایدر از ۰ تا ۱۸۰ قادر خواهیم بود سروو موتور متصل شده به Wemos را کنترل کنیم.
وسایل مورد نیاز
شماتیک و اتصالات
در اولین بخش برای راهاندازی پروژه اقدام به برقراری اتصالات خواهیم کرد. در این پروژه برای راهاندازی سروو موتور SG90 از یکی پین های pwm برد ESP8266 استفاده خواهیم کرد. که در این مورد من از پین D4 استفاده خواهم کرد البته میتوانید با تغییر بخشی از کد این مورد را با توجه به علاقه و نیاز خود تغییر دهید. اتصالات را با توجه به شماتیک و جدول زیر برقرار کنید.
- شمایک پروژه کنترل زاویه سروو موتور SG90 بوسیله وب سرور ESP8266
لازم به ذکر تمام پین های IO در Wemos بجز D0 و A0 از pwm پشتیبانی میکنند، پس میتوانید این پروژه تا تعداد زیادی برای کنترل سروو های بیشتر توسعه دهید.
کد و تحلیل کنترل سرو موتور
در ادامه برای راهاندازی پروژه نیاز به آپلود کد داریم، اما ابتدا بخش های مهم و قسمت هایی که نیاز به توضیح دارند را بررسی خواهیم کرد. ابتدا کتابخانه های مورد نیاز را فراخوانی خواهیم کرد. در این پروژه تنها از کتابخانه های servo و ESP8266WiFi استفاده خواهیم کرد.
#include <ESP8266WiFi.h> #include <Servo.h>
در این خط از کد پین مدنظر برای اتصال پایه سیگنال سروو موتور SG90 را مشخص میکنیم.
static const int ServoGPIO = D4;
در ادامه اطلاعات شبکه وایفای مدنظر برای اتصال برد را معرفی میکنیم.
const char* ssid = "C1F3R"; const char* password = "314159265";
این بخش از کد مربوط به ظاهر و فانکشن های صفحه وب ساخته شده است، که میتوانید در صورت نیاز آن را تغییر دهید و با سلیقه خود آن را شخصی سازی کنید.
client.println("<!DOCTYPE html><html>"); client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); client.println("<link rel=\"icon\" href=\"data:,\">"); client.println("<style>body { text-align: center; font-family: \"Trebuchet MS\", Arial; margin-left:auto; margin-right:auto;}"); client.println(".slider { width: 500px; }</style>"); client.println("<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>"); client.println("</head><body><h1></h1>"); client.println("<p><span id=\"servoPos\"></span></p>"); client.println("<input type=\"range\" min=\"0\" max=\"180\" class=\"slider\" id=\"servoSlider\" onchange=\"servo(this.value)\" value=\""+valueString+"\"/>"); client.println("<script>var slider = document.getElementById(\"servoSlider\");"); client.println("var servoP = document.getElementById(\"servoPos\"); servoP.innerHTML = slider.value;"); client.println("slider.oninput = function() { slider.value = this.value; servoP.innerHTML = this.value; }"); client.println("$.ajaxSetup({timeout:1000}); function servo(pos) { "); client.println("$.get(\"/?value=\" + pos + \"&\"); {Connection: close};}</script>"); client.println("</body></html>");
کد کامل پروژه کنترل زاویه سروو موتور SG90 بوسیله وب سرور ESP8266
#include <ESP8266WiFi.h> #include <Servo.h> Servo ObjServo; static const int ServoGPIO = D4; const char* ssid = "C1F3R"; const char* password = "314159265"; WiFiServer server(80); String header; String valueString = String(0); int positon1 = 0; int positon2 = 0; void setup() { Serial.begin(115200); ObjServo.attach(ServoGPIO); Serial.print("Making connection to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.begin(); } void loop(){ WiFiClient client = server.available(); if (client) { String header = client.readStringUntil('\r'); client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); client.println("<!DOCTYPE html><html>"); client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); client.println("<link rel=\"icon\" href=\"data:,\">"); client.println("<style>body { text-align: center; font-family: \"Trebuchet MS\", Arial; margin-left:auto; margin-right:auto;}"); client.println(".slider { width: 500px; }</style>"); client.println("<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>"); client.println("</head><body><h1></h1>"); client.println("<p><span id=\"servoPos\"></span></p>"); client.println("<input type=\"range\" min=\"0\" max=\"180\" class=\"slider\" id=\"servoSlider\" onchange=\"servo(this.value)\" value=\""+valueString+"\"/>"); client.println("<script>var slider = document.getElementById(\"servoSlider\");"); client.println("var servoP = document.getElementById(\"servoPos\"); servoP.innerHTML = slider.value;"); client.println("slider.oninput = function() { slider.value = this.value; servoP.innerHTML = this.value; }"); client.println("$.ajaxSetup({timeout:1000}); function servo(pos) { "); client.println("$.get(\"/?value=\" + pos + \"&\"); {Connection: close};}</script>"); client.println("</body></html>"); if(header.indexOf("GET /?value=")>=0) { positon1 = header.indexOf('='); positon2 = header.indexOf('&'); valueString = header.substring(positon1+1, positon2); ObjServo.write(valueString.toInt()); Serial.println(valueString); } header = ""; client.stop(); Serial.println(""); } }
جمع بندی
در این پروژه با ساخت یک وبسرور به کمک برد Wemos که از تراشه ESP8266 استفاده میکند. توانستیم یک صفحه وب را اجرا کنیم که در آن با استفاده از یک اسلایدر مقادیر pwm را در برد ESP8266 که به پایه D4 نسبت داده بودیم. بطوری تغییر بدهیم که شافت سرو موتور از ۰ تا ۱۸۰ درجه به دلخواه ما تغییر کند. البته با تغییر کد و اضافه کردن المان هایی قادر خواهید بود تعداد بیشتری سروو موتور SG90 را کنترل کنید.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام من نمیتونم ip رو در سریال مانیتور بگیرم
با سلام
تنظیمات سریال مانیتور را بررسی کنید و مجددا نتیجه را اعلام بفرمایید.