عربة تسوق باستخدام RFID و الاردوينو

في هذا الدرس سنتعلم كيف نبرمج الاردوينو وقارئ (RFID) لصنع عربة تسوق ذكية واضافة شريحة (RFID) إلى المنتجات. و يمكن معرفة سعر المنتج مباشرة بتمريره على القارئ بالعربة، وحساب فاتورة المشتريات، وعرض البيانات على الشاشة الكريستالية (LCD) ، كما يمكن حذف المنتج بالضغط على ضغاط التحكم و تمرير المنتج على قارئ (RFID)

RFID عربة

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

اردوينو

X1اردوينو 

قارئ rfid

X 1قارئ (RFID)

LCD

X1 شاشة كرستالية

رأس دبوس

X1 40 رأس دبوس

Full-size

X1 لوحة تجارب

سلك اردوينو

X1 سلك أردوينو

مصدر صوت

X1 مصدر صوت 

مفتاح

X1 ضغاط تحكم

arduino-smoke-gas-sensor

X1 مقاومة متغيرة

Jumper Wires Male/Male

أسلاك توصيل (ذكر/ ذكر)

مقاومة 220

X1 مقاومة 220 أوم

مقاومة

X1 مقاومة 10 كيلو اوم 

 

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

RFID-CART

تم توصيل القارئ بالأردوينو كما يلي :

قارئ RFID الأردوينو
SDA منفذ 10
SCK منفذ 13
MOSI منفذ 11
MISO منفذ 12
IRQ لا يتم توصيله
GND GND
 RST منفذ 9
 3.3v 3.3v (لاتقم بتوصيله إلى 5v)

البرمجة

أولا : قراءة البيانات من RFID tag :

قبل كتابة التعليمات البرمجية ، تحتاج إلى تحميل المكتبة الازمة لقارئ RFID من هنـا.

 وإضافة المكتبة إلى المكتبات الموجودة ببرنامج الاردوينو.  يمكن الاطلاع على طريقة تنزيل المكتبات من خلال الرابط

بعد أن تم توصيل الدائرة، انتقل إلى (File) >(Examples)>(MFRC522) >(DumpInfo)وارفع ملف البرمجة على الاردوينو

ثم قم بفتح الشاشة التسلسلية، يجب أن تظهر النافذة كالتالي :

security-access-using-rfid-reader

عند تمرير بطاقة (RFID) ستظهر كافة بيانات البطاقة على نافذة شاشة الاتصال التسلسلي

security-access-using-rfid-reader

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

ثانيًا : الكود البرمجي

#include <LiquidCrystal.h>
#include <SPI.h> 
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
String coffee = "25 13 68 33";
String tea = "4F 44 4D 29";
String water = "ED 82 B2 73";
int count = 0;
int p1=0,p2=0,p3=0; 
double total = 0;
int count_prod = 0;
void setup()

{pinMode(14, OUTPUT);
lcd.begin(16,2);
pinMode(8, INPUT);
Serial.begin(9600); // Initiate a serial communication
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
lcd.setCursor(0, 0);
lcd.print(" SHOPPING CART");
delay (2000);
lcd.setCursor(0, 1);
delay (2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" WELCOME TO ");
lcd.setCursor(0, 1); 
lcd.print(" OUR STORE");


}
void loop() 
{
if ( ! mfrc522.PICC_IsNewCardPresent()) 
{
return;
}

if ( ! mfrc522.PICC_ReadCardSerial()) 
{
return;
}
lcd.clear();
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++) 
{
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
content.toUpperCase();
int a=digitalRead(8);
//FIREST PRODUCT 
if (content.substring(1) == coffee && (a == 0)) 
{lcd.setCursor(0, 0);
lcd.println("Coffee15.00 SR");
tone(14,350);
delay(5);
noTone(14);
total = total + 15.00;
p1++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

else if (content.substring(1) == coffee && (a == 1)) 
{
if(p1>0)
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("coffee Removed!!! ");
tone(14,350);
delay(5);
noTone(14);
total = total - 15.00;
p1--;
lcd.setCursor(0, 1);
lcd.println("Total=");
lcd.print(total);
delay (3000);
} 
else
{lcd.clear();
lcd.print("Not in cart!!! ");}}

//FIREST PRODUCT 
if (content.substring(1) == tea && (a == 0)) 
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tea 8 SR");
tone(14,350);

delay(5);
noTone(14);
total = total + 8.00;
p2++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

else if (content.substring(1) == tea && (a == 1)) 
{if(p2>0)
{lcd.clear(); 
lcd.print("Tea Removed!!!");
tone(14,350); 
delay(5);
noTone(14);
total = total - 8.00;
p2--;
lcd.setCursor(0, 1);
lcd.println("Total=");
lcd.print(total);
delay (3000);
} 
else
{lcd.clear();
lcd.print("Not in cart!!!");
delay (3000);
}}
if (content.substring(1) == water && (a == 0)) 
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("water 2.00 SA ");
tone(14,350); 
delay(5);
noTone(14);
total = total + 2.00;
p3++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

else if (content.substring(1) == water && (a == 1)) 
{
if(p3>0)
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Removed!!! ");
tone(14,350);
delay(5);
noTone(14);
total = total - 2.00;
p3--;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
delay (3000);
} 
else
{lcd.print("Not in cart!!! ");
delay (3000);
}}
}

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

في الأسطر التالية يتم استدعاء المكتبات التالية (LiquidCrystal-SPI-MFRC522) والتي تحتوي على أوامر برمجية مهمة لتشغيل المشروع

#include <LiquidCrystal.h>
#include <SPI.h> 
#include <MFRC522.h>

نعرف المنافذ المتصلة مع القارئ

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

نعرف المنافذ المتصلة مع الشاشة الكرستالية

const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

لدينا 3 بطاقات RFID بعد أن تعرفنا على الرقم الخاص بكل بطاقة ثبتناه على المنتج و عرفنا الرقم باسم المنتج

 
String coffee = "25 13 68 33";
String tea = "4F 44 4D 29";
String water = "ED 82 B2 73";

نعرف متغير (count) يشر إلى عدد المنتجات التي تم شراؤها و المتغيرات (p1-p2-p3) تشير للمنتج الأول و الثاني و الثالث

 
int count = 0;
int p1=0,p2=0,p3=0; 
double total = 0;
int count_prod = 0;

في دالة (void setup)نعرف منفذ مصدر الصوت و نقوم بتهئية الشاشة ،وقارئ FRID

void setup()

{pinMode(14, OUTPUT);
lcd.begin(16,2);
pinMode(8, INPUT);
Serial.begin(9600); // Initiate a serial communication
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522

نطبع على الشاشة عبارات ترحيبية تظهر عند بدء التشغيل فقط

lcd.setCursor(0, 0);
lcd.print(" SHOPPING CART");
delay (2000);
lcd.setCursor(0, 1);
delay (2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" WELCOME TO ");
lcd.setCursor(0, 1); 
lcd.print(" OUR STORE");

}

عند دالة (void loop) نجعل البرنامج جاهز لقراءة البطاقات

 
void loop() 
{
if ( ! mfrc522.PICC_IsNewCardPresent()) 
{
return;
}

if ( ! mfrc522.PICC_ReadCardSerial()) 
{
return;
}
lcd.clear();
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++) 
{
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
content.toUpperCase();

 

نعرف متغير خاص بالمفتاح الذي سيتم ضغطه عند حذف المنتجات فقط

int a=digitalRead(8);

عند قراءة الرمز الخاص ببطاقة القهوة بدون الضغط على المفتاح يتم اضافة سعر القهوة و عرضها على الشاشة

if (content.substring(1) == coffee && (a == 0))
{lcd.setCursor(0, 0);
lcd.println("Coffee15.00 SR");
tone(14,350);
delay(5);
noTone(14);
total = total + 15.00;
p1++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

عند قراءة الرمز الخاص ببطاقة القهوة مع الضغط على المفتاح يتم حذف القهوة و عرضها على الشاشة

else if (content.substring(1) == coffee && (a == 1))
{
if(p1>0)
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("coffee Removed!!! ");
tone(14,350);
delay(5);
noTone(14);
total = total - 15.00;
p1--;
lcd.setCursor(0, 1);
lcd.println("Total=");
lcd.print(total);
delay (3000);
}

 

اذا لم تكن القهوة موجودة تظهر رسالة على الشاشة أنها غير موجودة

 

else
{lcd.clear();
lcd.print("Not in cart!!! ");}}

اضافة وحذف المنتج الثاني

if (content.substring(1) == tea && (a == 0))
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tea 8 SR");
tone(14,350);
delay(5);
noTone(14);
total = total + 8.00;
p2++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

else if (content.substring(1) == tea && (a == 1))
{if(p2>0)
{lcd.clear();
lcd.print("Tea Removed!!!");
tone(14,350);
delay(5);
noTone(14);
total = total - 8.00;
p2--;
lcd.setCursor(0, 1);
lcd.println("Total=");
lcd.print(total);
delay (3000);
}
else
{lcd.clear();
lcd.print("Not in cart!!!");
delay (3000);
}}

اضافة وحذف المنتج الثالث

if (content.substring(1) == water && (a == 0))
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("water 2.00 SA ");
tone(14,350);
delay(5);
tone(14,350);
total = total + 2.00;
p3++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

else if (content.substring(1) == water && (a == 1))
{
if(p3>0)
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Removed!!! ");
tone(14,350);
delay(5);
noTone(14,350);
total = total - 2.00;
p3--;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
delay (3000);
}
else
{lcd.print("Not in cart!!! ");
delay (3000);
}}
}

 




التحكم بمحرك السيرفو باستخدام النود-ريد (Node-RED)

تستخدم المحركات بشكل شائع في مجال الروبوتات، و يمكننا أن نتحكم بهذه الروبوتات عن طريق ربطها بالانترنت، في هذا المشروع نقوم بتوصيل محرك سيرفو  مع راسبيري باي Raspberry Pi والتحكم به من خلال صفحة ويب باستخدام النود-ريد (Node-RED)سيتم إنشاء صفحة منقلة لعرض زاوية المحرك و مزلاج من درجة 0-180 و ترسل قيم الزاوية المراد تحريكها إلى راسبيري باي (Raspberry Pi) للتحكم بمحرك سيرفو ،

Node-RED-servo-control

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

راسبيري باي

1X راسبيري باي

ذاكرة

1X ذاكرة (8 قيقا كحد أدنى )

محول طاقة راسبيري باي

1X محول طاقة (5V-2A)

محرك سيرفو

1Xمحرك سيرفو

أسلاك توصيل

أسلاك توصيل

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

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

تثبيت النودريد (Node-RED)

يتم تثبيت النود-ريد (Node-RED) عند تثبيت نظام التشغيل راسبيان (Raspbian) النسخة الكاملة  على راسبيري باي، لكن اذا ثبتت نظام (Raspbian Lite) فإنه لا يتضمن على النود-ريد (Node-RED) فلذلك في البداية ستحتاج إلى اتباع الخطوات التالية.

ابدأ بتثبيت أدوات (git) ، بالإضافة إلى أدوات البناء الأساسية التي ستكون مطلوبة في الخطوة التالية. عن طريق الأمر :

sudo apt install build-essential git

قم بتشغيل أمر (bash) لتثبيت نسخة جديدة من (Node-RED) عن طريق السطر التالي :

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

أثناء عملية التثبيت سيتطلب أن تجيب بنعم مرتين و ذلك بكتابة (Y) سيستغرق التثبيت بعض الوقت و بعد اكتمال التثبيت تظهر معلومات حول إعدادات نود-ريد (Node-RED) في وحدة التحكم.

اعدادات تثبيت النود-ريد (Node-RED)

اذا كنت تستخدم راسبيري باي (Raspberrypi 4) الذي يمتلك ذاكرة عشوائية أكثر من 2 غيغابايت يمكن البدء بخدمة نود-ريد ( Node-RED).بكتابة الأمر التالي:

node-red-start

بالنسبة لإصدارات راسبيري باي ( Raspberry Pi) الأقدم من الأفضل تحديد مقدار ذاكرة الوصول العشوائي المتاحة يمكن استخدام الأمر التالي:

node-red-pi --max-old-space-size=256

في ثواني سوف تبدأ خدمة النود-ريد (Node-RED) اكتب http: //nodered.local: 1880 في شريط العنوان الخاص بمتصفحك

اكتب عنوان   IPالخاص بالراسبيري باي لديك بدل من “nodered.local”

و ستظهر لديك واجة النود-ريد

واجهة النود ريد

 

إنشاء التدفق

في البداية يمكنك الاطلاع على السلسلة التعليمية الخاصة بالنود-ريد (Node-RED) من الرابط

أولًا: الاتصال بمنفذ الادخال و الاخراج (GPIO) في لوحة الراسبيري باي :

من قسم عقد راسبيري باي نسحب المخرجات “rpi gpio” و التي تكون رمز الراسبيري على اليمين

Node-RED-servo-control

حدد المنفذ الذي قمت بتوصيل محرك سيرفو معه

rpi gpio

نحدد نوع الاشارة و قيمة التردد

rpi gpio

ثانيًا : تعين قيم التحكم بالخرج 

سنقوم بمعادلة قيم الدخل (0-26) مع أعلى و أقل قيمة لزاوية محرك سيرفو التي نود أن يتحرك خلالها و هي (0-180) قسم الدوال نسحب “range”

Node-RED-servo-control

 نحدد المدى للدخل ،و كذلك نحدد المدى للخرج

renge

ثالثًا: واجهة المستخدم 

: واجهة المستخدم سوف يظهر في واجهة المستخدم عنصرين العنصر الأول المزلاج للتحكم بالسيرفو العنصر الثاني شكل المنقلة لإظهار زاوية محرك سيرفو

لتتمكن من انشاء واجهة مستخدم تحتاج إلى تنزيل مكتبة لوحة التحكم (Dashboard)

تحميل مكتبة

ستظهر لك قائمة يمكن من خلالها البحث عن المكتبة و تنزيلها

تنزيل مكتبة الداشبوريد

اسحب “slider” من قائمة عقد لوحة التحكم (Dashboard)

Node-RED-servo-control

بالنقر على العقدة ستظهر لنا قائمة تساعدنا في التحكم باعدادات العقدة

بالبداية قم باضافة مجموعة

انشاء مجموعة

انقر على اشارة القلم ثم انشئ مجموعة لواجهة المستخدم

انشاء المجموعة

 

حدد المجموعة و المدى من (0-26)

pwm

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

Node-RED-servo-control

نظيف لواجهة المستخدم شكل المنقلة الذي يشير للزاوية التي يوجد عندها محرك سيرفو

نسحب “gauge” من قسم “Dashboard”

Node-RED-servo-control

نحدد القيمة التي سيمثلها الشكل

Node-RED-servo-control

نوصل العقد معا لإنشاء التدفق المطلوب

Node-RED-servo-control

أخيرًا: نشر التدفق
تم الانتهاء من التدفق، حتى نتمكن من نشره. انقر على زر Deploy الأحمر الكبير أعلى يمين الشاشة. ستظهر رسالة في الأعلى تقول تم نشرها بنجاح “Successfully deployed”

getting-started-with-node-red
 اكتب http: //nodered.local: 1880/ui في شريط العنوان الخاص بمتصفحك اكتب عنوان IP الخاص راسبيري باي لديك بدل من “nodered.local” لتظهر واجهة المستخدم التي قمت ببنائها لتتحكم بمحرك سيرفو
Node-RED-servo-control
يمكنك التحكم من خلال الواجهة التي أنشأتها بالنود-ريد (NodeRED) بمحرك سيرفو



تحكم في طابعة 3D عن بُعد باستخدام راسبيري باي و octopi

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

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

راسبيري باي

1X راسبيري باي 
راسبيري باي كاميرا

 1X كاميرا للراسبري باي (raspberry pi camera module) أو USB webcam

 

ذاكرة

1X ذاكرة صغيرة (Micro SD card) 8 قيقا كحد أدنى

قارئ بطاقة الذاكرة

1X قارئ بطاقة الذاكرة 

سلك يو اس بى A-B

1X سلك يو اس بي (USB) A-B

محول طاقة راسبيري باي

1X محول طاقة 5V 2A 

تثبيت أوكتو باي (OctoPi):

تهيئة الراسبيري باي (Raspberry Pi):

يتضمن الأوكتو باي (Octopi) كل ما يلزم لتشغيل كل من راسبيري باي (Raspberry Pi) وخادم (OctoPrint). وخطوات تثبيت الأوكتو باي (Octopi)تشبه تثبيت أي نظام تشغيل بمجرد تهيئة اللوحة سيعمل النظام بدون أي تكوين إضافي. بالبداية لا تنس أن تقوم بتهيئة الذاكرة باستخدام برنامج (SD Card Formatter)

أولا:  قم بتنزيل الأوكتو باي (Octopi) من خلال الرابط  ثم قم بفك الضغط عن الملف

ثانيا : استخدم (install Raspberry Pi Imager) لرفع نظام التشغيل على الذاكرة يمكنك معرفة خطوات التحميل بزيارة الرابط 

الاتصال بالشبكة:

لتوصيل الراسبيري باي (Raspberry Pi) بالشبكة ستحتاج إلى تحرير ملف نصي على بطاقة الذاكرة، حدد موقع بطاقة SD الخاصة بك في (Finder (MacOS)) أو (Explorer (Windows)) بعد ذلك، افتح ملف octopi-wpa-supplicant.txt في Notepad أو Sublime Text. لا تستخدم (Microsoft Word) أو (Wordpad )

قم بإلغاء التعليق على الأسطر أدناه، وأدخل شبكة اسم الشبكة اللاسلكية وكلمة المرور الخاصة بك:

## WPA/WPA2 secured 
network={ 
    ssid="your-wifi-network-name" 
    psk="your-wifi-password" 
}

إلغاء التعليق أو إضافة رمز البلد الخاص بك:

# Uncomment the country your Pi is in to activate Wifi in RaspberryPi 3 B+ and above 
# For full list see: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 
#country=GB # United Kingdom 
#country=CA # Canada 
#country=DE # Germany 
#country=FR # France 
#country=US # United States
country=SA #add my country Saudi Arabia

ابحث عن رمز بلد ISO 3166-1 المكون من رقمين واستخدمه بدلاً من الرمز المستخدم .

 قم بتوصيل الراسبيري باي (Raspberry Pi) مع الشاشة ولوحة المفاتيح والفأرة، أو التحكم بالراسبيري عن بعد من خلال الدرس لمعرفة رقم (IP) على الشبكة

 

sudo ifconfig

 

يمكنك الآن الاتصال بـ OctoPrint لعرض واجهة OctoPrint. من جهاز جهاز الحاسوب الخاص بك، تأكد من أنك على نفس الشبكة مع الراسبيري باي (Raspberry Pi) الخاص بك، ثم قم بكتابة رقم (IP) للخادم في شريط العنوان على متصفح الويب الخاص بك. إذا لم تستطع الوصول إلى الخادم قم بتوصيل الراسبيري باي (Raspberry Pi) مع الراوتر باستخدام سلك ايثرنت، للتأكد من سبب المشكلة إذا استطعت الوصول إلى الخادم فان المشكلة من في اعدادات الاتصال قم بمراجعتها

 

اعدادات الأوكتوبرنت (OctoPrint):

OCTOPRINT

بعد تحميل واجهة (OctoPrint) على  متصفحك، سترى معالج إعداد (OctoPrint)

صلاحية التحكم بالدخول (Access Control)

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

راسبيري باي RASBERRY PI

التحقق من الاتصال عبر الإنترنت (Online Connectivity Check)

سيؤدي هذا إلى اختبار اتصال خادم DNS الخاص بـ Google بشكل دوري للتأكد من اتصال Pi الخاص بك عبر الإنترنت، قم بتمكينه، واتركه في الفاصل الزمني الافتراضي لمدة 15 دقيقة.

OCTOPRINT

القائمة السوداء للمكونات الإضافية (Plugin Blacklist)

يمنع هذا الإعداد تثبيت المكونات الإضافية غير الموقعة أو التي يحتمل أن تكون ضارة على Pi الخاص بك. قم بتمكين هذا حتى تتمكن لاحقًا من اكتشاف إضافات OctoPrint الآمنة.

Enable-Plugin-Blacklist

قم بتكوين الطابعة الخاصة بك (Configure your printer for OctoPrint)

أدخل تفاصيل الطابعة الخاصة بك.

إذا لم تكن متأكدًا من مواصفات الطابعة قد تجدها في برنامج التقطيع (مثل Cura) أو بإجراء بحث سريع على Google.

اعدادات الطابعة

 




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

مقدمة

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

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




حجب الإعلانات باستخدام الراسبيري باي وباي هول (Pi-hole)

مقدمة

في هذا الدرس ستتعلم كيف تستخدم الراسبيري باي وباي هول (Pi-hole) لحجب الإعلانات المزعجة؛ حتى لا تواجهك أو تواجه أبنائك أثناء استخدام الانترنت

راسبيري باي وباي هول

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

حجب الإعلانات الراسبيري باي

 1× راسبيري باي

الراسبيري باي وباي هول

 1× كرت ذاكرة

الراسبيري باي وباي هول

 1× سلك (HDMI)

الراسبيري باي وباي هول

1× محول تيار (5V-2A)

Fan

1× مروحة الراسبيري باي

الراسبيري باي وباي هول

غطاء الراسبيري باي

raspberry-pi-hole-block-ads

1× سلك ايثرنت

تبريد المعالج

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

ثبت المسرب الحراري على وحدة (SOC) ووحدة (USB controller)

الراسبيري باي وباي هول

وصل السلك الأحمر لمروحة التبريد(الموجب) مع المنفذ رقم 4

وصل السلك الأسود لمروحة التبريد (السالب) مع المنفذ رقم 6

الراسبيري باي وباي هول

تصبح المروحة بهذا الشكل بعد تثبيتها.

المروحة والراسبيري باي

تثبيت وتكوين باي هول (Pi-hole)

أولًا، سوف تحتاج إلى تثبيت نظام الراسبيان على الراسبيري باي إذا لم تكن قد فعلت ذلك قم بالاطلاع على الدرس الأول نظام تشغيل الراسبيري باي

وبعد تثبيت النظام، يمكنك تهيئة النظام من خلال الرجوع  للدرس الثاني تهيئة نظام التشغيل

افتح الشاشة السوداء LXterminal للبدء باستخدام الراسبيري باي.

LXterminal

للبدء، سنقوم بإستخدام الـ Termial لتحديث الراسبيري باي إلى أحدث إصدار.

sudo apt-get update
sudo apt-get upgrade

أعد تشغيل الراسبيري باي.

reboot

في هذه الخطوة سيتم تثبيت باي هول (Pi-hole) من خلال الأمر التالي:

curl -sSL https://install.pi-hole.net | bash

سوف تبدأ عملية التحديث وتثبيت باي هول (Pi-hole).

تثبيت باي هول

عليك فقط اتباع الأوامر التي تظهر على الشاشة لتثبيت باي هول (Pi-hole) على الشاشة.

اختر الإعدادات الافتراضية دائمًا وانتظر حتى ينتهي الإعداد.

اضغط OK.

حجب الإعلانات الراسبيري باي وباي هول

اضغط OK.

حجب الإعلانات الراسبيري باي وباي هول

اضغط OK.

حجب الإعلانات الراسبيري باي وباي هول

اختر طريقة اتصال الراسبيري باي مع الانترنت

الخيار الأول: هل عن طريق سلك ايثرنت؟

الخيار الثاني: أم عن طريق شبكة لاسلكية؟

ثم انقر على Ok.

حجب الإعلانات الراسبيري باي وباي هول

لاختيار الإعدادات الافتراضية اضغط OK.

حجب الإعلانات الراسبيري باي وباي هول

اختر كافة الخيارات المتاحة لك؛ لكي يتم حجب الإعلانات من كافة المزودين لها ثم اضغط OK.

حجب الإعلانات الراسبيري باي وباي هول

اختر كل البروتكولات المتاحة ثم اضغط OK.

حجب الإعلانات الراسبيري باي وباي هول

هنا يطلب منك التأكد من عنوان الشبكة إذا كنت متأكد من رغبتك باستخدامه اضغط Yes.

raspberry-pi-hole-block-ads

تحميل خادم الويب اضغط على OK.

web server

استكمال التثبيت اضغط على OK.

Wep server & PHP

استكمال التثبيت اضغط على OK.

web server

اضغط على الخيار الأول لعرض كل شيء ثم Ok.

Show Everything

ستبدأ عملية تعريف وتحميل الحزمة سيأخذ عدة دقائق.

حجب الإعلانات الراسبيري باي وباي هول

عند اكتمال تعريف الحزمة سيتم إخطارك بذلك.

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

انقر على OK.

raspberry-pi-hole-block-ads

ادخل الأمر التالي ثم ضع كلمة المرور التي يسهل عليك تذكرها.

pihole -a -p

إعدادات باي هول (Pi-hole)

افتح المتصفح الخاص بك وغيّر العنوان التالي إلى عنوان الراسبيري باي.

http://192.168.100.14/admin/

انقر على Login واكتب كلمة المرور التي عينتها مسبقًا.raspberry-pi-hole-block-ads

في Dashboard يتم عرض الإحصائيات والمواقع التي تم حجبها.

وفي أسفل الصفحة قائمة بأسماء الأجهزة التي تستخدم (Pi-hole) لحجب الإعلانات.

raspberry-pi-hole-block-adsraspberry-pi-hole-block-ads

ستظهر لك هذه الصفحة.

انقر على Settings.

الراسبيري باي وباي هول

انقر على DNS.

فعّل الخيارات الظاهرة بالصورة.

الراسبيري باي وباي هول

انزل أسفل الصفحة واكتب عنوان الشبكة الخاصة بك على سبيل المثال هنا ألياف بصرية بدء من العنوان 192.168.100.0.

ثم انقر على Save.

ثم انقر على DHCP.

وفعّل خيار DHCP server enabled.

ثم اكتب نطاق الشبكة.

وانقر على Save.
raspberry-pi-hole-block-ads

حدّث الصفحة.

 تغيير (DNS) على ويندوز

افتح “إعدادات الشبكة” على جهاز الكمبيوتر الخاص بك الذي يعمل بنظام ويندوز وتأكد من أنه متصل بالراوتر انتقل للمسار التالي:

انقر بالزر اليمين على قائمة ابدأ > اتصالات الشبكة > خصائص > تحرير.

اكتب عنوان الراسبيري باي بجانب Preferred DNS server.

اكتب عنوان الشبكة بدء من صفر على سبيل المثال 192.168.100.0 بجانب Alternate DNS server.

ثم انقر على حفظ.
raspberry-pi-hole-block-ads

 تغيير (DNS) على ماك

لتغيير DNS على ماك ، افتح “تفضيلات النظام”.

اضغط على مفتاح CMD + SPACE لإظهار البحث في spotlight واكتب System Preferences واضغط مفتاح الإدخال على النتيجة.

ابحث عن الشبكة من الخيارات وانقر نقرًا مزدوجًا لفتح إعدادات الشبكة.

Mac

سترى خادم DNS.

انقر على زر القفل في أسفل يسار النافذة.

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

Mac

انقر فوق DNS وانقر فوق الزر + لإضافة إدخال DNS.

أدخل عنوان الراسبيري باي وانقر فوق موافق.

تم تكوين Pihole DNS الخاص بك الآن على جهاز كمبيوتر Mac.

Mac

 تغيير (DNS) على الايفون

الشبكات اللاسلكية > معلومات الشبكة > DNS > يدوي ثم اكتب عنوان الراسبيري باي واحفظ ذلك.

واحذف العناوين السابقة.

IPhone

IPhone

سيتم حجب الإعلانات مباشرة Yahoo.

  إذا أردت حجب إعلان معين أو موقع معين يمكنك إكمال الخطوات التالية.

WhiteList و BlackList

Whitelist يمكنك وضع فيها قائمة المواقع التي تريد حجب الإعلانات عنها فقط.

Blacklist يمكنك وضع فيها قائمة المواقع التي تريد حجبها بالكامل.

الراسبيري باي وباي هولأضف الرابط بهذا الشكل لقائمة BlackList.

www.اسم الموقع.com

على سبيل المثال هنا نريد حجب موقعwww.theguardian.com.
raspberry-pi-hole-block-ads

حدّث الصفحة.

ستلاحظ أن الموقع انحجب بالكامل.

raspberry-pi-hole-block-ads

المشاكل والإصلاحات

في بعض الأوقات قد تواجهك هذه الرسالة عند إدخال أسماء المواقع في BlackList و WhiteList.

raspberry-pi-hole-block-ads

ادخل الأمر التالي وسيتم حلّها مباشرة.

pihole -a -p

 لا تنسَ فصل مصدر الطاقة بعد الانتهاء من استخدام نظام حجب الإعلانات باستخدام الراسبيري باي وباي هول .




استخدام الراسبيري باي كنقطة وصول لاسلكية (Access Point)

مقدمة

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

الراسبيري باي نقطة وصول لاسلكية

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

الرازبيري باي نقطة وصول لاسلكية

 1× راسبيري باي

raspberry-pi-sandisk

 1× كرت ذاكرة

raspberry-pi-HDMI

 1× سلك (HDMI)

raspberrypi-cable

1× محول تيار (5V-2A)

المروحة نقطة وصول لاسلكية

1× مروحة الراسبيري باي

سلك ايثرنت - الراسبيري باي - نقطة وصول لاسلكية

1× سلك ايثرنت

 

1 × مسرب حراري 

تبريد المعالج

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

ثبت المسرب الحراري على وحدة (SOC) ووحدة (USB controller)

wifi

وصل السلك الأحمر لمروحة التبريد(الموجب) مع المنفذ رقم 4

وصل السلك الأسود لمروحة التبريد (السالب) مع المنفذ رقم 6

raspberry-pi-connection

تصبح المروحة بهذا الشكل بعد تثبيتها.

المروحة - رازبيري باي - نقطة اتصال لاسلكية

تثبيت خادم (dnsmasq) ومضيف نقطة الوصول

أولا، سوف تحتاج إلى تثبيت نظام الراسبيان على الراسبيري باي إذا لم تكن قد فعلت ذلك قم بالإطلاع على  الدرس الأول نظام تشغيل الراسبيري باي

وبعد تثبيت النظام، يمكنك تهيئة النظام من خلال الرجوع  للدرس الثاني تهيئة نظام التشغيل

افتح الشاشة السوداء LXterminal للبدء بإعداد نقطة وصول لاسلكية باستخدام الراسبيري باي.

LX نقطة اتصال لاسلكية راسبيري

للبدء، قم بإستخدام الـ Termial  لتحديث الراسبيري باي إلى أحدث إصدار.

sudo apt-get update
sudo apt-get upgrade

ثم أعد تشغيل الراسبيري باي:

reboot

يعد خادم (dnsmasq) من الخيارات الجيدة عند بناء الشبكات الصغيرة فهو مصدر مفتوح وسهل التكوين وبحجم صغير، وتكمن أهميته في تنفيذ وظائف  (DNS): لتحليل أسماء النطاق  إلى عنوان IP للاتصال، و تنفيذ وظائف (DHCP) : لتوفير عنوان IP لأجهزة الكمبيوتر المتصلة بالشبكة.

وكذلك سنقوم بتحميل حزمة نقطة الوصول (hostapd)

و لتثبيت حزمة (dnsmasq) و حزمة (hostapd)اكتب الأمر التالي:

sudo apt install dnsmasq
sudo apt install hostapd

نظرًا لأن ملفات التكوين ليست جاهزة بعد، قم بإيقاف تشغيل البرنامج بكتابة الأمر التالي:

sudo systemctl stop dnsmasq
sudo systemctl stop hostapd

تكوين IP ثابت

يحتاج الراسبيري باي إلى الحصول على عنوان IP ثابت مخصص للمنفذ اللاسلكي. سنقوم بتعيين عنوان IP للخادم 192.168.4.1. الجهاز اللاسلكي المستخدم هو wlan0. لتكوين عنوان IP الثابت ، قم بتحرير ملف تكوين dhcpcd باستخدام:

sudo nano /etc/dhcpcd.conf

قم بتحرير الملف باضافة الأسطر التالية:

interface wlan0 
static ip_address=192.168.4.1/24 
nohook wpa_supplicant

أعد تشغيل (dhcpcd) بكتابة السطر التالي:

sudo service dhcpcd restart

تكوين خادم DHCP (dnsmasq)

يتم توفير خدمة DHCP من خلال dnsmasq. بشكل افتراضي. أعد تسمية ملف التكوين، وقم بتحرير ملف جديد من خلال كتابة الأسطر التالية:

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo nano /etc/dnsmasq.conf

سنقوم بتوفير عناوين IP بين 192.168.4.2 و 192.168.4.20، مع فترة تأجير تبلغ 24 ساعة، ولذلك اكتب في ملف تكوين dnsmasq الأسطر التالية:

interface=wlan0 # Use the require wireless interface - usually wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h

ثم اضغط ctrl , x ثم Y لحفظ الملف.

فعل dnsmasq سيستخدم الآن التكوين المحدث:

sudo systemctl start dnsmasq

تكوين برنامج مضيف نقطة الوصول اللاسلكية (hostapd)

تحتاج إلى تحرير ملف تكوين hostapd ؛ لإضافة المعلومات الخاصة بنقطة الوصول اللاسلكية.

اكتب السطر التالي للوصول لملف التكوين:

sudo nano /etc/hostapd/hostapd.conf

ادخل البيانات التالية وحدد عنوان نقطة الوصول اللاسكية (ssid) الذي تريده و الرقم السري مع مراعاة أن يتراوح طول الرقم السري بين 8 و 64 حرفًا.

interface=wlan0
driver=nl80211
ssid=NameOfNetwork
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=YOURPASS
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

ثم اضغط ctrl , x ثم Y لحفظ الملف

حدد للنظام المثبت على الراسبيري باي مكان العثور على ملف التكوين الذي تم إنشاؤه:

sudo nano /etc/default/hostapd
ثم اكتب السطر التالي في نهاية الملف:
DAEMON_CONF="/etc/hostapd/hostapd.conf"

تفعيل الاتصال

تفعيل وتمكين برنامج مضيف نقطة الاتصال بالأوامر التالية:

sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd

اضف التويجه:

sudo nano /etc/sysctl.conf

ثم اكتب السطر التالي داخل الملف واحفظ الملف:

net.ipv4.ip_forward=1

اكتب الأمر التالي:

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
sudo nano /etc/rc.local
iptables-restore < /etc/iptables.ipv4.nat

الراسبيري باي كنقطة وصول لاسلكية في أجهزة الحاسوب.

 الرازبيري باي كـ نقطة وصول لاسلكية

استخدام الرازبيري باي كـ نقطة وصول لاسلكية في منازلنا أو مكاتب عملنا

وكنقطة وصول لاسلكية في هاتفك المحمول أيضًا.

استخدام الراسبيري باي كـ نقطة وصول لاسلكية في هواتفنا المحمولة

يمكنك اختبار سرعة الانترنت من خلال التطبيقات أو المواقع المخصصة لذلك.

سرعة الراسبيري باي كـ نقطة وصول لاسلكية




استخدام DS3231 RTC Module مع الاردوينو

سنتعلم في هذا المشروع كيفية إستخدام وحدة RTC “Real Time Clock” وعرض التوقيت على شاشة LCD

استخدام-ds3231-rtc-module-مع-الاردوينو

المكونات المطلوبة

arduino uno r3

Arduino Uno

 

rtc ds3231

RTC – Real Time Clock

 

https://geeksvalley.com/tutorial/rtc-arduino/

2×16 LCD

Push Buttons

potentiometer 10k

Potentiometer 10K Ω

10k Ohm Resistors

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

الشاشة LCD

تعمل الشاشة في أحد الحالات التالية:

1- ان تستقبل امر من الارودوينو و تقوم بتنفيذة مثلا: امر مسح الشاشة و امر التهيئة 

lcd.begin(16,2);
lcd.clear();

2- ان تستقبل معلومات من الاردوينو و تقوم بعرضها مثلا : كتابة جملة معينة  

lcd.print("Hello");

استخدام-ds3231-rtc-module-مع-الاردوينو

DS3231 RTC Module

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

استخدام-ds3231-rtc-module-مع-الاردوينو

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

استخدام-ds3231-rtc-module-مع-الاردوينو

 

توصيل الدارة

قم بتوصيل الدارة كما هو موضح بالصورة التالية :

استخدام-ds3231-rtc-module-مع-الاردوينو

توصيل وحدة DS3231 RTC :

RTC Module Arduino
5v Vcc
GND Gnd
SCL A5
SDA A4

تقوم وحدة الRTC بحساب التوقيت و ارساله الى الاردوينو ليتم عرضه على شاشة LCD ، المفاتيح تستخدم لضبط التوقيت في البداية فقط.

استخدام-ds3231-rtc-module-مع-الاردوينو

البرمجة

قم بتنزيل الكود البرمجي كاملا من خلال الرابط هنـا .

شرح البرمجة :

حتى نتمكن من التواصل مع RTC Module بإستخدام الاردوينو، نحتاج الى إستخدام بروتوكول I2C و الذي تتيحه لنا المكتبة Wire.h.

لذلك في البداية نقوم بإدراج مكتبة Wire.h ، التي تحتوى على الدوال اللازمة للتواصل بين الاردوينو و الـ RTC Module .كما نقوم أيضا بإدراج مكتبة LiquidCrystal.h التي تحتوي على الدوال الخاصة بشاشة الـ LCD، و التي سيتم إستخدمها لعرض التوقيت.

#include <Wire.h>
#include <LiquidCrystal.h>

نقوم بعد ذلك بتسمية منافذ الأردوينو التي تم استخدامها في المشروع والخاصة بالـ Push Buttons.

#define ENTER A2
#define UP A1
#define DOWN A0

بعد ذلك قمنا بتحديد عنوان خاص بالRTC Module و هو 0x68 و قمنا بتعيين متغير له :

#define DS3231_I2C_ADDRESS 0x68

أي وحدة تستخدم برتوكول I2C تمتلك عنوان معين ليتمكن الاردوينو من التواصل معه. لان هذا البرتوكول يستطيع التواصل مع عدد كبير من الاجهزة على نفس الـProtocol Bus . لذلك كل واحد منها يمتلك عنوان معين ليستطيع الاردوينو التواصل معه بدون التأثير على باقي الاجهزة الموصلة على الـ Busـ

يتم الحصول على العنوان الخاص بكل موديول من الـ Datasheet  الخاصه به :

استخدام-ds3231-rtc-module-مع-الاردوينو

 

 ثم نقوم بإنشاء المتغير الخاص بشاشة الـ LCD، وتحديد الـ Pins الموصوله بينها وبين الأردوينو :

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

 ونقوم بالإعلان عن المتغيرات المستخدمه في تخزين حالة الـ Push Buttons، والتي ستيم استخدامها في البداية لضبط التوقيت فقط. كما نقوم أيضا بالإعلان عن متغيرات لحفظ التوقيت الذي سنقوم بضبطه مثل متغير SetM و SetH .

//variables for button states
int enterState = 0, enterStateLast = 0, upState = 0, upStateLast = 0, downState = 0, downStateLast = 0;

//variables for ui
boolean blinkOn = true; //visibility of ':' between hour and minutes
boolean setVisible = false; //visibility of the set time ui

//variables for new time
int setM = 0; //users new minute value
int setH = 0; //users new hour value

هذا الموديول يتعامل مع الارقام على النظامBinary Coded Decimal . أي اننا سوف نحتاج لضبط التوقيت في البداية إلى تحويل الأعداد من الصورة Decimal إلى الصورة BCD . لذلك نستخدم الدالة ()decToBcd.

//convert normal decimal numbers to binary coded decimals
byte decToBcd(byte val)
{
  return ( (val / 10 * 16) + (val % 10) );
}

 وعند قراءة قيمة الوقت من الموديول نستخدم الدالة ()bcdToDec ، لتحويل التوقيت المرسل من الموديول من الصورة BCD الى الصورة Decimal ، لنتمكن من عرضها على الشاشة LCD.

//convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val / 16 * 10) + (val % 16) );
}

 

 الدالة ()setup نقوم بضبط الإعدادات اللازمة للمشروع، مثل تشغيل بروتوكول I2C و شاشةالـ  LCD و قمنا بضبط المفاتيح المستخدمة في ضبط التوقيت كمدخل.

//code that runs once at setup
void setup() {
  //start wire and lcd
  Wire.begin();
  lcd.begin(16,2); //(col, rows)

  //intialize buttons as inputs
  pinMode(ENTER, INPUT);
  pinMode(UP, INPUT);
  pinMode(DOWN, INPUT);
}

 الدالة ()loop نقوم بقراءة الـPush Buttons لضبط التوقيت في البداية ثم نقوم بالتواصل مع الـRTC Module و نعرض التوقيت على الشاشة LCD .

void loop() {
  checkButtons();
  printTime();
}

الدالة ()setRTCTime تقوم بإنشاء اتصال بين الأردوينو و الـ RTC Module بإستخدام مكتبة Wire.  وظيفة هذه الداله هو ضبط التوقيت الذي سنقوم بإدخاله بإستخدام الـ Push Buttons. في البداية تقوم بإرسال عنوان الجهاز الذي تريد الإتصال معه وفي حالتنا هنا هو RTC Module و الذي قمنا بتحديده في بداية الكود.

//set the time and date to the RTC
void setRTCTime(byte second, byte minute, byte hour, byte dayOfWeek, byte
                dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}

بعد ذلك تقوم بإرسال التوقيت الذي تم ضبطه مع ملاحظة أننا عندما نرسل البيانات الى الموديول نقوم بتحويلها الى الصورة BCD .

 Wire.write(decToBcd(minute));

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

الدالة ()readRTCTime تقوم بعمل إتصال مع الموديول و قراءة معلومات التوقيت منه.  وسيتم استخدامها في الحصول على التوقيت وعرضه.
وهي تعمل بنفس اسلوب الداله السابقة مع اختلاف اننا نقوم بقراءة البيانات من الموديول بدلا من إرسالها له، مع ملاحظة اننا في هذه الحاله نقوم بتحويلها من الصورة BCD الى الصورة Decimal .

//read the time and date from the RTC
void readRTCTime(byte *second, byte *minute, byte *hour, byte *dayOfWeek,
                 byte *dayOfMonth, byte *month, byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

الدالة ()printTime تقوم بقراءة قيمة التوقيت من الموديول بإستخدام الدالة ()readRTCTime ثم تقوم بعرضها على الشاشة LCD مع اضافة كود مهمته عرض التوقيت على الصورة  HH : MM .

//reads the RTC time and prints it to the top of the LCD
void printTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  
  //retrieve time
  readRTCTime(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
  //print to lcd top
  lcd.setCursor(0,0);
  lcd.print(" Current: ");
  if (hour<10)
  {
    lcd.print("0");
  }
  lcd.print(hour, DEC);
  if (blinkOn == true)
  {
    lcd.print(" ");
    blinkOn = false;
  }
  else if (blinkOn == false)
  {
    lcd.print(":");
    blinkOn = true;
  }
  if (minute<10)
  {
    lcd.print("0");
  }
  lcd.print(minute, DEC);
  
  delay(100);
}

الجزء السابق مختص بقراءة قيمة التوقيت الذي يقوم الRTC Module بحسابه بدون تدخل من المستخدم . الجزء التالي من الكود مختص بقراءة حالة المفاتيح لضبط التوقيت و ارسالة الى الRTC Module.

الدالة ()checkButtons تقوم بقراءة حالة المفاتيح و التي تعمل كالتالي :

المفتاح المسمى UP يقوم بزيادة عداد الدقائق والساعات.
المفتاح المسمى DOWN يقوم بإنقاص عداد الدقائق والساعات.
المفتاح المسمى ENTER يقوم بتطبيق التوقيت الذي تم ضبطه وإرساله الى الـRTC Module.

//checks if buttons are pressed and responds accordingly
void checkButtons()
{
  //check enter
  enterState = digitalRead(ENTER);
  if (enterState != enterStateLast)
  {
    if (enterState == HIGH)
    {
      if (setVisible == true)
      {
        byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
        readRTCTime(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
        
        setRTCTime(0, setM, setH, dayOfWeek, dayOfMonth, month, year);
      }
      else if (setVisible == false)
      {
        showSet();
      }
    }
  }
  enterStateLast = enterState;
  
  //check up
  upState = digitalRead(UP);
  if (upState != upStateLast)
  {
    if (upState == HIGH)
    {
      if (setVisible == true)
      {
        addMin();
        printSetTime();
      }
      else if (setVisible == false)
      {
        showSet();
      }
    }
  }
  upStateLast = upState;

  //check down
  downState = digitalRead(DOWN);
  if (downState != downStateLast)
  {
    if (downState == HIGH)
    {
      if (setVisible == true)
      {
        subMin();
        printSetTime();
      }
      else if (setVisible == false)
      {
        showSet();
      }
    }
  }
  downStateLast = downState;
}

الدالة ()showSet تقوم بعرض التوقيت الذي نقوم بضبطه في أسفل الشاشة قبل إرساله الى الموديول لكي لا نقوم بإرسال توقيت خاطئ بشكل غير مقصود.

//displays the new time interface in the bottom of the LCD
void showSet ()
{
  //update new time variables to current RTC values
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  readRTCTime(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
    setH = hour, DEC;
    setM = minute, DEC;

  //pints to the LCD
  lcd.setCursor(0,1);
  lcd.print("   New: ");
  printSetTime();
  setVisible = true;
}

الدالة ()printSetTime تستخدمها الدالة ()showSet لعرض التوقيت الذي تم ضبطه في اسفل الشاشة LCD .

//prints the new time values on the bottom of the LCD
void printSetTime()
{
 lcd.setCursor(8,1); 
 if (setH<10)
  {
    lcd.print("0");
  }
  lcd.print(setH);
  lcd.print(":");
  if (setM<10)
  {
    lcd.print("0");
  }
  lcd.print(setM); 
}

الدوال التالية مستخدمة في الجزء السابق من الكود وهي تقوم بضبط المتغيرات التي تستخدم في تخزين قيم الدقائق والساعه التي يقوم المستخدم بضبطها بواسطة الPush Buttons .

الدالة ()addMin تقوم بزياد عداد الدقائق عند الضغط على المفتاح UP و تقوم أيضا بعمل اختبار لعداد الدقائق فإذا وصل العدد الى 59 تقوم بزيادة عداد الساعات .

//adds a minute to new time
void addMin()
{
  if (setM < 59)
  {
    setM++;
  }
  else if (setM == 59)
  {
    setM = 0;
    addHr();
  }
}

الدالة ()subMin تعمل عكس عمل الدالة السابقة وهي تقوم بإنقاص عداد الدقائق عند الضغط على المفتاح DOWN وتقوم أيضا باختبار عداد الدقائق فإذا وصل الى 0 تقوم بإنقاص عداد الساعات.

//subtracts a minute from new time
void subMin()
{
  if (setM > 0)
  {
    setM--;
  }
  else if (setM == 0)
  {
    setM = 59;
    subHr();
  }
}

الدالة ()addHr نقوم بإستدعائها الدالة ()addMin عندما يصل عداد الدقائق الى 59 لتقوم بزيادة عداد الساعات بمقدار واحد.

//adds an hour to new time
void addHr ()
{
  if (setH < 23)
  {
    setH++;
  }
  else if (setH == 23)
  {
    setH = 0;
  }
}

الدالة ()subHr تقوم باستدعائها الدالة ()subMin عندما يصل عداد الدقائق الى 0 لتقوم بإنقاص عداد الساعات بمقدار واحد.

//subtracts an hour from new time
void subHr ()
{
  if (setH > 0)
  {
    setH--;
  }
  else if (setH == 0)
  {
    setH = 23;
  }
}



التحكم في مصفوفة ليدات (LED Matrix)

في هذا المشروع سنتعلم كيف يمكننا التحكم في تشغيل مصفوفة الليدات LED Matrix بإستخدام الاردوينو ولتقليل عدد المخارج المستخدمة سيتم إستخدام الدارة المتكاملة MAX7219 .

 

المكونات المطلوبة

 

arduino uno r3

Arduino Uno

 

8×8 LED Matrix

 

MAX7219

Potentiometer 10K Ω

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

مصفوفة الليدات LED Matrix :

هي عبارة عن 64 LEDs موصلين معا على شكل مصفوفة مكونة من صفوف وأعمدة.

كل عامود يتصل بالـ cathode الخاص بمجموعة الـ LEDs لهذا العامود، وكل صف يتصل بالـ Anode الخاص بمجموعة الـ LEDs لهذا الصف.

كي نقوم بتشغيل LED معين، نضع الجهد الموجب على الصف الموجود به الـ LED والجهد السالب على العامود الموجود به. كما هو موضح بالصورة التالية: عند وضع جهد موجب على الصف A وأرضي على العامود 2 تعمل الـ LED رقم L2 وهكذا.

التحكم فى مصفوفة ليدات Led Matrix باستخدام الاردوينو

الهدف من توصيلها بهذا الشكل هو توفير عدد المخارج المطلوبة من الاردوينو لتشغيل الـ64 ليد.فإذا كانت موصله بشكل غير المصفوفة فسنحتاج إلى 64 مخرج من الأردوينو لتشغيل 64 LEDs . أما عند توصيلها على شكل مصفوفة فإن عدد المخارج المطلوبة يقل ليصبح 16 مخرج فقط.

التحكم فى مصفوفة ليدات Led Matrix باستخدام الاردوينو

كي نتمكن من توصيل مصفوفة الليد (LED Matrix)، نحتاج إلى معرفة اين مواقع الصفوف والأعمدة، انظر الصورة أدناه :

التحكم فى مصفوفة ليدات Led Matrix باستخدام الاردوينو

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

التحكم فى مصفوفة ليدات Led Matrix باستخدام الاردوينو

MAX7219 :

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

لأن الأردوينو يقوم بإرسال بيانات الـ LEDs التي يراد تشغيلها بشكل تسلسلي بإستخدام عدد اقل من المخارج، فتقوم هذه الشريحة بتحويل هذه الإشارة إلى عدة إشارات تقوم بتشغيل الـ LEDs المراد تشغيلها.

توصيلها :

توصيلها مع الاردوينو و الLED Matrix من الداتا شيت

led-matrix

الجدول التالي يوضح كيفية التوصيل مع الأردوينو :

MAX7219 التوصيل
اى رجل تسمى SEG مع الصفوف
اى رجل تسمى DIG مع الاعمدة
24 Not Connected
19 Vcc
18 10K Ohm to VCC
13 Arduino Pin 9
12 Arduino Pin 10
9 Ground
4 Ground
1 Arduino Pin 8

الجدول أعلاه يوضح أن الأرجل ذو الإسم SEG توصل مع الصفوف، والأرجل ذو الإسم DIG يتم توصيلها مع الأعمدة. على سبيل المثال: SEG A يتم توصيلها مع الصف الأول و SEG B يتم توصيلها مع الصف الثاني، وهكذا. اما DIG0 يتم توصيلها مع العامود الأول، و DIG1 يتم توصيلها مع العامود الثاني وهكذا.. .

لاحظ:

بداية الاعمدة فى الدارة MAX7219 من DIG 0. لذلك اول عمود يتصل مع DIG 0 و ليس DIG 1

توصيل الدارة

قم بتوصيل الدارة كما هو موضح بالصورة التالية :

التحكم فى مصفوفة ليدات Led Matrix باستخدام الاردوينو

 

يقوم البرنامج بقراءة قيمة مقاومة متغيرة و على حسب القيمة يقوم برسم شكل وجه مبتسم على الLED Matrix

التحكم فى مصفوفة ليدات Led Matrix باستخدام الاردوينو

البرمجة :

يعتمد الكود على بعض المكتبات التى نحتاج الى اضافتها الى Arduino IDE يمكنك تحميلها من هنا

#include <binary.h>
#include <Sprite.h>
#include <Matrix.h>

#define POT 0 

Matrix Leds = Matrix(8, 9, 10);

Sprite smile[3] = {
  Sprite(8, 8,  B01000000, B01000110, B01000110, B01000000, B01000000, B01000110, B01000110, B01000000),
  Sprite(8, 8,  B00100000, B01000110, B01000110, B01000000, B01000000, B01000110, B01000110, B00100000),
  Sprite(8, 8,  B00010000, B00100110, B01000110, B01000000, B01000000, B01000110, B00100110, B00010000)
};

void setup() {
  Leds.clear(); // turn off all diodes
}

void loop() {
  
  int pot = analogRead(POT); 
  pot = min(2, map(potData, 0, 1023, 0, 3)); // which smile
  
  // display face
  Leds.write(0, 0, smile[pot]);

}

شرح الكود :

في البداية نقوم بإدراج المكتبات التي نحتاجها في المشروع. وهم عبارة عن مكتبات للتعامل مع الـ LED Matrix والدارة MAX7219 :

#include <binary.h>
#include <Sprite.h>
#include <Matrix.h>

نقوم بتسمية منافذ الأردوينو التي سنقوم بتوصيلها مع المقاومة المتغيرة :

#define POT 0

ثم نقوم بإنشاء متغير مسؤول عن الـ LED Matrix .  و يتم تعريف الارجل التي يتم توصيلها بين الاردوينو و الدارة MAX7219 في هذا المتغير

Matrix Leds = Matrix(8, 9, 10);

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

Sprite smile[3] = {
  Sprite(8, 8,  B01000000, B01000110, B01000110, B01000000, B01000000, B01000110, B01000110, B01000000),
  Sprite(8, 8,  B00100000, B01000110, B01000110, B01000000, B01000000, B01000110, B01000110, B00100000),
  Sprite(8, 8,  B00010000, B00100110, B01000110, B01000000, B01000000, B01000110, B00100110, B00010000)
};

فى الدالة ()setup نقوم بوضع الاعدادات اللازمة للمشروع مثل اطفاء جميع الليدات فى البداية .

void setup() {
  Leds.clear(); // turn off all diodes
}

و في الدالة ()loop نقوم بقراءة قيمة المقاومة المتغيرة و بإستخدام الدالة map نقوم بتحويل القيمة التي تمت قرائتها وتتراوح بين 0 الى 1023 الى رقم بين 0 الى 2
ونستخدم الرقم الناتج في تشغيل وعرض الشكل المقابل له في مصفوفة الأشكال على الـ LED Matrix

void loop() {
  
  int pot = analogRead(POT); 
  pot = min(2, map(potData, 0, 1023, 0, 3)); // which smile
  
  // display face
  Leds.write(0, 0, smile[pot]);

}



جهاز تنبيه لوصول رسائل بريد إلكتروني

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

Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

المكونات المطلوبة

arduino uno r3

Arduino Uno

serial port bluetooth module hc-06

Bluetooth Module HC-06

blue led 5mm

LED

220 Ω resistor

220 Ohm Resistor

 

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

 

توصيل الدارة

قم بتوصيل الدارة كما هو موضح بالصورة التالية :

Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

قمنا بتوصيل وحدة البلوتوث كما هو موضح بالجدول أدناه :
موديول البلوتوث الاردوينو
VCC 5 v
GND GND
TXD RX (Pin 0)
RXD TX (Pin 1)

 

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

Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

 

البرامج المطلوبة

نحتاج لتجهيز بعض البرمجيات كي يعمل منبة الرسائل الإلكترونية بشكل صحيح :

  1. Microsoft Outlook
  2. Script File “.vbs”
  3. Bluetooth
  4. Putty

Script File

هو عبارة عن ملف يحتوي أوامر لنظام التشغيل يقوم النظام بتنفيذها بشكل تلقائي دون الحاجة للتدخل من المستخدم. بمعنى آخر أنه يمكننا من محاكاه إستخدام لوحة المفاتيح بدون وجود المستخدم.

مثلا بدلا من أن نضغط بأنفسنا مفتاح Enter يمكننا

x.sendkeys "{ENTER}"

عند تنفيذه سيحاكي مفتاح Enter كما لو ان أحد ما ضغط عليه.

 

لانشاء هذا الملف

  1. نفتح ملف جديد باستخدام برنامج Notepad
  2. اضف السطور التالية للملف، لاحظ الحروف يجب ان تكون بنفس الشكل
    set ghost = wscript.CreateObject("WScript.Shell")
    ghost.sendkeys "a"
    
  3. قم بحفظ الملف عن طريق :
    save as –> Email.vbs
    و تأكد من إختيار  Save as Type : All Files

Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

 

Microsoft Outlook

هنا سنقوم بضبط بعض الإعدادات بحيث عندما يصلنا رسالة إلكترونية جديدة يقوم برنامج Outlook بتنفيذ ملف الScript الذي قمنا بتجهيزه.

  1. قم بفتح برنامج Outlook بعدها قم بالضغط على ‘Rules’ ثم إختار ‘Manage Rules & Alerts’

    Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

  2. بعد ذلك إضغط على ‘New Rule’ تحت التوبيب في أعلى يسار النافذة

    Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

  3. اضغط ‘Apply on messages I receive’، بعد ذلك اضغط ‘Next’

    Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

  4. اختار ‘Where my name is in the To Box’، ثم اضغط ‘Next’

    Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

  5. اختار ‘Start application’،بعد ذلك في اسفل النافذة اضغط على كلمة ‘application’

    Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

  6. في النافذة الجديدة، قم بتغيير نوع الملفات من ‘(Executable Files (EXE’، الى ‘All files’.بعد ذلك اذهب الى المكان الموجود به الملف الذي قمنا بإنشاءة سابقا وقم باختياره، ‘Email.vbs’، ثم اضغط ‘Open’

    Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

  7. قم بإعطاء اسم ما لهذا الـRule ثم قم بالضغط على  ‘Finish’

    Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

  8. اضغط على  ‘Apply’ ثم  ‘Ok’

    Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

Bluetooth

سنحتاج لعمل إقتران لوحدة البلوتوث على الحاسوب من أجل إمكانية الإرسال و الإستقبال بين الأردوينو والحاسوب :

  1. قم بالتوجه الى Control Panel
  2. اضغط على ‘Hardware and Sound’
  3. تأكد من توصيل موديول البلوتوث بالاردوينو ثم قم بتوصيل الاردوينو الى جهاز الحاسوب ستلاحظ ان ضوء الليد على موديول البلوتوث يضىء و يطفىء بسرعه
  4. ثم بعد ذلك اختار ‘Add a Device’
  5. انتظر حتى يظهر موديول البلوتوث على الحاسوب بإسم ‘HC-06’ ثم اضغط عليه
  6. ستظهر نافذة أخرى تطلب ادخال كود مرور، قم بكتابة ‘1234’
  7. انتظر حتى تظهر رساله انه تم الاتصال

الأن نحن بحاجة لمعرفة رقم المنفذ (Port) الخاص بوحدة البلوتوث. ولذلك لكي نستطيع التواصل معه. توجه إلى أيقونة البلوتوث على شريط المهام أسفل اليمين وقم بالضغط عليه بالزر الأيمن للفأرة وإختيار Open Setting.

في أعلى النافذة ستجد ‘COM Ports’ قم بالضغط عليها و ستجد رقم فيOutgoing port تذكره جيدا

Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد

ملاحظة

لمزيد من المعلومات عن وحدة البلوتوث وكيفية ضبطة، يرجى الإطلاع على مشروع نظام التحكم في الإضاءة عبر البلوتوث.

 

Putty

  1. أولا، قم بتنزيله من الرابط هنـا   Putty
  2. نقوم بفتحه من Putty.exe
  3. نختار Serial
  4. نقوم بتغير COM1 الى رقم الـPort الذي حصلنا عليه من خطوة البلوتوث
  5. نضغط Open
  6. سنرى شاشة سوداء مما يعنى اننا نجحنا في عمل إتصال مع البلوتوث

 

البرمجة :

#define LED 13

int state;

void setup() {
 Serial.begin(9600);
 pinMode(LED, OUTPUT);
}

void loop() {
 if (Serial.available() > 0) {
  state = Serial.read();
 }

 if (state == 'a') {
  digitalWrite(LED, HIGH);
 }
}

شرح الكود :

في البداية نقوم بتسمية منافذ الأردوينو التي تم استخدامها في المشروع. اي منفذ 13 الذي تم توصيل الـ LED عليه. ثم نقوم بالإعلان عن المتغيرات التي سنحتاج إليها.

متغير state لتسجيل القيمة المستقبلية عن طريق البلوتوث في حالة وصول رسالة جديدة.

#define LED 13

int state;

في الدالة ()setup، نقوم بضبط الإعدادات اللازمة. وهي تشغيل بروتوكول Serial المستخدم بواسطة البلوتوث، وتعيين الـ LED كمخرج.

void setup() {
 Serial.begin(9600);
 pinMode(LED, OUTPUT);
}

في الدالة ()loop، نقوم بقراءة الـ Serial وفي حال وصول قيمة جديدة، نقوم بمقارنتها بقيمة ‘a’ التي تم ضبطها سابقا في ملف الـ Script. إذا كانت القيمة التي تم إستقبالها هي ‘a’ أي انه تم وصول رسالة جديدة.

void loop() {
 if (Serial.available() > 0) {
  state = Serial.read();
 }

 if (state == 'a') {
  digitalWrite(LED, HIGH);
 }
}

ملخص للدارة كاملة

قمنا بضبط برنامج Outlook بحيث عندما تصل رسالة جديدة يقوم بفتح ملف الscript الذي قمنا بتسميته Email.vbs و الذي يحتوى على بعض الأوامر التي يقوم الحاسوب بتنفيذها .

يقوم بكتابة حرف ‘a’  على شاشة برنامج Putty الذي يقوم بإرسالها إلى البلوتوث فيستقبلها الأردوينو ويقوم الحاسوب بتشغيل الـ LED

ملاحظة هامة

لكي يعمل كل شيء بشكل صحيح يحب أن يكون برنامج Outlook مفتوح و ايضا برنامج Putty مفتوح و يكون التركيز على الشاشة السوداء لبرنامج Putty
اي أن يكون كما في الصورة

Email Alert: استخدام الاردوينو مع البلوتوث لعمل تنبية لرسائل البريد




مشروع آلة التبريد

 

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

makeblock-cooling-machine

 

الأدوات المطلوبة

makeblock-cooling-machine

Inventor Kit

القطع المطلوبة

makeblock-cooling-machine

 

طريقة التوصيل

 

نقوم بتوصيل مستشعر الحرارة إلى اللوحة الرئيسية عبر محول Rj25

makeblock-cooling-machine

 

المنفذ القطعة الالكترونية
منفذ4  وحدة 7-segment
منفذ6 محول RJ25
منفذ8 المقاومة المتغيرة
منفذ المحركات M1 المروحة Me 130 dc motor

 

 

برمجة المشروع

 

سنقوم ببرمجة المشروع بحيث يتيح لنا تعيين درجة الحرارة التي نرغب في تبريد العصير إليها عبر المقاومة المتغيرة ويتم عرضها على وحدة 7-segment

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

makeblock-cooling-machine

ننشئ متغيرًا باسم temperature ونقوم بتعيينه لقراءة قيمة المقاومة المتغيرة

makeblock-cooling-machine

نقوم بتعيين وحدة 7-segment لعرض درجة الحرارة temperature

makeblock-cooling-machine

نستخدم الأمر التالي لقراءة مستشعر درجة الحرارة

makeblock-cooling-machine

باستخدام حلقة Repeat until
نضع أمر المحرك M1  المتعلق بالمروحة ليتحرك بسرعة 100 إلى أن تصبح درجة الحرارة التي اخترناها أكبر من الحرارة التي يقرأها المستشعر

makeblock-cooling-machine

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

makeblock-cooling-machine

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

 

makeblock-cooling-machine

للمزيد من المعلومات حول الكود يمكنك مراجعة درس جولة حول الأوامر البرمجية.

 




التحكم بالروبوت عبر الأوامر الصوتية

سنقوم في هذا المشروع باستخدام مستشعر الصوت الموجود في اللوحة الرئيسية Auriga لروبوت Ranger
لبرمجة روبوت يستجيب للأوامر الصوتية

 

voice-control-robot

 

الأدوات المطلوبة

voice-control-robot

mBot Ranger Kit

 Sound Sensor مستشعر الصوت

 

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

voice-control-robot

 

تحديد مدى قراءة المستشعر

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

قم بانشاء متغير Sound
اختيار الأمر say وتعيينه على مستشعر الضوء
ووضع الأمر داخل حلقة forever

voice-control-robot

 

ستظهر قراءة المستشعر على الشاشة

voice-control-robot

نلاحظ أن القيمة تتغير بسرعة كبيرة جدا وبهذا يصعب تحديد أعلى قيمة وأقل قيمة،  لذا سنضيف متغيرين آخرين
Max ليمثل أعلى قيمة،  و Min ليمثل أقل قيمة

voice-control-robot

سنقوم بتعيين المتغيرين على قراءة مستشعر الصوت

voice-control-robot

ونقوم كذلك بتعيين المتغير Sound لقراءة مستشعر الصوت

voice-control-robot

في البداية ستكون Max = Min
داخل حلقة forever  ستتغير قيمة المتغير Sound
ولتحديد أعلى وأقل قيمة نستخدم if ..then
بحيث إذا كانت قيمة sound أكبر من قيمة max
يتم إعادة تعيين قيمة max إلى هذه القيمة كأعلى قيمة
ويتم إعادة تعيين قيمة min إلى أقل قيمة تمت قراءتها في المتغير Sound

 

voice-control-robot

 

 

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

سنقوم ببرمجة الروبوت بحيث يتراجع للوراء عند التصفيق أو إعطاءه أي أمر صوتي

سنأخذ بالاعتبار القيم  التي حصلنا عليها من الكود السابق،  لاستخدامها في كتابة كود الروبوت الجديد

نقوم بفتح صفحة جديدة في برنامج mBlock
وانشاء متغير Sound  وتعيينه لقراءة مستشعر الصوت في اللوحة الرئيسية

voice-control-robot

 

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

voice-control-robot

نلاحظ في الصورة أن قيمة max = 184 وهذه القيمة تم تسجيلها قبل إصدار أي صوت
مما يعني أنه عند التصفيق مثلا ستكون قيمة المستشعر أكبر من هذه القيمة

 

voice-control-robot

 

إذا كانت قيمة القراءة أقل،  يتم تنفيذ الأوامر بعد else وهو التحرك للأمام

 

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

 

voice-control-robot

 

قم  بتجربة إضافة أوامر برمجية تقوم بإضاءة LED عند التصفيق

لمزيد من المعلومات حول الأوامر البرمجية الأخرى قم بالرجوع لدرس جولة حول الأوامر البرمجية

 

 




روبوت السومو

 

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

sumo-mbot

الأدوات المطلوبة:

 

sumo-mbot

mBot Kit (عدد 2)

 

فكرة المشروع

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

 

sumo-mbot

 

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

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

رصد حافة الطاولة رصد الخصم الفعل
نعم نعم الانعطاف يمينًا أو يسارًا
نعم لا الانعطاف يمينًا أو يسارًا
لا نعم زيادة السرعة (هجوم)
لا لا التحرك للأمام

 

 

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

 

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

سنقوم بدايةً بوضع مجموعة من الأوامر داخل حلقة تكرار Repeat until ، يقوم هذا الأمر بتنفيذ الأوامر التي بداخل الحلقة إلى أن يتحقق الشرط الذي يتم وضعه
وهنا قمنا باختيار الشرط أن تساوي قراءة مستشعر تتبع المسار 3
(عندما تكون القيمة 3 فذلك يعني أن كلا المستشعرين في وحدة تتبع المسار على سطح أبيض أي أن الروبوت لم يصل لحافة ساحة القتال)

sumo-mbot

 

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

 

sumo-mbot

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

sumo-mbot

 

بعد أن يعود الروبوت للخلف هل ينعطف يمينا أو يسارًا؟
ليتمكن الروبوت من اتخاذ القرار
سنستخدم الأمر pick random من 1 إلى 10

sumo-mbot

 

وهذا الأمر يقوم في كل مرة بأخذ رقم عشوائي بين العددين اللذان تم اختيارهما
وتبعا لهذا الرقم قمنا بوضع شرط إذا كان الرقم أقل من 5 ينعطف الروبوت لليمين
وإلا فينعطف لليسار

sumo-mbot

قمنا بوضع أمر التأخير الزمني.wait ليكون لدى الروبوت زمن كافي للانعطاف

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

 

sumo-mbot

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