آموزش رزبری پای رزبری پای میکروپایتون Micropython

راه اندازی جوی استیک با MicroPython میکروپایتون و برد رزبری پای پیکو

setup-joy-stick-with-micropython-and-raspberry-pi-pico-digispark
نوشته شده توسط پریسا پوربلورچیان

جوی استیک یک ماژول دو محوره آنالوگ با قابلیت اندازه گیری دو محور X , Y است. تا به حال هر پروژه ای با جوی استیک کار شده است، از سی پلاس پلاس برای راه اندازی استفاده شده است. در این آموزش با زبان برنامه نویسی میکروپایتون Micropython  و توسط برد رزبری پای پیکو Raspberry Pi PICO با نرم افزار Thonny IDE جوی استیک را تست خواهیم کرد. در ادامه راه اندازی جوی استیک با MicroPython با مرجع تخصصی میکروپایتون به زبان فارسی، دیجی اسپارک همراه باشید.

راه اندازی جوی استیک با میکروپایتون Micropython رزبری پیکو - دیجی اسپارک

 


استفاده از ADC Micropython


در دنیای واقعی ، سیگنال های آنالوگ به طور مداوم مقادیری را تغییر می دهند که از منابع و سنسورهای مختلفی گرفته می شوند که می توانند صدا ، نور ، دما یا حرکت را اندازه گیری کنند و بسیاری از سیستم های دیجیتال با اندازه گیری سیگنال های آنالوگ از این مبدل ها با محیط خود در ارتباط هستند. در حالی که سیگنال های آنالوگ به صورت مداوم دیتا را تغییر میدهند و از سمتی دیگر بردهای دیجیتال با سیگنال باینری کار می کنند که فقط دارای دو حالت گسسته هستند ، منطق “۱” (HIGH) یا منطق “۰” (LOW). یا یک یا صفر اولین نکته ای که همیشه برای یادگیری از آن استفاده می‌شود. دنیای دیجیتال فقط عدد ۱ یعنی فعال و عدد صفر یعنی غیرفعال را درک می‌کند. اما در دنیای آنالوگ بین ۰ و ۱ هزاران عدد وجود دارد که توسط سیگنال های آنالوگ قابل تفکیک است.اکثر میکروکنترلرها دارای ADC داخلی هستند و همچنین قابلیت اتصال ADC خارجی به میکروکنترلر هم از طریق پروتکل ارتباطی I2C به میکروکنترلرها فراهم شده است. معمولا مبدل های ADC بین ۱۰ تا ۱۲ بیتی هستند که بین ۱۰۲۴ تا ۴۰۹۶ سطح متفاوتی دارند.

کلاس ADC یک رابط برای تبدیل آنالوگ به دیجیتال فراهم می‌کند که ولتاژ پیوسته ای ایجاد کرده که میتوان ولتاژ را به یک مقدار از هم گسستته تبدیل کرد. روش فراخوانی کلاس به صورت زیر است. توسط دستور اول یک آبجکت ADC ساخته شده که به یک پایه نسبت داده می‌شود. سپس در دستور دوم مقدار خام آنالوگ از ورودی خوانده شده و این عدد دریافتی بین بازه ی ۰ تا ۶۵۵۳۵ خواهد بود.

import machine

adc = machine.ADC(pin)   # create an ADC object acting on a pin
val = adc.read_u16()     # read a raw analog value in the range 0-65535

 


جوی استیک JoyStick


بسیاری از پروژه‌های رباتیک نیاز به کنترل خروجی‌ها در جهت‌های مختلف دارند. از کنترل یک ربات پرنده گرفته تا هدایت ماشین کنترلی، همگی به جوی استیک نیاز دارند. ماژول جوی استیک با توجه به ساختار اهرمی مانند آن از دو پتانسیومتر در زوایه ۹۰ درجه بر روی یک پایه تشکیل شده ‌است. این ماژول در حالتی که اهرم‌ها هیچ حرکتی در راستای محور X و Y ندارند، خروجی ولتاژ ۲٫۵ ولت را تولید می‌کند. با حرکت شافت جوی استیک در راستای محور X و Y ولتاژ خروجی از ۰ تا ۵ ولت DC تغییر خواهد کرد. به هنگام اتصال ماژول به میکروکنترلر در حالت شافت ثابت، در خروجی مقادیری حدود ۵۱۲ را مشاهده خواهید کرد. سپس با جا به جایی شافت جوی استیک در راستای محور X و Y مقادیر بین ۰ تا ۱۰۲۳ تغییر خواهد کرد. حرکت جهت دار شافت جوی استیک توسط دو پتانسیومتر ۱۰ کیلو انجام شده و هر پتانسیومتر برای یک محور در نظر گرفته شده استماژول جوی استیک JoyStickدارای ۴ پایه به ترتیب GND , 5v , VRx , VRy , SW می‌باشد. پایهVRx مربوط به تغییرات اهرم در راستای محور X یا همان محور افقی می‌باشد. پایه VRy مربوط به تغییرات اهرم جوی استیک درراستای محور Yیا همان محور عمودی می‌باشد. پایه SW مربوط به کلید فشاری بر روی ماژول می‌باشد. در حالت عادی خروجی پین SW ، برابر با ۵ ولت DC است و در صورت فشار دادن کلید ولتاژ خروجی پایه SW به ۰ ولت تغییر می‌کند.

 


پایه های ADC در PICO


تراشه RP2040 در مجموع دارای ۵ کانال ADC است که چهار پایه از آن ها به صورت ۱۲ بیت SAR است که به ترتیب GP26, GP27, GP28 و GP29 است. سیگنال ورودی برای ADC0,ADC1,ADC2, ADC3 به ترتیب به پایه های  GP26, GP27,GP28,GP29 وصل شده است. بر روی برد پیکو GP29 مستقیم به VSYS وصل شده است. رنج استاندارد ADC بین ۰ تا ۳٫۳ ولت است. هر ۵ کانال ADC به سنسور دمای داخلی برد متصل است و برای اندازه گیری دما هم استفاده می‌شود.  رابط ADC در RP2040 فاقد رفرنس است و به همین دلیل از تغذیه ۳٫۳ ولت داخلی تراشه استفاده می‌کند. در پیکو پایه ADC_AVDD از SMPS 3.3 ولت با استفاده از فیلتر R-C تغذیه می‌شود. ADC جریان زیادی در مدار مصرف میکند تا جایی که در صورت غیرفعال بودن حسگر دما تا حدود ۱۵۰ میلی آمپر جریان کشیده و به همین دلیل جریان ماسفت برابر ۱۵۰μA*200 = ~30mV خواهد بود. با استفاده از تغییر مقاومت بین پایه VREF و پایه ۳٫۳ ولت میتواند تا حدودی ماسفت و نویز ایجاد شده را کاهش دهد. برای استفاده از پایه های ADC کافیست از پین های GP26-GP27 و GP28 استفاده کنید.

پایه های ADC در جوی استیک با پیکو - دیجی اسپارک

 


اتصال جوی استیک به رزبری پای پیکو


برای اتصال جوی استیک به رزبری پای پیکو به دو کانال ADC نیاز است. رزبری پای پیکو از سه کانال ADC برخوردار است که ما از ADC0 , ADC1 استفاده می‌کنیم.

 

اتصال جوی استیک به برد رزبری پای پیکو Pico - دیجی اسپارک

 


کد میکروپایتون راه اندازی جوی استیک


برای تست پروژه از نرم افزار Thonny IDE استفاده می‌کنیم. کد را کپی و به نرم افزار انتقال دهید. برای ذخیره حتما یک نام با پسوند py انتخاب کنید. سپس محل ذخیره کد نوشته شده را در This Computer و یا Raspberry Pi Pico انتخاب کنید. دقت داشته باشید حتما فریمور میکروپایتون برای رزبری پای پیکو را انتخاب و به روز رسانی کنید.

from machine import ADC, Pin
from time import sleep
joyX = ADC(0)
joyY = ADC(1)
lastX = 0
lastY = 0

while True:
    valjoyX = joyX.read_u16()
    valjoyY = joyY.read_u16()
    sleep(0.5)
    if valjoyX!=lastX or valjoyY!=lastY:
        print("X:", valjoyX, "Y", valjoyY)
        lastX=valjoyX
        lasyY=valjoyY

 

برای ذخیره ی برنامه و اجرا بر روی RUN کلیک کنید. در Shell مقادیر دو محور X , Y نمایش داده می‌شود. با حرکت شافت جوی استیک در دو محور X , Y مقادیر تغییر کرده و هر بار مقدار جدید بر روی Shell چاپ و پریینت می‌شود.

X: 31367 Y 30887
X: 31399 Y 30919
X: 31319 Y 30823
X: 30887 Y 30647
X: 64991 Y 30775
X: 30791 Y 128

 

راه اندازی جوی استیک با MicroPython - دیجی اسپارک

 

در ابتدا برای نوشتن کد از ماژول machine دو کلاس ADC , Pin فراخوانی می‎‌شود.

from machine import ADC, Pin

 سپس برای زمان بندی از کلاس تایم Time استفاده می‌کنیم.

from time import sleep

 

با توجه به اینکه جوی استیک دو محوره است، برای دو محور X , Y باید دو ADC تعریف کنیم. طبق Pin.out رزبری پای پیکو ADC0 , ADC1 به ترتیب به GP27 , GP26 متصل است. در کد برنامه تعریف می‌کنیم.

joyX = ADC(0)
joyY = ADC(1)

 

سپس آخرین وضعیت را مساوی صفر قرار میدهیم.

lastX = 0
lastY = 0

 

برای خواندن مقادیر از دو کانال ADC از کلاس ADC استفاده می‌کنیم.

valjoyX = joyX.read_u16()
    valjoyY = joyY.read_u16()

 

شرط نویسی میکنیم اگر مقادیر خوانده شده از محور X با آخرین مقداری که محور داشته است برابر نباشد و یا برای محور Y به همین صورت باشد، آخرین مقادیر کانال ADC هر دو محور را در خروجی برای ما جاپ کند.

if valjoyX!=lastX or valjoyY!=lastY:
        print("X:", valjoyX, "Y", valjoyY)
        lastX=valjoyX
        lasyY=valjoyY

 

کد نویسی جوی استیک با رزبری پیکو Pico - دیجی اسپارک

 


وسایل مورد نیاز


رزبری پای پیکو

جوی استیک

کابل

 

چنانچه در مراحل راه اندازی برد رزبری پای پیکو Pico و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

درباره نویسنده

پریسا پوربلورچیان

تولید کننده محتوا / کارشناس IOT

زندگی یعنی پژوهش و فهمیدن چیزی جدید

تلاشم بر این است تجربیاتم در زمینه IOT‌ را به بهترین شکل با شما در میان بگذارم.

تبادل نظر و رفع عیب با ثبت دیدگاه