عناوين الدرس

اصنع فأرة الحاسوب بنفسك باستخدام الاردوينو وعصا التحكم

متوسط

مقدمة

الفأرة هي وحدة إدخال في جهاز الحاسوب التي يتم استعمالها يدويًا للتأشير والنقر في الواجهة الرسومية وتحتوي الفأرة على زرين وعجلة في المنتصف تعمل كزر وسطي، في هذا الدرس ستتعلم صناعة فأرة الحاسوب بنفسك باستخدام الاردوينو وعصا التحكم.

arduino-joystick-controlled-mouse

المواد والأدوات

فأرة الحاسوب

1× اردوينو اونو

فأرة الحاسوب

1× سلك الاردوينو

فأرة الحاسوب

حزمة أسلاك توصيل (ذكر – أنثى)

فأرة الحاسوب

1×  عصا التحكم

توصيل الدائرة

للمزيد حول عصا التحكم يمكنك الرجوع للدرس التالي استخدام عصا التحكم joystick مع الاردوينو

فأرة الحاسوب

الكود البرمجي

في البداية عليك تنصب برنامج Python 3 يمكنك الرجوع للدرس التالي لمعرفة كيفية تنصيبه تنصيب Python 3.

انقر بالسهم اليمين على Command Prompt واختر من القائمة Run as administrator.

arduino-joystick-controlled-mouse

ادخل على مسار برنامج البايثون.

(هذا السطر قابل للتغيير بناء على موقع برنامج البايثون في جهازك)

cd C:\Program Files (x86)\Python39-32

حدّث Pip من خلال كتابة الأمر التالي.

python -m pip install --upgrade pip

حمّل مكتبة فأرة الحاسوب.

python –m pip install mouse

الكود البرمجي للتحقق من قراءة المدخلات

في البداية سنرفع كود برمجي لمحاكاة المشروع والتحقق من أن عصا التحكم تعطي قراءات صحيحة، ويتم طباعة الأوامر على شاشة الاتصال التسلسلي.

ارفع الكود التالي إلى لوحة الاردوينو عن طريق (IDE) وافتح شاشة الاتصال التسلسلي.

void setup()
{
Serial.begin(9600);
pinMode(9,INPUT); // SW pin
digitalWrite(9,HIGH);
}
int prev_state=0; // previous state of switch
void loop() {
int z=0,xpos=0,ypos=0;
int x=analogRead(A0);
int y=analogRead(A1);
int sensitivity=10; // you can adjust the sensitivity based on your comfort
if(x>=550) // when moved up
xpos=map(x,550,1023,0,sensitivity);
if(x<=450) // when moved down
xpos=map(x,450,0,0,-sensitivity);
if(y>=550) // when moved right
ypos=map(y,550,1023,0,sensitivity);
if(y<=450) // when moved left
ypos=map(y,450,0,0,-sensitivity);
int curr_state=digitalRead(9);
if(curr_state==1 && prev_state==0) // when SW is pressed
z=1;
else
z=0;
if(xpos!=0 or ypos!=0 or z==1) // prints only when the joystick is moved
{
Serial.print(xpos); // print the data and separating by ":"
Serial.print(":");
Serial.print(ypos);
Serial.print(":");
Serial.println(z);
}
prev_state=curr_state; delay(10); // for normal operation
}

شرح الكود البرمجي

في الدالة ()setup تتم قراءة المدخلات من عصا التحكم عن طريق المنفذ الرقمي 9 ثم تتم طباعتها على شاشة الاتصال التسلسلي.

void setup()
{
Serial.begin(9600);
pinMode(9,INPUT); // SW pin
digitalWrite(9,HIGH);
}

في دالة ()void loop يتم تعريف المتغيرات x, y و z.

تكون قيمة المحور z تساوي صفر.

وقيمة المحور x تتم قراءتها من المنفذ التناظري A0.

وقيمة المحور z تتم قراءتها من المنفذ التناظري A1.

 متغير xpos يشير إلى موقع الفأرة على محور x في شاشة الكمبيوتر وقيمته الابتدائية = 0.  

متغير ypos يشير إلى موقع الفأرة على محور y في شاشة الكمبيوتر وقيمته الابتدائية = 0.  

المتغير sensitivity=10 يمثل حساسية فأرة الحاسوب يمكنك تغيير القيمة.

void loop() {
int z=0,xpos=0,ypos=0;
int x=analogRead(A0);
int y=analogRead(A1);
int sensitivity=10; // you can adjust the sensitivity based on your comfort

تمثل قراءة المدخل التناظري  X حركة الفارة على المحور x الحركة بشكل عامودي، إذا كانت قيمة المدخل x أكبر من 550 نقوم بتعيين نطاق قيم المدخل x من 0 إلى 1024 إلى نطاق من 0 إلى القيمة الموجبة ل sensitivity التي تم تحديدها.

وإذا كانت قيمة المدخل x أقل أو تساوي 450 نقوم بتعيين نطاق قيم المدخل x من 0 إلى 1024 إلى نطاق من 0 إلى القيمة السالبة ل sensitivity التي تم تحديدها.

if(x>=550) // when moved up
xpos=map(x,550,1023,0,sensitivity);
if(x<=450) // when moved down
xpos=map(x,450,0,0,-sensitivity);

تمثل قراءة المدخل التناظري y حركة الفارة على المحور y الحركة بشكل أفقي، إذا كانت قيمة المدخل y أكبر من 550 نقوم بتعيين نطاق قيم المدخل y من 0 إلى 1024 إلى نطاق من 0 إلى القيمة الموجبة ل sensitivity التي تم تحديدها.

وإذا كانت قيمة المدخل y أقل أو تساوي 450 نقوم بتعيين نطاق قيم المدخل y من 0 إلى 1024 إلى نطاق من 0 إلى القيمة السالبة ل sensitivity التي تم تحديدها.

if(y>=550) // when moved right
ypos=map(y,550,1023,0,sensitivity);
if(y<=450) // when moved left
ypos=map(y,450,0,0,-sensitivity);

متغير curr_state يمثل قراءة قيمة المدخلات الرقمية من المنفذ رقم 9 إذا كان الزر مضغوط فالقيمة الراجعة 1.

وإذا لم يتم الضغط عليه تكون القيمة صفر أي بحالة سكون.

int curr_state=digitalRead(9);
if(curr_state==1 && prev_state==0) // when SW is pressed
z=1;
else
z=0;

ستتم طباعة القيم على الشاشة الاتصال التسلسلي إذا كان هناك أي تغيّر في قراءات قيم عصا التحكم.

إذا لم يتم تحريك عصا التحكم فلن يتم طباعة أي قيم.

if(xpos!=0 or ypos!=0 or z==1) // prints only when the joystick is moved
{
Serial.print(xpos); // print the data and separating by ":"
Serial.print(":");
Serial.print(ypos);
Serial.print(":");
Serial.println(z);
}

الكود البرمجي (بايثون)

افتح برنامج IDLE (Python 3.9 32-bit) من قائمة File اختر New File والصق الكود البرمجي التالي.

التحكم بالحاسوب بحركات اليد

ارفع الكود البرمجي للوحة الاردوينو من قائمة Run انقر على Run module.

import mouse, sys
import time 
import serial

mouse.FAILSAFE=False
ArduinoSerial=serial.Serial('com3',9600)  #Specify the correct COM port
time.sleep(1)                             #delay of 1 second

while 1:
   data=str(ArduinoSerial.readline().decode('ascii'))   #read the data
   (x,y,z)=data.split(":")           # assigns to x,y and z
   (X,Y)=mouse.get_position()        #read the cursor's current position
   (x,y)=(int(x),int(y))                           #convert to int
   mouse.move(X+x,Y-y)           #move cursor to desired position
   if '1' in z:                        # read the Status of SW
      mouse.click(button="left")    # clicks left button

شرح الكود البرمجي

افتح صفحة جديدة في IDLE Python وقم باستدعاء المكتبات المطلوبة mouse, sys serial python و time.

import mouse, sys
import time 
import serial

حدد المنفذ COM المستخدم في الاتصال مع الاردوينو، لديك وقم بتعديل الأمر في السطر التالي حسب رقم المنفذ.

(يمكنك تعيينه عن طريق برنامج اردوينو IDE من قائمة Port). 

ArduinoSerial=serial.Serial('com3',9600)  #Specify the correct COM port

هنا تتم قراءة القيم من المنافذ التناظرية A0 و A1 وسيتم تحريك فأرة الحاسوب في أماكن مختلفة على الشاشة بناء على هذه القيم.

while 1:
   data=str(ArduinoSerial.readline().decode('ascii'))   #read the data
   (x,y,z)=data.split(":")           # assigns to x,y and z
   (X,Y)=mouse.get_position()        #read the cursor's current position
   (x,y)=(int(x),int(y))                           #convert to int
mouse.move(X+x,Y-y)           #move cursor to desired position

هنا تتم قراءة القيم من المنفذ الرقمي 9 إذا كان الزر مضغوط ستكون القيمة الراجعة 1.

 if '1' in z:                        # read the Status of SW
      mouse.click(button="left")    # clicks left button

X
Product added to the cart