آردوینو مدارهای الکترونیک پروژه های آردوینو

کنترل موس کامپیوتر با جوی استیک با استفاده از برد آردوینو Arduino

آموزش کنترل کامپیوتر با استفاده از جوی استیک به وسیله آردوینو LEONARDO
نوشته شده توسط علیرضا قربانی

با استفاده از کتابخانه موس شما میتوانید موس کامیپوترتان را  توسط آردوینو های LEONARDO , DUE و MICRO  کنترل کنید.در این آموزش قصد داریم به کنترل موس کامپیوتر همراه با جوی استیک با استفاده از آردوینو لئوناردو بپردازیم.در ادامه با مرجع تخصصی آردوینو با دیجی اسپارک همراه باشید.

 


کنترل موس کامپیوتر با جوی استیک


در این پروژه با استفاده از یک جوی استیک دو محوره  و یک تاچ سوئیج یک موس واقعی را شبیه سازی میکنیم.حرکت نشان گر موس به مقدار های آنالوگ تولید شده توسط جوی استیک بستگی دارد.با استفاده از دو پین آنالوگ ، مقادیری بین ۰ الی ۱۰۲۳ دریافت میکنیم که با عملیاتی که تابع  readAxis  وظیفه انجام آن را دارد اعداد را به بازه -۶ الی ۶تبدیل میکنیم. با استفاده از سوئیچی که بر روی جوی استیک قرار دارد عملیات کلیک چپ و با استفاده از سوئیچی که بر روی برد برد قرار گرفته عملیات کلیک راست انجام می شود.

 


معرفی ماژول جوی استیک


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

  • VCC: تامین تغذیه (۵ ولت از آردوینو).
  • GND: زمین (زمین مشترک با آردوینو).
  • VRx: خروجی آنالوگ محور X.
  • VRy: خروجی آنالوگ محور Y.
  • SW: خروجی دیجیتال دکمه‌ها.
  • PS2_DAT، PS2_CMD، PS2_SEL، PS2_CLK: این‌ها برای اتصال جوی استیک با استفاده از رابط PS2 است (با آردوینو استفاده نمی‌شود).

 

 


بررسی پایه های ماژول جوی استیک


 

ماژول جوی استیک PS2 آردوینو دارای پنج پایه است که به شرح زیر هستند:

  • VCC (تغذیه): این پایه برای تامین تغذیه ماژول استفاده می‌شود و به طور معمول به منبع تغذیه ۵ ولت آردوینو متصل می‌شود.

 

  • GND (زمین): این پایه برای اتصال به زمین (GND) آردوینو استفاده می‌شود تا با آردوینو یک زمین مشترک داشته باشد.

 

  • VRx (خروجی آنالوگ محور X): این پایه خروجی آنالوگ جوی استیک برای محور X است. زمانی که جوی استیک حرکت می‌کند، ولتاژ آنالوگ متناسب با موقعیت محور X تولید می‌شود که می‌تواند با استفاده از تابع analogRead() در آردوینو خوانده شود.

 

  • VRy (خروجی آنالوگ محور Y): این پایه خروجی آنالوگ جوی استیک برای محور Y است. همانند پایه VRx، ولتاژ آنالوگ متناسب با موقعیت محور Y تولید می‌شود و با استفاده از تابع analogRead() در آردوینو قابل خواندن است.

 

  • SW (خروجی دیجیتال دکمه‌ها): این پایه خروجی دیجیتال مربوط به دکمه‌های جوی استیک است. وقتی دکمه‌ها فشار داده می‌شوند، این پایه یک سیگنال دیجیتالی (HIGH یا LOW) تولید می‌کند که با استفاده از تابع digitalRead() در آردوینو قابل خواندن است.

 


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


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

#include <Mouse.h>
const int mouseButton = 3;    // کلیک چپ موس
const int rightMouseButton = 4;   //کلیک راست موس
const int xAxis = A0;         // xجوی استیک محور
const int yAxis = A1;         // yجوی استیک محور


int range = 12;               // محدوده مقدار حرکت موس
int responseDelay = 5;        // سرعت حرکت
int threshold = range / 4;      // مقدار آستانه حرکت
int center = range / 2;

boolean mouseIsActive = true;

void setup ()
  {
  //سوئیچ متصل به جوی استیک (کلیک چب) و همچنین سوئیچی که به منظور کلیک راست استفاده کرده اایم را در وضعیت پول آپ قرار میدهیم
  pinMode (mouseButton, 0);
  digitalWrite (mouseButton, 1);
  pinMode (rightMouseButton, 0);
  digitalWrite (rightMouseButton, 1);
  // موس را فعال میکنیم
  Mouse.begin ();
  }

void loop ()
  {

  /*
  که در قسمت پایین برنامه تعریف کرده ایم مقدار حرکت موس را حول محور ها تعیین میکنیم readAxis با استفاده از تابع

  این مقدار بین ۶ الی -۶ می باشد.
  */
  int xReading = readAxis (A0);
  int yReading = readAxis (A1);
  yReading *= -1;


  // در صورت فعال بودن موس ، موس  طبق مقادیر مشخص به حرکت در می آید
  if ( mouseIsActive )
    {
    Mouse.move (xReading, yReading, 0);
    }

  Serial.println (xReading);
  //,وضعیت کلیک چپ را بررسی میکنیم که آیا فشار داده شده است یا خیر

  if ( digitalRead (mouseButton) == LOW )
    {
    // اگر فشرده شده باشد ، فرمان کلیک کردن را صادر میکند
    if ( !Mouse.isPressed (MOUSE_LEFT) )
      {
      Mouse.press (MOUSE_LEFT);
      }
    }

  else {
  //در صورتی که کلیک چپ فشرده نشدده باشد ، فرمان رهایی کلیک چپ را صادر میکند
    if ( Mouse.isPressed (MOUSE_LEFT) )
      {
      Mouse.release (MOUSE_LEFT);
      }
    }

     // کد های  کلیک چپ همانند کد های کلیک راست می باشد
  if ( digitalRead (rightMouseButton) == LOW )
    {
    if ( !Mouse.isPressed (MOUSE_RIGHT) )
      {
      Mouse.press (MOUSE_RIGHT);
      }
    }
  else {
    if ( Mouse.isPressed (MOUSE_RIGHT) )
      {
      Mouse.release (MOUSE_RIGHT);
      }
    }
  delay (responseDelay);
  }

/*
این تابه مقدار انالوگ جوک استیک را میخواند و سپس آن را به مقادیری بین ۶ الی -۶ نسبت میدهد
*/

int readAxis (int thisAxis)
  {
  // مقدر آنالوگ را دریافت میکنیم
  int reading = analogRead (thisAxis);

  // مقدار آنالوگ پین را که بینن مقدار ۰ الی ۱۰۲۳ می باشد به مقدار ۰ الی ۱۲ نسبت میدهد
  reading = map (reading, 0, 1023, 0, range);


  int distance = reading - center;

 if (abs(distance) < threshold) {
    distance = 0;
  }

  // return the distance for this axis:
  return distance;
}

 


بررسی کتابخانه #include <Mouse.h>


این خط کد به کتابخانه “Mouse.h” ارجاع می‌دهد که برای کنترل ماوس با استفاده از آردوینو استفاده می‌شود. این کتابخانه به شما امکان کنترل حرکت ماوس روی کامپیوتر را از طریق آردوینو می‌دهد. با استفاده از این کتابخانه، می‌توانید موس را به صورت مستقیم در کامپیوتر حرکت داده و کلیک‌های مختلف (مانند کلیک چپ و راست) را ایجاد کنید.
این کتابخانه در آردوینو IDE نصب شده است و به صورت پیش‌فرض برای استفاده فعال است. بنابراین، اگر این خط را به کد آردوینو خود اضافه کنید، می‌توانید از توابع موجود در کتابخانه “Mouse.h” برای کنترل ماوس استفاده کنید و ماوس را از طریق آردوینو حرکت دهید و کلیک‌ها را انجام دهید.

 

 

 


تحلیل کد آردوینو


این کد یک برنامه برای کنترل ماوس کامپیوتر با استفاده از یک جوی استیک آنالوگ است. اجزای اصلی برنامه عبارتند از:

  • تعریف و ابتدایی کردن متغیر‌ها و ثابت‌ها:mouseButton: پین مربوط به کلیک چپ موس.
    rightMouseButton: پین مربوط به کلیک راست موس.
    xAxis: پین مربوط به محور X جوی استیک آنالوگ.
    yAxis: پین مربوط به محور Y جوی استیک آنالوگ.
    range: محدوده حرکت موس، یعنی حداکثر مقداری که موس می‌تواند در هر جهت حرکت کند.
    responseDelay: سرعت حرکت موس.
    threshold: مقدار آستانه حرکت، اگر مقدار حرکت کمتر از این آستانه باشد، موس تحرک نمی‌کند.
    center: مرکز محور X و Y در جوی استیک، میانگین مقدار حرکت در اطراف این مرکز تشخیص داده می‌شود.
    mouseIsActive: متغیر منطقی برای فعال بودن یا غیرفعال بودن کنترل موس.

 

  • setup():
    در این قسمت، پین‌های مربوط به کلیدهای جوی استیک (کلیک چپ و راست) به عنوان پین‌های ورودی تعریف و در حالت HIGH قرار داده می‌شوند.
    ماوس آغاز به کار می‌کند (Mouse.begin ()).

 

  • loop():
    ابتدا مقادیر خوانده شده از جوی استیک در محور‌های X و Y آنالوگ در متغیر‌های xReading و yReading ذخیره می‌شوند. توجه داشته باشید که محور Y جوی استیک در این برنامه برعکس خوانده می‌شود (با تکرار yReading *= -1).
    اگر موس فعال باشد (mouseIsActive برابر با TRUE)، موس با استفاده از مقادیر xReading و yReading حرکت می‌کند.

 

  • سپس وضعیت کلید کلیک چپ موس بررسی می‌شود:

 

اگر کلید کلیک چپ فشرده شود (مقدار دیجیتالی پین برابر با LOW باشد) و در حالتی که موس کلیک چپ فشرده نشده باشد (!Mouse.isPressed(MOUSE_LEFT)، یعنی کلیک چپ در حالت فشرده نشده قبلی نبوده باشد)، دستور کلیک چپ را صادر می‌کند (با Mouse.press(MOUSE_LEFT)).
اگر کلید کلیک چپ فشرده نشود (مقدار دیجیتالی پین برابر با HIGH باشد) و در حالتی که موس کلیک چپ فشرده بوده باشد (Mouse.isPressed(MOUSE_LEFT)، یعنی کلیک چپ در حالت فشرده بوده قبلی بوده باشد)، دستور رهایی کلیک چپ را صادر می‌کند (با Mouse.release(MOUSE_LEFT)).

نحوه کنترل کلیک راست موس نیز مشابه کلیک چپ است.در آخر دستور delay(responseDelay) برای تاخیر به اندازه responseDelay میلی‌ثانیه بین حرکات موس استفاده می‌شود.

 


سخت افزار مورد نیاز


آردوینو سری‌های DUE , LEONARDO , MICRO

جوی استیک دو محوره

یک عدد تاچ سوئیج

 


جمع بندی


کنترل موس کامپیوتر با جوی استیک با استفاده از برد آردوینو یک پروژه جالب و ساده است که با کمک ماژول جوی استیک PS2 و کتابخانه “Mouse.h” انجام می‌شود. در این پروژه، ما موقعیت جوی استیک را تشخیص داده و موس را براساس این موقعیت در کامپیوتر حرکت می‌دهیم. همچنین می‌توانیم کلیک‌های چپ و راست موس را نیز با استفاده از دکمه‌های جوی استیک ساخته شده توسط کاربر شبیه‌سازی کنیم.توجه داشته باشید که برای انجام این پروژه، از ماژول جوی استیک PS2 و کتابخانه “Mouse.h” باید استفاده کنید. همچنین ممکن است نیاز به کدگذاری بیشتر و اضافه کردن تنظیمات اضافی داشته باشید تا برنامه به درستی کار کند. اتصال ماژول جوی استیک: ابتدا ماژول جوی استیک PS2 را به برد آردوینو متصل کنید. پنج پایه‌ی معمولی که اغلب دارای این ماژول هستند شامل VCC، GND، VRx، VRy و SW هستند. VCC و GND به منبع تغذیه آردوینو متصل می‌شوند، و VRx و VRy به دو پین آنالوگ و SW به یک پین دیجیتال آردوینو متصل می‌شوند.
نصب کتابخانه “Mouse.h”: در IDE آردوینو، کتابخانه “Mouse.h” به صورت پیش‌فرض نصب شده است. اگر این کتابخانه نصب نیست، از قسمت “Sketch” > “Include Library” > “Mouse” آن را نصب کنید. با استفاده از کدگذاری آردوینو، مقادیر آنالوگ جوی استیک را با تابع analogRead() خوانده و برای موس تبدیل کنید. سپس با استفاده از توابع موجود در کتابخانه “Mouse.h”، موس را حرکت دهید و کلیک‌های مورد نیاز را ایجاد کنید. به عنوان مثال، با استفاده از Mouse.move() می‌توانید موس را در هر جهت حرکت دهید، و با استفاده از Mouse.press() و Mouse.release() می‌توانید کلیک‌های چپ و راست موس را تعیین کنید.برنامه‌ را به برد آردوینو آپلود کنید و ماژول جوی استیک را با آردوینو وصل کنید. حالا ماوس را می‌توانید با حرکات جوی استیک کنترل کنید و کلیک‌های موس را با دکمه‌های جوی استیک تعیین کنید.با انجام این مراحل، شما می‌توانید ماوس کامپیوتر خود را با جوی استیک PS2 و آردوینو کنترل کنید و در پروژه‌های خود از این امکان استفاده کنید.

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

علیرضا قربانی

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

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

۱۲ دیدگاه

  • با سلام
    برای اردوینو due که با ولتاژ ۳٫۳ کار میکنه باید چیکار کرد ؟
    ممنون از آموزش های خوبتون

  • سلام من برنامه رو کپی کردم با خطای زیر مواجه شدم
    مشکلش کجاست
    Arduino: 1.6.12 (Windows 7), Board: “Arduino/Genuino Micro”

    C:\Users\Sharif\AppData\Local\Temp\arduino_modified_sketch_621412\mouse.ino: In function ‘void setup()’:

    mouse:22: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
    Mouse.begin ();

    ^

    C:\Users\Sharif\AppData\Local\Temp\arduino_modified_sketch_621412\mouse.ino: In function ‘void loop()’:

    mouse:41: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
    Mouse.move (xReading, yReading, 0);

    ^

    mouse:50: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
    if ( !Mouse.isPressed (MOUSE_LEFT) )

    ^

    mouse:50: error: ‘MOUSE_LEFT’ was not declared in this scope

    if ( !Mouse.isPressed (MOUSE_LEFT) )

    ^

    mouse:58: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
    if ( Mouse.isPressed (MOUSE_LEFT) )

    ^

    mouse:58: error: ‘MOUSE_LEFT’ was not declared in this scope

    if ( Mouse.isPressed (MOUSE_LEFT) )

    ^

    mouse:67: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
    if ( !Mouse.isPressed (MOUSE_RIGHT) )

    ^

    mouse:67: error: ‘MOUSE_RIGHT’ was not declared in this scope

    if ( !Mouse.isPressed (MOUSE_RIGHT) )

    ^

    mouse:73: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
    if ( Mouse.isPressed (MOUSE_RIGHT) )

    ^

    mouse:73: error: ‘MOUSE_RIGHT’ was not declared in this scope

    if ( Mouse.isPressed (MOUSE_RIGHT) )

    ^

    C:\Users\Sharif\AppData\Local\Temp\arduino_modified_sketch_621412\mouse.ino: In function ‘int readAxis(int)’:

    mouse:96: error: ‘lt’ was not declared in this scope

    if ( abs (distance) < threshold )

    ^

    mouse:96: error: expected ‘)’ before ‘;’ token

    if ( abs (distance) < threshold )

    ^

    mouse:96: error: expected ‘;’ before ‘)’ token

    if ( abs (distance) < threshold )

    ^

    exit status 1
    ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

      • سلام برنامه خطا داره لطفا راهنمایی کنید
        Arduino: 1.8.9 (Windows 7), Board: “Arduino Pro or Pro Mini, ATmega328P (5V, 16 MHz)”

        C:\Users\Administrator\Documents\Arduino\jostek\jostek.ino: In function ‘void setup()’:

        jostek:23:3: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
        Mouse.begin ();

        ^

        C:\Users\Administrator\Documents\Arduino\jostek\jostek.ino: In function ‘void loop()’:

        jostek:42:5: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
        Mouse.move (xReading, yReading, 0);

        ^

        jostek:51:11: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
        if ( !Mouse.isPressed (MOUSE_LEFT) )

        ^

        jostek:51:28: error: ‘MOUSE_LEFT’ was not declared in this scope

        if ( !Mouse.isPressed (MOUSE_LEFT) )

        ^

        jostek:59:10: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
        if ( Mouse.isPressed (MOUSE_LEFT) )

        ^

        jostek:59:27: error: ‘MOUSE_LEFT’ was not declared in this scope

        if ( Mouse.isPressed (MOUSE_LEFT) )

        ^

        jostek:68:11: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
        if ( !Mouse.isPressed (MOUSE_RIGHT) )

        ^

        jostek:68:28: error: ‘MOUSE_RIGHT’ was not declared in this scope

        if ( !Mouse.isPressed (MOUSE_RIGHT) )

        Multiple libraries were found for “Mouse.h”
        ^

        jostek:74:10: error: ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?
        if ( Mouse.isPressed (MOUSE_RIGHT) )

        ^

        jostek:74:27: error: ‘MOUSE_RIGHT’ was not declared in this scope

        Used: C:\Program Files\Arduino\libraries\Mouse
        if ( Mouse.isPressed (MOUSE_RIGHT) )

        Not used: C:\Users\Administrator\Documents\Arduino\libraries\Mouse-1.0.1
        ^

        Not used: C:\Users\Administrator\Documents\Arduino\libraries\Mouse-1.0.0
        exit status 1
        ‘Mouse’ not found. Does your sketch include the line ‘#include ‘?

        This report would have more information with
        “Show verbose output during compilation”
        option enabled in File -> Preferences.

        • با سلام
          تمامی ارورها مربوط به کتابخانه است. کتابخانه های مورد نیاز را ضمیمه شده است؟

  • سلام
    در این پروژه ای که آموزش دادید، اگر من بخواهم بجای استفاده از جوی استیک، از ولوم روتاری استفاده کنم، امکان پذیر هست؟
    یعنی برای حرکت موس به چپ و راست از یک ولوم روتاری استفاده کنم؛ و برای حرکت موس به بالا و پایین از یک ولوم روتاری دیگر استفاده کنم.

      • آیا امکانش هست مثل این آموزشی که برای جوی استیک قرار دادید، برای ساخت همچین چیزی که عرض کردم، آموزش بزارید؟

        یعنی با استفاده از ۲ عدد ولوم روتاری حرکت موس را کنترل کنیم.
        البته اگر بشود اسکرول موس را هم با یک ولوم روتاری دیگر کنترل کرد، عالی میشه.

        با تشکر از شما.

        • با سلام
          در حال حاضر چنین آموزشی در سایت منتشر نشده است.
          بررسی و در صورت امکان منتشر خواهد شد.

  • سلام
    دوستانی که با خطا هایی از جانب کتابخانه موس یا توابعش روبرو شدن ، دلیلش اینه که مشکل از اردوینو‌تون هست ، منم این مشکل رو داشتم و بعد از کلی گشتن توی سایت اردوینو و سایت های خارجی دیگه متوجه این مشکل شدم . این کتابخانه و کتابخانه کیبورد ، فقط روی پردازنده هایی مثل ATMEGA32U6 یا ATMEGA32U4 کار میکنن ، یعنی پردازنده های اردوینو میکرو یا لئوناردو . یعنی برای این کار باید یکی از این اردوینو هارو داشته باشید و عملا با اونو کار نمیکنه (اردوینو منم مگا بود)
    امیدوارم براتون مفید بوده باشه