0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Arduino機(jī)器人繪制一個(gè)MATLAB Logo

MATLAB ? 來(lái)源:MATLAB ? 2023-07-13 10:04 ? 次閱讀

引言:

隨著學(xué)習(xí)和研究的不斷深入,在仿真模擬的基礎(chǔ)上引入硬件設(shè)備變得越來(lái)越流行,也越來(lái)越重要,MATLAB/Simulink 在硬件支持方面應(yīng)用廣泛,提供了上百個(gè)硬件支持包來(lái)滿足使用者的需求,下載安裝好之后,可以很方便地使用封裝好的函數(shù)和模塊對(duì)硬件進(jìn)行控制。依靠 MATLAB 強(qiáng)大的代碼生成功能,可以靈活部署到 Arduino、Raspberry Pi、NVIDIA Jetson 等嵌入式設(shè)備中。MATLAB 現(xiàn)在支持生成 C/C++ 代碼、用于 FPGA 的 VHDL 代碼以及 NVIDIA GPU 的 CUDA 代碼等,并且所生成的代碼針對(duì)相應(yīng)的算法也進(jìn)行了優(yōu)化,對(duì)于不具備相應(yīng)手寫(xiě)代碼經(jīng)驗(yàn)的用戶來(lái)說(shuō),極大地降低了學(xué)習(xí)成本,可以將更多的精力放在模型或算法本身的設(shè)計(jì)當(dāng)中。

今天我們就從 Arduino 入手,通過(guò)一個(gè)簡(jiǎn)單的示例介紹 MATLAB 在硬件支持方面的一些初步應(yīng)用,以及這些內(nèi)容可以如何應(yīng)用到教學(xué)當(dāng)中。Arduino 有多個(gè)不同型號(hào)的開(kāi)發(fā)板,因?yàn)槌杀镜土?jiǎn)單易學(xué)被廣泛應(yīng)用。在之前的文章 “MATLAB/Simulink × Arduino Engineering Kit | 機(jī)電一體化虛擬實(shí)操課程”中我們已經(jīng)了解到 Arduino Engineering Kit(AEK)在課堂教學(xué)中的應(yīng)用。AEK 是 MathWorks 與 Arduino 公司合作開(kāi)發(fā)的工程套件,套件除了基本的開(kāi)發(fā)板還包含配套的電機(jī)、傳感器等組件,通過(guò)組裝調(diào)試,用戶可以搭建成三個(gè)不同的機(jī)器人。同時(shí)套件還包含完整的學(xué)習(xí)材料和 MATLAB/Simulink 代碼模型,非常適合控制類相關(guān)領(lǐng)域的初學(xué)者學(xué)習(xí)以及課堂教學(xué)。

下面我們將通過(guò)對(duì) AEK 組裝調(diào)試“墻壁繪圖機(jī)器人”過(guò)程的詳細(xì)介紹,展示 MATLAB 在硬件支持、電機(jī)控制、以及圖像處理等方向的應(yīng)用,無(wú)論之前是否有相關(guān)基礎(chǔ)都可以快速上手。

1. 組裝機(jī)器人

8ba72ba4-209c-11ee-962d-dac502259ad0.png

AEK 套件中包含了組裝繪圖機(jī)器人所需的全部零部件,包括一款型號(hào)為 Nano 33 IoT 的 Arduino 開(kāi)發(fā)板、擴(kuò)展板、三個(gè)電機(jī)以及其他配件。在安裝視頻的指導(dǎo)下,通常 1~2 個(gè)小時(shí)就可以組裝好。

8bd753ba-209c-11ee-962d-dac502259ad0.png

機(jī)器人的工作原理是將兩個(gè)滑輪固定在豎直放置的白板頂部?jī)啥?,滑輪與兩個(gè)直流電機(jī)相連,通過(guò)控制機(jī)器人在白板上移動(dòng)來(lái)進(jìn)行繪圖,此外機(jī)器人還配有伺服電機(jī)來(lái)控制記號(hào)筆的起落。所有的控制和調(diào)試都可以在 MATLAB 中進(jìn)行。

2. 圖像處理

我們繪制的圖形以簡(jiǎn)筆畫(huà)為主,以下圖(1)所示的 MATLAB logo 為例,你可以在 MATLAB 中連接攝像頭進(jìn)行拍照,也可以將已有的照片導(dǎo)入 MATLAB 中。要將照片轉(zhuǎn)化成機(jī)器人可以識(shí)別的數(shù)據(jù)格式并用于進(jìn)一步的復(fù)現(xiàn)繪制,需要對(duì)圖片進(jìn)行一系列處理。MATLAB Image Processing Toolbox 中包含了大量成熟的函數(shù)和算法可以直接調(diào)用,通過(guò)運(yùn)行以下代碼可將圖(1)處理成圖(2)的形式:

img2 = rgb2gray(img);
img3 = ~imbinarize(img2,'adaptive','ForegroundPolarity','dark');
img4 = bwmorph(img3,'clean');
img5 = bwmorph(img4,'thin',inf);

此時(shí)圖片中已經(jīng)只包含繪圖所需的輪廓線,但我們還需要做進(jìn)一步的處理來(lái)獲取對(duì)應(yīng)的坐標(biāo)。使用遞歸的方法調(diào)用 bwboundaries 函數(shù)以及數(shù)據(jù)處理可以獲得圖(3)所示曲線的一系列坐標(biāo)值。最后將曲線進(jìn)行合理的分段、合并形成圖(4)所示的三組坐標(biāo)值,分別用三種顏色表示,這也意味著要完成繪制需要畫(huà)三筆。

至此我們已經(jīng)準(zhǔn)備好繪圖需要的數(shù)據(jù),接下來(lái)可以連接硬件對(duì)電機(jī)進(jìn)行控制了。

(1)

(2)

8c6f084a-209c-11ee-962d-dac502259ad0.png

(3)

8c86f252-209c-11ee-962d-dac502259ad0.png

(4)

3. 連接硬件

8c9f32f4-209c-11ee-962d-dac502259ad0.png

MathWorks 官方提供了近 200 個(gè)硬件支持包,此外還有大量用戶自己開(kāi)發(fā)上傳的支持包。點(diǎn)擊 MATLAB 中“附加功能”->“獲取硬件支持包”,搜索 Arduino,即可下載 “MATLAB Support Package for Arduino Hardware”。下載完成后通過(guò) USB 將機(jī)器人與電腦連接,根據(jù)支持包提示進(jìn)行驅(qū)動(dòng)的安裝與配置,然后就可以在 MATLAB 中控制直流電機(jī)和伺服電機(jī)的運(yùn)動(dòng)了。

在 MATLAB 中運(yùn)行如下命令:

a = arduino

可以看到工作區(qū)中生成了一個(gè)類型為 arduino 的對(duì)象 a,包含如下屬性:

8d2532aa-209c-11ee-962d-dac502259ad0.png

在此基礎(chǔ)上可進(jìn)一步連接擴(kuò)展板:

carrier = motorCarrier(a)

更多支持的函數(shù)可參考幫助文檔:arduino。因?yàn)殡姍C(jī)與擴(kuò)展板相連,現(xiàn)在我們可以通過(guò) carrier 連接伺服電機(jī):

s = servo(carrier,3);

設(shè)置 pos 的值,調(diào)用 writePosition 函數(shù)即可控制電機(jī)轉(zhuǎn)動(dòng)角度即記號(hào)筆的位置:

pos = 0.3; %Change this value as per your requirements
writePosition(s,pos)

與伺服電機(jī)類似,你也可以通過(guò)簡(jiǎn)單幾行命令控制直流電機(jī)的運(yùn)動(dòng),并且我們可以通過(guò)開(kāi)環(huán)和閉環(huán)兩種方式實(shí)現(xiàn)。開(kāi)環(huán)的方式通過(guò) dcmotor 函數(shù)連接電機(jī):

mL = dcmotor(carrier,'M2');
mR = dcmotor(carrier,'M1');

設(shè)置好速度后即可通過(guò) start 和 stop 控制電機(jī)的運(yùn)轉(zhuǎn):

start(mL)
start(mR)
pause(3) % Wait 3 seconds
stop(mL)
stop(mR)

相對(duì)應(yīng)的,閉環(huán)控制的方式是通過(guò) pidMotor 實(shí)現(xiàn),你可以通過(guò)調(diào)節(jié) PID 參數(shù)獲得更精確的控制:

pidML = pidMotor(carrier,2,'position',3,[0.18 0.0 0.01]); % Modify the PID gains [Kp Ki Kd] as per your requirements
pidMR = pidMotor(carrier,1,'position',3,[0.18 0.0 0.01]);

設(shè)置好目標(biāo)角位移 theta 即可通過(guò) writeAngularPosition 控制運(yùn)轉(zhuǎn):

writeAngularPosition(pidML,theta,'rel');
writeAngularPosition(pidMR,theta,'rel');

在下文中我們將通過(guò)閉環(huán)控制的方式進(jìn)行繪圖。

以上所有控制函數(shù)列表都可以在幫助文檔中查到,與電機(jī)類似,你也可以配置自己的傳感器開(kāi)發(fā)更多新的功能。

4. 對(duì)圖像數(shù)據(jù)做進(jìn)一步處理

現(xiàn)在我們已經(jīng)得到要繪制的曲線的一系列坐標(biāo),也可以對(duì)電機(jī)進(jìn)行控制。但是坐標(biāo)值是基于圖片生成的真實(shí)數(shù)據(jù),要想在白板上繪制,需要將曲線坐標(biāo)縮放成合適的大小,并在此基礎(chǔ)上將坐標(biāo)的變化準(zhǔn)確地轉(zhuǎn)換成電機(jī)轉(zhuǎn)動(dòng)的角度。

我們需要測(cè)量白板的基本尺寸,并通過(guò)查閱電機(jī)最大扭矩等參數(shù),基于基本的力學(xué)分析,將可繪制的區(qū)域找出,并進(jìn)一步設(shè)定想要繪制的區(qū)域大小,結(jié)果如下圖所示。其中云圖標(biāo)識(shí)了根據(jù)扭矩計(jì)算出的機(jī)器人在白板移動(dòng)時(shí)的可行域,可以看到當(dāng)機(jī)器人接近白板頂端時(shí)扭矩將會(huì)變大,這也符合實(shí)際情況。紅色區(qū)域?yàn)槲覀冞x定的最終的繪圖區(qū),根據(jù)此區(qū)域的大小我們可以將圖像坐標(biāo)按比例縮放為適合的范圍。

8d4bdcca-209c-11ee-962d-dac502259ad0.png

由于繪制的過(guò)程是控制機(jī)器人沿一系列坐標(biāo)點(diǎn)移動(dòng),當(dāng)點(diǎn)過(guò)于密集時(shí)不僅會(huì)花費(fèi)更多時(shí)間,甚至可能會(huì)降低精度。我們可以設(shè)置一個(gè)最小移動(dòng)距離,遍歷所有的坐標(biāo)點(diǎn)將小于該距離的中間點(diǎn)移除,經(jīng)過(guò)實(shí)驗(yàn)這里取為 2mm。

最后即可根據(jù)機(jī)器人的尺寸、初始位置以及電機(jī)參數(shù)通過(guò)三角函數(shù)將坐標(biāo)值轉(zhuǎn)化成機(jī)器人每一步移動(dòng)時(shí)電機(jī)需要轉(zhuǎn)動(dòng)的角位移。

5.控制機(jī)器人進(jìn)行繪圖

現(xiàn)在我們可以控制機(jī)器人進(jìn)行繪圖了,如前文介紹,繪制的圖像分為三條曲線,首先通過(guò)伺服電機(jī)將記號(hào)筆抬起,移動(dòng)至第一條曲線的起點(diǎn),然后將筆落下繪制,結(jié)束后再抬起筆移動(dòng)至第二條曲線依次完成。

我們來(lái)通過(guò)視頻看一下最終的繪制過(guò)程:

6. 總結(jié)與展望

通過(guò)調(diào)試一個(gè)簡(jiǎn)單的繪圖機(jī)器人,我們可以了解圖像處理、硬件連接、控制以及數(shù)學(xué)等多個(gè)領(lǐng)域的基礎(chǔ)知識(shí),快速上手 MATLAB 在這些方向的應(yīng)用。在此基礎(chǔ)上,你可以開(kāi)發(fā)更為復(fù)雜的算法,處理實(shí)際拍攝的照片而非簡(jiǎn)筆畫(huà),你也可以利用兩只記號(hào)筆繪制彩色圖案,關(guān)于繪圖機(jī)器人還有更多應(yīng)用和功能等著你來(lái)解鎖。除了繪圖機(jī)器人,你還可以將 AEK 組裝為移動(dòng)漫游車或者自平衡小車,三種機(jī)器人形態(tài)會(huì)共享 Arduino 開(kāi)發(fā)板、電機(jī)以及部分零部件,詳細(xì)信息可以在 MATLAB 或 Arduino 官網(wǎng)上查看。

AEK 套件因?yàn)楹?jiǎn)單易上手、功能完整等特點(diǎn),被很多老師選擇用于控制類課程的教學(xué),學(xué)生可以作為團(tuán)隊(duì)的形式完成整個(gè)項(xiàng)目,也可以根據(jù)實(shí)際需求側(cè)重某一個(gè)應(yīng)用方向來(lái)進(jìn)行拓展。

對(duì)于手邊沒(méi)有 AEK 完整套件的同學(xué),只需要一個(gè) Arduino 開(kāi)發(fā)板,以及攝像頭、傳感器等一些外設(shè),同樣可以參考 AEK 的代碼和模型以及 MATLAB 的幫助文檔開(kāi)發(fā)自己的應(yīng)用,使用方法和上文類似,大家可以充分發(fā)揮自己的想象力進(jìn)行一些有趣的嘗試。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • matlab
    +關(guān)注

    關(guān)注

    180

    文章

    2952

    瀏覽量

    229849
  • 機(jī)器人
    +關(guān)注

    關(guān)注

    210

    文章

    27989

    瀏覽量

    205535
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    3992

    瀏覽量

    133215
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2090

    瀏覽量

    73404
  • Arduino
    +關(guān)注

    關(guān)注

    187

    文章

    6455

    瀏覽量

    186348

原文標(biāo)題:暑假怎么玩?來(lái)用 Arduino 機(jī)器人繪制一個(gè) MATLAB Logo 吧!

文章出處:【微信號(hào):MATLAB,微信公眾號(hào):MATLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用Arduino構(gòu)建個(gè)消防機(jī)器人

    在這個(gè)項(xiàng)目中,我們將學(xué)習(xí)如何使用Arduino構(gòu)建個(gè)簡(jiǎn)單的機(jī)器人,它可以向火移動(dòng)并在火周圍抽水來(lái)?yè)錅缁?。這是
    發(fā)表于 11-23 17:10 ?1839次閱讀
    如何使用<b class='flag-5'>Arduino</b>構(gòu)建<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>消防<b class='flag-5'>機(jī)器人</b>

    matlab機(jī)器人

    請(qǐng)問(wèn)一下機(jī)器人的計(jì)算工作是否用MATLAB在計(jì)算呢?能簡(jiǎn)單說(shuō)明下嗎?
    發(fā)表于 05-30 16:58

    DIY個(gè)打招呼的烏龜機(jī)器人

    Arduino IDE自帶)和NewPing.h(點(diǎn)擊這里下載)。我首先定義了觸發(fā)引腳、相應(yīng)引腳以及超聲波傳感器的最大距離;之后我又定義了個(gè)布爾變量,可以用來(lái)切換機(jī)器人的自動(dòng)模式。
    發(fā)表于 12-11 17:26

    如何學(xué)做一個(gè)機(jī)器人

    我想用arduino一個(gè)機(jī)器人。源碼不知道,去哪找。還有應(yīng)該看那些參考書(shū)籍。各位前輩有什么好的建議嗎?
    發(fā)表于 05-15 22:32

    自律型機(jī)器人制作入門.基于Arduino

    開(kāi)始,詳細(xì)介紹了簡(jiǎn)單自律機(jī)器人的制作方法,包括輪型機(jī)器人和關(guān)節(jié)型機(jī)器人兩種類型。讀者可以購(gòu)買相應(yīng)的套件組裝,也可以自己動(dòng)手制作?!蹲月尚?b class='flag-5'>機(jī)器人制作入門:基于
    發(fā)表于 06-23 11:18

    Arduino機(jī)器人制作指南

    Arduino機(jī)器人制作指南
    發(fā)表于 06-14 17:40

    Arduino調(diào)試Rapiro機(jī)器人

    火了把。Rapiro這個(gè)名字來(lái)源于RAspberry PI RObot(樹(shù)莓派機(jī)器人),它是個(gè)12自由度的機(jī)器人,其處理器為MEGA32
    發(fā)表于 08-10 20:19

    怎樣去設(shè)計(jì)個(gè)基于arduino的簡(jiǎn)單記憶機(jī)器人

    arduino的入門作品——簡(jiǎn)單的記憶機(jī)器人作為新手小白但卻有這顆激情與熱愛(ài)的心的我,在昨天上午看到個(gè)記憶機(jī)械手的視頻后實(shí)在是按耐不住自
    發(fā)表于 03-02 07:24

    個(gè)流行的arduino nano避障機(jī)器人項(xiàng)目

    描述arduino nano避障機(jī)器人這是個(gè)流行的 Arduino 機(jī)器人項(xiàng)目。為了避免大量的
    發(fā)表于 08-02 06:44

    構(gòu)建ARLOK arduino機(jī)器人的教程

    描述ARLOK arduino機(jī)器人PCB+展示代碼https://github.com/Settorezero/Arlok
    發(fā)表于 08-08 07:14

    自制5合1 Arduino機(jī)器人

    描述5合1 Arduino機(jī)器人機(jī)器人控制板包含個(gè) ATmega328P 微控制器和
    發(fā)表于 08-23 06:23

    Arduino IDE制作個(gè)劍龍機(jī)器人

    個(gè)非常小的 PCB 來(lái)完成。但是,正如我之前所說(shuō),PCB 也是美學(xué)的基本組成部分。當(dāng)我在腦海中想象整個(gè)機(jī)器人時(shí),我想到它的背面應(yīng)該有個(gè)大的綠色 PCB,上面有獨(dú)特的風(fēng)箏形板。PCB
    發(fā)表于 08-29 07:10

    使用PCB構(gòu)建個(gè)Arduino機(jī)器人避障項(xiàng)目

    描述Arduino 機(jī)器人避障 | PCB版| 更少的布線在這個(gè)項(xiàng)目中,我使用 PCB 構(gòu)建了個(gè)最小的線版本障礙物,以避免汽車或機(jī)器人。技
    發(fā)表于 09-13 06:17

    Arduino教學(xué)機(jī)器人的使用教程

    本文檔的主要內(nèi)容詳細(xì)介紹的是Arduino教學(xué)機(jī)器人的使用教程
    發(fā)表于 09-27 06:53

    制作個(gè)基于Arduino的邊緣避讓機(jī)器人

    電子發(fā)燒友網(wǎng)站提供《制作個(gè)基于Arduino的邊緣避讓機(jī)器人.zip》資料免費(fèi)下載
    發(fā)表于 06-26 09:41 ?0次下載
    制作<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>基于<b class='flag-5'>Arduino</b>的邊緣避讓<b class='flag-5'>機(jī)器人</b>