久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> Arduino >> 瀏覽文章

Matlab和Arduino通信

作者:未知   來源:互聯(lián)網(wǎng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月14日   【字體:

本文所有附件下載地址:http://www.zg4o1577.cn/f/Arduino and Matlab.zip
Matlab是運(yùn)用極廣的數(shù)學(xué)軟件。Arduino又是現(xiàn)在很火的開源硬件平臺(tái)。兩者連起來玩也是很爽的。
特別是現(xiàn)在Matlab出了Arduino支援套件以后,玩起來比以往的串口通信簡單多了。

第一部分 Matlab Arduino Support package
第二部分 Simulink Arduino Support package
第三部分 Matlab的串口通信
第三部分 Simulink的串口通信

堅(jiān)持持續(xù)更新與編輯。

Part 1 Matlab Arduino Support package
這個(gè)支持包是為了實(shí)現(xiàn)Matlab與Arduino之間的串口通信。基于在Arduino板上提前燒寫的服務(wù)器程序(Server program),監(jiān)聽串口的命令,需要的話可以返回結(jié)果。也就是說,Arduino板只需要提前燒寫一個(gè)程序,之后便可通過Matlab命令對其直接操 作。

該支援包支持學(xué)生版的Matlab。支持的控制板有UNO,Mega 2560,Duemilanove。
可以在Matlab官網(wǎng)下載,地址http://www.mathworks.de/hardware-support/arduino-matlab.html
點(diǎn)擊下方的Requirement框里的“MATLAB Support Package for Arduino”,在新打開的網(wǎng)頁中在右邊點(diǎn)擊Download Submission即可
也可以在本貼的附件直接下載ArduinoIO壓縮包

下載后解壓。把解壓文件里的pde/adiosrv/adiosrv.pde文件用Arduino IDE燒寫到Arduino控制板上。
把matlab的工作路徑修改到ArduinoIO文件夾。這樣配置就算完成了。

現(xiàn)在來實(shí)驗(yàn)一下。用matlab完成一個(gè)簡易的usb示波器
首先建立arduino和matlab的連接,代碼如下
a = arduino('COM3');
matlab會(huì)用幾秒鐘的時(shí)間來建立連接

用一個(gè)1k歐的可調(diào)電阻串聯(lián)一個(gè)1k歐的電阻。如下圖連接,樓主用的是AnalogRead pin 5


將下面的代碼直接復(fù)制到Matlab命令框,即可運(yùn)行。
interval = 10000;
passo = 1;
t = 1;
x = 0;
while(t<interval)
    b = a.analogRead(5)*10; % 把讀到的值放大10倍
    x = [x,b];
    plot(x);
    grid
    t = t+passo;
    drawnow;
end

從a5所讀的值會(huì)實(shí)時(shí)的畫在圖上,效果如下圖。可以自己手動(dòng)調(diào)整可調(diào)電阻阻值,即可在plot窗口觀察阻值變化。


下面來試一下把支援套件用到GUI點(diǎn)亮或熄滅led
這里為了使用digitalWrite(pin)設(shè)置了兩個(gè)pushbutton。標(biāo)簽(tag)分別是led1和led2
在函數(shù) _OpeningFcn 里設(shè)置全局變量,以及初始化。
global a;
global led1_state;
global led2_state;
a = arduino('COM3');
a.pinMode(3,'output');
a.pinMode(4,'output');
a.pinMode(5,'input'); % 5讀取3的狀態(tài)
a.pinMode(6,'input'); % 6讀取4的狀態(tài)
led1_state = 0;
led2_state = 0;


在函數(shù) led1_Callback中添加如下代碼
global a;
global led1_state;
if led1_state == 0
    a.digitalWrite(3,1);
    led1_state = a.digitalRead(5);
    set(hObject, 'BackgroundColor',[0 0 1]);
else
    a.digitalWrite(3,0);
    led1_state = a.digitalRead(5);
    set(hObject, 'BackgroundColor',[1 1 0]);
end

根據(jù)變量led1_state設(shè)置led1的狀態(tài)。讀取led1狀態(tài),更新變量led1_state。更改按鈕顏色
如果使用togglebutton,可以省略全局變量led1_state,可直接使用a.digitalWrite(3,(get(hObject,'Value')))進(jìn)行狀態(tài)切換。
注意:如果第二次執(zhí)行的時(shí)候沒有把語句 a = arduino('COM3')刪除,或者沒有清除變量a。都會(huì)出現(xiàn)錯(cuò)誤
在函數(shù)led2_Callback中類似。完整代碼在附件

 

從上面的實(shí)例看出,a是一個(gè)arduino類。通過調(diào)用arduino類的函數(shù)對控制板進(jìn)行操作。這時(shí)候的Arduino控制板看上去更像是執(zhí)行機(jī)。
其實(shí)Matlab Support Package for Arduino的絕大部分操作函數(shù)都和Arduino IDE的編程很像。上手會(huì)很快,這部分就不做過多的實(shí)例了。
更多該支持包的操作函數(shù)可以參見文件夾ArduinoIO下面的arduino.m文件。
我會(huì)在這樓為大家整理一下,方便使用

Part2 Simulink Arduino Support package
這個(gè)套件其實(shí)就更好玩了。不用再費(fèi)心費(fèi)力的寫代碼。而是直接用simulink搭建好流程,運(yùn)算關(guān)系,就可以直接燒寫到控制板上了,這就變成了模塊化編程。可惜的是該套件只支持UNO和Mega 2560。
安裝套件的過程稍微麻煩一點(diǎn)
打開下面的地址,點(diǎn)擊最下面的”Get Support Package Now“ 就會(huì)直接下載了。也可以在本樓的附件中下載。
http://www.mathworks.de/hardware-support/arduino-simulink.html
安裝方法:
解壓,點(diǎn)擊下圖的Get Hardware Support Packages。然后選擇剛才解壓的文件夾,下一步

也可以直接把壓縮包中的arduino.mlpkginstall直接拖到matla命令框中。
然后按提示開始安裝。
注意:安裝需要一個(gè)matlab賬號(hào),建議大家提前注冊好,學(xué)生身份賬號(hào)就可以用了。

打開simulink library可以在左邊看到Simulink Support Package for Arduino Hardware


點(diǎn)擊就可以看到大家熟悉的函數(shù)的模塊了


現(xiàn)在放一個(gè)小實(shí)例。新建一個(gè)simulink項(xiàng)目,
選一個(gè)Digital Output和一個(gè)Pulse Generator(在simulink/sources里面)
如下圖連接好。


設(shè)置下Pulse Geneartor。更改自己需要的頻率,占空比等。
雙擊Digital Output修改相應(yīng)的pin number

設(shè)置完以后可以開始燒寫了。按下圖打開配置窗口

選擇對應(yīng)的控制板型號(hào)

然后設(shè)置端口(可以選自動(dòng),或手動(dòng))設(shè)置波特率(相當(dāng)于IDE編程時(shí)setup()函數(shù)里的Serial.begin())

設(shè)置完成點(diǎn)擊保存。
回到simulink編輯窗口,按下圖點(diǎn)擊"Run"開始燒寫

如果配置的arduino型號(hào)或端口不正確,燒寫會(huì)出現(xiàn)錯(cuò)誤,點(diǎn)擊"Run"下面的options重新配置。

Part 2也不做過多的介紹了,應(yīng)該都是Arduino玩家熟悉的東西。

Simulink Support Package for Arduino:

Part 3 Matlab 串口通信
有的時(shí)候我們自己給Arduino編好了程序,又希望在Matlab中調(diào)用串口,讀取數(shù)據(jù)。此時(shí) Matlab Support Package for Arduino顯然不合適了。這里我們要用到Matlab里的串口對象serial。比如當(dāng)我們需要利用Matlab處理攝像頭畫面,結(jié)合攝像頭標(biāo)定、攝像頭識(shí)別、3D掃描后建模等等。
還是以part1里面的簡易示波器為例。
Arduino代碼如下
int analogPin = 5;                              
int
val = 0;           

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  val = analogRead(analogPin);
  Serial.println(val);
}


這里還是要實(shí)現(xiàn)Matlab的即時(shí)讀取和畫圖。Matlab代碼如下
s = serial('COM3');  %定義串口對象
set(s,'BaudRate',9600);  %設(shè)置波特率s
fopen(s);  %打開串口對象s

interval = 10000;  %這里開始的代碼很Part1里的代碼類似
passo = 1;
t = 1;
x = 0;
while(t<interval)
    b = str2num(fgetl(s));  %用函數(shù)fget(s)從緩沖區(qū)讀取串口數(shù)據(jù),當(dāng)出現(xiàn)終止符(換行符)停止。
    x = [x,b];                       %所以在Arduino程序里要使用Serial.println()
    plot(x);
    grid
    t = t+passo;
    drawnow;
end
fclose(s);  %關(guān)閉串口對象s

其他關(guān)于串口對象serial的函數(shù)之后更新

 

Part 4 Simulink 串口通信
既然和matlab通信,處理信號(hào)當(dāng)然算是用simulink更方便了。不論是做實(shí)驗(yàn)還是研發(fā)都經(jīng)常用到simulink和其他控制器來建模和采集數(shù)據(jù)分析。對于像我這樣的*絲,可能也希望能用simulink和Arduino一起玩。

先說下Simulink如何從Arduino實(shí)時(shí)接收數(shù)據(jù)。和simulink配合的重點(diǎn)應(yīng)該是分析、處理數(shù)據(jù),而不是控制部分。
我們還是沿用Part1里面的analogRead。
先打開simulink library。點(diǎn)擊左邊的Instrument Control ToolBox。見下圖

里面有Query Instrument、To Instrument、Serial Configuration、Serial Receive和Serial SendQuery Instrument和To Instrument配套使用
Serial Configuration、Serial Receive和Serial Send配套使用

先使用Serial Receive。選擇一個(gè)Serial Receive。在Simulink/Sinks里面選擇一個(gè)Display。如下圖連接并設(shè)置。


主要講下其中的幾個(gè)重要配置。
Header留空。Terminator是串口輸入的結(jié)尾控制符。因?yàn)锳rduino程序里面用的是Serial.prinln(),也就是每個(gè)字符串都以換行符結(jié) 尾。所以這里我選擇CR('\r'),表示每組數(shù)據(jù)讀到結(jié)尾控制符,但不包含該控制符,也就是在CR('\r')之前的制定位數(shù)的數(shù)據(jù)會(huì)被讀取。 Datasize要定義一個(gè)臨時(shí)存放數(shù)據(jù)的矩陣。我使用的電位器為1k歐,電阻是一千歐,測量的是電阻兩端的電壓。也就是說測量范圍是5V到 2.5V,analogRead()的返回值范圍是0-1024對應(yīng)0到5V,根據(jù)這里的情況,應(yīng)該是1023到512。不包含'\r'的情況下,得到的 字符串應(yīng)該是4到3位。所以暫時(shí)把Datasize(存放矩陣)矩陣設(shè)置為[4,1]。


Enable blocking mode勾選的情況下表示,讀取輸入數(shù)據(jù)時(shí)暫停其他模塊。如果勾選,Serial Receive模塊只有一個(gè)Output為Data,讀取過程大概是這樣,從Arduino發(fā)出的數(shù)據(jù)會(huì)不停的累積存到電腦緩存區(qū)。Serial Receive模塊會(huì)按照數(shù)據(jù)進(jìn)入的順序讀取。因?yàn)槠渌牟僮髦荒茉趦纱尾蓸又g進(jìn)行,所以這時(shí)讀取數(shù)據(jù)不是實(shí)時(shí)的,而是有延遲的,隨著時(shí)間延時(shí)越來越長。如果不勾選,則有兩個(gè)Output為Data和Status,status只有兩種值1或0,1表示有可用的數(shù)據(jù),0表是沒有可用的數(shù)據(jù)。因?yàn)椴粫?huì)暫停其他模塊,模塊意外的操作(模擬)可以看做是連續(xù)的,所以現(xiàn)在是實(shí)時(shí)的。

Action when data is unavailable(沒有可讀數(shù)據(jù)時(shí)的行為),有兩個(gè)選項(xiàng),Output last received value(可理解為輸出最后進(jìn)入緩存的數(shù)據(jù))和Output Custom value(輸出自定義值,選擇該項(xiàng)時(shí),可在下面的Custom Value進(jìn)行設(shè)置,默認(rèn)為零)。


設(shè)置完成后會(huì)出現(xiàn)提示框,是否立刻生成串口配置模塊(Serial Configuration),該模塊用通用的串口配置(Serial Receive和Serial Send)。如果不立刻生成,之后也要手動(dòng)添加。


打開Serial Configuration可以進(jìn)行波特率,串口號(hào)的設(shè)置。如下圖


大部分都不解釋了,都是基本的串口參數(shù)設(shè)置。
Flow Control管理數(shù)據(jù)傳輸速度),兩個(gè)選項(xiàng)none(沒有)和hardware(硬件控制)
Time Out(超時(shí)),在每個(gè)仿真步等待數(shù)據(jù)的最大時(shí)間量。


配置完成后,運(yùn)行。可以把仿真時(shí)間(simulation stop time,播放鍵旁邊)設(shè)置大一點(diǎn)。


右邊的圖對應(yīng)"1023",左邊的對應(yīng)"714"。左邊圖中第一位是10,前面說過Arduino程序里使用的是Serial.println。每一行串口數(shù)據(jù)起始位為LF('\n'),結(jié)束位為CR('\r')。LF('\n')對應(yīng)的ASCii碼就是10。更該Serial Receive模塊里的Header以及Terminator都沒有用。介紹一個(gè)比較偷懶的辦法,在Arduino中修改代碼:
val = analogRead(analogPin)
val = map(val, 5, 1023, 100, 999);  //把val的值修改到100至999的范圍之間

這樣就把值嚴(yán)格的控制在了3位。把datasize改為[3 1]。
現(xiàn)在來作圖。Serial receive的Output不能直接和Scop連接,否則看到的是ASCii碼的值被畫到圖中。按下圖操作


大家也可以在附件下載壓縮包。其中文件名為test1
可以把Serial receive里的Enable blocking mode勾選和不勾選,對比下效果。


相比之前的Serial receive現(xiàn)在使用的Query Instrument簡單的多了。按下圖連接下


打開Query Instrument的配置窗口。

三個(gè)標(biāo)簽,Hardware Configuration、Query、Instrument Initialisation。有的設(shè)置和Serial Receive一的
Hardware Configuration不多說了,基本的串口設(shè)置,波特率、串口號(hào)、緩沖區(qū)大小等。有一點(diǎn)說明下,在Interface可以看到這里可以選擇通信方式,不止是Serial,例如還有TCPIP等等。Query Instrument是一個(gè)通用的接收查詢模塊。
Instrument Initialisation只在控制板需要一個(gè)初始信號(hào)的時(shí)候才需要
Query可以根據(jù)自己的需要選擇,ASCii、Binary,Binblock
都是些基礎(chǔ)知識(shí),就不在帖子里多說了,不清楚的留言。(這個(gè)模塊真的是很簡單)

我們選擇默認(rèn)設(shè)置,也就是ASCii碼。這樣輸出的是字符串,而且已經(jīng)掐頭去尾了,不需要擔(dān)心數(shù)據(jù)位數(shù)。還能在簡單一點(diǎn)么
字符串在simulink正式以ASCii碼存放的,把所有元素按順序”拼“起來就得到了我們需要的相應(yīng)的值。這里用simulink/math operations/sum of Elements就可以了。
注意:如果一開始的值是1023(analogread的最大值),有的時(shí)候運(yùn)行simulink會(huì)出錯(cuò)。目前還沒查出原因。
大家也可以在附件的壓縮包中找到對應(yīng)的文件,文件名test

本文所有附件下載地址:http://www.zg4o1577.cn/f/Arduino and Matlab.zip

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 精品视频在线播放 | 毛片毛片毛片毛片毛片 | 国产区在线看 | 久久久久国产一区二区三区不卡 | 日韩视频精品在线 | 九九99九九精彩46 | 久久久网 | 天天色av| 久久久人 | 国产九九九 | 中文字幕中文字幕 | 日本午夜免费福利视频 | 欧美激情一区二区 | 黄色网址在线免费播放 | 中文字幕欧美一区 | 中文字幕一区在线 | 99成人免费视频 | 国产精品欧美一区二区三区 | 国产激情一区二区三区 | 黄色片免费看 | 欧美视频 亚洲视频 | 亚洲国产欧美日韩 | 91看片免费版 | 99国产精品视频免费观看一公开 | 国产精品不卡视频 | 成人激情视频免费在线观看 | 免费黄色日本 | 操久久 | 黄色一级视频 | 欧美一区二区三区的 | 91在线一区 | 毛片视频观看 | 日韩欧美在线观看 | 国产成人精品久久二区二区91 | www视频在线观看 | 国产精品久久a | 久久精品亚洲一区 | 香蕉二区| 伊人伊成久久人综合网站 | 国产在线a | 久久99精品久久久久久 |