fbpx

The Evil Pumpkin Project

استخدام الأردوينو في تطبيق أثر استمرار الرؤية (POV)
يونيو 11, 2019

The Evil Pumpkin Project

بما اننا داخلين علي الهالوين فعاوزين نعمل مشروع نقدر نستخدمه علشان نخض بيه اصحابنا و الناس اللي احنا مخنوقين منهم، زائد اننا كمان نتعلم شوية حاجات جديدة تخص الالكترونيات و البرمجة و التصنيع الرقمي و اللي هنطبقها عملي بنفسنا في المشروع ده.

مشروعنا النهاردة بسيط جداً، ببساطة احنا عاوزين نعمل مجسم قادر انه يتفاعل مع اي شخص يمر من قدامه من خلال انه يشغل صوت معين و يضئ بشكل معين. بمعني ان اول ما اي حد يمر من قدام المجسم ده في صوت ممكن يكون عبارة عن صوت عفريت بيصرخ مثلاً (او اي حاجة تخض الشخص ده) و كمان المجسم ده ذات نفسه ينور و يطفي بنمط محدد. لكن طول ما مفيش اي شخص ماشي من قدام المجسم ده هو هيقعد ساكت هادي مش بيعمل اي شئ.

  • طباعة مجسم نبات اليقطين (اللي بنقول عليه قرع العسل).

و ده المجسم اللي احنا هنستخذمه في المشروع ده و هنحط جواه مجموعة من اللمبات (LEDs) علشان نخلي المجسم ده قادر ان هو يتفاعل مع اي شخص يمر من قدامه من خلال ان مجموعة اللمبات (LEDs) دي تنور و تطفي. و كمان هيكون موجود جوه المجسم ده سماعة صغيرة مسئولة عن تشغيل مقطع الصوت اللي احنا عاوزين نشغله اول ما الشخص يعدي من قدام المجسم.

  • برمجة الاردوينو و التحكم في القطع الالكترونية.

و ده الجزء اللي هيكون مسئول عن التحكم في كل القطع الالكترونية زي اللمبات المسئولة عن انارة المجسم و السماعة(Speaker) المسئولة عن تشغيل مقطع الصوت و الحساس(Sensor) المسئول عن الاحساس اذا كان في حركة بني ادم قدام المجسم و لا لأ. العمود الفقري اللي هيكون مسئول عن تنظيم الحاجات دي كلها هي بوردة الاردوينو العظيمة و الكود اللولبي اللي هنكتبه ان شاء الله.

المشروع مش صعب اطلاقاً هو سهل جداً و مفيهوش اي تعقيدات. احنا في الوصفة دي هنغطي:

  1. طريقة توصيل المكونات الالكترونية كلها مع شرح احنا ليه وصلنا كده.
  2. طريقة التعامل مع لوحة الاردوينو و السبب وراء اختيارنا للوحة الاردوينو نانو (Arduino nano) مش الاردوينو أونو (Arduino UNO) 
  3. الكود البرمجي المسئول عن التحكم في القطع الالكترونية كلها و شرحه.
  4. و اخيراً، ازاي تقدر تطبع المجسم اللي احنا مستخدمينه في الوصفة دي و منين اصلاً تقدر تنزله جاهز لو انت معندكش خبرة في التصميم.

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

  1. Arduino Nano عدد (١)
  2. DFRobot MP3 Player عدد (١)
  3. PIR Sensor عدد (١)
  4. 10mm red LEDs عدد (٣)
  5. 1k ohm resistor عدد (٤)
  6. 8Ω Speaker عدد (١)
  7. Mini Breadboard عدد (٢)
  8. Wires عدد (هات حبة حلوين كده)

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

  1. مكواة لحام
  2. قصدير
  3. قصافة اسلاك

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

جزء الالكترونيات:

الدايرة الالكترونية بتاعت المشروع المفروض انها بتغطي حاجتين رئيسيتين:

  • مسئولة انها تستقبل قراية معينة (Input) من ال PIR Sensor مهمتها انها تعرفك اذا كان في حد بيتحرك قدام السنسور و لا لأ. و بناءً علي القراية دي هتبداً تنفذ اوامر مختلفة.
  • مسئولة عن تشغيل الانوار و مقطع صوتي معين -عم عادل شكل بيمسي- في حال ان في شخص بيتحرك قدام السنسور. و لو مفيش حركة نهائي قدام السنسور الانوار و المقطع الصوتي هيتقفلو.

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

طريقة عمل السنسور ده بسيطة جداً، زي ما قولنا من شوية ان ال PIR sensor بيقدر يحس بحركة اي كائن حي قدامه بشرط ان تكون المسافة بين الكائن الحي ده و السنسور اقل من ٧ متر. من بعد ال٧ متر القرايات بتاعت السنسور مش بتبقي دقيقة. جسم اي كائن حي بينتج طاقة علي صورة اشعة تحت حمراء بيبدأ السنور يحس بالتغير بتاع الاشعة تحت الحمراء في المكان اللي هو فيه و من هنا بيبدأ يعرف اذا كان في وجود لكائن حي في المدي بتاعه ولا لأ، و علشان كده السنسور اسمه PIR اختصارآ ل Passive Infrared Sensor. الجزء البلاستيك الابيض اللي فوق ده مهمته انه يركز الاشعة تحت الحمراء علي عدسة السنسور بحيث ان القرايات تبقي ادق.

طيب خلاص انا دلوقتي عرفت السنسور ده شغال ازاي، اوصله مع لوحة الاردوينو ازاي بقي؟!

ال PIR sensor ليه ٣ رجول اساسيين:

  • VCC: و دي الرجل اللي بنوصل من خلالها كهربا للسنسور علشان يشتغل و عادة ً بنديها ٥ فولت من لوحة الاردوينو. لكن عادي هي تقدر تستحمل لحد حوالي ٢٠ فولت.
  • GND: و دي الرجل اللي بنوصل عليها الGND (الارضي) بتاع الدايرة الكهربية.
  • Output: و دي الرجل اللي بنستقبل منها قراية السنسور (هل في حركة كائن حي قدامه و لا لأ). الرجل دي بتخرج كهربا في صورتين ملهمش تالت، يأما ٥ فولت و دي معناها ان في حركة قدام السنسور. او بتخرج ٠ فولت و دي معناها ان مفيش حركة قدام السنسور. و بما اننا عاوزين لوحة الاردوينو هي اللي تستقبل القراية دي فبالتالي احنا محتاجين نوصل رجل ال output بتاعت السنسور(Sensor output pin) علي اي رجل ديجيتال (Arduino Digital Pin) بحيث اننا لما نيجي نكتب الكود بتاعنا نقدر نقرأ الكهربا اللي جاية من السنسور و بالتالي نعرف هل في حركة قدامه و لا لأ.

الجزء الاول

تعالي ناخد مثال كده علشان نتأكد اننا فاهمين الجزء ده صح. في المثال ده احنا عاوزين ننور ٣ لمبات(LEDs) مع بعض في نفس الوقت في حالة ان السنسور حس بان في حركة قدامه، او اننا نقفل ال٣ لمبات كلهم و ده في حالة لو مفيش حركة قدام السنسور. طريقة التوصيل هتبقي كالتالي:

التوصيلة بسيطة جداً، موصلين الموجب(VCC) و السالب(GND) بتاع ال PIR Sensor بال ٥ فولت(5V) و السالب(GND) بتاع الاردوينو و دي الكهربا اللي مسئولة ان السنسور ده يشتغل.

بعد كده خدنا الرجل ال Output بتاعت الPIR Sensor و وصلناها علي الرجل رقم D9 علي الاردوينو، و دي الرجل اللي هنقرا منها القرايات اللي جاية من السنسور. و زي ما قولنا القراية اللي جاية من السنسور يأما هتكون ٥ فولت(يعني في حركة قدام السنسور) او ٠ فولت(يعني مفيش حركة قدام السنسور).

و بالنسبة لللمبات (LEDs) فأنا موصل كل لمبة (LED) علي رجل ديجيتال علي الاردوينو خاصة بيها علشان اقدر اتحكم في كل لمبة لوحدها علي مزاجي. و طبعاً كل لمبة (LED) بيكون معاها مقاومة (Current limiting resistor) علشان تقلل كمية التيار اللي داخل لللمبة علشان متتحرقش و بتكون عادةً ما بين ال 330ohm و ال 1k ohm.

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


int sensorPin = 9;
int led1 = 3;
int led2 = 4;
int led3 = 5;
void setup()
{
pinMode(sensorPin, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
Serial.begin(9600);
}

void loop()
{
int sensorReading = digitalRead(sensorPin);
if(sensorReading == 1){
Serial.println(“Someone is moving in range. “);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
}
else{
Serial.println(“No move”);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
}
delay(2);
}


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

int sensorPin = 9;
int led1 = 3;
int led2 = 4;
int led3 = 5;

في الجزء ده احنا بنعرف ارقام رجول الاردوينو اللي احنا موصلين عليها السنسور (رجل رقم ٩) و ال٣ رجول اللي احنا موصلين عليهم اللمبات (رجل ٣، ٤، ٥) و بندي لكل رجل من دول اسم بيعبر عن الشئ اللي احنا موصلينه عليه علشان نسهل علي نفسنا قراية الكود بعد كده. مثلاً في اول سطر احنا عرفنا متغير (Variable) اسمه “sensorPin” نوع المتغير ده integer يعني المتغير ده يقدر يشيل ارقام صحيحة بس، و بعدين ادينا للمتغير ده قيمه اللي هي 9 و دي بتعبر عن رقم الرجل اللي احنا موصلين عليها السنسور.

void setup()
{
pinMode(sensorPin, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
Serial.begin(9600);
}

جوه الدالة (Function) اللي اسمها void setup()، بدأنا نعرف لوحة الاردوينو الرجول اللي احنا موصلين عليها السنسور و اللمبات دول هيشتغلو علي انهم Inputs و لا علي انهم Output. بالنسبة للرجل رقم ٩ اللي موصلين عليها السنسور هتشتغل علي انها Input لان الرجل دي هتستقبل كهربا من السنسور علي حسب في حد بيتحرك قدامه و لا لأ، فمعني ان في كهربا جاية من برا (من السنسور) و داخلة علي الاردوينو من خلال الرجل رقم ٩ فمعني كده ان الرجل رقم ٩ هتشتغل ك Input لانها بتستقبل كهربا مش بتخرج كهربا.

و العكس صحيح مع ال٣ رجول اللي موصلين عليهم اللمبات هيشتغلو علي انهم outputs لانهم هيخرجوا كهربا علشان ينورو اللمبات(LEDs) لو خرجوا 5 volt اللمبات هتنور و لما يخرجو 0 volt اللمبات هتطفي.

بعدين شغلنا ال Serial Monitor علشان نبدأ نعرض عليها القرايات اللي جاية من السنسور بحيث اننا نعرف هو السنسور بيبعت للاردوينو ايه دلوقتي.

void loop()
{
int sensorReading = digitalRead(sensorPin);

جوه الدالة (Function) اللي اسمها void loop(), بنبدأ نكتب البرنامج الرئيسي بتاعنا اللي عاوزينه علي طول يقعد يتنفذ لمدة لا نهائية طول ما الكهربا متوصلة بلوحة الاردوينو.

اول حاجة بنعملها جوه ال void loop() هي اننا نقرأ القراية اللي بيبعتهالي السنسور و اخزنها جوه متغير اسمه “sensroReading” نوع المتغير ده integer يعني معني كده ان اقدر اخزن جواه رقم صحيح فقط.

  • في حالة ان في حركة حس بيها السنسور في المدي بتاعه، بيبدأ السنسور يبعت للأردوينو 5 volt و دي معناها ان في حركة حس بيها السنسور. ال 5 volt لوحة الاردوينو بتعبر عنها بالرقم 1 لان لوحة الاردينو هي عبارة عن digital device مبيفهمش غير حاجتين 1 و 0. يعني معني كده ان المتغير اللي اسمه “sensorReading” هيتخزن جواه 1 لو في حركة حس بيها السنسور.
  • و العكس صحيح، في حالة ان مفيش حركة قدام السنسور هيبعت للأردوينو 0 volt و اللي بيعبر عنها الاردوينو بقيمة digital و اللي هي 0. يعني معني كده ان المتغير اللي اسمه “sensorReading” هيتخزن جواه 0 لو مفيش حركة حس بيها السنسور.

if(sensorReading == 1){
Serial.println(“Someone is moving in range. “);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
}

و هنا بدأت اقول للوحة الاردوينو ايه الاوامر اللي انا عاوزه ينفذها لو في حركة حس بيها السنسور و ايه الاوامر اللي ينفذها لو مفيش حركة. فأنا قولتله لو القيمة المخزنة جوه المتغير اللي اسمه “sensorReading” بتساوي 1 اكتبلي علي ال Serial monitor الجمله دي “Someone is moving in range” و بعدين نورلي ال٣ لمبات اللي هما led1, led2, led3. 

علشان تفتح الserial monitor هتدوس علي الزرار ده (لازم تكون موصل لوحة الاردوينو بجهاز الكومبيوتر بتاعك الاول لو مش موصلها ال Serial monitor مش هتشتغل)

 

لو في حركة حس بيها السنسور هيكتبلة الجملة دي “Someone is moving in range” زي ما في الصورة كده.

else{
Serial.println(“No move”);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
}

و بعدين قولتله لو الشرط ده متحققش (يعني ال “sensorReading” مش بتساوي 1) اكتبلي علي ال Serial monitor الجملة دي “No move” و بعدين اطفيلي ال٣ لمبات اللي هما بردو led1, led2, led3.

في الحالة دي زي ما قولنا ال  Serial monitor هتكتبلك “No move” زي ما في الصورة كده

 

الجزء الثاني

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

علشان نقدر نعمل ده فأحنا محتاجين نلجأ لحد يساعدنا في اننا نشغل مقاطع صوت باستخدام لوحة الاردوينو لان هي لوحدها معندهاش الامكانية دي. و هنا ييجي دور القطعة الالكترونية (Module) اللي اسمها DFRobot mini MP3 Player.

ببساطة ال DFRobot mini MP3 Player هي عبارة عن قطعة الكترونية تقدر تركب فيها كارت ذاكرة خارجية (memory card) عليه المقاطع الصوتية اللي انت عاوز تشغلها و كمان تقدر توصل عليها السماعة اللي هتشغل المقطع الصوتي ده. بعد كده توصل القطعة الالكترونية(Module) دي بلوحة الاردوينو و من خلال الكود البرمجي اللي هنكتبه دلوقتي هتقدر انك تشغل المقطع الصوتي اللي انت عاوزه و كمان تقدر تعلي الصوت او تقلله و حاجات تانية كتير جداً.

ال DFRobot mini MP3 Player ليه ١٦ رجل، كل رجل و ليه وظيفة معينة. مش هنتكلم عليهم كلهم هنتكلم علي الرجول اللي هنحتاج نستخدمها في المشروع ده.

  • VCC: و دي الرجل اللي بنوصل عليها ال 5 volt بتاعت الاردوينو. الكهربا اللي القطعه الالكترونية دي محتاجاها علشان تشتغل.
  • RX و Tx: ال Rx اختصار لي “Receive” و ال Tx اختصار ل “Transmit” و دول الرجلين اللي مسئولين عن ال Serial communication و هو نوع الاتصال اللي بيكون ما بين لوحة الاردوينو و القطعة الالكترونية دي. ال Serial communication هي طريقة من طرق ارسال و استقبال الاوامر من و الي لوحة الاردوينو.
  • SPK_1: و دي الرجل اللي بنوصل عليها طرف من اطراف السماعة (Speaker) اللي هتشغل مقطع الصوت.
  • GND: و دي الرجل اللي بنوصل عليها الارضي (Ground) بتاع الدايرة الكهربية بتاعتنا.
  • SPK_2: و دي الرجل اللي بنوصل عليها طرف السماعة(Speaker) التاني.

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

و علشان يكون في صوت فلازم يكون في سماعة(Speaker). احنا في المشروع ده استخدمنا سماعة 8ohm قوتها ربع وات(0.25W) حجمها صغير قطرها حوالي ٢٠مم (20mm Diameter) صوتها مكنش عالي اوي. فلو انت حاببب تستخدم سماعة تديك صوت عالي اشتري سماعة بقوة اعلي

السماعة ملهاش قطبية(Polarity) يعني مفيش طرف موجب و طرف سالب.

بس خلي بالك ان اعلي سماعة تقدر توصلها بال DFRobot mini MP3 Player هي 3W يعني لو وصلت سماعة ازيد من 3W هيحصل مشكلة للموديول DFRobot mini MP3 Player.

طريقة التوصيل هتكون كالتالي:

هنكمل علي الجزء الاول اللي كنا وصلنا فيه الPIR Sensor و ال٣ لمبات، هنزود عليهم ال MP3 Player Module و كمان السماعة (speaker) اللي مسئولة عن اخراج الصوت. 

طريقة التوصيل سهلة جداً، احنا وصلنا ال VCC و ال GND بتوع ال MP3 player module بال 5V و ال GND بتاع الاردوينو.

بعدين وصلنا ال Rx بتاعت ال MP3 player module بالرجل رقم D11 علي لوحة الاردوينو من خلال مقاومة مقدارها 1k ohm، بعدين وصلنا ال Tx بتاعت ال MP3 player module بالرجل رقم D10 علي لوحة الاردوينو.

و اخيراً وصلنا طرفين السماعة (Speaker) بالرجلين ال SPK_1 و SPK_2 علي ال MP3 player module.

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


#include “Arduino.h”
#include “SoftwareSerial.h”
#include “DFRobotDFPlayerMini.h”

int pirSensor = 9;
int sensorReading = 0;

int LED1 = 3;
int LED2 = 4;
int LED3 = 5;

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
mySoftwareSerial.begin(9600);
Serial.begin(115200);

pinMode(pirSensor, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);

Serial.println();
Serial.println(F(“DFRobot DFPlayer Mini Demo”));
Serial.println(F(“Initializing DFPlayer … (May take 3~5 seconds)”));

if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F(“Unable to begin:”));
Serial.println(F(“1.Please recheck the connection!”));
Serial.println(F(“2.Please insert the SD card!”));
while (true) {
delay(0); // Code to compatible with ESP8266 watch dog.
}
}
Serial.println(F(“DFPlayer Mini online.”));

myDFPlayer.volume(30); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
}

void loop()
{
sensorReading = digitalRead(pirSensor);
Serial.println(sensorReading);

if (sensorReading == 1) {
LEDBlink();
myDFPlayer.play(1); //Play the first mp3
delay(7000); //delay for the MP3 length to play it.
} else {
myDFPlayer.stop(); //Play the first mp3
LEDOff();
delay(20);
}


if (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
}
}

void LEDBlink() {
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
delay(200);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
delay(200);

digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
delay(200);
}

void LEDOff() {
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED1, LOW);
}

void printDetail(uint8_t type, int value) {
switch (type) {
case TimeOut:
Serial.println(F(“Time Out!”));
break;
case WrongStack:
Serial.println(F(“Stack Wrong!”));
break;
case DFPlayerCardInserted:
Serial.println(F(“Card Inserted!”));
break;
case DFPlayerCardRemoved:
Serial.println(F(“Card Removed!”));
break;
case DFPlayerCardOnline:
Serial.println(F(“Card Online!”));
break;
case DFPlayerUSBInserted:
Serial.println(“USB Inserted!”);
break;
case DFPlayerUSBRemoved:
Serial.println(“USB Removed!”);
break;
case DFPlayerPlayFinished:
Serial.print(F(“Number:”));
Serial.print(value);
Serial.println(F(” Play Finished!”));
break;
case DFPlayerError:
Serial.print(F(“DFPlayerError:”));
switch (value) {
case Busy:
Serial.println(F(“Card not found”));
break;
case Sleeping:
Serial.println(F(“Sleeping”));
break;
case SerialWrongStack:
Serial.println(F(“Get Wrong Stack”));
break;
case CheckSumNotMatch:
Serial.println(F(“Check Sum Not Match”));
break;
case FileIndexOut:
Serial.println(F(“File Index Out of Bound”));
break;
case FileMismatch:
Serial.println(F(“Cannot Find File”));
break;
case Advertise:
Serial.println(F(“In Advertise”));
break;
default:
break;
}
break;
default:
break;
}

}


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

#include “SoftwareSerial.h”
#include “DFRobotDFPlayerMini.h”

السطرين دول مهمتهم استدعاء المكتبه البرمجية اللي اسمها “SoftwareSerial” و ال “DFRobotDFPlayerMini”.

المكتبة “SoftwareSerial” غرضها اضافة امكانية للوحة الاردوينو انها تستخدم اي digital pin علي انها Rx, Tx تستخدمها في التواصل مع القطع الالكترونية الاخري. و ده اللي احنا عملناه في المشروع، احنا مستخدمين رجلين الاردوينو D10, D11 علي انهم Rx, Tx.

المكتبة “DFRobotDFPlayerMini” مهمتها انها تسهل طريقة ارسال الاموار لل MP3 player module عن طريق مجموعة من الدوال (functions) الجاهزة اللي انت كمبرمج هتستخدمها علشان تقول لل MP3 player module انت عاوزه يعمل ايه بالظبط. 

علي سبيل المثال، احنا مثلاً عاوزين نشغل اول مقطع صوتي موجود علي كارت الميموري. هنستخدم الدالة (function) اللي اسمها .play() يعني الامر النهائي هيكون بالمنظر دهmyDFPlayer.play(1); انت كده بتقوله شغل المقطع الصوتي رقم واحد اللي موجود علي الكارت. و لو عاوز توقف المقطع الصوتي هتستخدم الدالة اللي اسمها .stop() و لو عاوز تغير مستوي الصوت هتستخدم الدالة اللي اسمها .volume()

علشان تقدر تستخدم المكتبة البرمجية “DFRobotDFPlayerMini” فأنت محتاج تعملها تثبيت (Install) علي جهاز الكومبيوتر بتاعك. 

بعد ما نفته برنامج Arduino IDE، هندوس علي Sketch-> Include Library-> Manage Libraries

بعدين هنبحث عن اسم المكتبة اللي احنا عاوزنها “DFRobotDFPlayerMini” اول ما تظهرلنا هندوس علي “Install” (كلمه Install مش ظاهرة عندي علشان انا محمل المكتبة قبل كده، لكن لو انت مش محملها هتظهرلك عادي)

لو عاوز تعرف تفاصيل اكتر عن المكتبة البرمجية دي تقدر توفرلك ايه شوف اللينك ده.

void loop()
{
sensorReading = digitalRead(pirSensor);
Serial.println(sensorReading);

if (sensorReading == 1) {
LEDBlink();
myDFPlayer.play(1); //Play the first mp3
delay(7000); //delay for the MP3 length to play it.
} else {
myDFPlayer.stop(); //Play the first mp3
LEDOff();
delay(20);
}

  • بنستلم القراية اللي جاية من السنسور و نخزنها جوه المتغير اللي اسمه “sensorReading” و بعدين نطبعها علي ال Serial monitor.
  • لو القيمة بتاعت المتغير “sensorReading” بتساوي 1 بنشغل اللمبات و بعدين بنشغل اول مقطع صوتي موجود علي كارت الميموري و بنستني لمده ٧ ثواني اللي هي مدة المقطع الصوتي ده. (٧٠٠٠ ميلي ثانية بتساوي ٧ ثانية) (هتحتاج انك تغير الزمن اللي جوه الدالة delay() علي حسب مده المقطع الصوتي اللي انت هتشغله)
  • و لو القيمة المخزنة جوه المتغير “sensorReading” مش بتساوي 1 اطفي اللمبات و وقف المقطع الصوتي.

و بكده يكون جزء الالكترونيات خلص و فاضل اننا نطبع الديزاين اللي بتاع نبات القرع العسلي (Pumpkin).

جزء التصميم و الطباعة ثلاثية الابعاد:

قدامك طريق من طريقين تقدر تمشي فيهم علشان تنفذ المشروع ده:

  • انك تنزل تصميم (3d design) جاهز من علي الانترنت و تطبعة انت علي اي مكنة 3D printer
  • او تعمل انت التصميم اللي يعجبك و بعدين تطبعه علي اي مكنة 3d printer

لو حابب انك تمشي في اول طريق و تجيب ديزاين جاهز من علي الانترنت، فأشهر موقعين موجودين عليهم تصميمات كتير ناس عملتها و نشرتها مفتوحة المصدر لاي حد يقدر يحملها و يستخدمها ببلاش هما Thingivers و Grabcad

كل اللي عليك تعمله انك تدخل علي الموقع و تبحث عن اي شئ انت عاوزه و غالباً هتلاقي ناس كتير عملته قبل كده و رفعته علي الموقع ده مجاناً لاي حد يقدر يستخدمه بدون اي مشاكل.

التصميم اللي احنا اشتغلنا بيه في المشروع ده هو تصميم مفتوح المصدر. تم تصميمه من Kaitlin و ده لينك المشروع

بعد ما تنزل ملفات المشروع علي جهازك، هتلاقي ملفين صيغتهم (.STL) و هي دي الملفات بتاعت التصميم اللي تهمنا 

لو عندك انت فكرة و حابب تصممها بنفسك يبقي هتحتاج انك تستخدم برنامج تصمم عليه اشهرهم Solidworks و fusion360. لو انت لسه بتبدأ فانا ارشحلك برنامج fusion360 لانه اسهل في التعامل و سهل اي مبدأ يبدأ عليه و امكانياته لا تقل خالص عن ال solidwroks و كمان فيه بض المميزات اللي مش موجودة في ال solidworks.

هنعتبر انك دلوقتي بقي معاك التصميم اللي عاوز تطبعه (سواء نزلته جاهز او عملته بنفسك). فأحنا دلوقتي ناقصلنا خطوة اختياريه ممكن تعملها لو حابب او متعملهاش لو مش حابب. و هي اننا نعمل Slicing للتصميم بتاعنا (ممكن تاخد ملفات ال STL و تروح بيها اي Fablab و تطلب من الشخص المسئول عن الطباعة انه يعملك Slicing بالجودة اللي انت عاوزها). و الغرض منها نظبط مقدار جودة الطباعة و مقدار ال Infill بتاع التصميم و نعرف التصميم هيكون وزنه كام جرام بعد الطباعة و هيتطبع في وقت قد ايه و كذا حاجة تانية ممكن تبحث اونلاين عن يعني ايه 3d printing slicing لو حابب تعرف تفاصيل اكتر.

في كذا برنامج مختلف تقدر تعمل بيه Slicing لكن انا شخصياً بستخدم CURA. هتفتح البرنامج بعدين هندوس File -> open files 

بعدين هتختار الملفين اللي صيغتهم .STL الخاصين بالتصميم اللي نزلناه

 

بعدين هنحدد مقدار ال resolution يعني الlayer الواحدة هيكون ارتفاعها كام مللي(كل ما ارتفاع ال layer يقل كل ما الجودة تزيد و طبعاً زمن الطباعة بردو هيزيد) 0.20mm هي قيمة معقولة جداً لكن ممكن تغير القيمة دي علي حسب احتياجاتك. و كمان هنحدد مقدار ال Infill يعني الجدار الخارجي للمجسم هيكون مليان بلاستيك من جوه بمقدار كام في المية. ٢٠٪ بتكون قيمة مناسبة جداً لاغلب الاجسام اللي بيكون مش عليها حمل او وزن او شايلة حاجة.

بعدين هنبدأ نعمل Slicing 

و دي نتيجة ال Slicing هتلاقيه بيقولك المجسم ده هيتطبع في مدة زمنية قد ايه، و كمان بيقولك هيكون وزن المجسم بعد الطباعة كام جرام.

 

لو النتيجة بالنسبة لك مرضية هتدوس علي Save To File و بعدين تاخد الملفات دي و تدخلها لل 3D Printer و تسيبها هي بقي تعمل شغلها 😀

  • لو حابب تنزل الكود البرمجي النهائي للمشروع، تقدر تحمله من اللينك ده.
  • لو حابب تنزل طريقة التوصيل، تقدر تنزلها من اللينك ده.

 

تقدر تنزل التصميم اللي اشتغلنا بيه المشروع ده من صفحة المشروع علي Grabcad او من اللينك ده.

في وصفة النهاردة احنا اتكلمنا و غطينا اكتر من نقطة، زي ازاي نتعامل مع ال PIR Sensor و ازاي نستقبل منه قرايات و منها نقدر ننفذ اوامر مختلفة بناءً علي القرايات اللي بنستقبلها من السنسور، و كمان اتكلمنا ازاي نستخدم ال DFRobot MP3 Player module علشان نشغل مقاطع صوتية معينة، و كمان اتكلمنا عن ايه اشهر البرامج اللي تقدر تستخدمها علشان تصمم اي حاجة انت عاوزها و كمان الاماكان اللي ممكن تنزل من عليها تصميمات جاهزة تقدر تستخدمها مجاناً.

دلوقتي بقي عاوزين نتكلم عن الاماكن اللي تقدر تشتري منها القطع الالكترونية و الاماكان اللي تقدر تطبع فيها مجسمات ثلاثية الابعاد. 

بالنسبة للقطع الالكترونية:

القطع الالكترونية دي كلها هتلاقيها موجودة في محل اسمه Ram Electronics في وسط البلد، باب اللوق. و لو المكان بعيد عليك تقدر تطلبها اون لاين من الويب سايت بتاعهم.

ليك كامل الحرية تشتري من المكان اللي يريحك، ده مجرد علي سبيل المثال و ليس الحصر.

بالنسبة للتصميم و الطباعة ثلاثية الابعاد:

لو انت معاك تصميم و محتاج تطبعه علي مكنة 3D printer ممكن تروح Fablab Egypt في المعادي، شارع ١٠٠ قريب من ميدان الحرية هتلاقي اللي انت محتاجه هناك.

طيب انت مش معاك تصميم و محتاج حد يساعدك في تنفيذ الفكرة بتاعتك، هتلاقي هناك بردو technical support يقدرو يساعدوك.

اتمني تكون الوصفة دي كانت واضحة و سهلة و اتمني انكم تكونو سعداء 😀 لو في حاجة مش واضحة و حابب تسأل عليها، قولهالنا في التعليقات و انا هكون سعيد جداً اني ارد علي سؤالك <3

Ahmed
Ahmed
Junky Egyptian Hardcore DIYer
X