اردوينو – الدرس التاسع – المدخلات التناظرية Analog inputs

مقدمة

في هذا الدرس، ستقوم بإستخدام الإتصال التسلسلي (Serial Monitor) لعرض قراءات المدخلات التناظرية “Analog Inputs” ومن ثم اضافة 8 مصابح LED (من الدرس الخامس) لتتمكن من التحكم بزيادة وتقليل درجة اضاءة الـLEDS عبر المقاوم المتغير (Variable resistor).

المدخلات التناظرية

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

analog inputs

(5mm LED)

analog inputs

(270 Ω Resistor)

74HC595 Shift Register

رقاقة مسجل الإزاحة (74HC595 shift register)

analog inputs

مقاوم متغير (10 kΩ variable resistor)

Half-size Breadboard

لوحة التجارب (Half-size Breadboard)

Arduino Uno R3

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

Jumper wire pack

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

Arduino cable

سلك اردوينو

المقاوم المتغير (Variable Resistors)

المقاومات المتغيرة تدعى “potentiometers” وتختصر بـ pot

في تجربتنا مع شاشة الاتصال التسلسلي (Serial Monitor) يقوم المقاوم بتغيير الجهد على A0 ، كما يقوم الكود البرمجي بتحويل هذا الجهد إلى رقم ما بين 0 و 1023.

المدخلات التناظرية

في المقاوم المتغير “pot” يوجد مسار يمثل المقاومة، في هذه الحالة مقاومه مقدارها  10 kΩ . كما يوجد سن متوسط يعتبر الموصل الفاصل يسمى “Slider” وظيفته هي تغيير مقدار المقاومة ما بين 0 وحتى 5V

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

قبل البدء بإستخدام مصابيح الـLEDs تستطيع القيام بالتجربة التالية عبر إستخدام المقاوم المتغير (potentiometer)؛ لتجربة المدخلات التناظرية ثم تفعيل خاصية شاشة الاتصال التسلسلي (Serial Monitor) في الاردوينو

وصل الدائرة رقم (1) لوح التجارب كالتالي:

المدخلات التناظرية

توصيل الدائرة رقم (2):

والآن استخدم المقاوم المتغير “pot” للتحكم في عدد الـLEDs

يعتمد تصميم هذه الدائرة على الدرس الخامس، هناك بعض الاسلاك التي قمت بتحريكها، كما قمت بإضاة المقاوم المتغير ‘pot’ وبعض الاسلاك له إلى الدائرة.

المدخلات التناظرية

المدخلات التناظرية

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

ارفع الكود للدائرة رقم (1) على الاردوينو:

int potPin = 0;
 
void setup()
{
  Serial.begin(9600);
}
 
void loop()
{
  int reading  = analogRead(potPin);
  Serial.println(reading);
  delay(500);
}

والآن، افتح شاشة الإتصال التسلسلي (Serial Monitor):

analog-inputs

حرك وغير المقاومة وسوف نرى القراءات تتغير مابين 0 و 1023

شاشة الاتصال التسلسلي (Serial Monitor) تقوم بعرض القراءات من A0 بواسطة السطر التالي:

int reading  = analogRead(potPin);

الجهد (Voltage) في A0 يتم تحويله إلى رقم مابين 0 و 1023.

ارفع الكود التالي للدائرة رقم (2) إلى الأردوينو:

int potPin = 0;
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
 
int leds = 0;
 
void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}
 
void loop()
{
  int reading  = analogRead(potPin);
  int numLEDSLit = reading / 114;  //1023 / 9
  leds = 0;
  for (int i = 0; i < numLEDSLit; i++)
  {
    bitSet(leds, i);
  }
  updateShiftRegister();
}
 
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

عليك أن تعلم أن بعض الأسطر في هذا الكود هو من الدرس الخامس، لذا تستطيع العودة للدرس الخامس لمعرفة شرح الكود المتعلق بالتحكم في الـLEDs

اما بالنسبة للجزء الجديد من الكود وهو تعريف منفذ المدخل التناظري “Analog inputs” والتي سنقوم بربط المقاوم المتغير بها

int potPin = 0;

لاحظ بأنك لم تقم بإضافة أي جديد في دالة ‘setup’ لتعريف حالة المنفذ للمدخل التناظري.

في دالة ‘loop’ نقوم بقراءة القيمة التناظرية “Analog value” بالطريقة التالية:

int reading  = analogRead(potPin);

ولكن عليك تحويل هذه القراءة التي ما بين 0 و 1023 إلى عدد الـLEDs ليتم اضاءتها ، مابين 0 و 8 . الأرقام التي مابين 0 و 8 هي في الحقيقة مجموعها 9 قيم . لذا عليك توسيع نطاق القراءة عبر 1023 مقسومة على 9 أو 114

int numLEDSLit = reading / 114;

لإضاءة الأعداد الصحيحة للـLEDs ، استخدم for loop للعد من 0 وحتى “numLEDSLit” لوضع البت الصحيح.

  leds = 0;
  for (int i = 0; i < numLEDSLit; i++)
  {
    bitSet(leds, i);
  }

وأخيرًا نقوم بتحديث رقاقة مسجل الإزاحة ‘shift register’ عبر السطر التالي:

updateShiftRegister();

أنشطة أخرى

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




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

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

 

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

 

arduino uno r3

Arduino Uno

 

8×8 LED Matrix

 

MAX7219

Potentiometer 10K Ω

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

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

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

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

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

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

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

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

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

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

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

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

MAX7219 :

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

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

توصيلها :

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

led-matrix

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

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

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

لاحظ:

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

توصيل الدارة

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

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

 

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

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

البرمجة :

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

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

#define POT 0 

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

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

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

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

}

شرح الكود :

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

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

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

#define POT 0

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

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

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

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

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

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

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

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

}