2015年3月19日 星期四

用Matlab與Arduino的序列阜溝通

Arduino可以以序列阜(Serial Port)的方式與電腦溝通,只要雙方設置好對應的Baud Rate即可,電腦有許多種選擇,不管是什麼程式語言,只要找到能夠跟序列阜溝通的方法,就能夠以序列阜的方式跟Arduino溝通。

之前的一篇有介紹到以Java來跟Arduino溝通,這篇是要介紹使用Matlab的方式。

在網上搜查之後,找到了兩種主要的常見方法,可以參考這篇文,寫得非常詳細:
【經驗分享】Matlab和Arduino
,其中也寫到了如何用Simulink來跟Arduino溝通。

兩種主要的方法為:
1.使用Matlab Arduino Support package。
2.使用Matlab本身的指令去跟Serial Port連接。

第一種方法在【經驗分享】Matlab和Arduino有詳細的解說,要把其所附的程式燒錄到Arduino枚子上,然後用Matlab只接控制Arduino,使用方便,但其缺點為Arduino上不行燒錄自己所寫的Arduino程式,可以把它想成把原來在Arduino上寫的程式全部搬到了Matlab上面去執行。

在這裡我主要介紹第二種方法,此方法不用任何套件,單純就Matlab本身去跟Seriao Port去溝通。

之所以要使用Matlab是因為它的繪圖很方便,只要使用plot()指令就能夠很輕易的繪圖,在這裡我們使用上述的第二種方法來實作一個簡單的示波器:

Matlab程式碼如下:
%模擬示波器,信號來源為Serial Port
serialPort = serial('COM3'); %獲得Serial Port(序列阜)
set(serialPort,'BaudRate',9600); %設定Baud Rate

fopen(serialPort); %打開Serial Port

times = 1:1000; %在這裡times只是當成X軸來顯示,其值並不代表真實的時間
voltages = zeros(1,1000); %初始化Y軸的值

try   %進行例外(Exception)處理

figure(1)
%繪置第一次loop的圖
for i = 1:length(voltages)
    inputVoltage = str2num(fgetl(serialPort));   %使用fgetl()來讀去從Serial Port讀到的值
    voltages(i) = inputVoltage;
    plot(times,voltages,'.');                    %繪圖
    drawnow;

    hold off;

end


%接著把代表Y軸的一維陣列全部的元素往左一格,第一個就移出去不要,把新得到的值放在最右邊
for i=1:3

   voltages(1:(length(voltages)-1)) = voltages(2:length(voltages));

   inputVoltage = str2num(fgetl(serialPort));

   voltages(length(voltages))=inputVoltage;

   plot(times,voltages,'.');

   drawnow;

   hold off;

end

catch ME

    id = ME.identifier

    fclose(serialPort); %關閉Serial Port

end

fclose(serialPort); %關閉Serial Port

沒有留言 :

張貼留言