کنترل جوی استیک فرمان آردوینو. جوی استیک آردوینو - اتصال و طرح. اتصال به برد آردوینو

این یک ماژول ورود اطلاعات است. با کمک آن می‌توانید ربات‌ها، دستکاری‌کننده‌ها، ابزارهای ماشینی، مدل‌های مختلف (ماشین‌ها، تانک‌ها، هواپیماها، هلیکوپترها، کوادکوپترها، قایق‌ها و غیره) را کنترل کنید، همچنین می‌توانید از آن برای ایجاد کنسول‌های بازی، انتخاب آیتم‌های منو روی نمایشگرها و نشانگرها استفاده کنید. مقادیر و غیره را وارد کنید جوی استیک را نه تنها می توان در امتداد محورهای X و Y حرکت داد، بلکه روی آن نیز کلیک کرد.

ویدئو:

مشخصات:

  • ولتاژ تغذیه: 5 ولت / 3.3 ولت (هر دو ولتاژ در محدوده قابل قبول هستند).
  • مصرف برق:< 10 мА
  • ابعاد: 30x30 میلی متر

تمام ماژول های خط "Trema" در قالب یکسان ساخته شده اند

ارتباط:

  • پین های "X" و "Y" ماژول به هر ورودی آنالوگ آردوینو متصل می شوند. با حرکت جوی استیک از چپ به راست و از پایین به بالا، مقادیر خوانده شده از این پین ها افزایش می یابد.
  • پین K دیجیتال است و به هر پایه ای در آردوینو متصل می شود. در حالت عادی یک سطح منطقی "0" دارد و وقتی جوی استیک را فشار می دهید به "1" منطقی تبدیل می شود.
  • پایه های V و G پایه های پاور هستند.

بسته به موقعیت، اتصال ماژول به 3 روش راحت است:

روش - 1:با استفاده از کابل روبان سیمی و پیرانا UNO

با استفاده از سیم های "پدر - مامان" مستقیماً به کنترلر UNO Piranha متصل می شویم


روش - 2: استفاده از Trema Set Shield

ماژول را می توان به هر یک از ورودی های آنالوگ Trema Set Shield متصل کرد.


روش - 3: با استفاده از کابل روبان سیمی و شیلد

با استفاده از کابل نواری 5 سیم، به ترما شیلد، ترما پاور شیلد، موتور شیلد، ترما شیلد نانو و غیره.


تغذیه:

یک ولتاژ ورودی 5 ولت یا 3.3 ولت DC به پین ​​های Vcc (V) و GND (G) عرضه می شود.

اطلاعات بیشتر در مورد ماژول:

داده های ماژول از دو پتانسیومتر و یک دکمه تدبیر که به صورت مکانیکی به اهرم جوی استیک متصل است خوانده می شود. دکمه به قطع منبع تغذیه Vcc و خروجی "K" متصل است که از طریق یک مقاومت به GND فشار داده می شود. بنابراین، تنها دو حالت را می توان در خروجی "K" تنظیم کرد: منطقی "0" (دکمه آزاد شده) یا "1" (دکمه فشار داده شده). پین های مختصات "X" و "Y" خروجی های آنالوگ ماژول هستند، آنها به پتانسیومتر متصل می شوند به طوری که ولتاژ گرفته شده بین این پایه ها و GND با جابجایی جوی استیک از چپ به راست و از پایین به بالا افزایش می یابد.

مثال ها:

تعیین موقعیت جوی استیک و روشن کردن LED با فشار دادن یک دکمه

const int8_t Xaxis = A0; // تعداد پینی که کنتاکت محور X جوی استیک به آن متصل است را تعیین کنید const int8_t Yaxis = A1; // تعداد پینی که تماس محور Y جوی استیک به آن متصل است را تعیین کنید const int8_t Button = 2; // تعداد پینی که تماس دکمه جوی استیک به آن متصل است را تعیین کنید const int8_t LED = 7; // شماره پینی که LED به آن متصل است را تعیین کنید uint16_t XborderMIN = 505; // مرز مقادیر را در زیر تنظیم کنید که در نظر گرفته می شود که جوی استیک در امتداد محور X به سمت چپ منحرف می شود uint16_t XborderMAX = 515; // مرز مقادیر را در بالای آن تنظیم کنید که در نظر گرفته می شود که جوی استیک در امتداد محور X به سمت راست منحرف می شود uint16_t YborderMIN = 505; // حد مقادیر را در زیر تنظیم کنید که در نظر گرفته می شود که جوی استیک در امتداد محور Y به سمت پایین منحرف شده است uint16_t YborderMAX = 515; // مرز مقادیر را در بالا تنظیم کنید که در نظر گرفته می شود که جوی استیک در امتداد محور Y به سمت بالا منحرف شده است uint16_t Xvol = 0, Yvol = 0; // متغیرهایی را تنظیم کنید که مقادیر خوانده شده از محورهای جوی استیک () void setup () (Serial.begin (9600)؛ // شروع انتقال داده به مانیتور پورت سریال pinMode (LED، OUTPUT)؛ // پیکربندی خروجی LED برای کار در حالت خروجی pinMode (دکمه، INPUT)؛ // پین دکمه را برای کار در حالت ورودی تنظیم کنید) حلقه خالی () (Xvol = analogRead (Xaxis)؛ // خواندن مقادیر محور X Yvol = analogRead (Yaxis)؛ // خواندن مقادیر محور If (Xvol< XborderMIN) { // Проверяем, полученное значение Х меньше нижней границы центрального положения или нет. Если да, то if (Yvol < YborderMIN) { // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то Serial.println("Left-Down"); // значит джойстик находится в положении ВЛЕВО-ВНИЗ } else if (Yvol >YborderMAX) (// اگر مقدار Y دریافتی بزرگتر از مرز بالایی موقعیت مرکزی باشد، Serial.println ("چپ-بالا")؛ // به این معنی است که جوی استیک در موقعیت چپ-بالا قرار دارد) other (Serial. println ("سمت چپ")؛ // اگر مقدار Y به دست آمده در محدوده موقعیت مرکزی در امتداد محور Y باشد، جوی استیک به سمت چپ منحرف می شود)) وگرنه اگر (Xvol> XborderMAX) (// بررسی کنید آیا X به دست آمده مقدار بزرگتر از مرز بالایی موقعیت مرکزی است یا خیر. اگر بله، پس اگر (Yvol< YborderMIN) { // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то Serial.println("Right-Down"); // значит джойстик находится в положении ВПРАВО-ВНИЗ } else if (Yvol >YborderMAX) (// اگر مقدار Y دریافتی بزرگتر از مرز بالایی موقعیت مرکزی باشد، Serial.println ("راست-بالا")؛ // به این معنی است که جوی استیک در موقعیت RIGHT-UP قرار دارد) other (Serial. println ("راست")؛ // اگر مقدار Y دریافتی در مرزهای موقعیت مرکزی در امتداد محور Y قرار گیرد، جوی استیک به سمت راست منحرف می شود)) other (// اگر مقدار X دریافتی در محدوده ها قرار گیرد موقعیت مرکزی در امتداد محور X، سپس اگر (Yvol< YborderMIN) { // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то Serial.println("Down"); // значит джойстик находится в положении ВНИЗ } else if (Yvol >YborderMAX) (// اگر مقدار Y دریافتی بزرگتر از مرز بالای موقعیت مرکزی باشد، Serial.println ("بالا")؛ // به این معنی است که جوی استیک در موقعیت بالا قرار دارد) وگرنه (Serial.println ("مرکز" ")؛ // اگر مقدار Y حاصل در داخل مرزهای موقعیت مرکزی در امتداد محور Y باشد، به این معنی که جوی استیک در مرکز قرار دارد.)) if (digitalRead (Button)) (// بررسی کنید که آیا تاخیر (1) ) دکمه فشار داده شده است؛ // اگر دکمه فشار داده شده است، پس از آن پچ پچ دیجیتالWrite (LED،! digitalRead (LED)) را متوقف کنید؛ // و وضعیت را در خروجی LED Serial.println تغییر دهید ("کلیک دکمه!") ؛ // نمایش متنی که دکمه در آن فشار داده شده است (digitalRead (Button)) () // اگر دکمه نگه داشته شود، هیچ کاری به تاخیر نمی اندازیم (10)؛ // اگر دکمه رها شود، آن را سرکوب می کنیم پچ پچ))

در مانیتور پورت سریال خواهید دید.

یک روز خوب با یک ماژول جوی استیک کوچک جالب در eBay روبرو شدم که بسیار شبیه به آنهایی است که در کنترلرهای پلی استیشن 2 استفاده می شود. معلوم شد که استفاده از ماژول با آردوینو بسیار آسان است و به معنای واقعی کلمه چند دلار قیمت دارد.

چندین تولید کننده جوی استیک برای آردوینو وجود دارد، از جمله Adafruit، Sparkfun و تعداد زیادی از شرکت های چینی. خوشحالم که اصل کار آنها کاملاً یکسان است.

اطلاعات کلی در مورد ماژول جوی استیک برای آردوینو

5 پین روی ماژول وجود دارد: Vcc، Ground، X، Y، کلید. لطفاً توجه داشته باشید که برچسب‌های ماژول شما ممکن است متفاوت باشد. بستگی به سازنده داره جوی استیک آنالوگ است و نسبت به جوی استیک های ساده «جهت دار» که از دکمه ها و سوئیچ های مکانیکی استفاده می کنند، دقت بالاتری ارائه می دهد. علاوه بر این، جوی استیک را می توان فشار داد (در مدل من تلاش مناسبی برای انجام این کار است. ممکن است هنوز توسعه نیافته باشد). پس از فشار دادن، دکمه "فشار برای انتخاب" کار خواهد کرد.

برای خواندن داده ها از پین های X / Y، باید از خروجی های آنالوگ در آردوینو استفاده کنید. وقتی کلید کلید را فشار دهید به زمین متصل می شود. در غیر این صورت در هیچ زنجیره ای شرکت نمی کند. برای خواندن پایدار داده ها از پین های کلید / انتخاب، باید از طریق یک مقاومت کششی به منبع تغذیه (Vcc) متصل شوند. مقدار مقاومت های ساخته شده در آردوینو برای این کار کاملاً کافی است.

یک مثال ویدیویی از نحوه عملکرد جوی استیک با آردوینو را تماشا کنید:

نمودار سیم کشی جوی استیک برای آردوینو

    آردوینو GND - GNG

    ARDUINO A0 - VER / Y

    آردوینو A1 - HOR / X

طرح اولیه برای استفاده از جوی استیک با آردوینو

int buttonPin = 2;

int xPosition = 0;

int yPosition = 0;

int buttonState = 0;

// مقداردهی اولیه تبادل داده از طریق پروتکل سریال در 9600 bps:

Serial.begin (9600);

pinMode (xPin، INPUT)؛

pinMode (yPin، INPUT)؛

// مقاومت pull-up را روی پین دکمه فعال کنید

pinMode (buttonPin، INPUT_PULLUP)؛

// برای نسخه های قدیمی آردوینو (کمتر از 1.0.1)

// pinMode (buttonPin، INPUT);

// digitalWrite (buttonPin، HIGH);

xPosition = analogRead (xPin)؛

yPosition = analogRead (yPin);

buttonState = digitalRead (buttonPin)؛

Serial.print ("X:");

Serial.print (xPosition);

Serial.print ("| Y:");

Serial.print (yPosition);

Serial.print ("| دکمه:");

Serial.println (buttonState)؛

تاخیر (100)؛ // یک تاخیر بین خواندن داده ها اضافه کنید

همانطور که در بالا ذکر شد، ماژول های جوی استیک زیادی تولید می شوند. Sparkfun راه حل جالبی دارد. آنها در حال انتشار Joystick Shield هستند که در ادامه در مورد آن صحبت خواهیم کرد. شکل ظاهری سپر جوی استیک در شکل زیر نشان داده شده است.


مونتاژ سپر جوی استیک

در اینجا قابل ذکر است که سپر بصورت غیر مونتاژ شده عرضه می شود. بنابراین شما باید با یک آهن لحیم کاری کار کنید. دستورالعمل‌های مونتاژ کامل را می‌توانید در این آدرس پیدا کنید: راهنمای اسمبلی Joystick Shield. مواد سازنده به زبان انگلیسی است، اما مواد عکاسی به اندازه کافی وجود دارد. بنابراین تشخیص آن آسان است.

جوی استیک برای چه مواردی قابل استفاده است؟

سپر جوی استیک دارای چهار دکمه در سمت راست، یک دکمه مستقیماً روی جوی استیک و خود جوی استیک آنالوگ است. سپر را می توان برای کنترل ملودی یا پیکسل های روی مانیتور استفاده کرد. می توان از دکمه ها برای هدایت و کنترل بازی ها استفاده کرد.

برای انگیزه بیشتر، ویدیوی زیر را ببینید:

پس از اینکه سپر جوی استیک خود را مونتاژ کردید، می توانید با خیال راحت تغییراتی در طرح ها ایجاد کنید تا وظایف خود را انجام دهید.

چگونه موقعیت فعلی جوی استیک را ردیابی کنیم؟

موقعیت جوی استیک بسته به مقادیر دو پتانسیومتری که در آن نصب شده است محاسبه می شود. جوی استیک در دو جهت حرکت می کند که معمولاً به صورت X و Y نشان داده می شوند. برای خواندن داده ها از پتانسیومترها، از تابع analogRead () استفاده کنید که مقداری در محدوده 0 تا 1023 برمی گرداند. برای این کار، اعداد پین را منتقل کنید. که جوی استیک به عملکرد متصل است. در این مثال به پین ​​آنالوگ 0 برای X و پایه آنالوگ 1 برای Y وصل می کنیم.

Serial.println (analogRead (0)); // موقعیت فعلی مختصات X را نمایش می دهد

Serial.println (analogRead (1)); // موقعیت فعلی مختصات Y را نشان می دهد

یک رویکرد بسیار راحت، استفاده از ثابت ها برای مقادیری است که در طول برنامه تغییر نخواهند کرد. بنابراین در کد زیر، برای پین‌های آنالوگ که استفاده می‌کنیم، ثابت می‌کنیم و موقعیت X و Y فعلی را در نمایشگر سریال Arduino IDE نشان می‌دهیم:

بایت const PIN_ANALOG_X = 0;

بایت const PIN_ANALOG_Y = 1;

Serial.begin (9600);

Serial.print ("x:");

Serial.print ("");

Serial.print ("y:");

Serial.print ("");

Serial.println ();

چگونه جهت فعلی جوی استیک را ردیابی کنیم؟

یک کد بسیار مفید بر اساس مقادیر موقعیت‌های X و Y، می‌توانیم تعیین کنیم که جوی استیک در یکی از هشت جهت (بالا، راست بالا، راست، راست به پایین، پایین، چپ به پایین، چپ، چپ، وسط یا چپ است). -بالا).

از آنجایی که مقادیر در هر جهت در محدوده 0 تا 1023 خواهند بود، می توان فرض کرد که مرکز در محدوده 511-512 باشد. اما اینطور نیست. ما ارزش فعلی را به این دقت دریافت نخواهیم کرد. و اگر مقدار اشتباه را تعیین کنیم، می توانیم اطلاعاتی در مورد حرکت جوی استیک به دست آوریم، اگرچه در مرکز قرار داشت و حرکت نمی کرد.

برای انجام این کار، محدوده‌ای از مقادیر را وارد می‌کنیم و فرض می‌کنیم که هر مقدار در این محدوده مرکز در نظر گرفته می‌شود:

این محدوده "حقیقت نهایی" نیست. شما باید آن را با جوی استیک خود تنظیم کنید، درست است. این مقادیر به صورت ثابت در کد وارد می شوند:

اکنون هر مختصات را از محدوده 0 تا 1023 به محدوده -1 به 1 تبدیل می کنیم. برای مختصات X، 1 به معنای حرکت به سمت چپ، 0 به معنای عدم حرکت و 1 به معنای حرکت به سمت راست است. برای جهت Y، -1 به معنای حرکت رو به پایین، 0 به معنای عدم حرکت و 1 به معنای حرکت به سمت بالا است.

ما با تنظیم مقدار در هر جهت روی 0 ("مرکز") شروع می کنیم. سپس از دستور if / else استفاده می کنیم تا بررسی کنیم که آیا مقدار موقعیت در هر جهت بزرگتر است یا کمتر از محدوده ما:

x_جهت = 0;

y_جهت = 0;

اگر (x_position> X_THRESHOLD_HIGH) (

x_جهت = 1;

) other if (x_position

x_جهت = -1;

اگر (y_position> Y_THRESHOLD_HIGH) (

y_جهت = 1;

) در غیر این صورت (y_position

y_جهت = -1;

Arduino IDE دارای یک تابع map () است که در تئوری می توان از آن به جای if / else استفاده کرد، اما در این مورد این روش به دلیل مسائل مرکزی پیچیده است، بنابراین ما در اینجا از نقشه استفاده نمی کنیم.

در مثال زیر، خواهید دید که بعداً از if / else برای نمایش جهت استفاده می شود - می توانید با خیال راحت این مثال را مطابق با نیازهای خود تغییر دهید:

بایت const PIN_ANALOG_X = 0;

بایت const PIN_ANALOG_Y = 1;

const int X_THRESHOLD_LOW = 505;

const int X_THRESHOLD_HIGH = 515;

const int Y_THRESHOLD_LOW = 500;

const int Y_THRESHOLD_HIGH = 510;

int x_direction;

int y_direction;

Serial.begin (9600);

x_جهت = 0;

y_جهت = 0;

x_position = analogRead (PIN_ANALOG_X);

y_position = analogRead (PIN_ANALOG_Y);

اگر (x_position> X_THRESHOLD_HIGH) (

x_جهت = 1;

) other if (x_position

x_جهت = -1;

اگر (y_position> Y_THRESHOLD_HIGH) (

y_جهت = 1;

) در غیر این صورت (y_position

y_جهت = -1;

اگر (x_جهت == -1) (

اگر (y_جهت == -1) (

Serial.println ("چپ-پایین");

Serial.println ("سمت چپ");

// y_جهت == 1

Serial.println ("سمت چپ");

) وگرنه اگر (x_direction == 0) (

اگر (y_جهت == -1) (

Serial.println ("پایین");

) وگرنه اگر (y_direction == 0) (

Serial.println ("مرکز");

// y_جهت == 1

Serial.println ("بالا");

// x_direction == 1

اگر (y_جهت == -1) (

Serial.println ("راست به پایین");

) وگرنه اگر (y_direction == 0) (

Serial.println ("راست");

// y_جهت == 1

Serial.println ("راست بالا");

چگونه آردوینو را برای ردیابی وضعیت یک دکمه (فشرده شده است) پیکربندی کنم؟

قبل از اینکه بتوانید بفهمید دکمه ای روی محافظ جوی استیک فشار داده شده است یا خیر، باید آردوینو را برای تشخیص دکمه ها پیکربندی کنید. با کمال تعجب، این در بدنه تابع setup () پیاده سازی شده است!

ابتدا برای پین های آردوینو که با دکمه ها مرتبط هستند، ثابت هایی تعریف می کنیم:

// دکمه ای را انتخاب کنید که با فشار دادن جوی استیک کار می کند

بایت Const PIN_BUTTON_UP = 4;

اگر قبلاً از دکمه‌هایی با آردوینو استفاده کرده‌اید، ممکن است متوجه شده باشید که باید از یک مقاومت برای تشخیص ولتاژ هنگام فشار دادن دکمه استفاده کنید. برای کاهش تعداد قطعات، محافظ جوی استیک به گونه ای طراحی شده است که نیازی به مقاومت نیست. ممکن است از خود بپرسید: "اگر دکمه ها به مقاومت نیاز دارند، چرا محافظ بدون آنها کار می کند؟" شما فقط در نظر نگرفتید که آردوینو دارای مقاومت های داخلی است. شما به سادگی می توانید آنها را فعال کنید و با سپر ما از آنها استفاده کنید!

برای استفاده از این مقاومت های pull-up داخلی، پین را روی حالت INPUT قرار دهید و سپس با استفاده از خطوط زیر آن را فعال کنید:

اگر از یک مقاومت کششی استفاده می کنید، مهم است که به یاد داشته باشید که دکمه فشار داده شده HIGH نیست، اما فشار داده شده LOW است.

برای پیکربندی هر پین برای عملکرد در حالت ورودی و فعال کردن مقاومت های کشش، می توانید از کد زیر استفاده کنید:

pinMode (PIN_BUTTON_RIGHT، INPUT)؛

DigitalWrite (PIN_BUTTON_RIGHT، HIGH)؛

چگونه بفهمم که دکمه روی محافظ جوی استیک فشرده شده است؟

پس از غلبه بر نکات قبلی، می توانید با استفاده از عملکرد digitalRead () تعیین کنید که آیا دکمه فشرده شده است یا خیر. وقتی مقدار خوانده شده LOW باشد، دکمه فشار داده می شود و زمانی که مقدار HIGH باشد، دکمه فشار داده نمی شود.

if (DigitalRead (PIN_BUTTON_LEFT) == LOW) (

// دکمه فشار داده شده است

// دکمه فشرده نشده است

مثال زیر وضعیت هر دکمه و مقادیر جوی استیک در مانیتور سریال Arduino IDE را نشان می دهد:

صرف بایت PIN_BUTTON_SELECT = 2;

بایت ثابت PIN_BUTTON_RIGHT = 3;

بایت Const PIN_BUTTON_UP = 4;

بایت ثابت PIN_BUTTON_DOWN = 5;

بایت ثابت PIN_BUTTON_LEFT = 6;

بایت const PIN_ANALOG_X = 0;

بایت const PIN_ANALOG_Y = 1;

Serial.begin (9600);

pinMode (PIN_BUTTON_RIGHT، INPUT)؛

DigitalWrite (PIN_BUTTON_RIGHT، HIGH)؛

pinMode (PIN_BUTTON_LEFT، INPUT)؛

DigitalWrite (PIN_BUTTON_LEFT، HIGH)؛

pinMode (PIN_BUTTON_UP، INPUT)؛

digitalWrite (PIN_BUTTON_UP، HIGH)؛

pinMode (PIN_BUTTON_DOWN، INPUT)؛

digitalWrite (PIN_BUTTON_DOWN، HIGH)؛

pinMode (PIN_BUTTON_SELECT، INPUT)؛

digitalWrite (PIN_BUTTON_SELECT، HIGH)؛

Serial.print ("l:");

Serial.print (digitalRead (PIN_BUTTON_LEFT));

Serial.print ("");

Serial.print ("r:");

Serial.print (digitalRead (PIN_BUTTON_RIGHT));

Serial.print ("");

Serial.print ("u:");

Serial.print (digitalRead (PIN_BUTTON_UP));

Serial.print ("");

Serial.print ("d:");

Serial.print (digitalRead (PIN_BUTTON_DOWN));

Serial.print ("");

Serial.print ("x:");

Serial.print (analogRead (PIN_ANALOG_X));

Serial.print ("");

Serial.print ("y:");

Serial.print (analogRead (PIN_ANALOG_Y));

Serial.print ("");

Serial.print ("s:");

Serial.print (digitalRead (PIN_BUTTON_SELECT));

Serial.print ("");

Serial.println ();

نظرات، سوالات و تجربیات شخصی خود را در زیر به اشتراک بگذارید. ایده ها و پروژه های جدید اغلب در بحث متولد می شوند!

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

بسیاری از پروژه های رباتیک نیاز به جوی استیک دارند. ماژول جوی استیک در آردوینو مشابه مواردی است که در کنسول های بازی استفاده می شود. این کار با تنظیم دو پتانسیومتر در زاویه 90 درجه انجام می شود. پتانسیومترها به یک میله کوتاه که در مرکز آن فنرها قرار دارد متصل می شوند.

این ماژول در حالت استراحت خروجی تقریباً 2.5 ولت از X و Y تولید می کند. حرکت جوی استیک سیگنال خروجی را بسته به جهت آن از 0 ولت به 5 ولت تغییر می دهد. اگر این ماژول را به یک میکروکنترلر متصل کنید، می توانید انتظار داشته باشید که مقدار آن در حالت استراحت حدود 512 باشد.

همانطور که جوی استیک را حرکت می دهید، بسته به موقعیت آن، می توانید مقادیر را از 0 به 1023 تغییر دهید.

اصول کارکرد، اصول جراحی، اصول عملکرد

در کد زیر محورهای X و Y ماژول جوی استیک را به ترتیب برای پایه آنالوگ A0 و A1 تعریف کرده ایم:

#define joysX Ad0 #define joysY As1

اکنون، در کد زیر، پین ۲ آردوینو را برای سوئیچر ماژول جوی استیک مقداردهی می کنیم و مقادیر buttonsdtate و buttonsdtate1 در ابتدای برنامه توصیف شده 0 خواهند بود:

دکمه های Int = 2; int buttonSdtate = 0; دکمه intSdtate1 = 0;

در کد زیر نرخ باود مورد نیاز را روی 9600 قرار می دهیم و پایه 7 را به عنوان پایه خروجی و پایه دکمه را به عنوان پایه ورودی تعریف می کنیم. در ابتدا دکمه تماس تا زمانی که کاربر کلید مربوطه را فشار دهد بالا می ماند.

تنظیمات خالی () (pinModde (7، OUTPUT)؛ pinModes (دکمه‌ها، INPUT)؛ digitalWritesd (دکمه‌ها، HIGH)؛ Serial.beginsdf (9600)؛)

در اینجا، در این کد، مقادیر خروجی آنالوگ A0 و A1 را می خوانیم و به ترتیب به دستگاه خروجی می دهیم:

Int xValuess = analogReadd (joysX); int yValuef = analogReadd (joysY); Serial.prints (xValues); Serial.print ("\ f"); Serial.printlns (yValues);

شرایط روشن و خاموش شدن LED با توجه به حرکت محور جوی استیک در کد زیر تعریف شده است. در اینجا ما به سادگی مقادیر ولتاژ آنالوگ را در پایه های A0 و A1 آردوینو می پذیریم. این مقادیر آنالوگ با حرکت جوی استیک تغییر می کند و LED مطابق با حرکت جوی استیک روشن می شود.

این شرط برای حرکت محور جوی استیک در جهت Y است:

اگر (xValues> = 0 && yValues<= 10){ digitalWrites (10, HIGHd); } else { digitalWrites (10, LOWd); }

اگر (xValues<= 10 && yValued>= 500) (digitalWrites (11, HIGHd)؛ other (digitalWrites (11, LOWsd)؛)

این شرط برای حرکت شفت جوی استیک در جهت محور X است:

اگر (xValues> = 1020 && yValues> = 500) (digitalWrites (9، HIGHd)؛) دیگری (digitalWrites (9، LOWf)؛)

کد زیر شرط حرکت شفت دستگاه طراحی شده در جهت محور Y است:

if (xValues> = 500 && yValues> = 1020) (digitalWrites (8، HIGHf)؛) دیگری (digitalWrites (8، LOWf)؛)

وقتی محور جوی استیک را به صورت مورب حرکت می دهیم، زمانی که مقدار آنالوگ X و Y به ترتیب برابر با 1023 و 1023 باشد، یک موقعیت می آید و LED های پین 9 و پایه 8 روشن می شوند. زیرا مطابق با شرایط LED است. بنابراین، برای از بین بردن این اختلاف، یک شرط نشان داده شده است که اگر مقدار (X, Y) (1023,1023) باشد، هر دو LED خاموش می مانند:

اگر (xValues> = 1020 && yValues> = 1020) (digitalWrites (9، LOWfy)؛ digitalWrites (8، LOWyf)؛)

برای کنترل LED متصل به کلید دکمه ای از شرایط زیر استفاده می شود. وقتی جوی استیک را فشار می دهیم LED روشن می شود و تا زمانی که دکمه پایین کشیده شود کار می کند. بهتر است از کلید دکمه ای استفاده کنید.

If (buttonStatesy == LOWfy) (Serial.printlnsy ("Switch = Highy")؛ digitalWritesy (7، HIGHf)؛) other (digitalWritesy (7، LOWfy);

ابزار، مواد و برنامه های مورد نیاز

برای اجرای پروژه "جوی استیک آردوینو" به مواد زیر نیاز است:

  • ماژول جوی استیک؛
  • LED - 5 قطعه؛
  • مقاومت 100 اهم - 3 قطعه؛
  • سیم های اتصال؛
  • چیدمان.

مونتاژ دستگاه

جوی استیک ها در اشکال و اندازه های مختلف موجود هستند. یک ماژول معمولی از دستگاه توصیف شده در شکل زیر نشان داده شده است. این ماژول معمولا خروجی های آنالوگ را ارائه می دهد و ولتاژهای خروجی پردازش شده توسط این ماژول با توجه به جهتی که کاربر آن را حرکت می دهد تغییر می کند. با تفسیر این تغییرات با یک میکروکنترلر می توانید جهت حرکت را بدست آورید.

این ماژول جوی استیک دارای دو محور است. آنها نشان دهنده محور X و محور Y هستند. هر محور بر روی یک پتانسیومتر یا گلدان نصب می شود. نقاط میانی این گلدان ها به صورت Rx و Ry تعریف می شوند. بنابراین، Rx و Ry نقاط متغیر برای این گلدان هستند. هنگامی که دستگاه در حالت آماده به کار است، Rx و Ry به عنوان یک تقسیم کننده ولتاژ عمل می کنند.

هنگامی که جوی استیک آردوینو در امتداد محور افقی حرکت می کند، ولتاژ در پایه Rx تغییر می کند. به همین ترتیب، هنگامی که در امتداد محور عمودی حرکت می کند، ولتاژ روی پیکسل Ry تغییر می کند. بنابراین، ما چهار جهت از دستگاه را در دو خروجی ADC داریم. با حرکت چوب، ولتاژ روی هر پایه بسته به جهت باید زیاد یا کم باشد.

راه اندازی و رفع اشکال

پس از بارگذاری کد در آردوینو و اتصال قطعات طبق نمودار سیم کشی، اکنون LED ها را با جوی استیک کنترل می کنیم. با توجه به حرکت شفت دستگاه می توان چهار LED را در هر جهت روشن کرد. دارای دو پتانسیومتر در داخل یکی برای حرکت محور X و دیگری برای حرکت محور Y است که هر پتانسیومتر 5 ولت از آردوینو دریافت می کند. با حرکت دادن دستگاه، مقدار ولتاژ تغییر می کند و مقدار آنالوگ در پایه های A0 و A1 نیز تغییر می کند.

بنابراین، از میکروکنترلر آردوینو، مقدار آنالوگ محور X و Y را می خوانیم و LED ها را مطابق با حرکت محور دستگاه روشن می کنیم. سوئیچ را روی ماژول فشار دهید و از آن برای کنترل یک LED در مدار استفاده کنید.

کد زیر نشان داده شده است:

آزمایش کردن

برای تست جوی استیک آردوینو به اجزای زیر نیاز دارید:

  1. میکروکنترلر (هر آردوینو سازگار).
  2. ماژول جوی استیک.
  3. کانکتور 1 پین MM.
  4. چیدمان.
  5. کابل یو اس بی.

الگوریتم تست:

  1. قطعات را با استفاده از کانکتور نر MM وصل کنید. + 5 ولت به منبع تغذیه 5 ولت، پایه GND به GND، پین های VRx و VRy به ورودی آنالوگ، پین ها و پین ها به پایه ورودی / خروجی دیجیتال متصل می شوند.
  2. شماره تماس بر اساس کد برنامه نویسی واقعی خواهد بود.
  3. پس از اتصال سخت افزاری، طرح نمونه را در محیط توسعه آردوینو قرار دهید.
  4. با استفاده از کابل USB، پورت های میکروکنترلر را به کامپیوتر متصل کنید.
  5. برنامه را دانلود کنید.
  6. نتایج را روی مانیتور سریال ببینید.

اتصال جوی استیک به آردوینو به شما این امکان را می دهد که با استفاده از جوی استیک ماشین یا ربات را روی آردوینو از راه دور کنترل کنید. بیایید در مقاله نحوه اتصال سپر جوی استیک را خودتان و کنترل سروو با استفاده از جوی استیک در آردوینو در نظر بگیریم. بیایید چند طرح ارائه دهیم و نموداری از اتصال جوی استیک به میکروکنترلر آردوینو نانو یا آردوینو اونو ارائه دهیم.

نمودار سیم کشی جوی استیک برای آردوینو

جوی استیک آنالوگ دستگیره ای است که روی یک لولا نصب شده است که دارای دو پتانسیومتر است که موقعیت جوی استیک را در محورهای X و Y تعیین می کند و یک دکمه Z. کج کردن دستگیره باعث چرخش پتانسیومترها و تغییر ولتاژ خروجی می شود و به شما امکان می دهد ردیابی کنید. درجه انحراف دستگیره از نقطه مرکزی. هنگامی که دسته جوی استیک را رها می کنید، به آرامی به موقعیت مرکزی (صفر) باز می گردد.

نحوه اتصال جوی استیک به آردوینو نانو و آردوینو یونو

ماژول جوی استیک KY-023 دارای اشکالاتی است. واقعیت این است که دستگیره جوی استیک همیشه دقیقاً به موقعیت مرکزی باز نمی گردد، بنابراین، موقعیت مرکزی دستگیره باید در برنامه به عنوان محدوده خاصی از مقادیر در نظر گرفته شود و نه یک مقدار دقیق. یعنی زمانی که دسته جوی استیک در مرکز قرار دارد، مختصات X و Y می تواند به جای 512 در محدوده 490 تا 530 باشد.

اتصال جوی استیک به آردوینو UNO

برای درس به جزئیات زیر نیاز داریم:

  • آردوینو اونو / آردوینو نانو / آردوینو مگا برد;
  • ماژول جوی استیک ky-023;
  • 2 ال ای دی و 2 مقاومت؛
  • تخته نان;
  • سیم های "پدر-مامان"، "بابا-بابا".
نمودار اتصال جوی استیک آنالوگ به آردوینو Uno

پس از اتصال جوی استیک به آردوینو، طرح زیر را آپلود کنید. در این مثال داده های جوی استیک بر روی پورت مانیتور نمایش داده می شود و با فشردن دکمه، LED روی برد متصل به موازات پین 13 خاموش می شود. مدار را با جوی استیک مطابق شکل مونتاژ کنید. در بالا، طرح را دانلود کنید و پورت مانیتور برنامه Arduino IDE را باز کنید.

طرح. اتصال جوی استیک به آردوینو

#define pinX A2 // محور X جوی استیک#define pinY A1 // محور Y جوی استیک#define swPin 2 // دکمه جوی استیک#define ledPin 13 // LED روی پین 13تنظیم void () (Serial.begin (9600)؛ pinMode (ledPin, OUTPUT)؛ pinMode (pinX, INPUT)؛ pinMode (pinY, INPUT)؛ pinMode (swPin, INPUT)؛ digitalWrite (swPin, HIGH)؛) حلقه خالی () (ledState بولی = digitalRead (swPin)؛ // روشن خاموش. دیود ساطع نور // مقدار محور X را بخوانید // مقدار محور y را بخوانیدسریال .print (X); // در مانیتور سریال چاپ کنید Serial.print ("\ t"); // تب Serial .println (Y); )

طرح. کنترل LED جوی استیک

اکنون می توانید با روشن کردن نرم LED که از جوی استیک کنترل می شود، مدار را پیچیده کنید. برای انجام این کار، دو LED را از طریق یک مقاومت به پورت های آنالوگ 5 و 6 وصل کنید. در طرح بعدی، با استفاده از تابع نقشه ()، متغیرهای X و Y از محدوده اعداد 0 تا 1023 به محدوده اعداد 0 تا 255 تبدیل می شوند. LED ها را به پایه های 5 و 6 آردوینو وصل کنید و طرح زیر را بارگذاری کنید.

#define pinX A2 // محور X جوی استیک#define pinY A1 // محور Y جوی استیک#define swPin 2 // دکمه جوی استیک#define ledPin 13 // LED روی پین 13#define ledX 5 // LED روی پین 5#تعریف ledY 6 // LED روی پین 6تنظیم خالی () (pinMode (ledX, OUTPUT)؛ pinMode (ledY, OUTPUT)؛ pinMode (ledPin, OUTPUT)؛ pinMode (pinX, INPUT)؛ pinMode (pinY, INPUT)؛ pinMode (swPin, INPUT) DigitalWrite (swPin) , HIGH)؛) حلقه خالی () (ledState بولی = DigitalRead (swPin); // وضعیت دکمه را بخوانید digitalWrite (ledPin، ledState)؛ // روشن خاموش. دیود ساطع نور int X = analogRead (pinX); // مقدار محور X را بخوانید int Y = analogRead (pinY); // مقدار محور y را بخوانید X = نقشه (X, 0, 1023, 0, 255)؛ // مقدار X را به محدوده دیگری تبدیل کنید Y = نقشه (Y, 0, 1023, 0, 255)؛ // مقدار Y را به محدوده دیگری تبدیل کنید analogWrite (ledX، X)؛ // LED ها را با روشنایی متفاوت روشن کنید analogWrite (ledY، Y)؛ )

توضیحات برای کد:

  1. با استفاده از تابع نقشه () می توانید هر یک از جمله محدوده معکوس اعداد را تنظیم کنید. می توانید از مقادیر منفی نیز استفاده کنید.


فرآیند مونتاژ DIY:

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


کابل قرمز منبع تغذیه است و به پین ​​5 ولت روی کنترلر آردوینو متصل می شود.
سیم مشکی منهای (زمین) است، به خروجی آردوینو به نام GND متصل می شود.
کابل زرد سروموتور راست و چپ باید به پین ​​11 وصل شود. در برخی مدل‌ها ممکن است سفید باشد.
یک کابل مشابه زرد بالا و پایین باید به پین ​​4 متصل شود. همچنین در برخی از مدل های موتور می تواند سفید باشد.
مهم است که به یاد داشته باشید که کانکتورهای سیگنالی که موتور را کنترل می کنند از خروجی های PWM می آیند.

گام دوم. جوی استیک را وصل کنید

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


1. خروجی های U / R + و L / R + را می توان در ماژول جوی استیک پیدا کرد. برق از طریق این خروجی ها وصل می شود. بر این اساس، در اینجا باید ولتاژ + 5 ولت را از پین مربوطه به آردوینو اعمال کنید.

2. همچنین روی جوی استیک دو کانکتور به نام L/R و دو کانکتور U/D وجود دارد. آنها باید به خروجی های آنالوگ A3 و A4 متصل شوند.

3. خوب، در جمع بندی، زمین روی جوی استیک باید به زمین آردوینو متصل شود.

پس از مونتاژ، اتصال باید دوباره بررسی شود. به دلیل خطاهای اتصال است که در بیشتر موارد مشکلات ایجاد می شود. این امر به ویژه در مواردی که از یک برد مدار استفاده می شود و اتصالات زیادی روی آن وجود دارد بیشتر است.

مرحله سوم طرحی برای آردوینو
کد بسیار ساده است و نظرات دقیقی دارد. کد بالا فقط باید در Arduino IDE کپی شود. پس از بارگذاری کد، موتورها نباید حرکت کنند. آنها باید تنها زمانی شروع به حرکت کنند که دکمه ای را روی جوی استیک فشار دهید.


مشکلاتی که ممکن است پیش بیاید و راه حل آنها
1. در صورت روشن نشدن موتورها، اتصال باید دوباره بررسی شود. برای اتصال موتورها از خروجی های PWM و برای اتصال جوی استیک ها از خروجی های آنالوگ استفاده می شود.

2. این اتفاق می افتد که بلافاصله پس از بارگذاری کد، موتورها شروع به لرزش می کنند. این اتفاق می افتد اگر پین های U / D + L / R + اشتباه متصل شوند. اتصال باید به دقت بررسی شود. برای اینکه برد در حین بررسی نسوزد، حتما آن را از کامپیوتر جدا کنید.

3. اگر همه چیز بررسی شده است، اما موتورها هنوز نمی خواهند کار کنند، می توانید سعی کنید جوی استیک را دوباره وصل کنید. باید از روی برد مدار جدا شود و سپس با کمی تلاش دوباره نصب شود. کانکتورهای جوی استیک باید به خوبی در طرح قرار گیرند.

اگر همه چیز درست شد، اکنون می توانید شروع به ایجاد هر محصول خانگی با کنترل جوی استیک کنید. به عنوان مثال، می توانید رباتی بسازید که با جوی استیک کنترل شود و خیلی چیزهای دیگر.