مقدمة
الفأرة هي وحدة إدخال في جهاز الحاسوب التي يتم استعمالها يدويًا للتأشير والنقر في الواجهة الرسومية وتحتوي الفأرة على زرين وعجلة في المنتصف تعمل كزر وسطي، في هذا الدرس ستتعلم صناعة فأرة الحاسوب بنفسك باستخدام الاردوينو وعصا التحكم.
المواد والأدوات
1× اردوينو اونو
1× عصا التحكم
توصيل الدائرة
للمزيد حول عصا التحكم يمكنك الرجوع للدرس التالي استخدام عصا التحكم joystick مع الاردوينو
الكود البرمجي
في البداية عليك تنصب برنامج Python 3 يمكنك الرجوع للدرس التالي لمعرفة كيفية تنصيبه تنصيب Python 3.
انقر بالسهم اليمين على Command Prompt واختر من القائمة Run as administrator.
ادخل على مسار برنامج البايثون.
(هذا السطر قابل للتغيير بناء على موقع برنامج البايثون في جهازك)
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