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

مبتدئ

image_pdf

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

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

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

const int trigger1 = 2; //Trigger pin of 1st Sesnor
const int echo1 = 3; //Echo pin of 1st Sesnor
const int trigger2 = 4; //Trigger pin of 2nd Sesnor
const int echo2 = 5;//Echo pin of 2nd Sesnor long time_taken;
int dist,distL,distR; void setup() { Serial.begin(9600);
pinMode(trigger1, OUTPUT);  pinMode(echo1, INPUT); 
pinMode(trigger2, OUTPUT); 
pinMode(echo2, INPUT); 
} /*###Function to calculate distance###*/ void calculate_distance(int trigger, int echo) { digitalWrite(trigger, LOW); delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW); time_taken = pulseIn(echo, HIGH);
dist= time_taken*0.034/2;
if (dist>50)
dist = 50; } void loop() { //infinite loopy calculate_distance(trigger1,echo1); distL =dist; //get distance of left sensor
calculate_distance(trigger2,echo2);
distR =dist; //get distance of right sensor //Uncomment for debudding
/*Serial.print("L=");
Serial.println(distL); Serial.print("R="); Serial.println(distR);
*/ //Pause Modes -Hold
if ((distL >40 && distR>40) && (distL <50 && distR<50)) //Detect both hands
{Serial.println("Play/Pause"); delay (500);} calculate_distance(trigger1,echo1);
distL =dist;
calculate_distance(trigger2,echo2);
distR =dist; if ((distL >40 && distL<50) && (distR ==50)) //Detect Left Hand {Serial.println("Rewind"); delay (500);} if ((distR >40 && distR<50) && (distL ==50)) //Detect Right Hand {Serial.println("Forward"); delay (500);} //Control Modes
//Lock Left - Control Mode if (distL>=13 && distL<=17) {
  delay(100); //Hand Hold Time   calculate_distance(trigger1,echo1);
distL =dist;   if (distL>=13 && distL<=17) {     Serial.println("Left Locked");     while(distL<=40)     {
      calculate_distance(trigger1,echo1);
      distL =dist;
      if (distL<10) //Hand pushed in        {Serial.println ("Vup"); delay (300);}       if (distL>20) //Hand pulled out
      {Serial.println ("Vdown"); delay (300);} }
} } //Lock Right - Control Mode if (distR>=13 && distR<=17) {   delay(100); //Hand Hold Time   calculate_distance(trigger2,echo2);   distR =dist;
  if (distR>=13 && distR<=17)
{     Serial.println("Right Locked");
  while(distR<=40)
{       calculate_distance(trigger2,echo2);       distR =dist;       if (distR<10) //Right hand pushed in       {Serial.println ("Rewind"); delay (300);}       if (distR>20) //Right hand pulled out
      {Serial.println ("Forward"); delay (300);} }
}
} delay(200); }

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

عرفنا  المتغيرات اللازمة التي  يستخدمها كلا حساسي الموجات فوق الصوتية.

المخرج للحساس الأول (trigger1) والمدخل للحساس الأول (echo1).

المخرج للحساس الثاني (trigger2) والمدخل للحساس الثاني (echo2).

const int trigger1 = 2; //Trigger pin of 1st Sesnor
const int echo1 = 3; //Echo pin of 1st Sesnor
const int trigger2 = 4; //Trigger pin of 2nd Sesnor
const int echo2 = 5;//Echo pin of 2nd Sesnor long time_taken;
int dist,distL,distR; void setup() { Serial.begin(9600); 
pinMode(trigger1, OUTPUT);  pinMode(echo1, INPUT); 
pinMode(trigger2, OUTPUT); 
pinMode(echo2, INPUT); 
}.

عند تشغيل أي مقطع فيديو على مشغل الفيديو (VLC) أو اليوتيوب سيتم حساب المسافة بين كلا حساسي الموجات فوق الصوتية واليدين في كل مرة من خلال الدالة ()calculate_distance، وسيكون هناك عدة اجراءات بناء على تلك القراءات.

/*###Function to calculate distance###*/
void calculate_distance(int trigger, int echo)
{
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW); time_taken = pulseIn(echo, HIGH);
dist= time_taken*0.034/2;
if (dist>50)
dist = 50; }

داخل دالة ()Loop، يتم التحقق من قيمة المسافة وعلى أساسها يتم الاختيار من بين الاجراءات.

نستخدم المتغير distL ويشير إلى مقدار المسافة بين حساس الموجات الصوتية و اليد الموجود باليسار

نستخدم المتغير distR ويشير إلى مقدار المسافة بين حساس الموجات الصوتية و اليد الموجود باليمين

calculate_distance(trigger1,echo1);
distL =dist; //get distance of left sensor

calculate_distance(trigger2,echo2);
distR =dist; //get distance of right sensor

بناء على المسافة (عند وضع كلتا اليدين على الحساسين في نفس الوقت وكانت المسافة أكبر من 40 وأصغر من 50) سيتوقف الفيديو وعند الرغبة بتشغيل الفيديو مرة أخرى يمكنك إرجاع كلتا يديك لكلا الحساسين.

if ((distL >40 && distR>40) && (distL <50 && distR<50)) //Detect both hands
{Serial.println("Play/Pause"); delay (500);}

بناء على المسافة (المسافة بين الحساس الأيسر واليد اليسرى أكبر من 40 وأقل من 50 والمسافة بين الحساس الأيمن واليد اليمنى تساوي 50)  سيتم ترجيع الفيديو للخلف.

بناء على المسافة (المسافة بين الحساس الأيمن واليد اليمنى أكبر من 40 وأقل من 50 والمسافة بين الحساس الأيسر واليد اليسرى تساوي 50)  سيتم تقديم الفيديو للامام.

if ((distL >40 && distL<50) && (distR ==50)) //Detect Left Hand
{Serial.println("Rewind"); delay (500);}

if ((distR >40 && distR<50) && (distL ==50)) //Detect Right Hand
{Serial.println("Forward"); delay (500);}

إذا كانت المسافة (المسافة بين الحساس الأيسر ويدك اليسرى أقل من 10) سيزيد حجم الصوت.

إذا كانت المسافة (المسافة بين الحساس الأيسر ويدك اليسرى أكبر من 20)  سينقص حجم الصوت.

//Lock Left - Control Mode
if (distL>=13 && distL<=17)
{
  delay(100); //Hand Hold Time
  calculate_distance(trigger1,echo1);
  distL =dist;
  if (distL>=13 && distL<=17)
  {
    Serial.println("Left Locked");
    while(distL<=40)
    {
      calculate_distance(trigger1,echo1);
      distL =dist;
      if (distL<10) //Hand pushed in 
      {Serial.println ("Vup"); delay (300);}
      if (distL>20) //Hand pulled out
      {Serial.println ("Vdown"); delay (300);}
    }
  }
}

إذا كانت المسافة (المسافة بين الحساس الأيمن ويدك اليمنى أقل من 10) سيتم ترجيع الفيديو للخلف.

إذا كانت المسافة (المسافة بين الحساس الأيمن ويدك اليمنى أكبر من 20)  سيتم تقديم الفيديو للأمام.

//Lock Right - Control Mode
if (distR>=13 && distR<=17)
{
  delay(100); //Hand Hold Time
  calculate_distance(trigger2,echo2);
 distR =dist;
if (distR>=13 && distR<=17)
{
Serial.println("Right Locked");
    while(distR<=40)
{
calculate_distance(trigger2,echo2);
 distR =dist;
 if (distR<10) //Right hand pushed in
 {Serial.println ("Rewind"); delay (300);}
 if (distR>20) //Right hand pulled out
 {Serial.println ("Forward"); delay (300);}
 }
}
}
delay(200);
}

X
تم إضافة المنتج إلى السلة بنجاح