التحكم بإضاءة RGB LED من خلال واجهة رسومية عبر Matlab

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

في هذا المشروع ستتعلم كيفية انشاء واجهة المستخدم الرسومية بإستخدام الماتلاب ، للتحكم في RGB LED المتصل بالاردوينو.

matlab-gui

الماتلاب Matlab

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

سنقوم بإنشاء واجهة للمستخدم باستخدام برنامج الماتلاب (Matlab) للتحكم بالاجهزة المرتبطة بالاردوينو, ليتم ارسال الأوامر من جهاز الحاسوب (Matlab) للأردوينو عبر المنفذ التسلسلي (Serial port).

matlab-gui

تجهيز الأردوينو و إعداد الماتلاب:
1- قم بتحميل برنامج الماتلاب من الرابط هنـا.
2-  قم بتحميل حزمة الدعم للأردوينو من الرابط هنـا : لقراءة, وكتابة, وتحليل بيانات الأجهزة المربوطة مع الاردوينو .

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

الأدوات التي تحتاجها لهذا المشروع :

Diffused RGB 5mm LED

RGB 5mm LED

220 Ω resistor

مقاومة 220 اوم

small size breadboard 170 colors

  لوح تجارب صغير (small size breadboard)

arduino uno r3

Arduino Uno R3

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر  (Jumper Wires Male Male)

 

تصميم لوحة التجارب:

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

matlab-gui

يمكنك العودة للـدرس الرابع للاطلاع على شرح و تفاصيل اكثر حول RGB LED .

إنشاء الواجهة الرسومية

واجهات المستخدم الرسومية GUI’s في الماتلاب يتم إنشاؤها بواسطة أداة تدعى :
GUIDE : Graphical User Interface Development Environment
هذه الأداة تسمح للمبرمج أن يقوم بتحرير الواجهة الرسومية GUI ،وتنسيقها وإضافة العناصر التي يريدها إلى الواجهة،كما يمكنه  تغيير الخصائص لكل كائن في الواجهة: الإسم،اللون،الحجم،نوع الخط,وغيرها من الخصائص .

على شاشة الاوامر للماتلاب قم بكتابة الأمر : guide

matlab-gui

 

matlab-gui

قم بالضغط على (Blank GUI(Default  الموجودة في علامة التويب (Create New GUI) كما هو مبين بالصورة اعلاه.
ثم  OK ليظهر محرر التخطيط الرسومي للواجهات.

matlab-gui

 

سنقوم بإنشاء ثلاثة Sliders لتتحكم بـ RGB LED عن طريق الواجهة الرسومية.
قم بالضغط على  Slider, ثم قم برسم الشكل على نافذة العمل , كما هو مبين بالشكل التالي :

matlab-gui

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

matlab-gui

في الاردوينو, الجهد على المداخل التناظرية يكون محدود بين 0v-5v .

يمكنك اضافة نص من خلال Static text، و تغير الخصائص المتعلقة بالخط ,و تغير لون خلفية الواجهة.

matlab-gui

قم بحفظ save الشكل  figure كملف،عندما تقوم بحفظه سيتم تقائيا توليد ملفين لهما نفس الإسم لكن ذو لاحقة مختلفة.
Fig file: يحتوي على الواجهة الرسومية  GUI التي قمت بإنشائها.
M-File : يحتوي code التعليمات البرمجية التي تتحكم بتنفيذ وسلوك الواجهة.

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

بعد بحفظ الواجهة الرسومية التي بنيتها بإستخدام الأداة GUIDE ،GUIDE سيقوم بتوليد الكود البرمجي لتعمل الواجهة، يتضمن التوابع الهيكلية التي يمكن للمبرمج أن يُعدّل عليها ويتحكم بتنفيذ وسلوك الواجهة الرسومية.

نقوم بفتح والتعديل على الكود البرمجي للواجهة (rgb.m) كما يلي :

function varargout = rgb(varargin)

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @rgb_OpeningFcn, ...
                   'gui_OutputFcn',  @rgb_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before rgb is made visible.
function rgb_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for rgb
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% --- Outputs from this function are returned to the command line.
function varargout = rgb_OutputFcn(hObject, eventdata, handles) 
varargout{1} = handles.output;
clear all;
global a;
a=arduino;


% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
b=get(hObject,'Value');
global a;
writePWMVoltage( a , 'D9' , 5-b );

% --- Executes during object creation, after setting all properties.
function slider1_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end


% --- Executes on slider movement.
function slider2_Callback(hObject, eventdata, handles)
c=get(hObject,'Value');
global a;
writePWMVoltage( a , 'D10' , 5-c );

% --- Executes during object creation, after setting all properties.
function slider2_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end


% --- Executes on slider movement.
function slider3_Callback(hObject, eventdata, handles)
d=get(hObject,'Value');
global a;
writePWMVoltage( a , 'D11' , 5-d );

function slider3_CreateFcn(hObject, eventdata, handles)

if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end

لمحة عن الكود : 

  إنشاء الاتصال

لإنشاء الاتصال بين الماتلاب ولوحة الاردوينو :

a = arduino;

او إذا كان لديك أكثر من لوحة ارديونو متصلة قم بتحديد المنفذ و نوع اللوحة كما يلي :

a = arduino('COM5', 'uno');

الكتابة على المنافذ :

لتعيين القيمة المتغيرة لكل منفذ( PWM pin) نستخدم الامر:

writePWMDutyCycle(a, pin, dutyCycle);

في هذا المشروع يتم تغير القيمة لكل منفذ اعتمادا على حركة ال Slider ، فتم اضافة الكود التالي لكل Slider كما يلي :

b=get(hObject,'Value');
global a;
writePWMVoltage( a , 'Pin' , 5-b );

يتم تغير الـ Pin لكل Slider اعتمادا على المدخل المرتبط به على لوحة الاردوينو

قم بحفظ و تشغيل الملف للتحكم بالـ RGB LED .

*يمكنك تنزيل واجهة المستخدم و الكود لهذا المشروع من هنـا.




نظام مسح الفضاء المحيط

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

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

 

arduino uno r3

الأردوينو (Arduino Uno)

حساس المسافة (Ultrasonic Sensor)

محرك سيرفو (Servo Motor)

Full size breadboard 830

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

Breadboard Jumper Wire 65 pcs

أسلاك توصيل (Wires)

محرك السيرفو (Servo Motor)

هو عبارة عن جهاز يقوم بتحويل الاشارة الكهربائية إلى حركة ميكانيكية. يختلف هذا المحرك عن محركات التيار المستمر (DC) في ان حركته غير مستمرة.

Servo Motor: استخدام مقاومة متغيرة للتحكم فى حركة محرك سيرفو

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

مداخل محرك السيرفة :

Servo Motor: استخدام مقاومة متغيرة للتحكم فى حركة محرك سيرفو

كيفية عمله

يعمل محرك السيرفو بوضع اشارة كهربائية PWM بزمن محدد . تقوم مكتبة السيرفو في الاردوينو بالاهتمام بهذا الامر عنك، فحسب هذه الإشارة يتحرك السيرفو بزاوية معينة من 0 إلى 180 درجة.

   لمعلومات اكتر راجع درس محرك السيرفو Servo Motor

 

حساس الموجات فوق الصوتية

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

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

توصيل الدارة

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

Room Map-Making Using Ultrasonic With Arduino

تم توصيل حساس الموجات الفوق صوتية (Ultrasonic) مع الأردوينو كما هو موضح بالصورة :

Room Map-Making Using Ultrasonic With Arduino

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

الطرف التوصيل
الاحمر Vcc / 5 V
البرتقالى Arduino Pin 9
البنى Ground

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

Room Map-Making Using Ultrasonic With Arduino

 

التوصيل كاملا :

 

Room Map-Making Using Ultrasonic With Arduino

البرمجة :

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

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

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

#include <Servo.h>
#include <NewPing.h>

#define TRIGGER_PIN  12 
#define ECHO_PIN     11  
#define MAX_DISTANCE 200 

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
Servo myservo;  

int pos = 0;   
int it = 10;

void setup() {
  myservo.attach(9); 
  Serial.begin(9600);
  delay(3000);
}

void loop() {
  int i = 0;
  int t = 0;
  int a = 0;

  for (i = 0; i < 180; i ++)
  {
    unsigned int uS = sonar.ping();
    myservo.write(i);
    delay(20);
    for (t = 0; t < it; t++)
    {
      uS = sonar.ping();
      a = uS/US_ROUNDTRIP_CM + a;
      delay(30);
    }
    
    a = a / (it-1);
    t = 0;

    Serial.println(a); 
    a = 0;
  }

}

شرح الشفرة البرمجية (Code):

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

#include <Servo.h>
#include <NewPing.h>

#define TRIGGER_PIN  12 
#define ECHO_PIN     11  
#define MAX_DISTANCE 200

بعد ذلك اعلنا عن المتغيرات اللازمة مثل المتغيرات الخاصة بالسيرفو و حساس الموجات فوق الصوتية والتي تستخدمها المكتبات ايضا. اعلنا عن متغير pos المستخدم في تسجيل موضع السيرفو و المتغير it المستخدم كعداد.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
Servo myservo;  

int pos = 0;   
int it = 10;

في الدالة ()setup قمنا بوضع الاعدادات اللازمة مثل تشغيل السيرفو و السيريال ثم الانتظار 3 ثوان حتى نضمن ان المحرك اصبح في وضعه الصحيح :

void setup() {
  myservo.attach(9); 
  Serial.begin(9600);
  delay(3000);
}

في الدالة ()loop نقوم بتحريك السيرفو حركة واحدة واخذ 10 قراءات للحساس، لحساب المتوسط لها، ثم كتابتها على المنفذ التسلسلي الذي لاحقا سنقوم باستقبال النتائج من خلاله على برنامج الماتلاب.

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

void loop() {
  int i = 0;
  int t = 0;
  int a = 0;

  for (i = 0; i < 180; i ++)
  {
    unsigned int uS = sonar.ping();
    myservo.write(i);
    delay(20);
    for (t = 0; t < it; t++)
    {
      uS = sonar.ping();
      a = uS/US_ROUNDTRIP_CM + a;
      delay(30);
    }
    
    a = a / (it-1);
    t = 0;

    Serial.println(a); 
    a = 0;
  }

}

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

بعد رفع كود الأردوينو نقوم بتشغيل برنامج الماتلاب عم طريق كتابة الكود الخاص بالماتلاب في ملف file.m . اي عند كتابة كود الماتلاب في ملف نصي تأكد من أن الإمتداد له m. أو قم بإنشاء ملف script من داخل اماتلاب وضع الكود به.

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

theta = 0:(pi/180):pi;
s = serial('/dev/ttyS1011');
s.BaudRate=9600
fopen(s)
i = 0;

inc = 1;

while i<180
   A = fgets(s);
   num(i+1) = str2num(A);
   i = i+1;
end
fclose(s)

j = 1

while j<181
    tab(j,1) = (j-1)*inc
    tab(j,2) = num(j)
    tab(j,3) = num(j)*cosd((j-1)*inc)
    tab(j,4) = num(j)*sind((j-1)*inc)
    j = j+1
end
%figure
%polar(theta,num)

plot(tab(:,3),tab(:,4))

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

Room Map-Making Using Ultrasonic With Arduino

ملاحظة :

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

Room Map-Making Using Ultrasonic With Arduino

فتقوم بتغييرة الى COM0 او COM1 او ايا كان اسم المنفذ الذي يستخدمة الاردوينو

Room Map-Making Using Ultrasonic With Arduino

و بعد ان تنتهي من كل شيء تقوم بضغط Run في برنامج الماتلاب و تنتظر إلى ان ينتهي السيرفو من عمل المشوار كامل ثم تظهر النتائج على الشاشة

ملاحظة : عند تشغيل كود الماتلاب تاكد ان لا يكون الSerial Monitor الخاص ببرنامج الاردوينو مفتوح