當(dāng)要使用Micro:bit驅(qū)動(dòng)非板載外設(shè)時(shí),制作專(zhuān)用軟件包并添加到項(xiàng)目,可提高程序的重復(fù)利用率,同時(shí)提高開(kāi)發(fā)效率。
本節(jié)將介紹如何制作Micro:bit擴(kuò)展軟件包:
1.搭載環(huán)境 1.1.安裝node.js
下載地址:https:///en/,根據(jù)32位或64位系統(tǒng)下載不同版本,并安裝,推薦安裝官方推薦版本:
檢查是否安裝成功:打開(kāi)Windows命令行,輸入node -v,輸出版本號(hào)則表明安裝成功:
若未正常顯示版本號(hào),請(qǐng)將安裝路徑添加到系統(tǒng)環(huán)境變量,或重新安裝node.js
1.2.安裝pxt命令行工具
打開(kāi)Windows命令行,輸入:
npm install -g pxt
打若出現(xiàn)以下提示,則成功安裝:1.3.安裝Visual
Studio Code
下載地址:https://code./,根據(jù)32位或64位系統(tǒng)選擇不同的版本下載安裝,該工具為官方推薦工具,編輯TypeScript腳本時(shí)有語(yǔ)法提示,錯(cuò)誤檢查等,推薦使用。
檢查是否安裝成功:打開(kāi)Windows控制臺(tái),輸入code -v,輸出版本號(hào)則表明安裝成功:
若未正常顯示版本號(hào),請(qǐng)將安裝路徑添加到系統(tǒng)環(huán)境變量,或重新安裝Visual Studio Code。 1.4.安裝Git下載地址:https:///,根據(jù)32位或64位系統(tǒng)選擇不同的版本下載安裝,發(fā)布軟件包的時(shí)候需要用到該軟件。
1.5.加載工具鏈新建文件夾,(注意:制作的軟件包也需放至該文件夾的子文件夾下,本次操作是在E:\Program\Project\MicroBit_Project\Server路徑建立microbit文件夾) 在microbit文件夾下加載Micro:bit工具鏈,打開(kāi)Windows命令行進(jìn)入該文件夾,輸入: 該過(guò)程可能持續(xù)幾分鐘,如果出現(xiàn)如下提示,則表明Micro:bit工具鏈加載成功:
此時(shí)輸入: 可查看pxt的命令行幫助:
打開(kāi)microbit文件夾,可見(jiàn)該文件夾下新增如下文件:
2.生成軟件包所需文件在microbit文件夾下,建立projects文件夾,(注意,必須命名為projects,當(dāng)執(zhí)行pxt serve命令時(shí),將會(huì)尋找projects文件夾)。 進(jìn)入projects文件夾,新建文件夾,并以軟件包名稱(chēng)命名(最終會(huì)將該文件夾下所有文件上傳至Github,本次操作中,在projects文件夾下新建MCP23017文件夾),如下圖所示:
打開(kāi)Windows命令行,進(jìn)入到新建的以軟件包名稱(chēng)命名的文件夾 (本次進(jìn)入到MCP23017文件夾),執(zhí)行以下命令,生成軟件包所需的部分文件:
此操作需輸入相關(guān)信息,分別如下: name:模塊名稱(chēng),為軟件包名稱(chēng),該名稱(chēng)將來(lái)也將顯示到makecode界面中。 description:對(duì)軟件包功能的描述,用makecode加載軟件包時(shí)將展示。
license: 軟件授權(quán)條款 輸入相關(guān)信息后,MCP23017文件夾下新增了如下文件:
其中pxt.json則記錄了模塊名稱(chēng),軟件包描述,軟件授權(quán)條款等信息,如下圖所示:
數(shù)據(jù)以json鍵值對(duì)的形式存儲(chǔ),如果需要修改數(shù)據(jù),修改鍵對(duì)應(yīng)的值即可。
3.設(shè)計(jì)驅(qū)動(dòng)代碼及圖形塊打開(kāi)Windows命令行,進(jìn)入到新建的以軟件包名稱(chēng)命名的文件夾 (本次進(jìn)入到MCP23017文件夾),輸入以下命令,采用Visual Studio Code 打開(kāi)該項(xiàng)目: code . 輸入回車(chē)后,VS Code打開(kāi)了該項(xiàng)目(pxt init命令生成的就是一個(gè)VS Code項(xiàng)目):
由于是制作軟件包,不需要main.ts文件,因此,將main.ts重命名為 mcp23017.ts,并在該文件下采用TypeScrip編寫(xiě)MCP23017的驅(qū)動(dòng)代碼,設(shè)計(jì)圖形塊(圖形塊與注釋相關(guān)聯(lián),圖形塊設(shè)計(jì)請(qǐng)參考: https:///defining-blocks ),之后,將pxt.json文件中”file”:下的main.ts修改為MCP23017.ts,如下圖所示:
MCP23017驅(qū)動(dòng)及圖形塊代碼如下圖所示:
cpp代碼:002 | * 使用此文件來(lái)定義自定義函數(shù)和圖形塊。 |
003 | * 想了解更詳細(xì)的信息,請(qǐng)前往 https://makecode./blocks/custom |
040 | //% weight=5 color=#9900CC icon="\uf53b" |
042 | const MCP23017_ADDRESS = 0x20 |
044 | const MCP23017_IODIRA = 0x00 |
045 | const MCP23017_IPOLA = 0x02 |
046 | const MCP23017_GPINTENA = 0x04 |
047 | const MCP23017_DEFVALA = 0x06 |
048 | const MCP23017_INTCONA = 0x08 |
049 | const MCP23017_IOCONA = 0x0A |
050 | const MCP23017_GPPUA = 0x0C |
051 | const MCP23017_INTFA = 0x0E |
052 | const MCP23017_INTCAPA = 0x10 |
053 | const MCP23017_GPIOA = 0x12 |
054 | const MCP23017_OLATA = 0x14 |
056 | const MCP23017_IODIRB = 0x01 |
057 | const MCP23017_IPOLB = 0x03 |
058 | const MCP23017_GPINTENB = 0x05 |
059 | const MCP23017_DEFVALB = 0x07 |
060 | const MCP23017_INTCONB = 0x09 |
061 | const MCP23017_IOCONB = 0x0B |
062 | const MCP23017_GPPUB = 0x0D |
063 | const MCP23017_INTFB = 0x0F |
064 | const MCP23017_INTCAPB = 0x11 |
065 | const MCP23017_GPIOB = 0x13 |
066 | const MCP23017_OLATB = 0x15 |
068 | let initialized = false |
070 | function i2cwrite(addr: number, reg: number, value: number): void { |
071 | let buf = pins.createBuffer(2); |
074 | pins.i2cWriteBuffer(addr, buf); |
077 | function i2cread(addr: number, reg: number): number { |
078 | pins.i2cWriteNumber(addr, reg, NumberFormat.UInt8BE); |
079 | let val = pins.i2cReadNumber(addr, NumberFormat.UInt8BE); |
083 | function initMCP23017(): void { |
084 | for (let regAddr = 0; regAddr < 22; regAddr++) { |
085 | if (regAddr == 0 || regAddr == 1) { |
086 | i2cwrite(MCP23017_ADDRESS, regAddr, 0xFF); |
089 | i2cwrite(MCP23017_ADDRESS, regAddr, 0x00); |
093 | //configue all PinA output |
094 | i2cwrite(MCP23017_ADDRESS, MCP23017_IODIRA, 0x00); |
096 | //configue all PinB input |
097 | i2cwrite(MCP23017_ADDRESS, MCP23017_IODIRB, 0xFF); |
098 | //configue all PinB pullUP |
099 | i2cwrite(MCP23017_ADDRESS, MCP23017_GPPUB, 0xFF); |
106 | *Read data from the register |
107 | * @param reg [0-21] register of mcp23017; eg: 0, 15, 23 |
109 | //% blockId=ReadReg block="Read register |%reg| data" |
111 | export function ReadReg(reg: REGISTER): number { |
112 | let val = i2cread(MCP23017_ADDRESS, reg); |
118 | * WriteData to PinA or PinB |
119 | * @param pin [0-1] choose PinA or PinB; eg: 0, 1 |
120 | * @param value [0-255] pulse of servo; eg: 128, 0, 255 |
122 | //% blockId=WritePin block="Set P |%pin| value |%value|" |
124 | //% value.min=0 value.max=255 |
125 | export function WritePin(pin: PIN, value: number): void { |
130 | i2cwrite(MCP23017_ADDRESS, MCP23017_GPIOA, value); |
133 | i2cwrite(MCP23017_ADDRESS, MCP23017_GPIOB, value); |
138 | *ReadData From PinA or PinB |
139 | * @param pin [0-1] choose PinA or PinB; eg: 0, 1 |
141 | //% blockId=ReadPin block="Read data from |%pin|" |
143 | export function ReadPin(pin: PIN): number { |
148 | let val = i2cread(MCP23017_ADDRESS, MCP23017_GPIOA); |
152 | let val = i2cread(MCP23017_ADDRESS, MCP23017_GPIOB); |
4.編寫(xiě)測(cè)試代碼
在采用pxt
init 生成的文件中,test.ts文件為測(cè)試文件,當(dāng)作為軟件包添加到其它項(xiàng)目中時(shí),該文件不會(huì)被編譯,而作為開(kāi)發(fā)流程中的功能測(cè)試時(shí),該文件將會(huì)被編譯,且單獨(dú)執(zhí)行。
現(xiàn)編寫(xiě)測(cè)試代碼,對(duì)輸出功能進(jìn)行測(cè)試:
在該測(cè)試代碼中,其操作為對(duì)MCP23017的A引腳的輸出寄存器寫(xiě)入十進(jìn)制數(shù)值:85,其二進(jìn)制為:01010101,對(duì)應(yīng)PA0至PA7的電平狀態(tài)分別為:高低高低高低高低。
此次測(cè)試代碼為:
cpp代碼:1 | /* tests go here; this will not be compiled when this package is used as a library*/ |
3 | MCP23017.WritePin(0,85); |
5.編譯檢查,測(cè)試 先進(jìn)行語(yǔ)法檢查,如果有語(yǔ)法出錯(cuò),VS code 會(huì)進(jìn)行提示,及時(shí)在VS Code中改正即可:
打開(kāi)Windows命令行,進(jìn)入到新建的以軟件包名稱(chēng)命名的文件夾 (本次進(jìn)入到MCP23017文件夾),進(jìn)行以下操作: 編譯:(可選) 在命令行輸入:pxt build,該步驟主要方便檢查語(yǔ)法錯(cuò)誤,實(shí)際中,VS Code能夠提示語(yǔ)法錯(cuò)誤,可先在VS Code中修改語(yǔ)法錯(cuò)誤。 編譯并下載:(可選)在命令行輸入:pxt deploy,該步驟為先編譯,編譯成功后直接下載,實(shí)際中,通過(guò)makecode進(jìn)行下載更便捷。 打開(kāi)makecode進(jìn)行編輯并下載:(推薦) 在命令行進(jìn)入到microbit路徑(該路徑下包含projects文件夾,運(yùn)行pxt serve將尋找projects文件夾,若找不到,則將自動(dòng)創(chuàng)建新項(xiàng)目,因此必須先進(jìn)入到含有projects子文件夾的microbit文件夾),如下所示:
在此基礎(chǔ)上,在命令行輸入:pxt serve,運(yùn)行makecode 服務(wù)器,自動(dòng)打開(kāi)makecode網(wǎng)頁(yè):
此時(shí),軟件包已經(jīng)加載到左側(cè),可預(yù)覽軟件包的顏色及圖標(biāo),并可對(duì)圖形塊進(jìn)行移動(dòng),如下圖所示:
但是,在test.ts文件中,僅能以JavaScript代碼的形式進(jìn)行顯示。 連接microbit,點(diǎn)擊左下角的download,程序?qū)⑾螺d到microbit中,運(yùn)行的是test.ts文件中的代碼。
下載后,將MCP23017的PA0-PA7連接至8個(gè)LED(低電平亮),觀察得,PA0-PA7連接的LED分別為滅亮滅亮滅亮滅亮,軟件包測(cè)試通過(guò)。
6.發(fā)布 軟件包測(cè)試通過(guò)后,將其發(fā)布到Github,此次發(fā)布的本地倉(cāng)庫(kù)為MCP23017文件夾,具體發(fā)布流程請(qǐng)參考廖雪峰的Git教程: https://www./ 最后,打開(kāi)Windows命令行進(jìn)入到MCP23017文件夾,輸入pxt bump命令,修改版本號(hào)(修改pxt.json文件中version鍵對(duì)應(yīng)的值)。 將軟件包發(fā)布后,即可根據(jù)Github倉(cāng)庫(kù)鏈接找到軟件包,可在makecode中自由擴(kuò)展該軟件包到項(xiàng)目中了。
|