Sunday, October 19, 2014

Arduino interface with MATLAB: GUI Real Time Plot

เป็นโอกาศดีครับมีคนเข้ามาสอบถามว่าถ้าต้องการติดต่อกับบอร์ด Arduino ด้วย MATLAB และต้องการสร้าง GUI ด้วยจะทำอย่างไร ผมก็ยังไม่เคยทำแต่ก็ลองหาดูว่ามีใครทำอะไร อย่างไรบ้าง ก็พบว่าน่าสนใจดีเลยทีเลยครับ เพราะ MATLAB มีคนเขียน I/O มาให้เราใช้อยู่แล้ว ลองเข้าไปอ่านและเอามาใช้ดูได้ครับ ตามนี้

http://www.mathworks.com/hardware-support/arduino-matlab.html

หรือที่นี่

http://www.mathworks.com/matlabcentral/fileexchange/32374-matlab-support-for-arduino--aka-arduinoio-package

(ผมใช้ที่นี่ ในไซต์นี้ยังมี example ให้ศึกษาทดลอง ก่อนที่จะไปทำของเล่นของตัวเองนะครับ ถือว่าดีมาก)

สิ่งที่จะต้องมีหากต้องการเล่นของเล่นใหม่นี้

1. Arduino board ซึ่งหาซื้อได้ในหลายช่องทางราคาถูก (ประมาณ 300 บาทก็หามาเล่นได้แล้วครับ)
2. Sketch เอาไว้เขียนโปรแกรมสำหรับฝั่งบอร์ด Arduino ซึ่งดาวว์โหลดได้โดยตรงจากเวบด้านบนครับ
3. แน่นอน MATLAB และไฟล์สำหรับติดต่อกับ Arduino ซึ่งก็ดาวว์โหลดจาก Mathwork (ตามลิ้งค์ด้านบน)
4. บอร์ดทดลองและชิ้นส่วนอิเล็กทรอนิกนส์ตามต้องการ (อาจเริ่มจากการวัดค่าโวลต์ จากตัวต้านทานปรับค่าได้ก่อนเพื่อทำความเข้าการติดต่อระหว่าง บอร์ดกับ MATLAB)
5. แนวคิด ความต้องการที่จะทำของเล่นสักอย่างหนึ่ง โดยรับค่ามาจาก Arduino แต่สั่งงานผ่าน MATLAB

ก่อนที่จะทำการทดลองต้องโปรแกรม I/O ลงไปในบอร์ด Arduino ก่อนผ่าน Sketch ไฟล์ที่กล่าวถึงหาจากลิ้งค์ด้านบนซึ่งจะอยู่ใน โฟลเดอร์ pde ให้มองหาไฟล์ดังต่อไปนี้ครับ adio.pde, adioe.pde, adioes.pde (ผมเลือกใช้ไฟล์แรก ส่วนนี้ขอให้ไปดูรายละเอียดเอง) ในไฟล์ zip มีไฟล์ที่จำเป็นต้องใช้ ซึ่งเราต้องคัดลอกไฟล์นี้ไปไว้ในโฟลเดอร์เดียวกับโปรแกรมที่เราพัฒนาขึ้นมาด้วย (ไฟล์ดังกล่าวชื่อ arduino.m)

ผมทดลองและทดสอบ การอ่านค่าจาก IR sensor ผ่าน analogRead ฟังก์ชัน (ขา A2) ผลการทดสอบเป็นดังรูป ส่วนรายละเอียดเดี๋ยวจะมาเขียนต่อครับ (ในรูป แกน x ยังไม่ใช่เวลาจริงนะครับยังไม่ศึกษาส่วนนี้ ส่วนแกน y ยังไม่ได้แปลงค่า ยังคงเป็น ค่าตาม ADC 10-bit ของ Arduino อยู่)


ส่วนรูปนี้คือ วงจร IR sensor ง่ายๆ ที่ใช้ทดสอบครับ


มีคำอธิบายการศึกษาพื้นฐาน เกี่ยวกับการติดต่อ Arduino ผ่าน MATLAB ดังนี้
คำสั่งติดต่อ MATLAB
a=arduino('COMPORT'); % ในกรณีเครื่องผมเป็น COM11

ในที่นี้  COMPORT คือ พอร์ตที่ Arduino ต่อกับคอมพิวเตอร์เราอยู่ การประกาศ input/output ตรงนี้สามารถทำได้ในหลายรูปแบบ ดูจากเอกสารอ้างอิงได้เลย

a.pinMode(2,'input'); % a ในที่นี้ก็คือตัวแปรที่ใช้แทน Arduino
a.pinMode(3,'input');
a.pinMode(4,'input');
a.pinMode(5,'input');

ประกาศให้ อะนาลอก A2-A5 เป็น input พอร์ต (ประกาศเผื่อไว้ จริงๆ ในงานนี้ใช้แค่ A2)
จากนั้นก็เขียนรับข้อมูลจาก ขาอะนาลอก A2 ด้วยคำสั่งนี้

b=a.analogRead(2);

b คือ ตัวแปรที่รับค่าจากขา A2 แต่คำสั่งนี้จะรับค่ามาครั้งเดียว ถ้าหากต้องการ ให้ MATLAB วนรับค่าตลอดเวลา (ให้ทำงานแบบวนไม่มีที่สิ้นสุด เหมือน void loop ใน sketch) ในที่นี้ผมใช้ while loop ที่มีเงื่อนไขเป็นจริงเสมอ ดังนี้

x=0;
while(1)
b=a.analogRead(2);
x=[x,b];
end

ในกรณีนี้ MATLAB จะรับค่าจาก A2 มาตลอดเวลา และเก็บค่าไว้ในตัวแปร x ส่วน source code เต็มและ file.fig หาได้จากที่นี่เลยครับ >>> Download (ไฟล์มีเวลาจำกัดอาจถูกลบไปก่อน)

ส่วนนี่คือ source code ที่เขียนบังคับ GUI ครับ
%=========================================
function varargout = IR_GUIArduino(varargin)
% IR_GUIARDUINO MATLAB code for IR_GUIArduino.fig

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @IR_GUIArduino_OpeningFcn, ...
                   'gui_OutputFcn',  @IR_GUIArduino_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 IR_GUIArduino is made visible.
function IR_GUIArduino_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for IR_GUIArduino
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);

% --- Outputs from this function are returned to the command line.
function varargout = IR_GUIArduino_OutputFcn(hObject, eventdata, handles)
% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushconnect.
function pushconnect_Callback(hObject, eventdata, handles)

global a;
a=arduino('COM11')
a.pinMode(2,'input');
a.pinMode(3,'input');
a.pinMode(4,'input');
a.pinMode(5,'input');

% --- Executes on button press in pushdisconnect.
function pushdisconnect_Callback(hObject, eventdata, handles)
delete(instrfind({'Port'},{'COM11'}))

% --- Executes on button press in pushmeasure.
function pushmeasure_Callback(hObject, eventdata, handles)

global a;

x=0;

while(1)
b=a.analogRead(2);
x=[x,b];

axes(handles.axes1);
plot(x,'g');
grid
drawnow
set(handles.axes1,'YGrid','on',...
    'YColor',[0.247058823529412 0.247058823529412 0.247058823529412],...
    'XGrid','on',...
    'XColor',[0.247058823529412 0.247058823529412 0.247058823529412],...
    'Color',[0 0 0]);
xlabel('time(s)');
ylabel('Intensity (a.u.)');
hold(handles.axes1,'all');
end

% --- Executes on button press in pushclear.
function pushclear_Callback(hObject, eventdata, handles)
cla(handles.axes1,'reset')

% --- Executes on button press in pushExit.
function pushExit_Callback(hObject, eventdata, handles)
button = questdlg('Do you want to quit?', ...
        'Exit Dialog','Yes','No','No');
switch button
            case 'Yes',
              %Save variables to matlab.mat
              save
              close(ancestor(hObject,'figure'))
             
            case 'No',
              quit cancel;
end
%=========================================
ส่วนไฟล์ ที่เป็น .fig สร้างเองเองละกันครับ

 (แต่อย่าลืมเปลี่ยน COMPORT ให้ตรงกันนะครับ)

สิ่งที่ต้องศึกษาหาความรู้ต่อไปคือ เวลา การจัดเก็บข้อมูล การใช้งานในโหมดอื่นๆ

*******************************************
 ปัจจุบันข้าพเจ้าไม่พัฒนา Arduino MATLAB แล้วเพราะมันดูไม่เข้ากัน (ในความคิดข้าพเจ้า)
เพราะ MATLAB มีค่าลิขสิทธิ์ ข้าพเจ้าจึงหันไปมองหา open source ที่จะมาพัฒนาร่วมกับ
Arduino น่าจะดีกว่า
*******************************************

เอกสารอ้างอิง

Arduino IO package: Slides and Examples  >>> read more

3 comments:

  1. arduino.m เป็นโค้ดจากตัว adio.pde หรือเขียนขึ้นเองหรือนำมาจากไหนครับ

    ReplyDelete
    Replies
    1. ดาวโหลดจากลิ้งค์ที่ 2 เลย แต่ต้องมี mathworks account ถ้าไม่มีก็สมัครเลยแล้วค่อยดาวโหลด

      Delete
  2. ตอนรันนี่ยังไงครับ มีทั้งarduino.m และ IR.m ขอบคุณครับ

    ReplyDelete