MicroPython從0到1(用Python做嵌入式編程)_第1頁
MicroPython從0到1(用Python做嵌入式編程)_第2頁
MicroPython從0到1(用Python做嵌入式編程)_第3頁
MicroPython從0到1(用Python做嵌入式編程)_第4頁
MicroPython從0到1(用Python做嵌入式編程)_第5頁
已閱讀5頁,還剩295頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

MicroPython從0到1用Python做嵌入式編程(基于K210平臺)目錄TOC\h\h第一部分MicroPython基礎(chǔ)知識\h第1章MicroPython簡介\h1.1MicroPython是什么\h1.2MicroPython支持的微控制器平臺\h1.3MicroPython相關(guān)學(xué)習(xí)資料\h1.3.101Studio社區(qū)\h1.3.2MicroPython文檔(中文)\h1.3.3MicroPython官方網(wǎng)站\h1.4MicroPython開發(fā)套件介紹\h1.4.1K210平臺\hpyAI-K210\hpyAI-K210開發(fā)套件\h1.4.2pyBase\h1.4.3IOT/通訊模塊\hpyIOT-BLETLS01\hpyIOT-LORAE22\hpyIOT-GPS\h1.4.4拓展配件\hOLED顯示屏\h2.8寸LCD顯示屏(電阻觸摸)\h舵機\hRGB燈帶\hUSB轉(zhuǎn)串口TTL\h第2章Python基礎(chǔ)知識\h2.1原始數(shù)據(jù)類型和運算符\h2.2變量和集合\h2.3流程控制和迭代器\h2.4函數(shù)\h2.5類\h2.6模塊\h2.7高級用法\h第二部分基于K210平臺\h第3章開發(fā)環(huán)境快速建立\h3.1基于Windows\h3.1.1安裝開發(fā)軟件MaixPyIDE\h3.1.2開發(fā)套件使用\h攝像頭接線\hLCD接線\h驅(qū)動安裝\h例程測試\hREPL串口調(diào)試\h文件系統(tǒng)\h固件更新\h3.2基于MacOS\h3.2.1安裝開發(fā)軟件MaixPyIDE\h3.3基于Linux\h3.3.1安裝MaixPyIDE\h第4章基礎(chǔ)實驗\h4.1點亮第一個LED\h4.2流水燈\h4.3按鍵\h4.4外部中斷\h4.5定時器\h4.6PWM\h4.7I2C總線(OLED顯示屏)\h4.8UART(串口通信)\h4.9thread(線程)\h第5章機器視覺\h5.1LCD\h5.2攝像頭應(yīng)用\h5.3畫圖\h5.4顏色識別\h5.5二維碼識別\h5.6人臉檢測\h5.7物體識別\h5.8圖片拍攝\h5.9視頻錄制\h第6章機器聽覺\h6.1聲音頻率識別(FFT)\h6.2聲源定位\h第7章拓展模塊\h7.1電阻觸摸屏\h7.2舵機\h7.3RGB燈帶\h7.4WiFi模塊\h7.4.1連接無線路由器\h7.4.2Socket通信\h7.4.3MQTT通信\h7.5攝像頭鏡頭\h7.5.1廣角鏡頭\h7.5.2長焦鏡頭\h7.5.3無畸變鏡頭\h7.5.4手動調(diào)焦鏡頭\h第8章項目應(yīng)用\h8.1照相機\h8.2視頻播放器\h8.3NES游戲機第一部分MicroPython基礎(chǔ)知識第1章MicroPython簡介1.1MicroPython是什么第一次接觸MicroPyhon的時候,我就想這是個什么玩意,從字面意思來看,就是Micro加Python。難道是閹割版的Python?閹割后可以在微控制器上面跑?當然你也可以這么理解,我們來看看官方的說明:“MicroPython是Python3編程語言的精簡高效實現(xiàn),包括Python標準庫的一小部分,并且經(jīng)過優(yōu)化,可以在Microcontrollers(微控制器)和有限的環(huán)境中運行。MicroPython包含許多高級功能,如交互式提示,任意精度整數(shù),閉包,列表理解,生成器,異常處理等。然而它非常緊湊,可以在256k的代碼空間和16k的RAM內(nèi)運行。MicroPyhon旨在盡可能與普通Python兼容,以便您輕松地將代碼從電腦傳輸?shù)轿⒖刂破骰蛘咔度胧较到y(tǒng)?!笨赐旯俜秸f明后,大家應(yīng)該有所了解,Micropyton是指在微控制器上使用Python語言進行編程,學(xué)習(xí)過單片機和嵌入式開發(fā)的小伙伴應(yīng)該都知道早期的單片機使用匯編語言來編程,隨著微處理器的發(fā)展,后來逐步被C所取代,現(xiàn)在的微處理器集成度越來越高了,那么我們現(xiàn)在可以使用Python語言來開發(fā)了。Python的強大之處是封裝了大量的庫,開發(fā)者直接調(diào)用庫函數(shù)則可以高效地完成大量復(fù)雜的開發(fā)工作。MicroPython保留了這一特性,常用功能都封裝到庫中了,以及一些常用的傳感器和組件都編寫了專門的驅(qū)動,通過調(diào)用相關(guān)函數(shù),就可以直接控制LED、按鍵、伺服電機、PWM、AD/DA、UART、SPI、IIC以及DS18B20溫度傳感器等等。以往需要花費數(shù)天編寫才能實現(xiàn)的硬件功能代碼,現(xiàn)在基于MicroPython開發(fā)只要十幾分鐘甚至幾行代碼就可以解決。真可謂:“人生苦短,我用Python和MicroPython”。71.2MicroPython支持的微控制器平臺MicroPython到目前為止已經(jīng)可以在多種嵌入式硬件平臺上運行:STM32、ESP8266、ESP32、CC3200、K210等等。由于項目的開源特性,很多開發(fā)者在嘗試將其移植到更多平臺上。MicroPython最早支持的硬件平臺是STM32,開發(fā)板名稱叫pyboard。使用的芯片型號是:STM32F405RGT6,該芯片具備1MBflash和196kSRAM,168MHZ主頻。除此之外,上海樂鑫的WIFI芯片ESP8266/ESP32也非常成熟。用戶使用MicroPython可以快速開發(fā)物聯(lián)網(wǎng)相關(guān)應(yīng)用,實現(xiàn)WIFI無線連接。除此之外,不少優(yōu)秀的開源項目也是基于MicroPythno衍生出來的,如機器視覺界Arduino之稱的OpenMV、人工智能芯片K210等。隨著社區(qū)的日益成熟,MicroPython必定將嵌入式編程推向新的高度。本書主要是圍繞K210平臺來進行編寫。圖1-1pyAI-K210+攝像頭模塊以下是01Studio其它micropython開發(fā)平臺:8STM32ESP8266ESP32NFR52840OpenMV4K210平臺平臺平臺平臺平臺平臺圖1-201StudioMicroPython系列開發(fā)平臺91.3MicroPython相關(guān)學(xué)習(xí)資料1.3.101Studio社區(qū)\h【社區(qū)網(wǎng)址:www.01S】01Studio社區(qū)是MicroPython開發(fā)者交流的社區(qū)論壇,我們以極簡風格設(shè)計,開發(fā)者在學(xué)習(xí)過程中遇到問題可以到論壇搜索或者發(fā)帖提問,以提高學(xué)習(xí)效率。01Studio團隊也會在社區(qū)定期發(fā)布學(xué)習(xí)資源。圖1-301Studio社區(qū)101.3.2MicroPython文檔(中文)限于篇幅,本教程部分實驗只介紹關(guān)鍵的函數(shù)和模塊應(yīng)用,如果在學(xué)習(xí)過程中希望深入了解MicroPython函數(shù)和模塊,請查閱:MicroPython文檔(中文)\h【網(wǎng)址:】圖1-4文檔在社區(qū)的位置該文檔是01Studio團隊在維護的官方文檔中文翻譯版,我們力求保持與官方文檔保持實時同步,降低開發(fā)者的學(xué)習(xí)門檻。圖1-5MciroPython文檔(中文)111.3.3MicroPython官方網(wǎng)站\h【網(wǎng)址:】英文版官網(wǎng)有官方文檔(DOCS)和英文論壇,適合比較英語比較好的小伙伴。圖1-6MicroPython官網(wǎng)121.4MicroPython開發(fā)套件介紹為了讓廣大電子愛好者更方便地學(xué)習(xí)MicroPython,01Studio團隊打造了一系列本土化的高性價比學(xué)習(xí)套件和周邊模塊。當前已支持STM32平臺、ESP8266平臺、ESP32平臺、NRF52840平臺、OpenMV平臺、K210平臺以及周邊傳感器模塊和配件外設(shè)。我們的開發(fā)平臺采用核心板+底板形式設(shè)計,保留了MicroPyhon官方的兼容性,同時使開發(fā)者可以更好的連接外設(shè),進行更多擴展性實驗?!禡icroPython從0到1》上的例程也是基于本學(xué)習(xí)平臺開發(fā)的,我們承諾資源會不斷更新,保證所有代碼程序能直接跑起。毫不夸張地說:你甚至可以將本教材的例程和實踐應(yīng)用在自己的產(chǎn)品研發(fā)和項目開發(fā)中去。131.4.1K210平臺pyAI-K210pyAI-K210是由01Studio設(shè)計研發(fā),基于嘉楠科技邊緣計算芯片K210(RSIC-V架構(gòu),64位雙核)方案的一款開發(fā)板,其接口兼容MicroPython的pyBoard,主要特點如下:(1)兼容pyBoard接口;(2)板載鋰電池輸入接口和充電電路;(3)引出復(fù)位和功能按鍵,布局合理,絲印清晰。圖1-7pyAI-K210(正反面)14圖1-8pyAI-K210引腳圖功能參數(shù)V+3.6V–6V輸入(當插入USB時候由USB供電,電壓為5V,建議使用USB口供電)3V33.3V輸出,最大電流600mAVBAT鋰電池輸入(板載FET保護電路和充電電路)LEDRGB三色按鍵RST-復(fù)位;KEY-引腳“16”SD卡最大支持32GB(SDHC)其它所有外部引腳支持任意GPIO內(nèi)部映射表1-1pyAI-K210功能參數(shù)表15pyAI-K210開發(fā)套件圖1-9pyAI-K210開發(fā)套件功能描述主要配置核心板pyAI-K210(配攝像頭)底板pyBase顯示屏2.8寸LCD/0.9寸OLED顯示屏表1-2161.4.2pyBasepyBase是01Studio針對各micropython開發(fā)平臺量身定制的底板,可以使用它可以做更多的MicroPython實驗,pyBase同時設(shè)計了外設(shè)接口,擴展性非常強。以下是詳細的功能說明:圖1-10pyBase功能說明功能參數(shù)pyboard接口兼容pyboardv1.1-CN以及官方的pyboard2.54mm排針引出pyboard全部接口按鍵2個引出RST和USR按鍵電位器ADC輸入無源蜂鳴器DAC輸出紐扣電池座安裝CR1220紐扣電池Servo接口舵機接口X1-X4(連接舵機需要外接隔離電路)OLED接口4P/0.96寸/I2C/OLED顯示屏1.77寸LCD接口適用于01Studio1.77寸LCD顯示屏2.4寸LCD接口適用于01Studio2.4寸LCD顯示屏(帶電阻觸摸)溫度傳感器DS18B20溫濕度傳感器DHT11Sensor接口13P防呆接口,用于外接傳感器17Sensor接口13P防呆接口,用于外接傳感器通訊接口4P防呆接口,用于外接UART/I2C設(shè)備鋰電池充電電路對接入的鋰電池進行充電(紅燈->充電,綠燈->充滿)表1-3181.4.3IOT/通訊模塊pyIOT開源項目由01Studio發(fā)起,旨在為市面上成熟的串口物聯(lián)網(wǎng)模塊開發(fā)MicroPython庫,讓用戶可以使用python編程快速實現(xiàn)各類物聯(lián)網(wǎng)相關(guān)應(yīng)用。pyIOT-BLETLS01圖1-11功能參數(shù)藍牙主控TLSR8266控制方式UART(串口)藍牙版本BLE4.0(從機)功耗工作電流:<8.8mA,廣播電流:<1mA引腳GND,3.3V,TX,RX模塊尺寸4.5*2.5cm表1-419pyIOT-LORAE22圖1-12功能參數(shù)工作頻段410~493MHz(433M)射頻芯片SX1268發(fā)射功率22dBm通訊距離最大:5km通訊接口UART(串口)天線IPEX發(fā)射電流110mA供電電壓2.3-5.2V工作溫度-40℃-85℃波特率1200–115200bps(默認9600)空中速率0.3k–42.5kbps接收長度1024字節(jié)(自動分包)模塊尺寸4.2*2.5cm表1-520pyIOT-GPS圖1-13功能參數(shù)主控芯片ATGM336H-5N衛(wèi)星信號GPS/BDS/GLONASS波特率9600bps工作電壓3.3V-5V串口電平3.3V或5V(自適應(yīng))定位精度2.5m(開闊地點)功耗工作:<25mA,待機:<10uA(@3.3V)模塊尺寸4.2*2.5cm表1-61.4.4拓展配件OLED顯示屏21圖1-14OLED顯示屏功能參數(shù)供電電壓3.3V屏幕尺寸0.9寸顏色參數(shù)黑底白字通訊方式I2C總線接口定義2.54mm排針(4Pin)【VCC、GND、SCL、SDA】整體尺寸2.8*2.8cm表1-7222.8寸LCD顯示屏(電阻觸摸)圖1-152.4寸LCD顯示屏(電阻觸摸)功能參數(shù)供電電壓3.3V屏幕尺寸2.8寸分辨率240*320顏色參數(shù)TFT彩色驅(qū)動芯片ST7789V+NS2009觸摸方式電阻屏通訊方式8位并口總線接口定義24P-0.5mmFPC座整體尺寸7*5cm表1-823舵機圖1-16舵機功能參數(shù)尺寸32*30*1.1mm重量15g扭力1.6kg/cm接口XH2.54接口(3Pin)【GND(黑)、VCC(紅)、Single(橙)】工作電壓3.5-6V工作溫度-30℃-60℃轉(zhuǎn)動角度180°和360°連續(xù)旋轉(zhuǎn)。應(yīng)用場景固定翼、直升機KT、機器人、機械臂、航模等表1-924RGB燈帶圖1-17RGB燈帶功能參數(shù)燈帶長度1米燈珠數(shù)量30顏色RGB全彩接口定義XH2.54防呆接口(3Pin)【GND、VCC、Single】驅(qū)動ICWS2812B供電電壓3.3-5V功率每顆燈珠最高0.3W應(yīng)用場景流水燈/呼吸燈/節(jié)日燈飾布置等表1-1025USB轉(zhuǎn)串口TTL圖1-18USB轉(zhuǎn)串口TTL功能參數(shù)驅(qū)動芯片CH340對外供電5V和3.3V支持電平3.3V和5V可切換引腳接口2.54MM排針表1-1126第2章Python基礎(chǔ)知識由于python語言是學(xué)習(xí)micropython的基礎(chǔ),為了照顧沒有pyhton基礎(chǔ)的朋友,我們一直在思考應(yīng)該給大家提供怎么樣的教程。Python相關(guān)的書籍和學(xué)習(xí)資料相信大家能在網(wǎng)上找到不少,所以這里整理給大家的經(jīng)典的python3快速學(xué)習(xí)資料,你甚至可以使用它來當作python字典查閱!【原著:LouieDinh,翻譯:GeoffLiu】#用井字符開頭的是單行注釋"""多行字符串用三個引號包裹,也常被用來做多行注釋"""2.1原始數(shù)據(jù)類型和運算符######################################################1.原始數(shù)據(jù)類型和運算符#####################################################整數(shù)3#=>3#算術(shù)沒有什么出乎意料的1+1#=>28-1#=>710*2#=>2027#但是除法例外,會自動轉(zhuǎn)換成浮點數(shù)35/5#=>7.05/3#=>1.6666666666666667#整數(shù)除法的結(jié)果都是向下取整5//3#=>15.0//3.0#=>1.0#浮點數(shù)也可以-5//3#=>-2-5.0//3.0#=>-2.0#浮點數(shù)的運算結(jié)果也是浮點數(shù)3*2.0#=>6.0#模除7%3#=>1#x的y次方2**4#=>16#用括號決定優(yōu)先級(1+3)*2#=>8#布爾值TrueFalse#用not取非notTrue#=>FalsenotFalse#=>True28#邏輯運算符,注意and和or都是小寫TrueandFalse#=>FalseFalseorTrue#=>True#整數(shù)也可以當作布爾值0and2#=>0-5or0#=>-50==False#=>True2==True#=>False1==True#=>True#用==判斷相等1==1#=>True2==1#=>False#用!=判斷不等1!=1#=>False2!=1#=>True#比較大小1<10#=>True1>10#=>False2<=2#=>True2>=2#=>True#大小比較可以連起來!1<2<3#=>True2<3<2#=>False29#字符串用單引雙引都可以"這是個字符串"'這也是個字符串'#用加號連接字符串"Hello"+"world!"#=>"Helloworld!"#字符串可以被當作字符列表"Thisisastring"[0]#=>'T'#用.format來格式化字符串"{}canbe{}".format("strings","interpolated")#可以重復(fù)參數(shù)以節(jié)省時間"{0}benimble,{0}bequick,{0}jumpoverthe{1}".format("Jack","candlestick")#=>"Jackbenimble,Jackbequick,Jackjumpoverthecandlestick"#如果不想數(shù)參數(shù),可以用關(guān)鍵字"{name}wantstoeat{food}".format(name="Bob",food="lasagna")#=>"Bobwantstoeatlasagna"#如果你的Python3程序也要在Python2.5以下環(huán)境運行,也可以用老式的格式化語法"%scanbe%sthe%sway"%("strings","interpolated","old")#None是一個對象None#=>None#當與None進行比較時不要用==,要用is。is是用來比較兩個變量是否指向同一個對象。30"etc"isNone#=>FalseNoneisNone#=>True#None,0,空字符串,空列表,空字典都算是False#所有其他值都是Truebool(0)#=>Falsebool("")#=>Falsebool([])#=>Falsebool({})#=>False312.2變量和集合######################################################2.變量和集合#####################################################print是內(nèi)置的打印函數(shù)print("I'mPython.Nicetomeetyou!")#在給變量賦值前不用提前聲明#傳統(tǒng)的變量命名是小寫,用下劃線分隔單詞some_var=5some_var#=>5#訪問未賦值的變量會拋出異常#參考流程控制一段來學(xué)習(xí)異常處理some_unknown_var#拋出NameError#用列表(list)儲存序列l(wèi)i=[]#創(chuàng)建列表時也可以同時賦給元素other_li=[4,5,6]#用append在列表最后追加元素li.append(1)#li現(xiàn)在是[1]li.append(2)#li現(xiàn)在是[1,2]li.append(4)#li現(xiàn)在是[1,2,4]li.append(3)#li現(xiàn)在是[1,2,4,3]#用pop從列表尾部刪除32li.pop()#=>3且li現(xiàn)在是[1,2,4]#把3再放回去li.append(3)#li變回[1,2,4,3]#列表存取跟數(shù)組一樣li[0]#=>1#取出最后一個元素li[-1]#=>3#越界存取會造成IndexErrorli[4]#拋出IndexError#列表有切割語法li[1:3]#=>[2,4]#取尾li[2:]#=>[4,3]#取頭li[:3]#=>[1,2,4]#隔一個取一個li[::2]#=>[1,4]#倒排列表li[::-1]#=>[3,4,2,1]#可以用三個參數(shù)的任何組合來構(gòu)建切割#li[始:終:步伐]#用del刪除任何一個元素delli[2]#liisnow[1,2,3]#列表可以相加#注意:li和other_li的值都不變33li+other_li#=>[1,2,3,4,5,6]#用extend拼接列表li.extend(other_li)#li現(xiàn)在是[1,2,3,4,5,6]#用in測試列表是否包含值1inli#=>True#用len取列表長度len(li)#=>6#元組是不可改變的序列tup=(1,2,3)tup[0]#=>1tup[0]=3#拋出TypeError#列表允許的操作元組大都可以len(tup)#=>3tup+(4,5,6)#=>(1,2,3,4,5,6)tup[:2]#=>(1,2)2intup#=>True#可以把元組合列表解包,賦值給變量a,b,c=(1,2,3)#現(xiàn)在a是1,b是2,c是3#元組周圍的括號是可以省略的d,e,f=4,5,6#交換兩個變量的值就這么簡單e,d=d,e#現(xiàn)在d是5,e是434#用字典表達映射關(guān)系empty_dict={}#初始化的字典filled_dict={"one":1,"two":2,"three":3}#用[]取值filled_dict["one"]#=>1#用keys獲得所有的鍵。#因為keys返回一個可迭代對象,所以在這里把結(jié)果包在list里。我們下面會詳細介紹可迭代。#注意:字典鍵的順序是不定的,你得到的結(jié)果可能和以下不同。list(filled_dict.keys())#=>["three","two","one"]#用values獲得所有的值。跟keys一樣,要用list包起來,順序也可能不同。list(filled_dict.values())#=>[3,2,1]#用in測試一個字典是否包含一個鍵"one"infilled_dict#=>True1infilled_dict#=>False#訪問不存在的鍵會導(dǎo)致KeyErrorfilled_dict["four"]#KeyError#用get來避免KeyErrorfilled_dict.get("one")#=>135filled_dict.get("four")#=>None#當鍵不存在的時候get方法可以返回默認值filled_dict.get("one",4)#=>1filled_dict.get("four",4)#=>4#setdefault方法只有當鍵不存在的時候插入新值filled_dict.setdefault("five",5)#filled_dict["five"]設(shè)為5filled_dict.setdefault("five",6)#filled_dict["five"]還是5#字典賦值filled_dict.update({"four":4})#=>{"one":1,"two":2,"three":3,"four":4}filled_dict["four"]=4#另一種賦值方法#用del刪除delfilled_dict["one"]#從filled_dict中把one刪除#用set表達集合empty_set=set()#初始化一個集合,語法跟字典相似。some_set={1,1,2,2,3,4}#some_set現(xiàn)在是{1,2,3,4}#可以把集合賦值于變量filled_set=some_set#為集合添加元素filled_set.add(5)#filled_set現(xiàn)在是{1,2,3,4,5}#&取交集36other_set={3,4,5,6}filled_set&other_set#=>{3,4,5}#|取并集filled_set|other_set#=>{1,2,3,4,5,6}#-取補集{1,2,3,4}-{2,3,5}#=>{1,4}#in測試集合是否包含元素2infilled_set#=>True10infilled_set#=>False372.3流程控制和迭代器######################################################3.流程控制和迭代器#####################################################先隨便定義一個變量some_var=5#這是個if語句。注意縮進在Python里是有意義的#印出"some_var比10小"ifsome_var>10:print("some_var比10大")elifsome_var<10:#elif句是可選的print("some_var比10小")else:#else也是可選的print("some_var就是10")"""用for循環(huán)語句遍歷列表打印:dogisamammalcatisamammalmouseisamammal"""foranimalin["dog","cat","mouse"]:print("{}isamammal".format(animal))"""38"range(number)"返回數(shù)字列表從0到給的數(shù)字打印:0123"""foriinrange(4):print(i)"""while循環(huán)直到條件不滿足打印:0123"""x=0whilex<4:print(x)x+=1#x=x+1的簡寫#用try/except塊處理異常狀況try:#用raise拋出異常raiseIndexError("Thisisanindexerror")exceptIndexErrorase:pass#pass是無操作,但是應(yīng)該在這里處理錯誤except(TypeError,NameError):39pass#可以同時處理不同類的錯誤else:#else語句是可選的,必須在所有的except之后print("Allgood!")#只有當try運行完沒有錯誤的時候這句才會運行#Python提供一個叫做可迭代(iterable)的基本抽象。一個可迭代對象是可以被當作序列#的對象。比如說上面range返回的對象就是可迭代的。filled_dict={"one":1,"two":2,"three":3}our_iterable=filled_dict.keys()print(our_iterable)#=>dict_keys(['one','two','three']),是一個實現(xiàn)可迭代接口的對象#可迭代對象可以遍歷foriinour_iterable:print(i)#打印one,two,three#但是不可以隨機訪問our_iterable[1]#拋出TypeError#可迭代對象知道怎么生成迭代器our_iterator=iter(our_iterable)#迭代器是一個可以記住遍歷的位置的對象#用__next__可以取得下一個元素our_iterator.__next__()#=>"one"#再一次調(diào)取__next__時會記得位置our_iterator.__next__()#=>"two"40our_iterator.__next__()#=>"three"#當?shù)魉性囟既〕龊?,會拋出StopIterationour_iterator.__next__()#拋出StopIteration#可以用list一次取出迭代器所有的元素list(filled_dict.keys())#=>Returns["one","two","three"]412.4函數(shù)######################################################4.函數(shù)#####################################################用def定義新函數(shù)defadd(x,y):print("xis{}andyis{}".format(x,y))returnx+y#用return語句返回#調(diào)用函數(shù)add(5,6)#=>印出"xis5andyis6"并且返回11#也可以用關(guān)鍵字參數(shù)來調(diào)用函數(shù)add(y=6,x=5)#關(guān)鍵字參數(shù)可以用任何順序#我們可以定義一個可變參數(shù)函數(shù)defvarargs(*args):returnargsvarargs(1,2,3)#=>(1,2,3)#我們也可以定義一個關(guān)鍵字可變參數(shù)函數(shù)defkeyword_args(**kwargs):returnkwargs42#我們來看看結(jié)果是什么:keyword_args(big="foot",loch="ness")#=>{"big":"foot","loch":"ness"}#這兩種可變參數(shù)可以混著用defall_the_args(*args,**kwargs):print(args)print(kwargs)"""all_the_args(1,2,a=3,b=4)prints:(1,2){"a":3,"b":4}"""#調(diào)用可變參數(shù)函數(shù)時可以做跟上面相反的,用*展開序列,用**展開字典。args=(1,2,3,4)kwargs={"a":3,"b":4}all_the_args(*args)#相當于foo(1,2,3,4)all_the_args(**kwargs)#相當于foo(a=3,b=4)all_the_args(*args,**kwargs)#相當于foo(1,2,3,4,a=3,b=4)#函數(shù)作用域x=5defsetX(num):#局部作用域的x和全局域的x是不同的x=num#=>43print(x)#=>4343defsetGlobalX(num):globalxprint(x)#=>5x=num#現(xiàn)在全局域的x被賦值print(x)#=>6setX(43)setGlobalX(6)#函數(shù)在Python是一等公民defcreate_adder(x):defadder(y):returnx+yreturnadderadd_10=create_adder(10)add_10(3)#=>13#也有匿名函數(shù)(lambdax:x>2)(3)#=>True#內(nèi)置的高階函數(shù)map(add_10,[1,2,3])#=>[11,12,13]filter(lambdax:x>5,[3,4,5,6,7])#=>[6,7]#用列表推導(dǎo)式可以簡化映射和過濾。列表推導(dǎo)式的返回值是另一個列表。[add_10(i)foriin[1,2,3]]#=>[11,12,13][xforxin[3,4,5,6,7]ifx>5]#=>[6,7]442.5類######################################################5.類#####################################################定義一個繼承object的類classHuman(object):#類屬性,被所有此類的實例共用。species="H.sapiens"#構(gòu)造方法,當實例被初始化時被調(diào)用。注意名字前后的雙下劃線,這是表明這個屬#性或方法對Python有特殊意義,但是允許用戶自行定義。你自己取名時不應(yīng)該用這#種格式。def__init__(self,name):#Assigntheargumenttotheinstance'snameattribute=name#實例方法,第一個參數(shù)總是self,就是這個實例對象defsay(self,msg):return"{name}:{message}".format(name=,message=msg)#類方法,被所有此類的實例共用。第一個參數(shù)是這個類對象。@classmethoddefget_species(cls):returncls.species45#靜態(tài)方法。調(diào)用時沒有實例或類的綁定。@staticmethoddefgrunt():return"*grunt*"#構(gòu)造一個實例i=Human(name="Ian")print(i.say("hi"))#印出"Ian:hi"j=Human("Joel")print(j.say("hello"))#印出"Joel:hello"#調(diào)用一個類方法i.get_species()#=>"H.sapiens"#改一個共用的類屬性Human.species="H.neanderthalensis"i.get_species()#=>"H.neanderthalensis"j.get_species()#=>"H.neanderthalensis"#調(diào)用靜態(tài)方法Human.grunt()#=>"*grunt*"462.6模塊######################################################6.模塊#####################################################用import導(dǎo)入模塊importmathprint(math.sqrt(16))#=>4.0#也可以從模塊中導(dǎo)入個別值frommathimportceil,floorprint(ceil(3.7))#=>4.0print(floor(3.7))#=>3.0#可以導(dǎo)入一個模塊中所有值#警告:不建議這么做frommathimport*#如此縮寫模塊名字importmathasmmath.sqrt(16)==m.sqrt(16)#=>True#Python模塊其實就是普通的Python文件。你可以自己寫,然后導(dǎo)入,#模塊的名字就是文件的名字。#你可以這樣列出一個模塊里所有的值importmathdir(math)472.7高級用法######################################################7.高級用法#####################################################用生成器(generators)方便地寫惰性運算defdouble_numbers(iterable):foriiniterable:yieldi+i#生成器只有在需要時才計算下一個值。它們每一次循環(huán)只生成一個值,而不是把所有的#值全部算好。##range的返回值也是一個生成器,不然一個1到900000000的列表會花很多時間和內(nèi)存。##如果你想用一個Python的關(guān)鍵字當作變量名,可以加一個下劃線來區(qū)分。range_=range(1,900000000)#當找到一個>=30的結(jié)果就會停#這意味著`double_numbers`不會生成大于30的數(shù)。foriindouble_numbers(range_):print(i)ifi>=30:break#裝飾器(decorators)#這個例子中,beg裝飾say48#beg會先調(diào)用say。如果返回的say_please為真,beg會改變返回的字符串。fromfunctoolsimportwrapsdefbeg(target_function):@wraps(target_function)defwrapper(*args,**kwargs):msg,say_please=target_function(*args,**kwargs)ifsay_please:return"{}{}".format(msg,"Please!Iampoor:(")returnmsgreturnwrapper@begdefsay(say_please=False):msg="Canyoubuymeabeer?"returnmsg,say_pleaseprint(say())#Canyoubuymeabeer?print(say(say_please=True))#Canyoubuymeabeer?Please!Iampoor:(49第二部分基于K210平臺K210是嘉楠(Cannaan)科技的一款集成機器視覺與機器聽覺能力的系統(tǒng)級芯片(RSIC-VCPU)。使用臺積電(TSMC)超低功耗的28納米先進制程,具有雙核64位處理器,擁有較好的功耗性能,穩(wěn)定性與可靠性。該方案力求零門檻開發(fā),可在最短時效部署于用戶的產(chǎn)品中,賦予產(chǎn)品人工智能(AI)??梢哉f是集性能強勁與高性價比于一身。這么強大的MCU,配合MicroPython進行開發(fā)可以說是如虎添翼,那就是MaixPy開源項目。MaixPy是中國Spieed團隊發(fā)起將MicroPython移植到K210的開源項目,通過MicroPython編程,我們可以輕松實現(xiàn)基于K210的MCU編程和各類AI算法,如機器視覺、機器聽覺等。可以說這個平臺是一個徹頭徹尾的國產(chǎn)開源項目。在開源技術(shù)越來越流行的今天,我們01Studio希望國內(nèi)能有更多更優(yōu)秀的開源項目走向全球。如果你學(xué)習(xí)了前面的平臺,那么恭喜你,對于K210平臺你會非??焖偕鲜帧H绻銢]有學(xué)習(xí)過任何一個MicroPython平臺那也沒關(guān)系,你可以借助K210平臺和Maxipy的學(xué)習(xí)從而入門MicroPython。pyAI-K210開發(fā)套件50第3章開發(fā)環(huán)境快速建立3.1基于Windows3.1.1安裝開發(fā)軟件MaixPyIDEMaixPy擁有自己官方的IDE,可以在官網(wǎng)下載,我們使用該IDE可以輕松進行開發(fā)。而且擁有Windows、MacOS、Linux等版本。當前版本為v0.2.4,官網(wǎng)下載地址:(如有更新請下載最新版)\h/MAIX/MaixPy/ide/_/v0.2.4,下載界面如下圖。用戶可以根據(jù)自己系統(tǒng)選擇合適的版本下載安裝。Window用戶選擇exe格式文件下載安裝。圖3-1MaixPyIDE下載界面安裝完成后如果在桌面沒用找到該軟件,可以在安裝路徑或者在系統(tǒng)搜索欄搜索Maixpy關(guān)鍵詞找到該軟件。51圖3-2搜索MaixpyIDE打開軟件,如下圖所示,至此安裝完成。可以看到跟OpenMVIDE長得很像,因為MaixPy就是基于OpenMVIDE衍生出來的。圖3-3MaixPyIDE523.1.2開發(fā)套件使用攝像頭接線攝像頭模塊建議使用配套的6cm長排線。pyAI-K210集成了24P攝像頭接口,可以直接連接標準OV2640等24P攝像頭模塊,排線接線方式均為下接(排線金手指朝下),具體如下:(注意核心板上的FPC座為后翻蓋,也就是在后邊翻開,插進排線,再鎖緊)圖3-4攝像頭接線方式接完后可以直接將K210攝像頭模塊插到pyAI-K210的拓展排母上,由于攝像頭的排針均沒有電氣連接,所以可以根據(jù)自己需要任意擺放位置。圖3-5攝像頭位置任意擺放53LCD接線LCD模塊建議使用配套的20cm長排線。2.8寸LCD跟pyAI-K210通過底部的24P排線連接,注意排線均為下接(排線金手指朝下)。將排線塞進座子,扣下即可。圖3-6pyAI-K210與2.8寸LCD接線方式2.8寸LCD背面的排母是沒有電氣連接的,僅僅是為了方便用戶安裝,可以接到pyAI-K210背面或者pyBase上,具體如下:54圖3-7LCD與pyAI-K210pyAI-K210與LCD連接后,可以插到pyBase上,建議排線藏到后方,首次插進注意排線不要壓著即可。組裝完成如下圖所示。圖3-8LCD與pyBase55驅(qū)動安裝pyAI-K210通過串口燒寫程序和通信,因此主主要是安裝USB轉(zhuǎn)串口驅(qū)動。我們將pyAI-K210開發(fā)板通過MicroUSB數(shù)據(jù)線連接到電腦:圖3-9通過MicroUSB線連接到電腦如果你的操作系統(tǒng)是Win10,一般情況下能自動安裝。鼠標右鍵點擊“我的電腦”—屬性—設(shè)備管理器:出現(xiàn)串口號說明安裝成功,如下圖所示。56圖3-10串口驅(qū)動成功安裝如果無法安裝,請手動安裝驅(qū)動,方法如下:不能自動安裝時候,設(shè)備會出現(xiàn)黃色嘆號,這時候點擊設(shè)備右鍵,選擇“更新驅(qū)動程序”,選擇“瀏覽計算機查找驅(qū)動”:圖3-1157驅(qū)動路徑選擇:零一科技(01Studio)MicroPython開發(fā)套件配套資料\01-開發(fā)工具\01-Windows\串口終端工具\CP210x驅(qū)動,點擊確認后即可自動安裝:圖3-12安裝成功后如下圖:圖3-13串口驅(qū)動安裝成功58例程測試我們使用MaixPyIDE來進行我們的第一個實驗,借此來熟悉開發(fā)環(huán)境。將pyAI-K210開發(fā)板通過MicroUSB線連接到電腦。打開MaixPyIDE,我們先打開配套資料包里面的例程代碼(這里暫時不對代碼進行講解,后面章節(jié)會有詳細內(nèi)容)。我們用最簡單的LED程序來測試,在MaixPyIDE中打開零一科技(01Studio)MicroPython開發(fā)套件配套資料_latest\02-示例程序\5.pyAI-K210\1.基礎(chǔ)實驗\1.點亮第一個LED里面的LED.py例程(也可以直接拖動過去),如下圖所示:圖3-14接下來我們需要連接開發(fā)板,pyAI-K210的串口驅(qū)動芯片跟Maix的DOCK接近,因此可以在IDE頂部點擊工具,選擇Dock。圖3-1559接下來點擊左下角連接按鈕:圖3-16點擊連接按鈕連接成功后,運行按鈕變成綠色。圖3-17連接成功當前的例程是點亮LED藍燈,我們點擊綠色按鍵“運行”按鈕,當看到pyAI-K210開發(fā)板上的藍燈亮?xí)r,說明實驗成功:60圖3-18第一個實驗以上測試是基于IDE的在線運行功能,當然你也可以直接將py文件保存到開發(fā)板的文件系統(tǒng)中,這樣程序不再依賴IDE就可以直接運行。具體方法如下:在連接狀態(tài)下點擊工具—將打開的腳本保存到開發(fā)板的boot.py,這里的意思是將當前編輯框的代碼拷貝到開發(fā)板文件系統(tǒng)中的boot.py,由于boot.py是Maixpy上電運行的第一個腳本文件,因此相當于實現(xiàn)了上電運行寫入的程序。圖3-19復(fù)制文件到pyAI-K210文件系統(tǒng)點擊后出現(xiàn)以下提示,點yes確認。61圖3-20點擊YES當出現(xiàn)保存腳本成功,說明程序燒寫成功。圖3-21我們按下開發(fā)板的復(fù)位鍵(RST),可以看到開發(fā)板上電后藍燈亮,說明程序文件已經(jīng)燒錄進去了。圖3-22復(fù)位后程序運行MaixpyIDE集成了串口調(diào)試窗口,點擊IDE左下角“串口終端”,即可觀察到串口打印的信息。62圖3-23串口終端信息顯示63REPL串口調(diào)試上一節(jié)在IDE中的串口終端打印調(diào)試數(shù)據(jù),并不能實現(xiàn)交互,pyAI-K210的MicroPython固件集成了交互解釋器REPL【讀取(Read)-運算(Eval)-輸出(Print)-循環(huán)(Loop)】,開發(fā)者可以直接通過串口終端來調(diào)試pyboard或micropython開發(fā)套件。我們使用的軟件是一款免費的串口終端軟件putty。將開發(fā)板連接到電腦,從我的電腦—屬性—設(shè)備管理器中找到當前的串口號,這里是COM4。圖3-24找到串口號打開MicroPython開發(fā)套件配套資料\開發(fā)工具\串口終端工具\Putty.exe,選擇左下角Serial,配置信息如下:64圖3-25配置串行設(shè)備參數(shù)配置好后不是點open,而是點左邊上方Session,選擇Serial后可看到剛剛的配置信息。串口號通常不會變化,我們在SaveSession下方輸入COM4或者自己喜歡的名稱,點右邊Save,在空白框里面就出現(xiàn)COM4字樣,以后可以直接使用。設(shè)置好后我們點擊Open。圖3-2665出現(xiàn)下面對話框,是不是似曾相識,沒錯,跟我們之前在計算機命令行執(zhí)行python指令后出現(xiàn)類似的。上面主要是當前設(shè)備固件的版本號。圖3-27現(xiàn)在對話框相當于連接上了開發(fā)板上,由于pyAI-K210集成了MicroPython解析器。我們在這里可以進行調(diào)試和簡單編程,接下來我們測試一下。在對話框輸入下面代碼,按回車,可以看到代碼運行情況。print(“Hello01Studio!”)圖3-28我們再輸入1+1按回車,得到了計算結(jié)果2。圖3-2966圖3-30溫馨提示:putty在windows操作系統(tǒng)下,當按下開發(fā)板復(fù)位鍵的時候,由于系統(tǒng)重啟過程中虛擬串口消失,會導(dǎo)致putty會死掉,需要重新開啟。所以我們可以使用【Ctrl+D】組合鍵方式軟件復(fù)位開發(fā)板。如下圖所示:圖3-31軟件復(fù)位(softreboot)67文件系統(tǒng)pyAI-K210里面內(nèi)置了文件系統(tǒng),可以簡單理解成上電后運行的python文件,這個可以通過串口REPL結(jié)合命令來查看。打開putty進入REPL,依次輸入下面命令,每行輸入后按回車鍵。importosos.listdir()圖3-32文件列表可以看到一共有以下3個文件:freq.conf、boot.py、main.py。【freq.conf】:CPU參數(shù)配置【boot.py】:上電運行的第一個腳本文件【main.py】:上電運行的第二個腳本文件,也是主函數(shù)文件。前面章節(jié)講到的MaixPyIDE中工具--將打開的腳本保存到開發(fā)板的boot.py實際上就是將腳本文件保存到開發(fā)板文件系統(tǒng)。當然我們也可以使用IDE中傳輸文件功能,非常方便:圖3-3368我們可以選擇基礎(chǔ)實驗中的LED.py文件,保存到開發(fā)板。圖3-34保存成功后再通過REPL查看文件,發(fā)現(xiàn)多了LED.py。圖3-35文件拷貝成功如果想刪除某個文件,可以使用以下指令:os.remove(‘xxx.py’)當插入SD卡時候,系統(tǒng)會自動以SD作為存儲的文件系統(tǒng)。優(yōu)先執(zhí)行SD卡上面的腳本文件。(提示:前面我們提到修改程序到boot.py用于運行,但這里更推薦將腳本文件改成main.py,然后發(fā)送main.py文件到pyAI-K210,這樣更符合MicroPython使用習(xí)慣?。?9固件更新當pyAI-K210上的固件意外丟失或者我們希望升級到較新版本固件時候,就需重新燒錄固件。pyAI-K210上面是一個K210單片機,所以這個操作相當于給K210MCU重新燒錄MicroPython固件。MaixPy官方提供了免安裝的燒錄工具,通過板載USB轉(zhuǎn)串口燒錄的。我們打開MicroPython開發(fā)套件配套資料\開發(fā)工具\Windows\固件更新工具\kflash_gui目錄下的kflash_gui.exe燒錄軟件。圖3-36K210固件燒錄軟件打開軟件后點擊openfile:圖3-3770選擇配套資料包路徑零一科技(01Studio)MicroPython開發(fā)套件配套資料\03-相關(guān)固件\05-pyAI-K210下的固件:圖3-38選擇要更新的固件燒錄地址默認為0x00000即可。選擇開發(fā)板和串口COM,開發(fā)板可以選擇跟pyAI-K210串口方案一樣的MaixDock,而串口則選擇自己開發(fā)板對應(yīng)的串口。圖3-39選擇開發(fā)板和串口COM71點擊Download下載。圖3-40正在下載圖3-41下載成功后彈出success對話框723.2基于MacOS3.2.1安裝開發(fā)軟件MaixPyIDEMaixPy擁有自己官方的IDE,可以在官網(wǎng)下載,我們使用該IDE可以輕松進行開發(fā)。而且擁有Windows、MacOS、Linux等版本。當前版本為v0.2.4,官網(wǎng)下載地址:(如有更新請下載最新版)\h/MAIX/MaixPy/ide/_/v0.2.4,下載界面如下圖。用戶可以根據(jù)自己系統(tǒng)選擇合適的版本下載安裝。MacOS用戶選擇dmg格式文件下載安裝。圖3-42MaixPyIDE下載界面733.3基于Linux3.3.1安裝MaixPyIDEMaixPy擁有自己官方的IDE,可以在官網(wǎng)下載,我們使用該IDE可以輕松進行開發(fā)。而且擁有Windows、MacOS、Linux等版本。當前版本為v0.2.4,官網(wǎng)下載地址:(如有更新請下載最新版)\h/MAIX/MaixPy/ide/_/v0.2.4,下載界面如下圖。用戶可以根據(jù)自己系統(tǒng)選擇合適的版本下載安裝。Linux用戶選擇run格式文件下載安裝。圖3-43MaixPyIDE下載界面Linux命令行給運行權(quán)限然后執(zhí)行:chmod+xmaixpy-ide-linux-x86_64-0.2.2.run./maixpy-ide-linux-x86_64-0.2.2.run74第4章基礎(chǔ)實驗MicroPython更強調(diào)的是針對應(yīng)用的學(xué)習(xí),強大的底層庫函數(shù)讓我們可以直接關(guān)心功能的實現(xiàn),也就是說我們只要理解和熟練相關(guān)的函數(shù)用法,就可以很好的玩轉(zhuǎn)MicroPython。它讓我們可以做到不關(guān)心硬件和底層原理而直接跑起硬件(當然有興趣和能力的小伙伴可以深入研究)?;A(chǔ)實驗是針對一些簡單的實驗學(xué)習(xí)講解,可以讓我們更快和更直接感受到MicroPython針對嵌入式開發(fā)的強大之處,我后面的學(xué)習(xí)和開發(fā)夯實基礎(chǔ)。請先看實驗講解格式預(yù)覽,每一節(jié)我們都會以以下形式講解,圖文并茂,務(wù)求達到快速理解和學(xué)習(xí)的作用:(1)前言:簡單介紹這個實驗;(2)實驗平臺:實驗所用到的開發(fā)板、配件和接線說明;(3)實驗?zāi)康模罕緦嶒炓獙崿F(xiàn)的功能;(4)實驗講解:對函數(shù)、代碼、編程方法以及實驗的詳細講解;(5)實驗結(jié)果:記錄程序下載到開發(fā)板上的圖片示例;(6)總結(jié):對實驗進行總結(jié)。754.1點亮第一個LED?前言:相信大部分人開始學(xué)習(xí)嵌入式單片機編程都會從點亮LED開始,基于K210平臺的MicroPython的學(xué)習(xí)也不例外,通過點亮第一個LED能讓你對編譯環(huán)境和程序架構(gòu)有一定的認識,為以后的學(xué)習(xí)和更大型的程序打下基礎(chǔ),增加信心。?實驗平臺:pyAI-K210。圖4-1pyAI-K210核心板?實驗?zāi)康模簩W(xué)習(xí)LED的點亮,點亮LED_B(藍燈)。?實驗講解:pyAI-K210上總共有3個LED,位于2個按鍵中間,三色一體LED。分別是LED_B(藍色)、LED_G(紅色)、LED_R(紅色)。76圖4-2RGB燈其連接到pyAI-K210的外部IO引腳如下(可以看開發(fā)板原理圖),LED藍燈對應(yīng)的外部IO為IO12,從電路可以看到當IO12為低電平時,藍燈被點亮。圖4-3RGBLED電路引腳圖K210為外部IO和內(nèi)部IO,其片上外設(shè)(比如GPIO、I2C等)對應(yīng)的引腳是可以任意設(shè)置的,而傳統(tǒng)大部分MCU片上外設(shè)和引腳對應(yīng)關(guān)系已經(jīng)固定了,只有部分引腳可以復(fù)用,相比之下K210自由度更大。77因此我們在編程使用GPIO的時候需要注冊一下硬件IO和K210內(nèi)部IO的對應(yīng)關(guān)系。注冊方式使用fpioa_manager:簡稱fm,該模塊用于注冊芯片內(nèi)部功能和引腳,幫助用戶管理內(nèi)部功能和引腳。構(gòu)造函數(shù)fm.register(pin,function,force=False)GPIO注冊函數(shù);使用方法fm.register(pin,function,force=False)【pin】芯片外部IO【function】芯片功能【force】=True則強制注冊,清除之前的注冊記錄;例:fm.register(12,fm.fpioa.GPIO0,force=True)表示將外部IO12注冊到內(nèi)部GPIO0更多有關(guān)引腳和功能注冊信息請看官方文檔:\h/zh/libs/builtin_py/fm.html表4-1fm引腳和功能注冊模塊注冊成功后我們就可以通過GPIO對象模塊來控制外部IO,從而控制LED。GPIO對象說明如下:構(gòu)造函數(shù)GPIO(ID,MODE,PULL,VALUE)GPIO對象。【ID】內(nèi)部GPIO編號;【MODE】GPIO模式;GPIO.IN:輸入模式GPIO.OUT:輸出模式【PULL】GPIO.PULL_UP:上拉78GPIO.PULL_DOWN:下拉GPIO.PULL_NONE:無【value】GPIO初始化電平1:高電平0:低電平使用方法GPIO.value([value])【value】GPIO輸出電平值;1:高電平0:低電平*輸入模式時候參數(shù)為空,表示獲取當前IO輸入電平值。圖4-4GPIO對象輸出功能上表對MicroPython的GPIO對象做了詳細的說明,GPIO模塊在Maix大模塊下,而fm模塊是在fpioa_manager大模塊下面的其中一個小模塊,在python編程里有兩種方式引用相關(guān)模塊:方式1是:importMaix,然后通過Maix.GPIO來操作;方式2是:fromMaiximportGPIO,意思是直接從Maix中引入GPIO模塊,然后直接通過GPIO來操作。顯然方式2會顯得更直觀和方便,本實驗也是使用方式2來編程。代碼編寫流程如下:導(dǎo)入GPIO、fm模塊將外部IO12引腳注冊到內(nèi)部GPIO0GPIO0輸出低電平(點亮LED_B)圖4-5代碼編寫流程79參考代碼如下:'''實驗名稱:點亮LED_B藍燈版本:v1.0日期:2019.12作者:01Studio實驗?zāi)康模簩W(xué)習(xí)led點亮。'''fromMaiximportGPIOfromfpioa_managerimportfm#將藍燈引腳IO12配置到GPIO0,K210引腳支持任意配置fm.register(12,fm.fpioa.GPIO0,force=True)LED_B=GPIO(GPIO.GPIO0,GPIO.OUT)#構(gòu)建LED對象LED_B.value(0)#點亮LED?實驗結(jié)果:在IDE中運行上述代碼,可以看到LED_B藍燈被點亮。圖4-6LED藍燈被點亮80?總結(jié):從第一個實驗我們可以看到,使用MicroPython來開發(fā)關(guān)鍵是要學(xué)會構(gòu)造函數(shù)和其使用方法,便可完成對相關(guān)對象的操作,在強大的模塊函數(shù)支持下,實驗只用了簡單的兩行代碼便實現(xiàn)了點亮LED燈。814.2流水燈?前言:通過上一節(jié)點亮LED燈的學(xué)習(xí),我們已經(jīng)對OpenMV4使用micropython的編程有了初步的了解,這一節(jié)來做一個功能稍微復(fù)雜一點的實驗,流水燈。流水燈也叫跑馬燈,也就是讓幾個LED來回亮滅,達到好像流水的效果。也是單片機開發(fā)學(xué)習(xí)的典型例子。?實驗平臺:pyAI-K210。圖4-7?實驗?zāi)康模毫魉疅?。讓LED_B、LED_G、LED_R循環(huán)亮滅,達到像流水一樣的效果。?實驗講解:pyAI-K210上總共有3個LED,分別是LED_B(藍色)、LED_G(綠色)、LED_R(紅色);控制LED使用到GPIO對象。上一章節(jié)我們已經(jīng)學(xué)習(xí)過LED點亮,這里要實現(xiàn)固定時間來亮滅,需要用到utime模塊中的延時的函數(shù)。具體如下:82構(gòu)造函數(shù)utime()時間模塊,直接使用。使用方法utime.sleep(seconds)秒級顏色。seconds:延時秒數(shù)utime.sleep_ms(ms)毫秒級延時。ms:延時毫秒數(shù)。utime.sleep_us(us)微秒級延時。us:延時微秒數(shù)。*更多用法請閱讀MaixPy官方文檔:文檔鏈接\h:/zh/libs/standard/utime.html表4-2utime時間對象知道了延時函數(shù)的使用方法后,我們可以簡單的梳理一下流程,首先導(dǎo)入LED和utime模塊,程序開始先讓RGBLED滅掉,開啟循環(huán),依次點亮每個LED,延時1秒,關(guān)閉LED。流程如下:導(dǎo)入GPIO、utime模塊關(guān)閉所有LED點亮LED_B→延時1秒→關(guān)閉LED_B點亮LED_G→延時1秒→關(guān)閉LED_G點亮LED_R→延時1秒→關(guān)閉LED_R圖4-8代碼編寫流程83參考例程代碼如下:'''實驗名稱:流水燈版本:v1.0日期:2019.12作者:01Studio實驗?zāi)康模鹤孯GB燈循環(huán)閃爍。'''fromMaiximportGPIOfromfpioa_managerimportfmimportutime#將將LED外部IO注冊到內(nèi)部GPIO,K210引腳支持任意配置fm.register(12,fm.fpioa.GPIO0)fm.register(13,fm.fpioa.GPIO1)fm.register(14,fm.fpioa.GPIO2)LED_B=GPIO(GPIO.GPIO0,GPIO.OUT,value=1)#構(gòu)建LED對象LED_G=GPIO(GPIO.GPIO1,GPIO.OUT,value=1)#構(gòu)建LED對象LED_R=GPIO(GPIO.GPIO2,GPIO.OUT,value=1)#構(gòu)建LED對象whileTrue:#藍燈亮1秒LED_B.value(0)#點亮LEDutime.sleep(1)LED_B.value(1)#關(guān)閉LED#綠燈亮1秒LED_G.value(0)#點亮LED84utime.sleep(1)LED_G.value(1)#關(guān)閉LED#紅燈亮1秒LED_R.value(0)#點亮LEDutime.sleep(1)LED_R.value(1)#關(guān)閉LED上述代碼沒錯是完整地按照編程思路來編寫,但可以見到有很多格式相似的地方,這顯得代碼非常冗余。我們可以通過for函數(shù)來編寫程序,由于是對3個LED的操作,因此我們可以用foriinrange(0,3):語句來修改,參考代碼如下:'''實驗名稱:流水燈版本:v1.0日期:2019.12作者:01Studio實驗?zāi)康模鹤?/p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論