fbpx

عالم إفتراضي لمشاريع أردوينو

لوحة الألعاب “Circuito”
مارس 3, 2019
RPi for Normies|وصفة رقم واحد
مارس 12, 2019

عالم إفتراضي لمشاريع أردوينو

في هذا ” المشروع المبسط” سنتعلم كيفية دمج بعض الأدوات المساندة لمشاريع الأردوينو لتطوير إمكانياتها بطريقة مذهلة و الانتقال إلى مستوى آخر من الإحترافية …

لو سمعت يوماً ما عن بعض التقنيات مثل Machine learning أو Computer vision أو حتى Artificial intelligence فهذا المشروع بمثابة مدخل لعالم مختلف لبرمجة المتحكمات. وسأقوم في بعض المشاريع القادمة بمحاولة شرح ذلك تدريجياً.

في معظم المشاريع التي نراها اعتمد الصناع على طريقة واحدة فقط لقراءة المخرجات من لوحة الأردوينو وهي من خلال شاشة الاتصال التسلسلي أو serial monitor، لذا قد يختلف هذا المشروع بعض الشيء لأننا سوف ندمج مخرجات الأردوينو مع لغة برمجة ذكية يمكنها تحليل البيانات لصورة مرئية تُعرض على الكمبيوتر بشكل واقع إفتراضي، وذلك عن طريق استخدام إحدى لغات البرمجة المساندة وهي Python.

من المعروف أن التعامل مع لوحة الأردوينو يتقيد دائماً ببعض الحدود حيث أنه لا يمكن قراءة أي بيانات منها إلا عن طريق شاشة الـ serial monitor وتكون البيانات المقروءة دائماً في صورة نصية و بدائية للغاية.. لذا كيف نبني بيئة رسومية افتراضية لمشاريع الأردوينو؟

لعمل هذا المشروع، تحتاج إلى خبرة مسبقة في:

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

مستوى صعوبة المشروع:

متوسط

مدة عمل هذا المشروع:

ساعتين

المكونات المستخدمة في المشروع:

  1. لوحة أردوينو uno أو أي نوع آخر
  2. مستشعر موجات فوق صوتية
  3. لوحة تجارب Breadboard

قبل البدء في خطوات العمل يجب التعرف أولاً بصورة سريعة على هدف المشروع و إعطاء نبذة عما يعرف باسم الرؤية الحاسوبية Computer vision

الهدف:

إنشاء واقع افتراضي ثلاثي الأبعاد مبسط يحاكي مستشعرات الأردوينو.

تعريف الرؤية حاسوبية:

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

الخطوة الأولى: تحميل لغة البرمجة بايثون على جهازك

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

 رابط التحميل

تحميل بايثون سيريال pyserial
وهي مجموعة من المكتبات المشابهة لمكتبات الأردوينو والتي تعمل مع بايثون تتيح الفرصة للتعامل مع شاشة الاتصال التسلسلي الخاصة بالأرديونو
رابط التحميل

vpython
وهي مكتبة برمجية تتيح تصميم واقع افتراضي موازي ثلاثي الأبعاد لمحاكاة مستشرعات الأردوينو
رابط التحميل

هكذا ستبدو الأيقونات بعد التحميل. يرجي عمل Setup للملفات حسب الترتيب في المقال

الخطوة الثانية: تجهيز المكونات الإلكترونية

قم بتوصيل المستشعر كما هو موضح

الخطوة الثالثة: تحميل كود الأردوينو

الخطوة الرابعة: تجهيز واجهة الواقع الافتراضي بلغة بايثون

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

من خلال برنامج الـ  vpython الذي قمت بتحميلة يمكنك إنشاء و رسم أشكال ثلاثية الأبعاد ببساطة، فمثلاً إذا أردنا رسم مستشعر Ultrasonic

من قائمة start، اختر VIDLE for VPython و أكتب الكود التالي، ثم إضغط Run

سيظهر الشكل التالي ثلاثي الأبعاد، يمكنك تحركية كيفما شئت

الـ color هو المتغير الخاص باللون
و الـ width المتغير الخاص بالعرض و Height للطول
أما المتغير pos هو مكان الـ OBJECT في شاشة العالم الافتراضي (x,y,z)

 و لمزيد من المعلومات عن تقنية الرسم بلغة Python، أضغط هنا

الخطوة الخامسة: استقبال بيانات الأردوينو

1. تأكد من توصيل لوحة الأدروينو وتأكد من رقم المنفذ التسلسلي
2. إغلق شاشة المنفذ التسلسلي الخاصة بالأردوينو
3. افتح نافذة VIDLE for VPython
4. إلصق الكود
5. تأكد من كتابة المنفذ الصحيح في كود البايثون حسب رقم المنفذ بجهازك
ArduinoSerialData = serial.Serial(‘com4’, 9600)
6. من قائمة Run اختر Run module
7. قم بتحريك شيء أمام المستشعر، في الحقيقة ستلاحظ أنه يتم تحريك الشكل ثلاثي الأبعاد في نفس الوقت بالواقع الافتراضي الذي أنشئته

الخطوة السادسة: كود البايثون

حمل الكود التالي و إضغط Run بعد التأكد من توصيل لوحة الأردوينو

int S2= 7; //Color sensore pin S2 to Arduino pin 7
int S3= 8; //Color sensor pin S3 to Arduino pin 8
int outPin = 4; //Color Sensor OUT to Arduino pin 4

int trigPin=13; //Ultrasonic Sensor Trig pin connected to Arduino pin 13
int echoPin=11; //Ultrasonic Sensor Echo pin connected to Arduino pin 11

int rColorStrength; //measured strength of red color
int gColorStrength; //measured strength of green color
int bColorStrength; //measured strength of blue color
unsigned int pulseWidth; //for measuring color strength using pulseIn command

float pingTime; //time for ping to travel from sensor to target and return
float targetDistance; //Distance to Target in inches
float speedOfSound=776.5; //Speed of sound in miles per hour when temp is 77 degrees.

void setup() {
// put your setup code here, to run once:

Serial.begin(115200); //turn on serial port

pinMode(S2, OUTPUT); //S2 and S3 are outputs and used to tell
pinMode(S3, OUTPUT); //arduino which color to measure
pinMode(outPin, INPUT); //This is the pin we read the color from

pinMode(trigPin, OUTPUT); //Ultrasonic Trig Pin is an output
pinMode(echoPin, INPUT); //Ultradoinic Echo Pin is an input

}

void loop() {

//Lets start by reading Red Component of the Color
// S2 and S3 should be set LOW
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);

pulseWidth = pulseIn(outPin, LOW); //Measure raw pulsewidth coming from color sensor outpin

rColorStrength = pulseWidth/400. -1; //normalize number to number between 0 and 255

rColorStrength = (255- rColorStrength); //reverse so that large number means strong color

//Lets read Green Component of the Color
// S2 and S3 should be set HIGH
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);

pulseWidth = pulseIn(outPin, LOW); //Measure raw pulsewidth coming from color sensor outpin

gColorStrength = pulseWidth/400. -1; //normalize number to number between 0 and 255

gColorStrength = (255- gColorStrength); //reverse so that large number means strong color

gColorStrength=gColorStrength + 2;

//Lets read Blue Component of the Color
// S2 and S3 should be set LOW and HIGH Respectively
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);

pulseWidth = pulseIn(outPin, LOW); //Measure raw pulsewidth coming from color sensor outpin

bColorStrength = pulseWidth/400. -1; //normalize number to number between 0 and 255

bColorStrength = (255- bColorStrength); //reverse so that large number means strong color

//Now we need to exagerate the colors because readings from color sensor
//are all too close together. Algorithm that appears to work is to
//take the strongest color and set to 255, take the weakest color
//and set to zero, and then take the middle color and reduce its
//value by 2. That is what this next segment of code does.

if(rColorStrength>gColorStrength && gColorStrength>bColorStrength) {

rColorStrength = 255;
gColorStrength = gColorStrength/2;
bColorStrength = 0;
}

if(rColorStrength>bColorStrength && bColorStrength>gColorStrength) {

rColorStrength = 255;
bColorStrength = bColorStrength/2;
gColorStrength = 0;
}

if(gColorStrength>rColorStrength && rColorStrength>bColorStrength) {

gColorStrength = 255;
rColorStrength = rColorStrength/2;
bColorStrength = 0;
}

if(gColorStrength>bColorStrength && bColorStrength>rColorStrength) {

gColorStrength = 255;
bColorStrength = bColorStrength/2;
rColorStrength = 0;
}

if(bColorStrength>rColorStrength && rColorStrength>gColorStrength) {

bColorStrength = 255;
rColorStrength = rColorStrength/2;
gColorStrength = 0;
}

if(bColorStrength>gColorStrength && gColorStrength>rColorStrength) {

bColorStrength = 255;
gColorStrength = gColorStrength/2;
rColorStrength = 0;
}

//Now lets measure distance to target from the ultrasonic sensor
digitalWrite(trigPin, LOW); //Set trigger pin low
delayMicroseconds(2000); //Let signal settle
digitalWrite(trigPin, HIGH); //Set trigPin high
delayMicroseconds(15); //Delay in high state
digitalWrite(trigPin, LOW); //ping has now been sent
delayMicroseconds(10); //Delay in low state
pingTime = pulseIn(echoPin, HIGH); //pingTime is presented in microceconds
pingTime=pingTime/1000000; //convert pingTime to seconds by dividing by 1000000 (microseconds in a second)
pingTime=pingTime/3600; //convert pingtime to hours by dividing by 3600 (seconds in an hour)
targetDistance= speedOfSound * pingTime; //This will be in miles, since speed of sound was miles per hour
targetDistance=targetDistance/2; //Remember ping travels to target and back from target, so you must divide by 2 for actual target distance.
targetDistance= targetDistance*63360; //Convert miles to inches by multipling by 63360 (inches per mile)

//Now lets print our data to the serial monitor all on one line divided by commas.

Serial.print(rColorStrength);
Serial.print(” , “);
Serial.print(gColorStrength);
Serial.print(” , “);
Serial.print(bColorStrength);
Serial.print(” , “);
Serial.println(targetDistance);

delay(150);

}

بالنهاية قم بتحريك أي جسم أمام المستشعر، سترى أن الـ object الموجود بصورة ثلاثية الأبعاد يتحرك على الشاشة كما هو موضح، في نفس اللحظة بسرعة استجابة فائقة.

الاستفادة :

بطرق مشابهة جداً يتم برمجة الألعاب التي تستخدم نظارات الواقع الإفتراضي VR في المحاكاه بين حركة اللاعب و الصورة الإفتراضية التي يراها أمامه بالنظارة أو شاشة العرض.

الأن يمكنك التخيل والإبداع و خلق الواقع الإفتراضي الخاص بك، ومن ثم مشاركتنا تجربتك …

X