الثلاثاء، 26 مارس، 2013

مقدمة إلى البروتوكول التسلسلي I2C

البروتول التسلسلي I2C




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



ما العمل في حالة كانت لدينا العديد من التطبيقات , و كنا محصورين باسستخدام متحكم واحد بعينه" كاPIC18F2550 أو AVR Atmel 328 كالذي نستخدمه في الأردوينو UNO

لذلك يوجد بروتوكولات اتصال مختلفة تمكننا من التواصل مع التطبيقات , من أهم هذه البروتوكولات هو I2C 


يمكن تعريف الI2C بأنه بروتوكول يسمح للمتحكم بالأتصال بالأجهزة التي تدعم هذا البروتوكول , و تسمح بالتواصل مع هذه الأجهزة الطرفية بكل سهولة 


للتحكم بال I2Cهناك خطان فقط من المتحكم ! , هذين الخطين هما :
1)SDA "Serial data line : و هو الخط الذي ينقل البيانات إلى الأجهزة المختلفة .
2) SCL"Serial clock line : هو خط ساعة , و تتغير البيانات عند كل عملية تغير في خط الساعة .


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

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

في الأول يلزمنا معرفة المداخل التي يمكننا من خلالها استعمال الI2C

لأستخدام الI2C , سأركز بشكل أكبر على الأردوينو UNO لكثرة توافرها لدى الأغلبية .


هذه الصورة تبين مداخل الi2c في بطاقة اردوينو uno 


في النسخة R2 مداخل اردوينو الخاصة بهذا البروتوكول هما

1)المدخل A4 كمدخل SDA

2)المدخل A5 كمدخل SCL 

في النسخة الحديثة منها R3 هناك مدخلين تم وضعهما في الجانب العلوي الأيسر من اللوحة هما أيضاً I2C "طبعاً لا فرق بين النسختين اطلاقاً "

مهما كانت نسختك من الأردوينو UNO فيمكنك اكمال قراءة التدوينة للنهاية .

لكتابة أوامر الI2C في برنامج الأردوينو نقوم بتحميل المكتبة الخاصة بالI2C و اسمها wire.h .


و أوامر الi2c  المهمة هي :


Wire.begin(address)
 يتم التواصل بين الأجهزة الطرفية و المتحكم "اردوينو UNO في حالتنا هذه " هناك عنوان محدد يمكن من خلاله تمييز الأجهزة المختلفة و أرسال الأوامر للجهاز المطلوب دون غيره .
الأوامر الأخرى يمكن تلخيصها فيما يلي :

Wire.beginTransmission(address)

 
هذه الأوامر الرئيسية في هذه المكتبة .


و الأمثلة عليها عديدة , مثل التواصل بين بطاقتي أردوينو معاً , المؤقت RTC DS1307 , ايضاً الدارة المتكاملة PCF8574 و حساس الضغط BMP85 , سنتحدث عن كل منها على حدا.

الجمعة، 22 مارس، 2013

Nokia 5110 LCD

الشاشة الكريستالية Nokia 5110 PCD 8544 




ضمن سلسلة المقالات التي نتحدث فيها عن الشاشات الكريستالية  سأعرض اليوم نوعاً مميزاً من هذه الشاشات يدعى Nokia 5110 و هي شاشة كانت مستعملة في الهاتف النقّال من شركة نوكيا من جيل أجهزة DCT3 ضمن الحزمة GSM 900MHz .



ما يهمنا في هذا الجهاز الآثري , هو شاشته ذات اللونين الأبيض و الاسود Monochrome , هذه الشاشة ذات ابعاد 84*48 من انتاج شركة فيلبس Philips  .

تحتوي هذه الشاشة على متحكم يدعى PCD8544 و هو عبارة 
عن دارة متكاملة لقيادة الشاشة LCD Driver يمكن الإطلاع على النشرة الفنية Data sheet  له هنا



سنلقي نظرة في البداية على توزيع مرابط Pin Configuration لهذه القطعة و وظيفتها .

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

بالنسبة للشاشات التي من انتاج Sparkfun :


و هناك نفس الموديل من شركة Adafruit  :



و هناك موديل آخر صيني "يختلف فقط في كيفية توزيع المرابط"


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


تقوم هذا الشاشة على البروتوكول التسلسلي SPI"Serial Prepherial interface " , و تحتوي المداخل التالية :

 مدخل التصفير RST: Reset pin 
مدخل تحديد نمط عمل المتحكمCE: Select chip
DC:  data command selection
 SDIN: serial Input
SCLK: Serial clock
Light:Backlight 


ننتقل الآن للمعدات التي سنحناجها في هذه التجربة .

سنحتاج لتنفيذ هذه التجربة :

1) بطاقة أردوينو 
2)مقاومة متغيرة 5كيلو اوم
3) الشاشة الكريستالية NOKIA 5110 LCD
4) pin header  
5) اسلاك توصيل Solderless Jumper 





التوصيل :

قد تسمع أو تقرأ بأن هذه الشاشة تحتاج ما يسمى Shift level و السبب في أن هذه الشاشة يستخدم نظام 3.3 فولت للتحكم و التواصل بينها و بين المتحكم , و في الأردوينو UNO فإن فولتية المخرج الرقمي يساوي 5 فولت , و قد جربت الطريقتين مرة باستعمال القطعة 74125 و هي تحول الخرج المنطقي من مستوى 5 فولت إلى 3.3 فولت .



أنا جربّت الطريقتين و عملتا بشكل رائع :) لذلك سواء استعملت الLevel shift ام لا  فهذا لا يهم

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


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



الآن ننتقل للبرمجة .

يوجد هناك طريقتين للبرمجة و هما :

1) بواسطة الأوامر المباشرة .

2)  بواسطة مكتبة خاصة .

لنبدأ بالطريقة الأولى .

1) بواسطة الأوامر المباشرة :


أهم الأوامر في هذا الكود :

الكود مكتوب بعدة جمل استدعاء , فمثلاً عند بداية الكود يجب كتابة الأمر 
 LcdInitialise();


هذا الأمر يقوم بتهيئة الشاشة للعمل 
 LcdClear();


هذا الأمر يقوم بمسح المخرجات على الشاشة .
 LcdString("Mohannad    Rawashdeh");


هذا الأمر يقوم بإظهار الكلمات و الحروف على الشاشة .

الآن ننتقل للرسوم .

لكي ترسم اشكال مختلفة على هذه الشاشة , عليك القيام بما يلي :

1) اذهب لهذا الموقع هنا 
2) اختار فتح صورة من الجهاز 


3) ثم اعمل crop  للصورة حتى تصبخ ابعاده 84 *48 ثم خزنه في جهازك من لائحة file >> save . " حاول قدر الإمكان ان تجعل الصورة فقط من لونين ابيض و اسود لأن هذا مهم جداً و إن لم تستطع ذلك فافتح الصورة باستخدام برمجية الرسام و خزّن الصورة على الصيغة Bitmap monochrome ".

4) ثم افتح برنامج LCD Assistance

5) قم بفتح الصورة ثم تخزينها  



و أخيراً افتح الملف الذي خزنّته باستخدام محرر النصوص Notepad و انسخ المصفوفة التي بداخله ابتداءاً من جملة char 



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

 LcdBmp(arduino);



و هذا الفيديو ادناه يعرض المخرجات التي تظهر على الشاشة .



هذا كل شيء يمكننا أن نقوله عن استخدام هذه الشاشة باستخدام الأوامر المباشرة .

سنتحدث عن استخدام مكتبة لهذه الشاشة في الجزء الثاني من هذا المقال .

إلى ذلك الوقت إلى اللقاء  .







الخميس، 14 مارس، 2013

المقاطعات Interrupt و الأردوينو .


المقاطعات Interrupt

ضمن برمجية الأردوينو 

(1)


في هذه التدوينة , سأقوم بشرح أحد أهم المواضيع في برمجة المتحكمات الأصغرية Microcontroller, موضوع المقاطعات Interrupt , فما هي المقاطعات ؟ و متى تستخدم ؟ و كيف نكتب الكود الخاص بها ؟

ما هي المقاطعات Interrupt :



هو تعليمة  Code يقوم بمقاطعة برنامج فعّال لعمل برنامج آخر , اعتماداً على قدحTriggering خارجي أو داخلي , عندما يتم هذا القدح Triggering يتم إيقاف البرنامج الفعّال و ينتقل لعمل برنامج آخر هذا يسمى " Interrupt Service Routine" ISR 

عندما ينتهي تطبيق البرنامج العارض , يتم العودة للبرنامج الأصلي الذي كان يعمل عليها المتحكم قبل المقاطعة .

مبدأ العمل :

في الغالب , نستطيع عمل كل الأوامر في جملة الدوران Loop بالتسلسل حسب ترتيب الكود , لكن المقاطعات تعطينا الأفضلية دائما في مثل هذه الحالات لأنها تعتمد على "عدم التزامن Asynchronous ".

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

المتحكمات المستخدمة في لوحات الأردوينو Arduino Board's هي من عائلة Atmel AVR 8bit و هي غير قادرة على تنفيذ الكثير من البرامج في آن واحد Parallel process فمثلاً المتحكم Atmega 328 يحتوي على مدخلي مقاطعة فقط (Interrupt 0 (D2 و 
(Interrupt 1 (D3 
Pic taken from http://avrprogrammers.com

أنواع المقاطعات :

هناك نوعان من المقاطعات :
1) المقاطعات المعتمدة على البرنامج Software Interrupt حيث تستجيب للاشارات التي يعطيها البرنامج .
2) المقاطعات المعتمدة على التغيرات الخارجية  Hardware Interrupt حيث تستجيب للأشارات القادمة من خارج المتحكم , بفعل التغيرات التي تحدث على مداخل المتحكم .

المتحكمات من عائلة AVR 8bit لا تدعم 
المقاطعات المعتمدة على البرنامج Software Interrupt , المقاطعات الخارجية هي المدعومة فقط في لغة الأردوينو .


هناك مقاطعات تعتمد على المؤقتات Timer Interrupt التي تدعمها لغة أردوينو ذات فائدة كبيرة و استخدامات شائعة .

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

لكل متحكم أصغري , لائحة من أوامر المقاطعات و المداخل التي تدعم المقاطعات , لكل أمر هناك هناك ذاكرة موقع interrupt vectors memory location  و عندما نفّعل أحد هذه المواقع , سينتقل البرنامج للموقع المحدد في ذاكرة الموقع , هذا هو جوهر ال ( ISR )
يوجد طريقتين يمكن تفعيل المقاطعات من خلالها , بلغة الأردوينو , و لغة الآلة Assembly ضمن بيئة أردوينو البرمجية .

لن أتكلم عن كتابة الكود بلغة الآلة , لكن سأتطرق للمقاطعة بلغة الأردوينو .

طريقة كتابة البرنامج :

الأمر الذي يستخدم لتفعيل المقاطعة Interrupt هو :

attachInterrupt();

و الصيغة الذي يكتب به هذا الكود :


 attachInterrupt(interrupt, Function, mode);



interrupt: هو المدخل الذي سيحدث المقاطعة بناءاً على حالته
إما 0, 1 

Function: هو البرنامج الذي سينتقل إليه العمل .

mode : هو الحالة التي لو تم تطبيقها على مدخل المقاطعة 

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

LOW

ChANGE

RISING

FALLING 



 لكن يجب أن تنتبه لعدة أمور في حال استدعيت المقاطعات و هي :

أن تعليمة delay و millis لن تعمل داخل جملة المقاطعة 
Interrupt , و اي متغيير ستستخدمه داخل جملة المقاطعة 
يجب أن يعرف بالمتغيير volatile .لذلك لا تستعمل اوامر طويلة جداً داخل جملة المقاطعة .

تذكر أن الأوامر المركبة ايضاً لا تعمل داخل جملة المقاطعة مثل digitalWrite/read و analoge Read/Write  أيضاً لن تعمل داخل لبرنامج 






لنأخذ الآن مثالاً بسيطاً على المقاطعات :



في البداية ستحتاج للمكونات التالية :
1) بطاقة أردوينو 
2) حساس Reflected sensor IR 
3)اسلاك
4) BreadBoard




التوصيل يكون فقط بتوصيل قطبي التغذية , و طرف البيانات مع المدخل D2 

و الكود أدناه






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



يمكن الأستفادة من هذه التقنية في العديد من تطبيقات البرمجة المختلفة , و سأتحدث عن المؤقتات Timer في وقت لاحق .

تحياتي 


الأحد، 3 مارس، 2013

الشاشة الكريستالية 1602 Liquid crystal

 الشاشة الكريستالية 1602 Liquid crystal



هذا النوع من الشاشات الكريستالية هو الأشهر و الأكثر انتشارا بين هواة الالكترونيات و في المشاريع الإلكترونية , نظراً لتوفرها بسعر زهيد و سهولة برمجتها .

 و قبل البدء بالحديث عن الشاشات الكريستالية , نقاط مهمة 
تساعدك على  أختيار الشاشة المناسبة لمشروعك ألا و هي :

1) أبعاد الشاشة 

2) نوع المتحكم المدمج معها .

3) التطبيق الذي تحتاجه من الشاشة " وجود الألوان , إظهار الصور و المؤثرات الحركية , الكتابة بخطوط مختلفة , ألخ من التطبيقات "

ما سنتحدث عنها اليوم هي الشاشة الكريستالية LCD1602  التي تحتوي على سطرين و 16 عموداً , و التي تعتمد في تشغيلها على المتحكم  Hitachi HD44780 driver  و التي يمكن تملك ناقل خط Data bus 8 bit .

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



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

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

RS اختيار المسجل : هذا المربط يحدد لنا  في أي ذاكرة نحن  نكتب البيانات ! يتم الأختيار ما بين مسجل البيانات , أو مسجل التعليمات

R/W  خيار القراءة أو الكتابة  , هذا المربط يحدد إما أختيار وضعية القراءة أو الكتابة .
enable pin يسمح هذا المربط في حال تفعيله بالكتابة للمسجلات الخاصة بالشاشة الكريستالية .

data pin (D0-D7) : هي المرابط التي نمرر البيانات عبرها للمسجلات  .


هناك ايضاً مرابط للتغذية و التأريض و للأضاءة الخلفية الداخلية .
هذه لمحة عامة عن المرابط الخاصة بهذه الشاشة , سنتكلم عن توصيل هذه الشاشة مع بطاقة الأردوينو .
سنوصل المرابط كالتالي :
LCD RS ……..D12
LCD Enable …….D11
LCD D4 ……D5
LCD D5……D4
LCD D6……D3
LCD D7……D2
و التوصيل كما في الصورة ....

و أيضا سنوصل الرجل رقم 15 مع مصدر التغذية الموجب و الرجل رقم 16 مع السالب في حال أردنا تشغيل الإضاءة الداخلية .
المكتبة الاساسية الخاصة بالشاشات الكريستالية :

يجب عليك الإلمام بهذه المكتبة لأنها تمكنك من التعامل مع اغلب الشاشات الكريستالية .

أوامرها سهلة و بسيطة و يمكنك الإطلاع عليها هنا .

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

عند كتابة البرنامج , نقوم بتعريف المداخل المربوطة مع الشاشة باستخدام الأمر LiquidCrystal
 و يكتب على الصورة التالية :

و تكتب المرابط المربوطة بالشاشة بأكثر من صيغة , و أكثر الصيغ استعمالاً هي :






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

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


في حالتنا هذه تكتب الشاشة بالصيغة :




 هذان الأمران هما أهم أمرين يجب كتابتهما في جملة التثبيت void setup

البرنامج الأول : برنامج لطباعة جملة Hello world!  الشهيرة .

البرنامج الأول سيبين لنا كيفية إظهار الكلمات على الشاشة .

// this simple program taken from :


 //This example code is in the public domain.

 //http://www.arduino.cc/en/Tutorial/LiquidCrystal
 
 //modified by Mohannad Rawashdeh

// include the library code:

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {

  // set up the LCD's number of columns and rows: 

  lcd.begin(16, 2);

  // Print a message to the LCD.

  lcd.print("hello, world!");

}

void loop(){}



حسناً لنأخذ هذا المثال , ستحتاج فقط لمقاومة متغيرة مربوطة مع المدخل A0 من الأردوينو للتحكم بسرعة تحرك النص .
#include <LiquidCrystal.h>
int t=300;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int y =1;
void setup()
{  
   lcd.begin(16, 2);
   lcd.cursor();
   lcd.autoscroll();
}
char Phone[]={"0786739233"};
char Name[]={"Mohannad Rawashdeh "}; char Email[]={"Genotronex@Gmail.com "};
void timing_delay(){
  int A=analogRead(A0);
  delay(5);
  t=map(A,0,1023,30,1000);
  t= constrain(A, 30, 1000);
}
  
void loop(){
  timing_delay();
    lcd.setCursor(15, 0);
  for (int i=0;i<20;i++){
    lcd.print(Name[i]);
     timing_delay();
    delay(t);
  }
  lcd.clear();
  lcd.setCursor(15, 0);
 for (int i=0;i<21;i++){
    lcd.print(Email[i]);
    timing_delay();
    delay(t);
  }
  lcd.clear();
   lcd.setCursor(15, 0);
 for (int i=0;i<11;i++){
    lcd.print(Phone[i]);
    timing_delay();
    delay(t);
  }
  delay(2000);
  lcd.clear();
}



و في الختام , هذا الفيديو للبرنامج الأخير الذي كتبناه , تحياتي



 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.