در پروژه میکروپایتون با ESP32، نحوه کنترل موتور DC با برد ESP32 در MicroPython با استفاده از درایور موتور L298N را یاد خواهیم گرفت. ابتدا درایور موتور L298N را به شما معرفی می کنیم و سپس از آن برای یادگیری برخی از روش های کنترل اولیه موتور dc از جمله حرکت شروع، توقف، راست گرد و چپ گرد از طریق بردهای ESP32 خود استفاده می کنیم. قبل از شروع این آموزش آخرین نسخه سیستم عامل MicroPython بر روی بردهای ESP خود نصب کنید، این مورد را در آموزش های پایه میکروپایتون بطور کامل پوشش دادهایم همچنین از آن در برنامه های ادیتوری مانند uPyCraft IDE یا Thonny IDE استفاده خواهیم کرد. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
درایور موتور L298
ماژول درایور موتور L298N از یک IC درایور موتور L298N، رگولاتور ۵ ولتی ۷۸M05، اکتیو کننده ۵ ولت، LED، هیت سینک حرارتی، مقاومت ها و خازن ها تشکیل شده است که همه در یک مدار مجتمع ترکیب شده اند. این درایور به طور گسترده ای در کنترل ربات ها استفاده می شود زیرا می توانیم تا چهار موتور را همزمان کنترل کنیم اما اگر بخواهیم سرعت و جهت را نیز کنترل کنیم این امکان را می دهد تا دو موتور به هم متصل شوند. بنابراین، برای روبات هایی که تا دو چرخ استفاده میکنند بسیار مناسب است. این ماژول عمدتا در رباتیک و در کنترل موتورهای dc و پله ای استفاده می شود.
تراشه ESP32
ESP32 می تواند به عنوان یک سیستم کامل مستقل یا به عنوان یک دستگاه MCU عمل کند و بار اضافی ارتباطات را در پردازنده اصلی برنامه کاهش دهد. ESP32 می تواند با سیستم های دیگر ارتباط برقرار کند تا از طریق SPI عملکرد Wi-Fi و بلوتوث را ارائه دهد. ESP32 با سوئیچ های آنتن داخلی، RF balun، تقویت کننده قدرت، تقویت کننده دریافت، فیلترها و ماژول های مدیریت توان یکپارچه شده است. ESP32 با حداقل الزامات برد مدار چاپی (PCB) ، عملکرد و تطبیق پذیری بی نظیری را به برنامه های شما اضافه می کند. برد ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش میباشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC میباشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی میباشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته میشود.
وسایل مورد نیاز
شرح پروژه میکروپایتون
در این آموزش با استفاده از برد ESP32 و همچنین میکروپایتون قصد داریم تا یک الی چند موتور DC را کنترل کنیم. من از ادیتور uPyCraft استفاده میکنم. کافیست کدهای توسعه داده شدهی میکروپایتون را به این محیط و یا هر محیط دیگری که با آن آشنایی دارید، اضافه کنید. به واسطه این درایور قادر خواهیم بود سرعت و جهت چرخش موتور DC خود را کنترل کنیم به شکل ساعتگرد و پادساعتگرد. ابتدا برای کار با این درایور در محیط کدنویسی باید یک کتابخانه برای معرفی و نحوه کنترل کامل این درایور بسازیم و در ادامه در یک فایل جداگانه سناریو مدنظر را اجرا کنیم.
اتصالات پروژه
در این پروژه ما از پین های خروجی A برای کنترل موتور استفاده خواهیم کرد. بنابراین ENA سرعت و IN1 و IN2 جهت چرخش موتور را تنظیم می کنند. برای ESP32، ما پین های GPIO13 به ENA متصل میکنیم. GPIO5 و GPIO4 به ترتیب با IN1 و IN2 متصل خواهند شد. هنگام اتصال برد ESP و ماژول درایور می توانید پین های مناسب GPIO را با توجه به کد خود انتخاب کنید. موتور dc دارای ولتاژ ۶ الی ۱۲ ولت است و برای راه اندازی به مقدار بالایی جریان نیاز دارد. به همین دلیل از یک منبع تغذیه خارجی برای موتور dc استفاده خواهیم کرد. از آنجایی که میتوانیم از هر منبع از ۶ الی ۱۲ ولت استفاده کنیم، یک باتری ۹ ولتی برای این پروژه مناسب خواهد بود.
ساخت کتابخانه میکروپایتون
همانطور که پیش تر ذکر شد برای کد نویسی با میکروپایتون نیاز به ایجاد کتابخانه مد نظر متناسب با ماژول و سنسور مورد استفاده نیاز داریم. در این پروژه نیز ابتدا از کد زیر به عنوان کتابخانه اصلی برای کنترل کامل L298 استفاده خواهیم کرد. در ادیتور خور یک فایل با پسوند .py ایجاد کنید نام آن را dcmotor قرار دهید. در ادامه پروژه و کد اصلی با استفاده از این ماژول ساخته شده اقدام به اجرای سناریوی مدنظر خواهیم کرد.
class DCMotor: def __init__(self, pin1, pin2, enable_pin, min_duty=750, max_duty=1023): self.pin1=pin1 self.pin2=pin2 self.enable_pin=enable_pin self.min_duty = min_duty self.max_duty = max_duty def forward(self,speed): self.speed = speed self.enable_pin.duty(self.duty_cycle(self.speed)) self.pin1.value(1) self.pin2.value(0) def backwards(self, speed): self.speed = speed self.enable_pin.duty(self.duty_cycle(self.speed)) self.pin1.value(0) self.pin2.value(1) def stop(self): self.enable_pin.duty(0) self.pin1.value(0) self.pin2.value(0) def duty_cycle(self, speed): if self.speed <= 0 or self.speed > 100: duty_cycle = 0 else: duty_cycle = int(self.min_duty + (self.max_duty - self.min_duty)*((self.speed-1)/(100-1))) return duty_cycle
در این کد هر بخش یک تابع برای انجام تسک های مورد نیاز و قابل اجرا بوسیله درایور L298 است. برای مثال کد زیر که در توابع بالا نیز قابل مشاهده است برای کنترل موتور به شکل پادساعتگرد میباشد که در کد اصلی تنها با فراخوانی این تابع قادر به اجرایی کردن آن خواهیم بود.
def backwards(self, speed): self.speed = speed self.enable_pin.duty(self.duty_cycle(self.speed)) self.pin1.value(0) self.pin2.value(1)
بررسی و آپلود کد اصلی
برای اجرای سناریوی مدنظر یک فایل جدید ایجاد میکنیم با اسم main.py که این فایل شامل تمام کدهای اصلی ما است که با وارد کردن کتابخانه dcmotor و فراخوانی توابع مدنظر، به روش های متفاوتی قادر به کنترل موتور DC خواهیم بود. مطمئن شوید که هر دو dcmotor.py و main.py را در یک بخش ذخیره کردید. در کد اصلی با وارد کردن ماژول dcmotor که قبلا ایجاد کردیم، به جای نوشتن دستورات تکراری، با یک دستور قادر به کنترل موتور خواهیم بود. همچنین کلاسهای pin و pwm را از ماژول ماشین وارد میکنیم تا موارد ذکر شده قابل فهم برای کد ما باشند. همچنین از کلاس sleep برای ایجاد تاخیر بین هر دستور اجرایی استفاده میکنیم.
from dcmotor import DCMotor from machine import Pin, PWM from time import sleep frequency = 15000 pin1 = Pin(5, Pin.OUT) pin2 = Pin(4, Pin.OUT) enable = PWM(Pin(13), frequency) dc_motor = DCMotor(pin1, pin2, enable) dc_motor = DCMotor(pin1, pin2, enable, 350, 1023) dc_motor.forward(50) sleep(10) dc_motor.stop() sleep(10) dc_motor.backwards(100) sleep(10) dc_motor.forward(60) sleep(10) dc_motor.stop()
در این کد ما پین ۱ و پین ۲ را به عنوان پایه های خروجی که هر کدام به ترتیب با GPIO5 و GPIO4 متصل هستند، مقداردهی اولیه می کنیم. پین ENA، پایه PWM در GPIO13 با فرکانس تنظیم شده ۱۵۰۰۰ مشخص شده است. در مرحله بعد، آبجکت DCMotor به نام “dc_motor” را مقداردهی اولیه می کنیم و به آن دسترسی به IN1، IN2 و ENA می دهیم. برای حرکت دادن موتور به جلو و عقب ما از روش های مربوط به آنها استفاده می کنیم که قبلا در ماژول dcmotor تعریف کرده ایم. همچنین مقادیر مختلف سرعت را بین ۰ الی ۱۰۰ مشخص می کنیم و این را به عنوان پارامتر داخل متدها ارسال می کنیم.
نتیجه نهایی
در نهایت پس از آپلود کد های ذکر های شده مانند کتابخانه درایور مدنظر و همچنین کد مربوط به سناریو اصلی، موتور DC متصل شده به درایور l298 با توجه به مقادیر از قبل مشخص شده در کد برنامه یعنی فایل main.py تغییرات در جهت مدنظر را انجام خواهد داد. در کد برنامه با توجه توضیحاتی که در پروسه اجرای قادر خواهیم بود بصورت سخت افزاری جهت چرخش و بصورت نرم افزاری سرعت موتور را تغییر دهیم.
کلام آخر با سایفر
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.