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

مقدمة

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

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

arduino-python-gesture-control

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

التحكم بالحاسوب بحركات اليد

اردوينو اونو

التحكم بالحاسوب بحركات اليد

1× سلك الاردوينو

التحكم بالحاسوب بحركات اليد

حزمة أسلاك توصيل (ذكر – أنثى)

التحكم بالحاسوب بحركات اليد

حساس المسافة (HC-SR04)

التحكم بالحاسوب بحركات اليد

1× شريط لاصق ذو وجهين

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

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

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

arduino-python-gesture-control

تثبيت القطع على جهاز الحاسوب

قم بقص الشريط اللاصق لثلاث قطع صغيرة وثبتها على جهاز الحاسوب كما هو واضح بالصورة:

التحكم بالحاسوب بحركات اليد

ثبت الدائرة الكهربائية كما هو موضح:

التحكم بالحاسوب بحركات اليد

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

تنصيب (Python IDLE) و (Pyserial)

1- تنصيب (Python IDLE)

تثبيت البايثون على نظام ويندوز سوا كان نظام تشغيل 32 بت أو 64 بت هو نفسه.

 انقر على الرابط التالي Python 3.9.2 وثبت البرنامج على جهاز الحاسوب.

حمّل نسخة 32 بت دائمًا مهما كان نظام التشغيل.

التحكم بالحاسوب

افتح ملف exe الذي تم تنزيله واتبع التعليمات لا تقم بتغيير المسار الذي يتم فيه تثبيت Python.

سيكون المسار C:\Program Files (x86)\Python39-32 بشكل افتراضي اتركه كما هو عليه.

التحكم بالحاسوب بحركات اليد

2- ضبط إعدادات لوحة الأوامر

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

علينا اضافة مترجم اوامر البايثون إلى امتدادات الأوامر – PATH environment variable.
عليك الذهاب للوحة التحكم بويندوز واتباع المسار التالي:
Control Panel\System and Security\System
اختر من القائمة Advanced system setting:

التحكم بالحاسوب بحركات اليد

انقر على Environment variable:

التحكم بالحاسوب بحركات اليد

انقر على Path من قائمة System Variables.

arduino-python-gesture-control

انقر على New وأضف المسار التالي (أو المسار الذي قمت بتحميل البرنامج عليه):
C:\Program Files (x86)\Python39-32

 انقر على New مرة أخرى وضع مسار مجلد Scripts:

C:\Program Files (x86)\Python39-32\Scripts

التحكم بالحاسوب

بعد اتمامك للخطوات سيكتمل تنصيب البرنامج، يمكنك التحقق من وجوده وذلك بالبحث عنه مع قائمة البرامج Python IDLE.

3- تنصيب (Pyserial)

بعد ذلك علينا تنصيب Pyserial انقر على الرابط التالي وحمله على حاسوبك Pyserial 3.5 

التحكم بالحاسوب عن طريق التلويح

بعد تحميله فك الضغط عنه وانسخ المسار الذي يتواجد فيه ملف Pyserial.

انقر بالسهم اليمين على Command Prompt واختر من القائمة Run as administrator.

arduino-python-gesture-control

اكتب الأمر التالي وضع المسار الذي قمت بتحميل Pyserial فيه:

cd (Pyserial المسار لبرنامج)

حمل setup.py.

python setup.py install
4- تنصيب مكتبة (Pyautogui)

تركيب وحدة Pyautogui للويندوز:

تأكد من أن جهاز الحاسوب متصل بالإنترنت واتبع الخطوات أدناه:

الخطوة 1: افتح صفحة الأوامر بويندوز Windows prompt وقم بتغيير المسار إلى المجلد الذي قمت بتثبيت به البايثون.

cd C:\Program Files (x86)\Python39-32

الخطوة 2: داخل مسار بايثون، سنقوم بترقية Pip وهي أداة في البايثون تساعدنا على تثبيت وحدات البايثون بسهولة استخدم الأمر التالي لترقيتها.

pip install –-upgrade pip

 الخطوة 3: ثبت وحدة Pyautogui.

pip install pyautogui

  الكود البرمجي (بايثون)

افتح برنامج IDLE (Python 3.9 32-bit) من قائمة File اختر New File والصق الكود البرمجي التالي.

التحكم بالحاسوب بحركات اليد

ارفع الكود البرمجي للوحة الاردوينو من قائمة Run انقر على Run module.

import serial #Serial imported for Serial communication
import time #Required to use delay functions
import pyautogui
ArduinoSerial = serial.Serial('com18',9600) #Create Serial port object called arduinoSerialData
time.sleep(2) #wait for 2 seconds for the communication to get established
while 1:
    incoming = str (ArduinoSerial.readline()) #read the serial data and print it as line
    print (incoming)
    if 'Play/Pause' in incoming:
        pyautogui.typewrite(['space'], 0.2)
    if 'Rewind' in incoming:
        pyautogui.hotkey('ctrl', 'left')  
    if 'Forward' in incoming:
        pyautogui.hotkey('ctrl', 'right') 
    if 'Vup' in incoming:         pyautogui.hotkey('ctrl', 'down')     if 'Vdown' in incoming:       pyautogui.hotkey('ctrl', 'up')
  incoming = "";

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

افتح صفحة جديدة في IDLE Python وقم باستدعاء المكتبات المطلوبة pyautogui, serial python و time.

import serial #Serial imported for Serial communication
import time #Required to use delay functions
import pyautogui

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

ArduinoSerial = serial.Serial('com18',9600) #Create Serial port object called arduinoSerialData 
time.sleep(2) #wait for 2 seconds for the communication to get established

 في هذا السطر تتم قراءة المسافة بين اليدين والحساس من المنفذ التسلسلي.

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

الاختصارات المستخدمة في هذا الدرس من مشغل VLC:

Space :ايقاف/تشغيل الملف

 Ctrl +  السهم يمين أو يسار: التقديم أو الترجيع دقيقة

Ctrl + السهم للأعلى والأسفل: رفع وخفض مستوي الصوت

while 1:
    incoming = str (ArduinoSerial.readline()) #read the serial data and print it as line
    print incoming
    
    if 'Play/Pause' in incoming:
        pyautogui.typewrite(['space'], 0.2)

    if 'Rewind' in incoming:
        pyautogui.hotkey('ctrl', 'left')  

    if 'Forward' in incoming:
        pyautogui.hotkey('ctrl', 'right') 

    if 'Vup' in incoming:
        pyautogui.hotkey('ctrl', 'down')
        
    if 'Vdown' in incoming:
        pyautogui.hotkey('ctrl', 'up')

ستلاحظ كقدرتك على التحكم بالحاسوب بحركات اليد بدلًا من الفأرة باستخدام الاردوينو يمكنك اختبار صحة الخطوات والاجراءات من خلال الصفحة المنبثقة بعد النقر على Run modul ستظهر  صفحة IDLE Shell.

التحكم بالحاسوب بحركات اليد

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

 




تسجيل الدخول لنظام ويندوز باستخدام الاردوينو و (RFID)

 مقدمة

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

arduino-unlock-computer-with-rfid

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

الدخول لنظام ويندوز RFID

1× اردوينو اونو

الدخول لنظام ويندوز RFID

1× سلك الاردوينو

arduino-unlock-computer-with-rfid

حزمة أسلاك توصيل (ذكر – أنثى)

اردوينو

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

security-access-using-rfid-reader

قارئ البطاقة (RFID mfrc522)

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

وصل الدائرة كما هو موضح بالشكل:

arduino-unlock-computer-with-rfid

الدخول لنظام ويندوز RFID

لمعرفة المزيد حول بطاقة RFID يمكنك الرجوع للدرس RFID

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

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

1- قراءة رمز البطاقة

حتى تتمكن من تسجيل الدخول لنظام ويندوز باستخدام الاردوينو و (RFID) ارفع الكود البرمجي التالي على لوحة الاردوينو.

#include <SPI.h>
#include <MFRC522.h> // RFID library
#define SS_PIN 10 //RX slave select
#define RST_PIN 9
int gled = 7; // optional
int rled = 4;// optional
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
String card_ID=""; //
String password="" ; // Change It To Your Windows / fb / any Account's Password String rfid="";// UID (unique Id Code Of Your Rfid Tag) void setup() { Serial.begin(9600); // Initialize serial communications with the PC SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
pinMode(gled,OUTPUT);
pinMode(rled,OUTPUT);
} void loop() { //look for new card if ( ! mfrc522.PICC_IsNewCardPresent()) { return; }
if ( ! mfrc522.PICC_ReadCardSerial()) { return;//if read card serial(0) returns 1, the uid struct contians the ID of the read card. }
for (byte i = 0; i < mfrc522.uid.size; i++) { card_ID += mfrc522.uid.uidByte[i]; }
// Serial.println(card_ID); Serial.print(card_ID); delay(1000); card_ID=""; }

افتح شاشة الاتصال التسلسلي وضع البطاقة على قارئ البطاقات.

انسخ رمز البطاقة واحفظه في ملف ستحتاج إليه لاحقًا.

الدخول لنظام ويندوز RFID

2- رفع الكود البرمجي لنظام

قبل رفع الكود البرمجي إلى لوحة الاردوينو هناك أمور مهمة عليك العمل بها، اقرأ شرح الكود البرمجي.

uint8_t buf[8] = { 0 };
#include <SPI.h>
#include <MFRC522.h> // RFID library
#define SS_PIN 10 //RX slave select
#define RST_PIN 9
int gled = 7; // optional
int rled = 4;// optional
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
String card_ID=""; //
String password="" ; // Change It To Your Windows / fb / any Account's Password
String rfid="";// UID (unique Id Code Of Your Rfid Tag) void setup() { Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
pinMode(gled,OUTPUT);
pinMode(rled,OUTPUT);
}
void loop() { //look for new card if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } if ( ! mfrc522.PICC_ReadCardSerial()) {
return;//if read card serial(0) returns 1, the uid struct contains the ID of the read card.
} for (byte i = 0; i < mfrc522.uid.size; i++) {
card_ID += mfrc522.uid.uidByte[i];
} // Serial.println(card_ID);
if(card_ID==rfid){digitalWrite(gled,HIGH);
typeLiteralString(password);
pressKey("enter"); releaseKey("enter");
digitalWrite(gled,LOW); delay(200);digitalWrite(gled,HIGH); delay(200);digitalWrite(gled,LOW);
} if(card_ID!=password){
digitalWrite(rled,HIGH); digitalWrite(rled,LOW); delay(200);digitalWrite(rled,HIGH); delay(200);digitalWrite(rled,LOW); } else{ goto cont;}
delay(1000);
cont:
delay(1000);
card_ID=""; } boolean isModifier(int keycode) {
boolean result = false;
if (keycode >= 224 && keycode <= 231) { // if the keycode is a modifier key
result = true;
} return result; } void pressModifier(String keyname) {
pressModifier(getKeycode(keyname));
} void pressModifier(int keycode) {
int modifiermask = 0;
if (isModifier(keycode)) { // if the keycode represents a modifier key modifiermask = getModifierMask(keycode);
buf[0] = buf[0] | modifiermask;
Serial.write(buf, 8); // Send key report
} } void releaseModifier(String keyname) {
releaseModifier(getKeycode(keyname));
} void releaseModifier(int keycode) {
int modifiermask = 0;
if (isModifier(keycode)) { // if the keycode represents a modifier key
modifiermask = getModifierMask(keycode);
buf[0] = buf[0] & (~modifiermask);
Serial.write(buf, 8); // Send key report
} } void releaseAllModifiers() {
buf[0] = B00000000;
Serial.write(buf, 8); // Send key report
} void pressKey(String keyname) {
pressKey(getKeycode(keyname));
} void pressKey(int keycode) { // TODO: cycle the 6 key spots in the report buffer instead of just using buf[2] each time. buf[2] = keycode;
Serial.write(buf, 8); // Send key report
} void releaseKey(String keyname) {
releaseKey(getKeycode(keyname));
} void releaseKey(int keycode) {
// find the keycode in the report buffer, then set it to zero.
int i=0;
for (i=2; i<8; i++) {
if (buf[i] == keycode) {
buf[i] = 0;
} } Serial.write(buf, 8); // Send key report
} void releaseAllKeys() {
int i=0;
for (i=2; i<8; i++) {
buf[i] = 0;
} Serial.write(buf, 8); // Send key report
} void pressSequenceOfKeys(const char * keySequence[], int numberOfKeys) {
// This function can be good for pressing a few keys while holding a modifier down for example.
int i = 0; for (i=0; i<numberOfKeys; i++) {
pressKey(keySequence[i]);
releaseKey(keySequence[i]);
} } void typeLiteralString(String string) {
char charArray[string.length()+1];
string.toCharArray(charArray, string.length()+1);
typeLiteralString(charArray, string.length());
} void typeLiteralString(char string[], int stringLength) { // stringLength is the length of the printable string without considering the null byte.
// This function will type the given string exactly as given, automatically pressing left_shift where necessary for capitals and symbols. // just in case: releaseAllKeys(); releaseAllModifiers(); boolean charNeedsShift = false; boolean shiftIsPressed = false; int i=0;
for (i=0; i<stringLength; i++) {
charNeedsShift = characterNeedsShift(string[i]);
if (charNeedsShift && !shiftIsPressed) {
pressModifier("left_shift");
shiftIsPressed = true;
} else if (!charNeedsShift && shiftIsPressed) {
releaseModifier("left_shift");
shiftIsPressed = false;
} pressKey(String(string[i])); // without converting the char in string[i] to a String, arduino would prefer the pressKey(int) function instead of the pressKey(String) function, casting the char to a keycode (int) instead of a keyname (String).
releaseKey(String(string[i])); // same as previous comment, but with releaseKey(). } releaseAllModifiers(); } boolean characterNeedsShift(char character) { int needsModifier = false; if ( // look up an ascii table and this will make sense.
(character >= 33 && character <= 38)
|| (character >= 40 && character <= 43)
|| (character == 58)
|| (character == 60)
|| (character >= 62 && character <= 90)
|| (character >= 94 && character <= 95)
|| (character >= 123 && character <= 126)
) { needsModifier = true;
} return needsModifier; } int getKeycode(String keyname) { String key = String(keyname); // Use a copy so that we don't mutate the user's String. Not sure if this is needed, but just in case. TODO: find out.
key.toLowerCase(); int keycode = 0; // keycode of zero means nothing pressed. // non-modifier keys
if (key == "a") { keycode = 4; }
else if (key == "b") { keycode = 5; }
else if (key == "c") { keycode = 6; }
else if (key == "d") { keycode = 7; }
else if (key == "e") { keycode = 8; }
else if (key == "f") { keycode = 9; }
else if (key == "g") { keycode = 10; }
else if (key == "h") { keycode = 11; }
else if (key == "i") { keycode = 12; }
else if (key == "j") { keycode = 13; }
else if (key == "k") { keycode = 14; }
else if (key == "l") { keycode = 15; }
else if (key == "m") { keycode = 16; }
else if (key == "n") { keycode = 17; } else if (key == "o") { keycode = 18; } else if (key == "p") { keycode = 19; }
else if (key == "q") { keycode = 20; }
else if (key == "r") { keycode = 21; }
else if (key == "s") { keycode = 22; }
else if (key == "t") { keycode = 23; }
else if (key == "u") { keycode = 24; }
else if (key == "v") { keycode = 25; } else if (key == "w") { keycode = 26; }
else if (key == "x") { keycode = 27; }
else if (key == "y") { keycode = 28; }
else if (key == "z") { keycode = 29; } else if (key == "1" || key == "!") { keycode = 30; }
else if (key == "2" || key == "@") { keycode = 31; }
else if (key == "3" || key == "#") { keycode = 32; } else if (key == "4" || key == "$") { keycode = 33; }
else if (key == "5" || key == "%") { keycode = 34; }
else if (key == "6" || key == "^") { keycode = 35; }
else if (key == "7" || key == "&") { keycode = 36; }
else if (key == "8" || key == "*") { keycode = 37; } else if (key == "9" || key == "(") { keycode = 38; } else if (key == "0" || key == ")") { keycode = 39; }
else if (key == "enter" || key == "return") { keycode = 40; }
else if (key == "escape" || key == "") { keycode = 41; }
else if (key == "backspace" || key == "") { keycode = 42; }
else if (key == "tab" || key == " ") { keycode = 43; }
else if (key == "space" || key == " ") { keycode = 44; } else if (key == "-" || key == "_") { keycode = 45; }
else if (key == "=" || key == "+") { keycode = 46; }
else if (key == "[" || key == "{") { keycode = 47; }
else if (key == "]" || key == "}") { keycode = 48; }
else if (key == "\\" || key == "|") { keycode = 49; } else if (key == ";" || key == ":") { keycode = 51; }
else if (key == "'" || key == "\"") { keycode = 52; } else if (key == "`" || key == "~") { keycode = 53; }
else if (key == "," || key == "<") { keycode = 54; }
else if (key == "." || key == ">") { keycode = 55; }
else if (key == "/" || key == "?") { keycode = 56; } // TODO: Fix these keycodes. V
else if (key == "capslock") { keycode = 58; } else if (key == "f1") { keycode = 59; }
else if (key == "f2") { keycode = 60; }
else if (key == "f3") { keycode = 61; }
else if (key == "f4") { keycode = 62; }
else if (key == "f5") { keycode = 63; }
else if (key == "f6") { keycode = 64; }
else if (key == "f7") { keycode = 65; }
else if (key == "f8") { keycode = 66; }
else if (key == "f9") { keycode = 67; }
else if (key == "f10") { keycode = 68; } else if (key == "f11") { keycode = 69; }
else if (key == "f12") { keycode = 70; } else if (key == "print_screen") { keycode = 70; }
else if (key == "scroll_lock") { keycode = 71; }
else if (key == "pause") { keycode = 72; } else if (key == "insert") { keycode = 73; }
else if (key == "home") { keycode = 74; } else if (key == "page_up") { keycode = 75; }
else if (key == "delete") { keycode = 76; }
else if (key == "end") { keycode = 77; }
else if (key == "page_down") { keycode = 78; } else if (key == "right_arrow") { keycode = 79; }
else if (key == "left_arrow") { keycode = 80; }
else if (key == "down_arrow") { keycode = 81; }
else if (key == "up_arrow") { keycode = 82; } else if (key == "numlock" || key == "clear") { keycode = 83; } //TODO: keypad and miscellaneous keys if you want them. // modifier keys. else if (key == "left_control") { keycode = 224; }
else if (key == "left_shift") { keycode = 225; }
else if (key == "left_alt") { keycode = 226; }
else if (key == "left_gui") { keycode = 227; } else if (key == "right_control") { keycode = 228; }
else if (key == "right_shift") { keycode = 229; }
else if (key == "right_alt") { keycode = 230; }
else if (key == "right_gui") { keycode = 231; } return keycode; }
int getModifierMask(String keyname) { return getModifierMask(getKeycode(keyname));
}
int getModifierMask(int keycode) { // return value of 0 means key is not a modifier.
int modifiermask = 0; // NOTE: these are not the usage keycodes like for other keys, but rather the bit masks.
if (keycode == 224) { modifiermask = B00000001; } // left ctrl
else if (keycode == 225) { modifiermask = B00000010; } // left shift
else if (keycode == 226) { modifiermask = B00000100; } // left alt
else if (keycode == 227) { modifiermask = B00001000; } // left gui
else if (keycode == 228) { modifiermask = B00010000; } // right ctrl
else if (keycode == 229) { modifiermask = B00100000; } // right shift
else if (keycode == 230) { modifiermask = B01000000; } // right alt
else if (keycode == 231) { modifiermask = B10000000; } // right gui return modifiermask;
}

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

في هذا السطر نستدعي مكتبة قارئ البطاقة RFID ومكتبة الاتصال المتزامن.

#include <SPI.h>
#include <MFRC522.h> // RFID library

هذه الأسطر توضح منافذ الاردوينو التي ستستخدمها للربط في هذا المشروع.

#define SS_PIN 10 //RX slave select
#define RST_PIN 9

بعد ذلك أعلنا عن المتغيرات اللازمة مثل المتغيرات الخاصة بقارئ البطاقة RFID.

int gled = 7; // optional
int rled = 4;// optional
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

هذه الأسطر حساسة ومهمة.

السطر الأول: اتركه كما هو عليه فارغ.

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

السطر الثالث: اكتب رقم ID للبطاقة.

String card_ID=""; //
String password="12345986" ; // Change It To Your Windows / fb / any Account's Password
String rfid="215177152200";// UID (unique Id Code Of Your Rfid Tag)

في الدالة ()setup يتم انشاء جسر تواصل تسلسلي بين الحاسوب وقارئ البطاقة وتهيئة قارئ البطاقة لتسجيل القيم.

void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
pinMode(gled,OUTPUT);
pinMode(rled,OUTPUT);

في الدالة ()loop يستبدل الرمز السابق للبطاقة بالرمز الجديد (رمز تسجيل الدخول لنظام ويندوز).

 تتم قراءة البيانات من قارئ البطاقة ويتم ارسالها إلى الاردوينو لمعالجة البيانات المدخلة.

سيختبر القارئ كل بطاقة يتم توجيهها له وسيمنع أي محاولات لدخول النظام غير مصرحة.

وسيعطي الصلاحية فقط لحامل البطاقة التي تحمل كلمة المرور لنظام ويندوز.

void loop() {}

يمكنك الآن رفع الكود البرمجي على لوحة الاردوينو بعد تعيين رمز البطاقة وكلمة المرور لنظام ويندوز.

وضع (DFU)

هو اختصار لكلمة (Device Firmware Update).

عند وضع الاردوينو بوضع DFU فلا يمكنك استخدام المنفذ التسلسلي USB مرة أخرى مع برنامج Arduino IDE.
وهنا يمكنك عمل ترقية باستخدام برامج أخرى مثل Flip.

بعد رفع الكود البرمجي لنظام تسجيل الدخول لنظام ويندوز باستخدام الاردوينو و RFID.

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

الدخول لنظام ويندوز RFID

عند الذهاب للمسار التالي:

Control panel > Hardware and Sound > Device Manager

ستلاحظ وجود جهاز جديد بهذا الاسم.

arduino-unlock-computer-with-rfid

يمكنك فصل سلك USB الموصل مع لوحة الاردوينو وإعادته مرة أخرى.

سيبدأ النظام بالعمل مباشرة يمكنك اختباره واختبار صحة خطواتك.

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

 




الطباعة على مصفوفة الإضاءة باستخدام ليتل بيتس (LittleBits)

مقدمة

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

littlebits-hello-world

 المواد والأدوات من ليتل بيتس

حتى تتمكن من طباعة مرحبا بالعالم (Hello World) على مصفوفة الإضاءة تحتاج من مجموعة البرمجة سفيرو ليتل بيتس (Code kit by sphero little bits):

littlebits-hello-world

1× سلك (USB)

littlebits-hello-world

1× وحدة برمجة

littlebits-hello-world

1× ناقل الطاقة

1× ناقل التعليمات البرمجية

littlebits-hello-world

1× بطارية

1× مصفوفة الإضاءة

littlebits-hello-world

1× مفتاح

littlebits-hello-world

1× جهاز حاسوب

وحدة البرمجة

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

littlebits-hello-world

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

littlebits-hello-world

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

وصل البطارية مع سلك (USB)، وفي الطرف الآخر اضف ناقل الطاقة.

littlebits-hello-world

وصل المفتاح مع ناقل الطاقة، كما هو ظاهر.

littlebits-hello-world

وصل الطرف الآخر للمفتاح مع المدخل الثاني لوحدة البرمجة.

littlebits-hello-world

وصل مصفوفة الإضاءة مع المخرج الأول لوحدة البرمجة.

littlebits-hello-world

 حرك المفتاح لـ Serial، يساعدك هذا الخيار على طباعة الصور والجمل على مصفوفة الإضاءة.

مصفوفة الإضاءة ليتل بيتس

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

littlebits-hello-world

وصل ناقل التعليمات البرمجية على جهاز الحاسوب وتصبح قطع ليتل بيتس جاهزة لمرحلة البرمجة.

يعمل ناقل التعليمات البرمجية على نقل المقطع البرمجي من جهاز الحاسوب إلى النظام.

littlebits-hello-world

تنصيب برنامج ليتل بيتس (Littlebits)

حتى تتمكن من تغيير البرمجة لابد من تحميل برنامج ليتل بيت كود بيت من الرابط التالي: LittleBits code kit اختر نوع نظام التشغيل المتوافق مع جهازك.

littlebits-hello-world

بعد اكتمال عملية التحميل اضغط على أيقونة البرنامج.

littlebits-hello-world

اختر (Only for me) ثم اضغط على (install).

install

بعد اكتمال عملية التنزيل اضغط على (finish).

المقطع البرمجي

افتح برنامج ليتل بيتس (Littlebits) تظهر لك هذه النافذة مباشرة اضغط على  (Open A blank canvas) حتى تبدأ بكتابة المقطع البرمجي.

littlebits-hello-world

ستظهر هذه النافذة مباشرة وتحتوي على عدة أقسام موضحة في الصورة التالية:

littlebits-hello-world

سنبدأ بكتابة المقطع البرمجي.

من قائمة (Timing) والتي تقوم بتحديد وقت معين لكل أمر برمجي اسحب الأمر (Wait for IN1 to be on) وتعني بأن ننتظر حتى يكون المدخل In1 فعّال وجاهز للعمل.

Wait for IN1 to be on

بعد افلات الأمر في منطقة التحكم نعدل المدخل ونختار من القائمة المدخل الثاني (IN2).

IN2

من قائمة (Text) والتي تخص طباعة النص بأشكالها المختلفة نسحب (Send scrolling text hello world to OUT1) والتي تعني ارسل الجملة أهلا بالعالم إلى المخرج 1.

Text

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

littlebits-hello-world

بعد كتابة الجملة اضغط على (Connect to your CODEBIT):

Connect to your CODEBIT

 اضغط على المفتاح الموجود في وحدة البرمجة: 

littlebits-hello-world

 بعد الضغط عليه، سوف يومض باللون الأخضر ويظهر في القائمة يمكنك اختياره بالضغط على (Connect) .

Connect

اضغط على (Upload) حتى تقوم برفع المقطع البرمجي:

Upload

الآن قد اكتمل بناء نظام الطباعة على مصفوفة الإضاءة لتشغيل النظام اضغط على الزر وستلاحظ أن جملة مرحبا بالعالم (Hello World) ستظهر على مصفوفة الإضاءة.

افحص مجددًا تركيب النظام لترى انه بمتوافق مع صور التركيب.

تأكد من تشغيل وحدة مزود الطاقة.

littlebits-hello-world

تذكر فصل وحدة مزود الطاقة عند الانتهاء من استخدام النظام.




ترجمة شفرة مورس على الشاشة باستخدام الاردوينو

مقدمة

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

شفرة مورس

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

الاردوينو يستخدم في حساس الغاز/ الدخان

1× اردوينو اونو

arduino-smoke-gas-sensor

1× سلك الاردوينو

arduino-smoke-gas-sensor

لوحة تجارب – حجم كبير

lcd

 شاشة كرستالية (LCD 2×16 )

شفرة مورس

1× مقاومة متغيرة

arduino-smoke-gas-sensor

 حزمة أسلاك توصيل (ذكر- ذكر)

arduino-unlock-computer-with-rfid

حزمة أسلاك توصيل (ذكر – أنثى)

arduino-smoke-gas-sensor

3× مقاومة 220 Ω

شفرة مورس

أزرار

شفرة

1× 40 رأس دبوس

شفرة مورس

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

وتتم ترجمة شفرة مورس إلى حروف وأرقام ورموز أخرى.

arduino-morse-code-translator

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

لمعرفة المزيد حول الشاشة الكرستالية يمكنك الرجوع للدرس التحكم بالشاشة الكرستالية LCD

لابد من تلحيم المنافذ مع الشاشة الكرستالية، للمزيد حول اللحام يمكنك الرجوع للدرس تعلم كيفية التلحيم – تلحيم القطع باللوحة الإلكترونية

شفرة مورس

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

#include <LiquidCrystal.h>
#define BUTTON1PIN 6
#define BUTTON2PIN 8
#define BUTTON3PIN 7
#define DISPLAY_NUMOFCOLUMNS 16
int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int Button1State = 0;
int Button1LastState = 0;
int Button2State = 0;
int Button2LastState = 0;
int Button3State = 0;
int Button3LastState = 0;
String tonesBuffer;
String text;
String expectedText;
String symbolsAlphabet[][2] =
{
{ ".-","A" },
{ "-...","B" },
{ "-.-.","C" },
{ "-..","D" },
{ ".","E" },
{ "..-.","F" },
{ "--.","G" },
{ "....","H" },
{ "..","I" },
{ ".---","J" },
{ "-.-","K" },
{ ".-..","L" },
{ "--","M" },
{ "-.","N" },
{ "---","O" },
{ ".--.","P" },
{ "--.-","Q" },
{ ".-.","R" },
{ "...","S" },
{ "-","T" },
{ "..-","U" },
{ "...-","V" },
{ ".--","W" },
{ "-..-","X" },
{ "-.--","Y" },
{ "--..","Z" },
{ ".----","1" },
{ "..---","2" },
{ "...--","3" },
{ "....-","4" },
{ ".....","5" },
{ "-....","6" },
{ "--...","7" },
{ "---..","8" },
{ "----.","9" },
{ "-----","0"}
};
char getToneFromButtonStates()
{
if (!Button1State && Button1LastState)
return '-';
if (!Button2State && Button2LastState)
return '.';
if (!Button3State && Button3LastState)
return ' ';
return (char)0;
}
char getSymbolFromBuffer()
{
if (tonesBuffer == "")
return ' ';
for (int i = 0; i < sizeof symbolsAlphabet / sizeof symbolsAlphabet[0]; i++)
if (tonesBuffer == symbolsAlphabet[i][0])
return symbolsAlphabet[i][1][0];
return (char)0; }
 void extractActionFromTonesBuffer() {
 if (tonesBuffer == "......")
 text.remove(text.length() - 1, 1);
 if (tonesBuffer == "------") text = ""; } 
void setup()
 { lcd.clear();
 lcd.begin(16,2);
 lcd.print("Morse");
 lcd.setCursor(0, 1); 
lcd.print("Code");
 pinMode(BUTTON1PIN, INPUT); 
pinMode(BUTTON2PIN, INPUT); 
pinMode(BUTTON3PIN, INPUT); }
 void loop() { 
Button1State = digitalRead(BUTTON1PIN);
 Button2State = digitalRead(BUTTON2PIN);
 Button3State = digitalRead(BUTTON3PIN);
 char tone = getToneFromButtonStates(); 
if (tone != (char)0) 
{ if (tone == ' ') 
{ char symbol = getSymbolFromBuffer(); 
if (symbol != (char)0) { text += symbol; 
if (text.length() > DISPLAY_NUMOFCOLUMNS) {
 text = (String)symbol; }
 } else { extractActionFromTonesBuffer(); } tonesBuffer = "";
 } else {
 tonesBuffer += tone;
 if (tonesBuffer.length() > DISPLAY_NUMOFCOLUMNS) 
{ tonesBuffer = (String)tone; 
} 
} lcd.clear();
 lcd.print(text);
 lcd.setCursor(0, 1); 
lcd.print(tonesBuffer); }
 Button1LastState = Button1State; 
Button2LastState = Button2State; 
Button3LastState = Button3State; }

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

هذا السطر يستدعي مكتبة الشاشة الكرستالية.

نستطيع تحميلها بتتبع المسار التالي:

Sketch > Include libraries > Manage libraries

ثم نكتب بخانة البحث Liquid crystal by Arduino

ثم نضغط على Install.

#include <LiquidCrystal.h>

هذه الأسطر توضح منافذ الاردوينو التي ستستخدمها للربط في هذا المشروع.

#define BUTTON1PIN 6
#define BUTTON2PIN 8
#define BUTTON3PIN 7
#define DISPLAY_NUMOFCOLUMNS 16

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

int Button1State = 0;
int Button1LastState = 0;
int Button2State = 0;
int Button2LastState = 0;
int Button3State = 0;
int Button3LastState = 0;

أيضًا أنشئنا متغيرات لتخزين التسلسل الحالي للضغطات والرمز التابع لكل ضغطة، التسلسل الحالي إما نقطة أو شرطة.

ترجمة الرموز في شفرة مورس ستكون إما رقم أو حرف أو رموز خاصة.

String tonesBuffer;
String text;
String expectedText;

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

String symbolsAlphabet[][2] =
{
{ ".-","A" },
{ "-...","B" },
{ "-.-.","C" },
{ "-..","D" },
{ ".","E" },
{ "..-.","F" },
{ "--.","G" },
{ "....","H" },
{ "..","I" },
{ ".---","J" },
{ "-.-","K" },
{ ".-..","L" },
{ "--","M" },
{ "-.","N" },
{ "---","O" },
{ ".--.","P" },
{ "--.-","Q" },
{ ".-.","R" },
{ "...","S" },
{ "-","T" },
{ "..-","U" },
{ "...-","V" },
{ ".--","W" },
{ "-..-","X" },
{ "-.--","Y" },
{ "--..","Z" },
{ ".----","1" },
{ "..---","2" },
{ "...--","3" },
{ "....-","4" },
{ ".....","5" },
{ "-....","6" },
{ "--...","7" },
{ "---..","8" },
{ "----.","9" },
{ "-----","0"}
};

في دالة ()setup، التي ستبدأ عند بدء التشغيل، تتم تهيئة الشاشة وتشغيل الإضاءة الخلفية وطباعة النص “Morse code” هنا علينا تعريف المنافذ إلى مدخلات  للاتصال الرقمي باستخدام الأزرار.

void setup() {
clear.lcd();
lcd.begin(16,2);
lcd.print("Morse");
lcd.setCursor(0, 1);
lcd.print("Code");
pinMode(BUTTON1PIN, INPUT);
pinMode(BUTTON2PIN, INPUT);
pinMode(BUTTON3PIN, INPUT);
}

تبدأ دالة ()loop بقراءة حالات الأزرار واستدعاء دالة ()getToneFromButtonStates.

void loop() {
Button1State = digitalRead(BUTTON1PIN);
Button2State = digitalRead(BUTTON2PIN);
Button3State = digitalRead(BUTTON3PIN);
char tone = getToneFromButtonStates();

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

إذا كانت تحمل قيم (ضغط المستخدم على أي زر)، يأتي تحليل آخر، يتفرع البرنامج إلى قسم “تم الضغط على النقطة” وقسم ” “تم الضغط على الشرطة”.

if (tone != (char)0) {
        if (tone == ' ')
        {
        }
        else
       {
        }
        lcd.clear();
        lcd.print(text);
        lcd.setCursor(0, 1);
        lcd.print(tonesBuffer);
}
Button1LastState = Button1State;
Button2LastState = Button2State;
Button3LastState = Button3State;

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

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

إذا لم يكن المخزن المؤقت فارغًا، يتم البحث عن ترجمة الرموز المدخلة ويتم إرجاع ترجمة الرمز الذي تم العثور عليه.

إذا كان هناك رمز ولم يتم العثور على ترجمة الرمز، فسيتم إرجاع قيمة فارغة.

char getSymbolFromBuffer()
{
if (tonesBuffer == "")
return ' ';
for (int i = 0; i < sizeof symbolsAlphabet / sizeof symbolsAlphabet[0]; i++)
if (tonesBuffer == symbolsAlphabet[0])
return symbolsAlphabet[1][0];
return (char)0;
}

في هذه الدالة سيكون هناك رموز خاصة في شفرة مورس لها تفسير معين.

عند إدخال المستخدم 6 نقط متتابعة فذلك يعني أن المستخدم يريد حذف آخر حرف تمت كتابته.

عند إدخال المستخدم 6 شرطات متتابعة فذلك يعني أن المستخدم يريد حذف كامل النص المكتوب.

void extractActionFromTonesBuffer()
{
if (tonesBuffer == "......")
text.remove(text.length() - 1, 1);
if (tonesBuffer == "------")
text = "";
}

شفرة مورس

شفرة مورس

 

 

 




اصنع فانوس رمضان بنفسك

فانوس رمضان

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

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

شريط ليد

1Xشريط اضاءة

بطارية

1Xبطارية

حامل بطارية

1Xحامل بطارية

حساس الألوان (ألواح أكليريك)

 

1Xلوح أكليريك(3*150*150)

 

آلة تفريز

1Xألية التفريز(أو قاطع ليزر)

لحام

1Xكاوية لحام 

سلك توصيل

1Xأسلاك توصيل

سلك لحام

1Xسلك لحام 

هيكل الفانوس

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

فانوس رمضان

ثم نقوم بتصبيت جميع أجزاء الفانوس ليظهر كما هو بالصورة

فانوس رمضان

اضاءة الفانوس

في قاعدة الفانوس ثبتنا الإضاءة و البطارية،

فانوس رمضان

فانوس رمضان

 




سلة مهملات ذكية باستخدام ليتل بيتس (LittleBits)

مقدمة

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

سلة مهملات ليتل بيتس

المواد والأدوات من ليتل بيتس

حتى تتمكن من صناعة سلة المهملات الذكية تحتاج مجموعة (littleBits Base Inventor Kit) وحدات المبتكر ليتل بيتس:

أسلاك توصيل

3× سلك

littlebits-smart-trash

1× حامل البطارية

littlebits-smart-trash

1× سلك البطارية

بطارية

1× بطارية

littlebits-smart-trash

1× منفذ الطاقة

littlebits-smart-trash

1× مستشعر الإقتراب

قالب كرتوني

1× قالب كرتوني رقم (8)

littlebits-navagitor

1× قالب كرتوني رقم (9)

littlebits-navagitor

1× مفتاح تحكم

littlebits-navagitor

1× محرك السيرڤو

littlebits-navagitor

1× ذراع تحكم

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

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

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

تركيب البطارية

اربط سلك البطارية مع منفذ الطاقة.

littlebits-navigator

وصل السلك مع منفذ الطاقة، وفي الطرف الآخر اضف مستشعر الإقتراب.

littlebits-smart-trash

وصل السلك مع مستشعر الإقتراب، وفي الطرف الآخر نضيف مفتاح التحكم.

littlebits-smart-trash

وصل محرك السيرڤو مع مفتاح التحكم.

littlebits-smart-trash

شغل محرك السيرڤو من مفتاح التشغيل.

littlebits-smart-trash

تجميع مكونات سلة المهملات الذكية

 قم بطي الخطوط المتقطعة في القالب الكرتوني (8) ثم فك الطي، كرر ذلك مع جميع الخطوط المتقطعة؛ حتى تصبح مرنة أثناء عملية التجميع.

بناء الهيكل

قم بطي الخطوط المتصلة في القالب الكرتوني (8) ثم فك الطي، كرر ذلك مع جميع الخطوط المتصلة؛ حتى تصبح مرنة أثناء عملية التجميع.

سلة مهملات ليتل بيتس

ادخل وصلات التثبيت 1 و 2 في المنفذين المقابلين 1 و 2 بإحكام، كما هو ظاهر.

سلة مهملات ليتل بيتس

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

سلة مهملات ليتل بيتس

سلة مهملات ليتل بيتس

سلة مهملات Littlebits

ادخل اللوحة في الفتحة السوداء الموجودة بإحدى جوانب القالب الكرتوني.

سلة مهملات ليتل بيتس

قم بطي الخطوط المتقطعة في القالب الكرتوني (9) ثم فك الطي،كرر ذلك مع جميع الخطوط المتقطعة.

littlebits-smart-trash

قم بطي الخطوط المتصلة في القالب الكرتوني (9) ثم فك الطي، كرر ذلك مع جميع الخطوط المتصلة.

سلة مهملات Littlebits

طبق الأوجه التي لها نفس الرقم بدءًا من (1) حتى آخر رقم بالنموذج، واغلقها بإحكام.

littlebits-smart-trash

littlebits-smart-trash

ثبت منفذ الطاقة والبطارية على اللوحة خارج القالب الكرتوني (8).

منفذ الطاقة سلة المهملات الذكية ليتل بيتس

ثبت مفتاح التحكم، ومحرك السيرڤو في اللوحة داخل القالب الكرتوني (8).

littlebits-smart-trash

اسحب مفتاح التحكم للأعلى

سلة المهملات الذكية ليتل بيتس

نثبت ذراع التحكم على محرك السيرڤو.

littlebits-smart-trash

ثبت لاقط المهملات على ذراع التحكم.

لاقط المهملات سلة المهملات الذكية ليتل بيتس

ثبت حساس الإقتراب على الفتحات الموجودة على لاقط المهملات.

سلة مهملات Littlebits

اسحب مفتاح التحكم للمنتصف.

 سلة المهملات الذكية ليتل بيتس

اغلق الباب لسلة المهملات الذكية.

الباب سلة المهملات الذكية ليتل بيتس

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

الطاقة سلة المهملات الذكية ليتل بيتس

افحص مجددًا تركيب النظام لترى انه متوافق مع الصور.

تأكد من تشغيل وحدة مزود الطاقة

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

سلة مهملات بدون لمس

تذكر فصل وحدة مزود الطاقة عند الانتهاء من استخدام النظام.




كاشف العقبات باستخدام ليتل بيتس (LittleBits)

مقدمة

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

المقدمة

المواد والأدوات من ليتل بيتس

حتى تتمكن من صناعة كاشف العقبات تحتاج مجموعة (littleBits Base Inventor Kit) وحدات المبتكر ليتل بيتس:

littlebits-navigator

1× قالب الكرتوني رقم (4)

اسلاك توصيل

2× سلك

littlebits-navigator

1× حامل البطارية

littlebits-navigator

1× سلك البطارية

littlebits-navigator

1× بطارية

littlebits-navigator

1× منفذ الطاقة

littlebits-navigator

1× حساس القرب

مصدر صوت

1× مصدر صوت

littlebits-navigator

1× لوحة

littlebits-navigator

1× شريط لاصق

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

تحتوي مجموعة ليتل بيتس على بطارية و منفذ الطاقة اللذان يعتبران مسؤولان عن تزويد دائرتك بالطاقة اللازمة لتشغيلها.

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

الطاقة

اربط سلك البطارية مع منفذ الطاقة.

littlebits-navigator

وصل الطرف الأول للسلك مع منفذ الطاقة والطرف الثاني مع حساس القرب.

توصيل مصدر الصوت

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

littlebits-navigator

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

مستكشف الأشياء ليتل بيتس

 

تجميع مكونات كاشف العقبات

 قم بطي الخطوط المتقطعة في القالب الكرتوني ثم فك الطي، كرر ذلك مع جميع الخطوط المتقطعة؛ حتى تصبح مرنة أثناء عملية التجميع.

littlebits-navigator

قم بطي الخطوط المتصلة في القالب الكرتوني ثم فك الطي، كرر ذلك مع جميع الخطوط المتصلة؛ حتى تصبح مرنة أثناء عملية التجميع.

littlebits-navigator

طبق الأوجه التي لها نفس الرقم (1) .

littlebits-navigator

ادخل وصلات التثبيت 2 و 3 في المنفذين المقابلين 2 و 3 بإحكام،.

littlebits-navigator

وبعد ذلك ادخل وصلات التثبيت 4 و 5 في المنفذين المقابلين 4 و 5 بإحكام،.

littlebits-navigator

ادخل وصلات التثبيت في المنفذين المقابلين.

littlebits-navigator

اطو الوجهين اللذان لهم نفس الرقم (6) وجهًا لوجه، .

littlebits-navigator

اسحب الجزء العلوي وادخله في المنفذ المقابل له.

littlebits-navigator

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

littlebits-navigator

تثبيت مكونات ليتل بيتس على كاشف العقبات:

ثبّت البطارية  في الموقع C.

littlebits-navigator

ومنفذ الطاقة  في الموقع A.

تركيب

وحساس القرب في الموقع B.

littlebits-navigator

ومصدر الصوت على اللوحة.

تثبيت البطارية

لجعل كاشف العقبات الخاص بك أكثر قوة، يمكنك وضع شريط لاصق على الطرفين.

تركيب

 بعد تركيب كل مكونات ليتل بيتس يمكنك تشغيل كاشف العقبات من خلال المفتاح الموجود في منفذ الطاقة.

littlebits-navigator

افحص مجددًا تركيب النظام تأكد من تشغيل وحدة مزود الطاقة

قرب الأداة إلى أحد العقبات المتواجدة حولك ولاحظ إصدار إنذار عند الاقتراب منها.

مستكشف

تذكر فصل وحدة مزود الطاقة عند الانتهاء من استخدام النظام.




نظام مراقبة نقاوة الجو باستخدام الاردوينو و حساس الغبار

المقدمة

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

حساس الغبار

 

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

اردوينو

1 X اردوينو

سلك اردوينو

1 X سلك الأردوينو

حساس الغبار

1 X حساس الغبار

لوحة تجارب حجم متوسط

1X لوحة تجارب

red led

1 X  الثنائي المشع للضوء لون أحمر

green-led-5mm

1 X  الثنائي المشع للضوء لون أخضر

مقاومة 220

2X مقاومة 220

مكثف

1X مكثف (16v,220uf) متوفر مع الحساس

مقاومة 150 اوم

1X مقاومة (150 اوم ) متوفره مع الحساس

اسلاك توصيل

مجموعة أسلاك توصيل (ذكر/ ذكر )

 

حساس الغبار

يتكون حساس الغبار من صمام ثنائي ضوئي. يبعث الضوء ومستكشف ضوء (Photodiode) لتحديد انعكاسات الضوءـ ويتم وضعهما بشكل قطري بالقرب من مدخل الهواء.

حساس الغبار

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

 

يحتوي حساس الغبار على 6 منافذ وظيفتها كالتالي

حساس الغبار

 

الجدول التالي يوضح وضيفة كل منفذ موجود بحساس الغبار

المنفذ وظيفة منفذ حساس الغبار
V-LED لتزويد الصمام الثنائي الضوئي بالطاقة
LED GND الأرضي للصمام الثنائي الضوئي
LED للتحكم بتشغيل الضوء
S-GND المنفذ الأرضي للحساس
Vo ينتج نبضات جهد تناظرية وفقًا لتركيز جزيئات الغبار في الهواء.
VCC لتزويد الحساس بالطاقة مقدارها 5 فولت
GND GUN

 

 

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

توصيل حساس الغبار

 

البرمجة

#include <Wire.h> 
#include <Adafruit_GFX.h> 
#include <Adafruit_SSD1306.h> 
#define OLED_RESET 4 
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64) 
#error("Height incorrect, please fix Adafruit_SSD1306.h!"); 
#endif 
const int LED1 = 8;
const int LED2 = 10; 
int measurePin = 0; 
int ledPower = 2; 
unsigned int samplingTime = 280;
unsigned int deltaTime = 40;
unsigned int sleepTime = 9680;
float voMeasured = 0; 
float calcVoltage = 0; 
float dustDensity = 0; 
void setup(){ 
  pinMode(ledPower,OUTPUT); 
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
  display.display(); // show splashscreen 
  delay(2000); 
  display.clearDisplay(); // clears the screen and buffer 
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  }
  void loop(){
    digitalWrite(ledPower,LOW);// power on the LED 
    delayMicroseconds(samplingTime); 
    voMeasured = analogRead(measurePin); // read the dust value 
    delayMicroseconds(deltaTime); 
    digitalWrite(ledPower,HIGH); // turn the LED off 
    delayMicroseconds(sleepTime); 
    calcVoltage = voMeasured * (5.0 / 1024.0); 
    dustDensity = 0.17 * calcVoltage - 0.1; 
    display.clearDisplay(); 
    display.setTextSize(2); 
    display.setTextColor(WHITE); 
    display.setCursor(0,0); 
    display.println("airquality="); 
    display.print(dustDensity); 
    display.display(); 
    delay(100); 
     if ( dustDensity < 0)
  {
    dustDensity = 0.00;
  }
    if(dustDensity < 0.12) { 
digitalWrite(LED1, HIGH); 
digitalWrite(LED2, LOW); } 
if(dustDensity >0.12 ) {
        digitalWrite(LED1, LOW);
        digitalWrite(LED2, HIGH);} 
        delay(100); 
  }

شرح الشفرة البرمجية

نبدأ بتحميل المكتبات شرح طريقة تحميل المكتبات من خلال الرابط

ابحث عن مكتبتي (Adafruit_GFX) و (Adafruit_SSD1306) عن طريق النقر على sketch < include library < manage libraries ثم حمل المكتبات

من داخل ملف المكتبات على جهاز انقر على مكتبة (Adafruit_SSD1306) ثم على ملف (Adafruit_SSD1306.h) و قم بالتعديل التالي :

ازالة رمز التعليق () //عن سطر

#define SSD1306_128_64

اضافة رمز التعليق (//) إلى السطر

//#define SSD1306_128_32

بالبداية نقوم باستدعاء المكتبات المطلوبة

#include <Wire.h> 
#include <Adafruit_GFX.h> 
#include <Adafruit_SSD1306.h> 
#define OLED_RESET 4 
Adafruit_SSD1306 display(OLED_RESET); 
#if (SSD1306_LCDHEIGHT != 64) 
#error("Height incorrect, please fix Adafruit_SSD1306.h!"); 
#endif 

نقوم بتعريف منافذ الثنائي المشع للضوء

const int LED1 = 8; 
const int LED2 = 10;

نقوم بتعريف المنافذ التي تم توصيلها مع حساس الغبار وهي  A0 و  المنفذ الرقمي 2

و حدد قيمة ابتدائية تساوي 0 للمتغيرات التالية (samplingTimeو deltaTime  و  int sleepTime)

int measurePin = 0; 
int ledPower = 2; 

int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;

نحدد قيمة ابتدائية لكل من (voMeasured  و calcVoltage  و dustDensity )

float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;

في دالة void setup نعرف نعرف منافذ الدخل و الخرج و تهيئة شاشة Oled

void setup(){
  pinMode(ledPower,OUTPUT);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
  display.display(); 
  delay(2000);
  display.clearDisplay();   
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);

}

في دالة void loop نشغل و نطفئ الثنائي المشع للضوء الموجود في حساس الغبار و نقرأ البيانات من المنفذ التناظري A0

void loop(){
  digitalWrite(ledPower,LOW); // power on the LED
  delayMicroseconds(samplingTime);

  voMeasured = analogRead(measurePin); // read the dust value

  delayMicroseconds(deltaTime);
  digitalWrite(ledPower,HIGH); // turn the LED off
  delayMicroseconds(sleepTime);

نقوم بعمل عملية حسابية لحساب تركيز ذرات الغبار بالجو بالميكروجرام (واحد على مليون من الجرام) لكل متر مكعب من الهواء أو ميكروغرام / م 3.

calcVoltage = voMeasured * (5.0 / 1024.0);

  dustDensity = 0.17* calcVoltage - 0.1;

بعد حساب تركيز الغبار نقوم بطباعة القيمة على الشاشة

 display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.println("airquality=");
    display.print(dustDensity);
    display.display();
    delay(2000);

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

 if ( dustDensity < 0)
{
dustDensity = 0.00;
}

اذا كان تركيز الغبارأصغر من  (0.12 ) نعطي أمر بتشغيل الثنائي المشع للضوء الأول

if(dustDensity <= 0.12) {
 digitalWrite(LED1, HIGH); 
digitalWrite(LED2, LOW); }

اذا كان تركيز الغبار أكبر من قيمة (0.12) نعطي أمر بتشغيل الثنائي المشع للضوء الثاني

if(dustDensity > 0.12) {   
digitalWrite(LED1, LOW);
   digitalWrite(LED2, HIGH);}
  delay(1000);
}



مطرقة المركبة الفضائية باستخدام ليتل بيتس (Littlebits)

مقدمة

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

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

المواد والأدوات من ليتل بيتس

حتى تتمكن من صناعة مطرقة المركبة الفضائية تحتاج من مجموعة مستكشف الفضاء ليتل بيتس (little bits Space Rover Inventor Kit):

littlebits-space-hammer

 1×  قالب كرتوني رقم (4)

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

 1×  قالب كرتوني رقم (1)

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

 1×  قالب كرتوني رقم (2)

littlebits-space-hammer

 1×  قالب كرتون رقم (5) – لوحة الطاقة الشمسية

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

 1×  قالب كرتوني رقم (6)

littlebits-space-hammer

 1×  مركز التحكم

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

 1×  محور

littlebits-space-hammer

 1× وصلة محور

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

 1×  ذراع تحكم

littlebits-space-hammer

 1×  محرك السيرڤو

littlebits-space-hammer

 2×  محرك تيار مستمر

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

 1×  عجلة كروية

littlebits-space-hammer

 2×  عجلات

littlebits-space-hammer

 1×  حامل البطارية

littlebits-space-hammer

 1×  سلك البطارية

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

 1×  بطارية

littlebits-space-hammer

 1× منفذ الطاقة

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

تحتوي مجموعة ليتل بيتس على بطارية ومنفذ الطاقة اللذان يعتبران مسؤولان عن تزويد دائرتك بالطاقة اللازمة لتشغيلها.

ادخل البطارية في حامل البطارية، ثم صل سلك البطارية مع البطارية.

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

اربط سلك البطارية مع منفذ الطاقة.

littlebits-space-hammer

صل السلك مع منفذ الطاقة، وفي الطرف الآخر اضف مركز التحكم.

littlebits-space-hammer

محرك التيار المستمر يقوم بتدوير المحور حسب القيمة التي يتلقاها، كلما زادت القيمة زادت سرعة دوران المحرك.

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

تجنب تدوير المحرك بيدك؛ فذلك قد يؤدي إلى تلفه.

littlebits-space-hammer

صل محرك التيار المستمر الأول مع المخرج الأول، ومحرك التيار المستمر الثاني مع المخرج الثالث في مركز التحكم.littlebits-space-hammer

محرك

يمكن من خلال وحدة التحكم بالمحرك تحديد اتجاه الدوران للمحرك:

ccw عكس عقارب الساعة

Cw مع عقارب الساعة

Var متغير يمكن أن تكون مع أو عكس عقارب الساعة

حرك المفتاح في كلا محركين التيار المستمر لوضع var في المنتصف.

littlebits-space-hammer

اضف محرك السيرڤو في المخرج الثاني لمركز التحكم.

محرك السيرڤو يدور حسب الزوايا التي يتم إدخالها له.

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

شغل المفتاح الموجود على محرك السيرڤو.

littlebits-space-hammer

تركيب مكونات مطرقة المركبة الفضائية

 قم بطي الخطوط المتصلة في القالب الكرتوني (4) ثم فك الطي، كرر ذلك مع جميع الخطوط المتصلة؛ حتى تصبح مرنة أثناء عملية التجميع.

littlebits-space-hammer

طبق الأوجه التي لها نفس الرقم (1) مع (1) كرر ذلك مع كل الأوجه في القالب الكرتوني، واغلقها بإحكام.

littlebits-space-hammer

littlebits-space-hammer

littlebits-space-hammer

قم بطي الخطوط المتقطعة في القالب الكرتوني (1) ثم فك الطي، كرر ذلك مع جميع الخطوط المتقطعة؛ حتى تصبح مرنة أثناء عملية التجميع.

littlebits-space-hammer

قم بطي الخطوط المتصلة في القالب الكرتوني (1) ثم فك الطي، كرر ذلك مع جميع الخطوط المتصلة؛ حتى تصبح مرنة أثناء عملية التجميع.

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

طبق الأوجه التي لها نفس الرقم (1) مع (1)، كرر ذلك مع كل الأوجه في القالب الكرتوني، واغلقها بإحكام.

littlebits-space-hammer

littlebits-space-hammer

littlebits-space-hammer

littlebits-space-hammer

littlebits-space-hammer

littlebits-space-hammer

قم بطي الخطوط المتقطعة في القالب الكرتوني (5) ثم فك الطي، كرر ذلك مع جميع الخطوط المتقطعة؛ حتى تصبح مرنة أثناء عملية التجميع.

littlebits-space-hammer

قم بطي الخطوط المتصلة في القالب الكرتوني (5) ثم فك الطي، كرر ذلك  مع جميع الخطوط المتصلة؛ حتى تصبح مرنة أثناء عملية التجميع.

littlebits-space-hammer

قم بطي الخطوط المتصلة في القالب الكرتوني (6) ثم فك الطي، كرر ذلك مع جميع الخطوط المتصلة؛ حتى تصبح مرنة أثناء عملية التجميع.

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

طبق الوجه رقم (1) مع (1)، وادخل وصلة التثبيت (2) في المنفذ المقابل (2).

littlebits-space-hammer

قم بطي الوجه رقم (3) مع (3)، كما هو ظاهر.

littlebits-space-hammer

ادخل ذراع التحكم في القالب الكرتوني (6) الذي يسمى بالمطرقة.

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

قم بطي الخطوط المتصلة في القالب الكرتوني (2) ثم فك الطي، كرر ذلك مع جميع الخطوط المتصلة؛ حتى تصبح مرنة أثناء عملية التجميع.

littlebits-space-hammer

طبق الأوجه التي لها نفس الرقم (1) مع (1) وهكذا حتى تصل للرقم (7)، ادخل وصلة التثبيت رقم (8) مع المنفذ المقابل (8) حينها ستصل للشكل النهائي الموجود على اليسار.

littlebits-space-hammer littlebits-space-hammer مطرقة الفضاء ليتل بيتس

ادخل وصلة المحور بالمحور.

littlebits-space-hammer

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

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

تبيث مكونات مطرقة المركبة الفضائية:

ثبت اللوحة في هيكل عربة الفضاء.

littlebits-space-hammer

ثبت العجلة الكروية في الفتحة السفلية لهيكل عربة الفضاء، كما هو ظاهر.

littlebits-space-hammer

ثبت محركا التيار المستمر في الفتحات السفلية لهيكل عربة الفضاء، كما هو ظاهر.

littlebits-rover-body

ثبت مركز التحكم، منفذ الطاقة والمتحكم لكلا محركا التيار المستمر على اللوحة، كما هو ظاهر.

littlebits-cargo-carrier

ثبت العجلتين على محركا التيار المستمر.

littlebits-rover-body مطرقة الفضاء ليتل بيتس

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

خطوة اختيارية: استخدم ربطات قابلة للإلتواء؛ لتجعلها أكثر ثباتًا.

ذراع الروبوت ليتل بيتس

ثبت محرك السيرڤو على اللوحة.

littlebits-space-hammer

ثبت المطرقة على محرك السيرڤو.

littlebits-space-hammer

ثبت وصلات التثبيت الموجودة على لوحة الطاقة الشمسية في المنافذ الموجودة بالقالب الكرتوني (4).

littlebits-rover-body

ثبت لوحة الطاقة الشمسية على اللوحة.

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

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

تأكد من تشغيل وحدة مزود الطاقة

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

littlebits-space-hammer مطرقة الفضاء ليتل بيتس

تذكر فصل وحدة مزود الطاقة عند الانتهاء من استخدام النظام.




جهاز تصنيف الألوان باستخدام الاردوينو

المقدمة

حساس الألوان

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

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

اردوينو

1X اردوينو 

حساس الألوان

1X سلك A-B USB 

حساس الألوان

1X حساس الألوان 

محرك سيرفو

2 X محرك السيرفو 

اسلاك توصيل

مجموعة أسلاك توصيل (ذكر / ذكر)

اسلاك توصيل

مجموعة أسلاك توصيل (أنثى/ ذكر)

حساس الألوان (ألواح أكليريك)

1 X لوح أكليريك ( ملم 3*600*600)

طابعة ثلاثية الأبعاد

طابعة ثلاثية الأبعاد 

حساس الألوان خيوط طباعة

1X خيط الطباعة 

arduino-automatic-candy-dispenser-machine

1× لوحة تجارب حجم صغير

حساس الألوان

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

حساس الألوان
و بناء على هذا يعمل حساس الألوان حيث أنه يحول شدة الضوء الطول الموجي المنعكس من الأجسام إلى تردد، و يتكون حساس الألوان من مصدر ضوء (LED) أبيض يضيء عند تشغيل الوحدة ويستخدم لإضاءة الكائن الذي يتم استشعاره ثم وحدة استشعار اللون TCS230 وهي عبارة عن شبكة 8*8 من الصمامات الثنائية الضوئية مغطاة بمرشح حساس للألوان بحيث تكون 16 صمامًا ضوئيًا عليه مرشحات حمراء ، و 16 صمامًا ضوئيًا عليه مرشحات خضراء ، و 16 صمامًا ضوئيًا عليه مرشحات زرقاء ، و 16 صمامًا ضوئيًا متبقيًا بدون مرشحات.

حساس الألوان

حساس الألوان

تمكنك دبابيس التحكم  S2 وS3 من اختيار أي من الصمامات تريد قراءته. على سبيل المثال، إذا كنت ترغب في اكتشاف اللون الأحمر فقط، فيمكنك تحديد 16 صمامًا ضوئيًا عليه المرشح باللون الأحمر عن طريق ضبط دبابيس التحكم  S2 وS3 على LOW وفقًا للجدول.

photodiodes S3 S2
احمر LOW LOW
ازرق HIGH LOW
اخضر HIGH HIGH
بدون لون LOW HIGH

 

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

حساس الألوان

نوصل حساس الألوان مع الأردوينو حسب الجدول
الاردوينو حساس الألوان
2 S0
3 S1
4 S2
5 S3
6 OUT
5V VCC
GND GUN

 

الهيكل

توجد تقنيات متعدده ممكن أن تساعدك على بناء الهيكل المناسب، يمكن أن تكون قاطع الليزر أو جهاز التفريز و غيرها يمكنك تحميل الهيكل من خلال الرابط 

و تحتاج إلى تحميل القطع ثلاثية الأبعاد التي تم استخدامها بالمشروع من خلال الرابط  

الشفرة البرمجية

#include <Servo.h>

#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define sensorOut 6

Servo topServo;
Servo bottomServo;

int frequency = 0;
int color=0;

void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);

  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);

  topServo.attach(9);
  bottomServo.attach(10);

  Serial.begin(9600);
}

void loop() {

  topServo.write(115);
  delay(500);
  
  for(int i = 115; i > 35; i--) {
    topServo.write(i);
    delay(4);
  }
  delay(1000);
  
  color = readColor();
  delay(10);  

  switch (color) {
    case 1:
    bottomServo.write(50);
    break;

    case 2:
    bottomServo.write(90);
    break;

    case 3:
    bottomServo.write(120);
    break;

  }
  delay(300);
  
  for(int i = 35; i > 4; i--) {
    topServo.write(i);
    delay(2);
  } 
  delay(200);
  
  for(int i = 4; i < 115; i++) {
    topServo.write(i);
    delay(2);
  }
  color=0;
}


int readColor() {
  // Setting red filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int R = frequency;
  // Printing the value on the serial monitor
  Serial.print("R= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.print("  ");
  delay(50);

  // Setting Green filtered photodiodes to be read
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int G = frequency;
  // Printing the value on the serial monitor
  Serial.print("G= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.print("  ");
  delay(50);

  // Setting Blue filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int B = frequency;
  // Printing the value on the serial monitor
  Serial.print("B= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.println("  ");
  delay(50);

  if(R<50 & R>46 & B<92 & B>80){
    color = 1; // Red
   
  }
   if(G<89 & G>80 & B<96 & B>105){
    color = 2; // Yellow

  }
  if(G<89 & G>80  & B<97 &B>93){
    color = 3; // Orange
  }
  
  return color;  
}

 شرح الشفرة البرمجية

في بداية سيتم استعداء مكتبة محرك السيرفو ثم نقوم بتعريف منافذ حساس الألوان وتعريف  محرك السيرفو

#include <Servo.h>

#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define sensorOut 6

Servo topServo;
Servo bottomServo;

 

انشاء متغيرين للتردد و اللون و تكون بالبداية قيمة 0

int frequency = 0;
int color=0;

 

نحدد منافذ الدخل و الخرج في حساس الألوان

void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);

 

لتحديد عامل تحجيم التردد 20%

digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);

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

topServo.attach(9);
bottomServo.attach(10);

لتحديد معدل نقل البيانات من الاردوينو إلى اللابتوب

Serial.begin(9600);
}

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

أولا الزاوية الأولى نحددها بقية 115

void loop() {

topServo.write(115);
delay(500);

نعرف متغير (i) والذي يمثل قيمة الزاوية تتناقص قيمة (i) إلى أن تصل إلى 35 و التي تعد زاوية قراءة التردد

for(int i = 115; i > 35; i--) {
topServo.write(i);
delay(4);
}
delay(1000);

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

color = readColor();
delay(10);

switch (color) {
case 1:
bottomServo.write(50);
break;

case 2:
bottomServo.write(90);
break;

case 3:
bottomServo.write(120);
break;

}
delay(300);

نغير قيمة الزاوية (i) الى 4 والتي تمثل موقع نقل قطعة الحلوى إلى المحرك الثاني

for(int i = 35; i > 4; i--) {
topServo.write(i);
delay(2);
}
delay(200);

نعيد قيمة (i) إلى 115 و هي أول زاوية و يتم عندها أخذ قطعة حلوى جديدة

for(int i = 4; i < 115; i++) {
topServo.write(i);
delay(2);
}
color=0;
}

انشاء متغير باسم (readColor) لقراءة الألوان

int readColor() {

لقراءة اللون الأحمر نفعل الصمام الثنائي الضوئي المرشح باللون الأحمر عن طريق جعل قيمة s2 و s3 loW

 

digitalWrite(S2, LOW);
digitalWrite(S3, LOW);

لقراءة قيمة التردد و طباعته على شاشة العرض

frequency = pulseIn(sensorOut, LOW);
int R = frequency;
// Printing the value on the serial monitor
Serial.print("R= ");//printing name
Serial.print(frequency);//printing RED color frequency
Serial.print(" ");
delay(50);

لقراءة اللون الأخضر نفعل الصمام الثنائي الضوئي المرشح باللون الأخضر عن طريق جعل قيمة s2 و s3 HIGH

digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);

 

لقراءة قيمة التردد و طباعته على شاشة العرض

frequency = pulseIn(sensorOut, LOW);
int G = frequency;
// Printing the value on the serial monitor
Serial.print("G= ");//printing name
Serial.print(frequency);//printing RED color frequency
Serial.print(" ");
delay(50);

لقراءة اللون الأزرق نفعل الصمام الثنائي الضوئي المرشح باللون الأزرق عن طريق جعل قيمة S2 LOW و S3 HIGH

digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);

لقراءة قيمة التردد و طباعته على شاشة العرض

frequency = pulseIn(sensorOut, LOW);
int B = frequency;
// Printing the value on the serial monitor
Serial.print("B= ");//printing name
Serial.print(frequency);//printing RED color frequency
Serial.println(" ");
delay(50);

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

if(R<50 & R>46 & B<92 & B>80){
color = 1; // Red
}
if(G<89 & G>80 & B<96 & B>105){
color = 2; // Yellow

}
if(G<89 & G>80 & B<97 &B>93){
color = 3; // Orange
}

return color;
}



انشاء منصة ألعاب باستخدام الراسبيري باي

مقدمة

تعد ألعاب الفيديو من أساليب التسلية لقضاء أوقات الفراغ وتتوفر ألعاب متنوعة , متناسبة مع الفئات العمرية المختلفة، في هذا الدرس ستتعلم انشاء منصة ألعاب الفيديو، وذلك باستخدام الراسبيري باي مع نظام التشغيل (RetroPie).

install-retropie-raspberry-pi

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

install-retropie-raspberry-pi

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

ذاكرة

 1× كرت ذاكرة

raspberry-pi-HDMI

 1× سلك (HDMI)

raspberrypi-cable

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

المروحة منصة ألعاب الراسبيري باي

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

غطاء الراسبيري باي منصة ألعاب

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

ذراع تحكم راسبيري باي منصة ألعاب

1× ذراع تحكم سلكية

راسبيري باي منصة ألعاب

1× ذاكرة خارجية (Flash memory)

توصيل القطع

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

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

wifi

قم بإضافة المروحة؛ لتقوم بالتبريد على أجزاء اللوحة وحفظها من التلف

raspberry-pi-connection

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

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

يتكون غطاء الراسبيري باي من طبقتين يمكنك تثبيتهما على اللوحة.

غطاء الراسبيري باي منصة ألعاب

 

تنصيب ريترو باي (Retro Pie)

تتوفر أنظمة تشغيل متناسبة مع الراسبيري باي ويمكن تنصيبها بسهولة على بطاقة الذاكرة، تحتاج في البداية إلى تهيئة البطاقة الذاكرة قبل رفع نظام التشغيل عليها؛ ليتم مسح جميع البيانات على الذاكرة نهائيًا. ثم رفع نظام التشغيل باستخدام Raspberry Pi Imager يمكن متابعة الدرس الأول من سلسلة تعليم الراسبيري باي لمعرفة خطوات تنصيب برنامج تهيئة البطاقة و Raspberry Pi Imager.

سنحتاج في هذا الدرس إلى نظام التشغيل (Retro Pie) لرفع البرنامج على الذاكرة بعد التهيئة افتح برنامج rRaspberry Pi Image

منصة ألعاب راسبيري باي

يوجدة عدة نسخ لنظام التشغيل (Retro Pie) اختر النظام المتوافق مع اصدار لوحة الراسبيري باي لديك:

الراسبيري باي منصة ألعاب

من قائمة (SD Card) اختر الذاكرة التي ستنصب النظام عليها:

منصة ألعاب الراسبيري باي

اضغط على (Write) ليتم تثبيت نظام (RetroPie).

راسيري باي منصة ألعاب

تهيئة نظام ريترو باي (Retro Pie)

بعد رفع نظام التشغيل على الذاكرة يمكنك إزالة كرت الذاكرة ووضعه على لوحة الراسبيري باي.

وصل سلك (HDMI) وسلك محول التيار وذراع التحكم على لوحة الراسبيري باي وشغل الشاشة.

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

 بعد توصيل الراسبيري باي بالطاقة سيبدأ النظام بالتهيئة.

منصة ألعاب الراسبيري باي

 راسبيري باي منصة ألعاب

راسبيري باي منصة ألعاب

تأكد أنك قمت بتوصيل ذراع التحكم بالراسبيري باي حتى يتعرف الراسبيري باي عليها حيث ستظهر رسالة: (GAMEPAD DETECTED 1)

منصة ألعاب الراسبيري باي

تعريف أزرار المتحكم مع الأوامر

لتحديد مهام أزرار المتحكم ستعمل على ربط  كل زر موجود على ذراع التحكم (يظهر اسم الزر باللون الرمادي) مع تعريفها على الراسبيري باي الظاهرة باللون الأسود الغامق:

بعد الانتهاء من تعريفها اضغط OK.

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

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

راسبيري باي منصة ألعاب

بعد الانتهاء انقر على (OK).

الآن نظام ريترو باي (Retro Pie) أصبح مفعل ومهيئ للألعاب.

راسبيري باي منصة ألعاب

ألعاب ريترو باي (Retro)

1. تحميل الألعاب

بعد تنصيب نضام التشغيل الرترو باي (retropie) أصبح الراسبيري باي جاهز كمنصة ألعاب ـ ويمكن تحميل ألعاب الرومس (Roms game) التي تعد نسخة محاكاة للألعاب الشهيرة مثل ( العاب البلاستيشن – ألعاب الأتاري) فيمكنك لعب هذه الألعاب بدون امتلاك جهاز أتاري أو جهاز البلايستيشن ، ولتحميل الألعاب تحتاج إلى ذاكرة خارجية و يتم مسح بيانات الذاكرة وتهيئتها، ثم قم بانشاء مجلد داخل الذاكرة الخارجية باسم (retropie) يكتب بأحرف صغيرة  ثم داخل مجلد (retropie) أنشئ مجلد آخر باسم (roms).

سيكون عنوان الملف كالتالي:

F:\retropie\roms

اخرج الذاكرة الخارجية من جهاز الحاسوب وقم بتوصيلها مع لوحة الراسبيري باي ستبدأ لوحة الراسبيري باي بالوميض انتظر عدة دقائق حتى ينتهي الوميض.

راسبيري باي منصة ألعاب

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

roms

يمكنك الان تحميل الألعاب من خلال الرابط 

 في هذا الدرس سنقوم بتحميل لعبة  Mario Brothers (1988)  وهي أحد ألعاب(Atary 7800) 

راسبيري باي منصة ألعاب

بعد تحميل اللعبة قم بفك الملف المضغوط للعبة، واحفظ ملفات اللعبة داخل المجلد المناسب لها من مجلدات (roms) بالذاكرة.

لعبة Mario Brothers (1988) سيتم حفظها داخل مجلد (Atary 7800).

2.  رفع الألعاب على الراسبيري باي

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

راسبيري باي

حتى تظهر كل الألعاب على واجهة ريترو باي اتبع الخطوات التالية:

اضغط على القائمة الرئيسية (MAIN MENU) ثم اضغط على (GAME COLLECTION SETTINGS):

تنصيب نظام التشغيل

اضغط على (AUTOMATIC GAME COLLECTIONS).

الراسبيري باي منصة ألعاب

اختر (ALL GAMES).

الراسبيري باي منصة ألعاب

ستظهر مباشرة قائمة الألعاب التي قمت بتحميلها.

بدء اللعبة

الآن قد اكتملت منصة الألعاب لتشغيل اللعبة يمكنك إدارة ذلك من خلال ذراع التحكم.

ريترو باي

تذكر فصل وحدة مزود الطاقة عند الانتهاء من استخدام المنصة.




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

مقدمة

DS18B20 درجة الحرارة المقاوم للماء

في هذا الدرس نتعرف على كيفية استخدام مستشعر درجة الحرارة المقاوم للماء وإظهار القراءة على شاشة العرض (OLED Display). حيث يمكننا مستشعر درجة الحرارة من قياس درجة الحرارة من (-55 ℃ إلى 125 ℃) بدقة ± 5. كما يمكن استخدامه في قياس درجة حرارة الهواء أو السوائل.

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

ds18b20-digital-temperature-arduino

1 X اردوينو

OLED شاشة

1 X شاشة عرض (OLED Display)

DS18B20 مستشعر الحرارة درجة الحرارة المقاوم للماء

1 X حساس حرارة ( DS18B20)

 

ds18b20-digital-temperature-arduino

1X لوحة تجارب

1 X مقاومة مقدار 4.7k

ds18b20-digital-temperature-arduino

مجموعة أسلاك ذكر/ ذكر

شاشة عرض (OLED Display)

التوصيل

شاشة عرض (OLED Display) اختصارا لـ (organic light emitting diode) متوفرة بحجم 128 × 64 وهي شاشة عرض رسومية نقطية بسيطة. تحتوي على 128 عمودًا و64 صفًا مما يجعله يعرض إجمالي 128 × 64 = 8192 بكسل. تحتوي الشاشة على أربعة دبابيس فقط ويتواصل مع Arduino باستخدام بروتوكول اتصال I2C.

توصيل الشاشة مع الاردوينو حسب الجدول التالي

الاردوينو OLED Display
5v VCC
GND GND
A4 SLC
A5 SDA

عمل مسح لمعرفة عنوان i2c

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

#include 

void setup()
{
    Wire.begin();

    Serial.begin(9600);
    while (!Serial); // Leonardo: wait for serial monitor
    Serial.println("\nI2C Scanner");
}

void loop()
{
    byte error, address;
    int nDevices;

    Serial.println("Scanning...");

    nDevices = 0;
    for (address = 1; address < 127; address++) {
  
        Wire.beginTransmission(address);
        error = Wire.endTransmission();

        if (error == 0) {
            Serial.print("I2C device found at address 0x");
            if (address < 16)
                Serial.print("0");
            Serial.print(address, HEX);
            Serial.println(" !");

            nDevices++;
        }
        else if (error == 4) {
            Serial.print("Unknown error at address 0x");
            if (address < 16)
                Serial.print("0");
            Serial.println(address, HEX);
        }
    }
    if (nDevices == 0)
        Serial.println("No I2C devices found\n");
    else
        Serial.println("done\n");

    delay(5000); // wait 5 seconds for next scan
}

 و من ثم نقوم بإظهار شاشة (serial Monitor) ومعرفة عنوان i2c

OLED شاشة

البرمجة:

للتحكم في شاشة OLED ، تحتاج إلى مكتبة  adafruit_SSD1306.h مكتبة  adafruit_GFX.h. لتثبيت هذه المكتبات نقوم بالخطوات التالية:
1. افتح Arduino IDE وانتقل إلى Sketch> Include Library> Manage Libraries. يجب أن يفتح مدير المكتبة
. 2. اكتب “SSD1306” في مربع البحث وقم بتثبيت مكتبة SSD1306 من Adafruit.

OLED شاشة

3. بعد تثبيت مكتبة SSD1306 من Adafruit ، نكتب  “GFX” في مربع البحث ونقوم بتثبيت المكتبة.

ds18b20-digital-temperature-arduino

نفتح  ملف Adafruit_SSD1306.h في محرر نصي. من خلال القسم الذي يعرض SSD1306. نقوم بإلغاء التعليق #define SSD1306_128_64 بحيث يظهر الكود في هذا القسم كما يلي:

ds18b20-digital-temperature-arduino

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

ds18b20-digital-temperature-arduino

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

نقوم بتحميل مكتبة  DallasTemperature بالبحث عن المكتبات عن طريق Tools > Manage Libraries لبرمجة DS18B20 مستشعر درجة الحرارة المقاوم للماء

 درجة حرارة الماء

و مكتبة OneWire Arduino library

 درجة حرارة الماء

ثم ستقوم برفع الكود البرمجي التالي :

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
display.display(); // show splashscreen
delay(2000);
display.clearDisplay(); // clears the screen and buffer
Serial.begin(9600);
sensors.begin();
}
void loop() {
// Send the command for all devices on the bus to perform a temperature conversion:
sensors.requestTemperatures();

// Fetch the temperature in degrees Celsius for device index:
float tempC = sensors.getTempCByIndex(0); // the index 0 refers to the first device
// Fetch the temperature in degrees Fahrenheit for device index:
float tempF = sensors.getTempFByIndex(0);

// Print the temperature in Celsius in the Serial Monitor:
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);

display.println("Temp: ");
display.print(tempC);
display.print((char)247); // degree symbol
display.print("C");
display.display();
delay(2000);
// routine for displaying text for temp/hum readout

}

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

استدعاء المكتبات التي ستساعدنا في برمجة شاشة OLED Display و حساس الحرارة

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

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

#define ONE_WIRE_BUS 2

بعد ذلك ، نقوم بإنشاء كائن
من أجل التواصل مع مستشعر DS18B20 ، نحتاج إلى إنشاء كائن من مكتبة DallasTemperature

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

نكتب بروتوكول إعادة الضبط

#define OLED_RESET 4 
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

في دالة void setup()نحتاج إلى تهيئة حساس الحرارة و تهيئة العرض ومسحه لشاشة OLED Display تأكد من كتابة عنوان  I2Cلشاشة العرض

void setup()   {                
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
  display.display(); // show splashscreen
  delay(2000);
  display.clearDisplay();   // clears the screen and buffer
  Serial.begin(9600);
  sensors.begin();  
}

نعطي الأمر استشعار  درجة الحرارة

void loop() {
  sensors.requestTemperatures();

  float tempC = sensors.getTempCByIndex(0); // the index 0 refers to the first device

نعطي الأمر بطباعة درجة الحرارة بالدرجة المئوية على شاشة OLED Display

  // Print the temperature in Celsius in the Serial Monitor:
 display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,0);

  display.println("Temp: ");
  display.print(tempC);
  display.print((char)247); // degree symbol 
  display.print("C");
    display.display();
    delay(2000);    
  }