物聯網開發硬體應用

提升國內高職學生物聯網開發硬體應用入門技術 待進入科技大學再升級為物聯網開發硬體設計人員


您沒有登錄。 請登錄註冊

pyboard的MicroPython教程

向下  內容 [第1頁(共1頁)]

1 pyboard的MicroPython教程 于 周一 10月 22, 2018 9:55 am

Admin


Admin
1. pyboard簡介
為了充分利用你的pyboard,有一些基本的東西需要了解它是如何工作的。

1.1。照顧你的pyboard
因為pyboard沒有外殼,所以需要一點小心:

插拔USB電纜時要輕柔。雖然USB連接器通過電路板焊接並且相對較強,但如果它斷開則可能很難固定。
靜電會震動pyboard上的組件並將其破壞。如果您所在地區經歷了大量靜電(例如乾燥和寒冷的氣候),請特別注意不要讓pyboard受到衝擊。如果你的pyboard是用黑色塑料盒裝的,那麼這個盒子是存放和攜帶pyboard的最佳方式,因為它是一個防靜電盒子(它由導電塑料製成,裡面有導電泡沫)。
只要你照顧硬件,你應該沒問題。破解pyboard上的軟件幾乎是不可能的,所以隨意編寫代碼,盡可能多地編寫代碼。如果文件系統損壞,請參閱下面有關如何重置它的信息。在最壞的情況下,您可能需要重新刷新MicroPython軟件,但這可以通過USB完成。

1.2。pyboard的佈局
微型USB連接器位於右上方,即板左上方的micro SD卡插槽。SD插槽和USB連接器之間有4個LED。顏色為:底部為紅色,頂部為綠色,橙色和藍色。有2個開關:右邊一個是複位開關,左邊是用戶開關。

1.3。插入和打開電源
pyboard可以通過USB供電。通過micro USB線將其連接到PC。電纜只有一種方式適合。連接後,電路板上的綠色LED應快速閃爍。

1.4。由外部電源供電
pyboard可以由電池或其他外部電源供電。

務必將電源正極連接到VIN,接地連接到GND。pyboard上沒有極性保護,因此在將任何東西連接到VIN時必須小心。

輸入電壓必須介於3.6V和10V之間。

2.運行第一個腳本
讓我們直接進入並在pyboard上運行Python腳本。畢竟,這就是它的全部!

2.1。連接你的pyboard
使用micro USB線將pyboard連接到PC(Windows,Mac或Linux)。電纜只有一種連接方式,所以你不能錯。


當pyboard連接到您的PC時,它將打開電源並進入啟動過程(啟動過程)。綠色LED應亮起半秒或更短時間,當它關閉時表示啟動過程已完成。

2.2。打開pyboard USB驅動器
您的PC現在應該識別pyboard。這取決於你擁有的PC類型,接下來會發生什麼:

Windows:您的pyboard將顯示為可移動USB閃存驅動器。Windows可能會自動彈出一個窗口,或者您可能需要使用資源管理器去那裡。

Windows還會看到pyboard有一個串行設備,它會嘗試自動配置這個設備。如果是,請取消該過程。我們將在下一個教程中使用串行設備。

Mac:您的pyboard將作為可移動光盤出現在桌面上。它可能會被稱為“NONAME”。單擊它打開pyboard文件夾。

Linux:您的pyboard將顯示為可移動媒體。在Ubuntu上,它將自動掛載並彈出一個帶有pyboard文件夾的窗口。在其他Linux發行版上,pyboard可能會自動掛載,或者您可能需要手動執行。在終端命令行中,鍵入lsblk 以查看已連接驅動器的列表,然後(替換 為相應的設備)。您可能需要root才能執行此操作。mount /dev/sdb1sdb1

好的,所以你現在應該將pyboard連接為USB閃存驅動器,並且窗口(或命令行)應該顯示pyboard驅動器上的文件。

您正在查看的驅動器稱為/flashpyboard,應包含以下4個文件:

boot.py - 當pyboard啟動時執行此腳本。它設定
pyboard的各種配置選項。
main.py - 這是包含Python程序的主腳本。
它執行後boot.py。
README.txt - 這包含一些關於獲取的基本信息
從pyboard開始。
pybcdc.inf - 這是一個用於配置串行USB的Windows驅動程序文件
設備。在下一個教程中有關於此的更多信息
2.3。編輯main.py
現在我們要編寫Python程序,因此main.py 在文本編輯器中打開文件。在Windows上,您可以使用記事本或任何其他編輯器。在Mac和Linux上,使用您喜歡的文本編輯器。打開文件,您將看到它包含1行:

#main.py  - 把你的代碼放在這裡!
該行以#字符開頭,表示它是註釋。這樣的行不會做任何事情,你可以寫下有關你的程序的註釋。

讓我們在這個main.py文件中加2行,使它看起來像這樣:

#main.py  - 把你的代碼放在這裡!
import  pyb
pyb 。LED (4 )。on ()
我們寫的第一行說我們想要使用該pyb模塊。該模塊包含控制pyboard功能的所有函數和類。

我們寫的第二行打開了藍色LED:它首先LED 從pyb模塊中獲取類,創建LED 4號(藍色LED),然後打開它。

2.4。重置pyboard
要運行此小腳本,您需要先保存並關閉該main.py文件,然後彈出(或卸載)pyboard USB驅動器。這樣做就像普通的USB閃存驅動器一樣。

安全彈出/卸載驅動器後,您可以進入有趣的部分:按下pyboard上的RST開關以重置並運行您的腳本。RST開關是電路板上USB連接器正下方的小黑色按鈕,位於右邊緣。

按RST鍵時,綠色LED指示燈將快速閃爍,然後藍色LED指示燈應亮起並保持亮起狀態。

恭喜!您已經編寫並運行了第一個MicroPython程序!

3.獲取MicroPython REPL提示
REPL代表Read Evaluate Print Loop,是您可以在pyboard上訪問的交互式MicroPython提示的名稱。到目前為止,使用REPL是測試代碼和運行命令的最簡單方法。除了編寫腳本外,您還可以使用REPL main.py。

要使用REPL,您必須連接到pyboard上的串行USB設備。如何執行此操作取決於您的操作系統。

3.1。視窗
您需要安裝pyboard驅動程序才能使用串行USB設備。驅動程序位於pyboard的USB閃存驅動器上,並被調用pybcdc.inf。

要安裝此驅動程序,您需要轉到計算機的設備管理器,在設備列表中找到pyboard(它旁邊應該有一個警告標誌,因為它還沒有工作),右鍵單擊pyboard設備,選擇Properties,然後安裝驅動程序 然後,您需要選擇手動查找驅動程序的選項(不要使用Windows自動更新),導航到pyboard的USB驅動器,然後選擇它。然後應該安裝。安裝完成後,返回設備管理器查找已安裝的pyboard,並查看它是哪個COM端口(例如COM4)。更全面的說明可以 在Windows上的pyboard指南(PDF)中找到。如果您在安裝驅動程序時遇到問題,請參閱本指南。

您現在需要運行終端程序。如果安裝了HyperTerminal,可以使用HyperTerminal,也可以下載免費程序PuTTY: putty.exe。使用串行程序,您必須連接到上一步中找到的COM端口。使用PuTTY,單擊左側面板中的“Session”,然後單擊右側的“Serial”單選按鈕,然後在“Serial Line”框中輸入COM端口(例如COM4)。最後,單擊“打開”按鈕。

3.2。Mac OS X.
打開終端並運行:

屏幕 / dev / tty 。usbmodem *
完成後想要退出屏幕時,鍵入CTRL-A CTRL-。

3.3。Linux的
打開終端並運行:

屏幕 / dev / ttyACM0
您也可以嘗試picocom或minicom代替屏幕。您可能必須使用/dev/ttyACM1或更高的數字ttyACM。並且,您可能需要為自己提供訪問此設備的正確權限(例如,組uucp或dialout,或使用sudo)。

3.4。使用REPL提示符
現在讓我們嘗試直接在pyboard上運行一些MicroPython代碼。

打開串行程序(PuTTY,screen,picocom等),您可能會看到一個帶有閃爍光標的空白屏幕。按Enter鍵,您將看到一個MicroPython提示符,即>>>。讓我們確保它正在使用強制性測試:

>>> print (“你好pyboard!” )
你好pyboard!
在上面,您不應該輸入>>>字符。它們表示您應該在提示符後面鍵入文本。最後,輸入文本並按Enter鍵後,屏幕上的輸出應如上所示。print("hello pyboard!")

如果您已經了解了一些python,現在可以在這裡嘗試一些基本命令。

如果其中任何一個不起作用,您可以嘗試硬重置或軟重置; 見下文。

繼續嘗試輸入其他一些命令。例如:

>>> pyb 。LED (1 )。on ()
>>> pyb 。LED (2 )。上()
>>> 1  +  2
3
>>> 1  /  2
0.5
>>> 20  *  'PY'
'pypypypypypypypypypypypypypypypypypypypy'
3.5。重置電路板
如果出現問題,您可以通過兩種方式重置電路板。第一種是在MicroPython提示符下按CTRL-D,執行軟復位。你會看到類似的消息

>>>
PYB:同步文件系統
PYB:軟重啟
Micro Python v1.0於2014-05-03; 帶有STM32F405RG的PYBv1.0輸入
“help()”以獲取更多信息。
>>>
如果不起作用,您可以按RST開關(最靠近電路板上的微型USB插座的黑色小按鈕)執行硬重置(再次開啟和關閉)。這將結束您的會話,斷開您用於連接到pyboard的任何程序(PuTTY,屏幕等)。

如果要進行硬重置,建議先關閉串口程序並彈出/卸載pyboard驅動器。

4.打開LED和基本的Python概念
在pyboard上最簡單的方法是打開連接到電路板的LED。連接電路板,然後按照教程1中的說明登錄。我們將從解釋器中的轉動和LED開始,鍵入以下內容

>>> myled  =  pyb 。LED (1 )
>>> myled 。on ()
>>> myled 。關()
這些命令可以打開和關閉LED。

這一切都很好,但我們希望這個過程是自動化的。在您喜歡的文本編輯器中打開pyboard上的文件MAIN.PY。將以下行寫入或粘貼到文件中。如果您是python的新手,那麼請確保縮進正確,因為這很重要!

led  =  pyb 。LED (2 )
而 True :
   led 。toggle ()
   pyb 。延遲(1000 )
保存時,pyboard上的紅燈應亮起約一秒鐘。要運行腳本,請執行軟重置(CTRL-D)。然後pyboard將重新啟動,您應該看到綠燈不斷閃爍。成功,是你建立邪惡機器人軍隊的第一步!當您對煩人的閃光燈感到厭倦時,請按下終端上的CTRL-C以停止運行。

那麼這段代碼有什麼用呢?首先,我們需要一些術語。Python是一種面向對象的語言,幾乎python中的所有東西都是一個類,當你創建一個類的實例時,你會得到一個對象。類具有與之關聯的方法。方法(也稱為成員函數)用於與對象交互或控制對象。

第一行代碼創建了一個LED對象,然後我們稱之為led。當我們創建對象時,它需要一個參數,該參數必須介於1和4之間,對應於電路板上的4個LED。pyb.LED類有三個重要的成員函數我們將使用:on(),off()和toggle()。我們使用的另一個函數是pyb.delay(),它只是等待一個給定的時間,以毫秒為單位。一旦我們創建了LED對象,聲明為True:創建一個無限循環,在打開和關閉之間切換LED並等待1秒。

練習:嘗試更改切換LED和打開其他LED之間的時間。

練習:直接連接到pyboard,創建一個pyb.LED對象並使用on()方法將其打開。

4.1。你的pyboard上的迪斯科舞廳
到目前為止,我們只使用了一個LED,但是pyboard有4個可用。讓我們首先為每個LED創建一個對象,以便我們可以控制每個LED。我們通過創建具有列表理解的LEDS列表來實現這一點。

leds  =  [ pyb 。LED (我) 為 我 在 範圍(1 ,5 )]
如果使用不是1,2,3,4的數字調用pyb.LED(),您將收到錯誤消息。接下來,我們將設置一個無限循環,循環通過每個LED打開和關閉它們。

n  =  0
而 True :
 n  =  (n  +  1 ) % 4
 leds [ n ] 。toggle ()
 pyb 。延遲(50 )
這裡,n跟踪當前LED,每次循環執行時我們循環到下一個n(%符號是一個模數運算符,它將n保持在0和3之間。)然後我們訪問第n個LED並切換它。如果你運行它,你應該看到每個LED都打開然後所有LED按順序再次關閉。

您可能會發現的一個問題是,如果您停止腳本然後重新啟動它,那麼LED會從上一次運行中停留,破壞了我們精心設計的迪斯科舞廳。我們可以通過在初始化腳本然後使用try / finally塊關閉所有LED來解決這個問題。按CTRL-C時,MicroPython會生成VCPInterrupt異常。異常通常意味著出現了問題,您可以使用try:命令來“捕獲”異常。在這種情況下,只是用戶中斷腳本,因此我們不需要捕獲錯誤,只需告訴MicroPython退出時要做什麼。finally塊執行此操作,我們使用它來確保所有LED都關閉。完整的代碼是:

leds  =  [ pyb 。LED (我) 為 我 在 範圍(1 ,5 )]
為 升 中 的LED :
   升。關()

Ñ  =  0
嘗試:
  而 真:
     ñ  =  (Ñ  +  1 ) % 4
     發光二極管[ Ñ ] 。toggle ()
     pyb 。最後延遲(50 )
:對於l in leds :l 。關()
     
       
4.2。特殊LED
黃色和藍色LED是特殊的。除了打開和關閉它們之外,您還可以使用intensity()方法控制它們的強度。這需要一個0到255之間的數字來確定它的亮度。以下腳本使藍色LED逐漸變亮,然後再將其關閉。

led  =  pyb 。LED (4 )
強度 =  0
而 真:
   強度 =  (強度 +  1 ) % 255
   led 。強度(強度)
   pyb 。延遲(20 )
您可以在LED 1和2上調用intensity(),但它們只能關閉或打開。0將它們關閉,任何其他數字(最多255個)將它們打開。

5. Switch,回調和中斷
pyboard有2個小開關,標有USR和RST。RST開關是一個硬復位開關,如果按下它,它會從頭開始重新啟動pyboard,相當於關閉電源然後再打開電源。

USR開關用於一般用途,並通過Switch對象進行控制。要製作一個切換對象:

>>> sw  =  pyb 。開關()
請記住,如果您收到名稱不存在的錯誤,則可能需要鍵入內容。import pybpyb

使用switch對象,您可以獲得其狀態:

>>> sw 。value ()
錯誤
False如果沒有保持開關,或者True如果保持開關,則會打印。嘗試在運行上述命令時按住USR開關。

通過“調用”開關對象,還有一個簡寫符號來獲取開關狀態:

>>> sw ()
錯誤
5.1。切換回調
該開關是一個非常簡單的對象,但它確實有一個高級功能:該sw.callback()功能。回調函數設置在按下開關時運行的東西,並使用中斷。在了解中斷如何工作之前,最好先從一個例子開始。嘗試在提示符下運行以下命令:

>>> sw 。回調(lambda :print ('press!' ))
這告訴開關press!每次按下開關時都要打印。繼續嘗試:按下USR開關並觀察PC上的輸出。請注意,此打印將中斷您鍵入的任何內容,並且是異步運行的中斷例程的示例。

另一個例子是嘗試:

>>> sw 。回調(拉姆達:PYB 。LED (1 )。切換())
這將在每次按下開關時切換紅色LED。它甚至可以在其他代碼運行時工作。

要禁用交換機回調,請傳遞None給回調函數:

>>> sw 。回調(無)
您可以將任何函數(接受零參數)傳遞給交換機回調。上面我們使用lambdaPython 的特性來動態創建一個匿名函數。但我們同樣可以做到:

>>> def  f ():
...   pyb 。LED (1 )。toggle ()
...
>>> sw 。回調(f )
這將創建一個名為的函數f,並將其分配給交換機回調。當你的功能比lambda允許的更複雜時,你可以這樣做 。

請注意,您的回調函數不能分配任何內存(例如,它們不能創建元組或列表)。回調函數應該相對簡單。如果您需要創建一個列表,請事先將其創建並將其存儲在全局變量中(或將其設置為本地變量並將其關閉)。如果需要進行長而復雜的計算,則使用回調設置一個標誌,然後其他一些代碼會響應。

5.2。中斷的技術細節
讓我們逐步了解交換機回調發生的細節。使用時註冊功能時sw.callback(),開關會在開關所連接的引腳上設置外部中斷觸發(下降沿)。這意味著微控制器將在引腳上偵聽任何更改,並將發生以下情況:

按下開關時,引腳發生變化(引腳從低電平變為高電平),微控制器記錄此變化。
微控制器完成當前機器指令的執行,停止執行並保存其當前狀態(將寄存器推入堆棧)。這具有暫停任何代碼的效果,例如您正在運行的Python腳本。
微控制器開始執行與開關外部觸發相關的特殊中斷處理程序。此中斷處理程序獲取您註冊的函數sw.callback()並執行它。
執行回調函數直到完成,將控制權返回給開關中斷處理程序。
開關中斷處理程序返回,並通知微控制器已經處理了中斷。
微控制器恢復在步驟2中保存的狀態。
繼續執行開頭運行的代碼。除了暫停,此代碼不會注意到它被中斷。
當多個中斷同時發生時,上述事件序列會變得複雜一些。在這種情況下,具有最高優先級的中斷首先進行,然後按優先級順序進行。開關中斷設置為最低優先級。

5.3。進一步閱讀
有關使用硬件中斷的更多信息,請參閱 編寫中斷處理程序。

6.加速度計
在這裡,您將學習如何使用LED向左傾斜和向右傾斜等狀態讀取加速度計和信號。

6.1。使用加速度計
pyboard有一個加速度計(微小彈簧上的微小質量),可用於檢測電路板的角度和運動。對於x,y,z方向中的每一個,存在不同的傳感器。要獲取加速度計的值,請創建pyb.Accel()對象,然後調用x()方法。

>>> accel  =  pyb 。加速()
>>> 加速。x ()
7
這將返回一個有符號整數,其值介於-30和30之間。請注意,測量結果非常嘈雜,這意味著即使您保持電路板完全靜止,您測量的數量也會有一些變化。因此,您不應使用x()方法的確切值,而是查看它是否在某個範圍內。

我們將首先使用加速度計打開燈,如果它不是平的。

accel  =  pyb 。Accel ()
light  =  pyb 。LED (3 )
靈敏度 =  3

而 真:
   x  =  加速。x ()
   如果 abs (x ) >  靈敏度:
       光。on ()
   其他:
       光。關()

   pyb 。延遲(100 )
我們創建Accel和LED對象,然後獲取加速度計的x方向的值。如果x的大小大於某個值SENSITIVITY,則LED會亮起,否則會關閉。循環有一個小的,pyb.delay() 否則當x的值接近時,LED會惱人地閃爍 SENSITIVITY。嘗試在pyboard上運行此操作並左右傾斜電路板以使LED打開和關閉。

練習:更改上面的腳本,使得傾斜pyboard的藍色LED越亮。提示:您需要重新調整值,強度從0到255。

6.2。使精神水平
上面的示例僅對x方向上的角度敏感,但如果我們使用該y()值和更多LED,我們可以將pyboard轉換為精神級別。

xlights  =  (PYB 。LED (2 ), PYB 。LED (3 ))
ylights  =  (PYB 。LED (1 ), PYB 。LED (4 ))

accel  =  pyb 。加速()
靈敏度 =  3

而 真:
   x  =  加速。x ()
   if  x  >  SENSITIVITY :
       xlights [ 0 ] 。on ()
       xlights [ 1 ] 。off ()
   elif  x  <  - SENSITIVITY :
       xlights [ 1 ] 。on ()
       xlights [ 0 ] 。off ()
   else :
       xlights [ 0 ] 。off ()
       xlights [ 1 ] 。關()

   y  =  加速。y ()
   如果 y  >  敏感度:
       ylights [ 0 ] 。on ()
       ylights [ 1 ] 。off ()
   elif  y  <  - SENSITIVITY :
       ylights [ 1 ] 。on ()
       ylights [ 0 ] 。off ()
   else :
       ylights [ 0 ] 。off ()
       ylights[ 1 ] 。關()

   pyb 。延遲(100 )
我們首先為x和y方向創建一個LED對像元組。元組是python中的不可變對象,這意味著它們一旦被創建就無法修改。然後我們像以前一樣繼續操作,但為正負x值打開不同的LED。然後我們對y方向做同樣的事情。這不是特別複雜,但它可以完成這項工作。在你的pyboard上運行它,你應該看到不同的LED打開,這取決於你如何傾斜板。


7.安全模式和出廠重置
如果你的pyboard出了問題,不要驚慌!你幾乎不可能通過編寫錯誤的東西來打破pyboard。

首先要嘗試的是進入安全模式:這會暫時跳過執行boot.py和,main.py並提供默認的USB設置。

如果文件系統出現問題,可以進行恢復出廠設置,將文件系統恢復到原始狀態。

7.1。安全模式
要進入安全模式,請執行以下步驟:

將pyboard連接到USB,以便啟動。
按住USR開關。
在按住USR的同時,按下並釋放RST開關。
然後LED將循環綠色變為橙色至綠色+橙色並再次返回。
繼續按住USR直到只有橙色LED亮起,然後鬆開USR開關。
橙色LED應快速閃爍4次,然後關閉。
您現在處於安全模式。
在安全模式下,不會執行boot.py和main.py文件,因此pyboard將使用默認設置啟動。這意味著您現在可以訪問文件系統(應該出現USB驅動器),您可以編輯boot.py 並main.py修復任何問題。

進入安全模式是臨時的,不會對pyboard上的文件進行任何更改。

7.2。出廠重置文件系統
如果你的pyboard的文件系統被破壞了(例如,你忘了彈出/卸載它),或者你有一些代碼boot.py或者main.py你無法逃脫,那麼你可以重置文件系統。

重置文件系統刪除的內部pyboard存儲(不是SD卡)的所有文件,並恢復文件boot.py,main.py,README.txt 並pybcdc.inf返回到原來的狀態。

要對文件系統進行恢復出廠設置,請按照與進入安全模式類似的步驟進行操作,但要在綠色+橙色上釋放USR:

將pyboard連接到USB,以便啟動。
按住USR開關。
在按住USR的同時,按下並釋放RST開關。
然後LED將循環綠色變為橙色至綠色+橙色並再次返回。
繼續按住USR,直到綠色和橙色LED都亮起,然後鬆開USR開關。
綠色和橙色LED應快速閃爍4次。
紅色LED將亮起(因此紅色,綠色和橙色現在亮起)。
pyboard現在正在重置文件系統(這需要幾秒鐘)。
LED全部關閉。
您現在有一個重置文件系統,並處於安全模式。
按下並釋放RST開關以正常啟動。

8.使pyboard充當USB鼠標
pyboard是一個USB設備,可以配置為鼠標而不是默認的USB閃存驅動器。

為此,我們必須首先編輯boot.py文件以更改USB配置。如果你還沒有觸及你的boot.py文件,那麼它看起來像這樣:

#boot.py  - 在啟動時
運行#可以運行任意Python,但最好保持最小化

import  pyb
#pyb.main('main.py')在此之後運行的#main腳本
#pyb.usb_mode('VCP + MSC')#充當串口和存儲設備
#pyb.usb_mode('VCP + HID ')#充當串行設備和鼠標
要啟用鼠標模式,請取消註釋文件的最後一行,使其看起來像:

pyb 。usb_mode ('VCP + HID' ) #充當串行設備和鼠標
如果您已經更改了boot.py文件,那麼它需要工作的最小代碼是:

import  pyb
pyb 。usb_mode ('VCP + HID' )
這告訴pyboard在啟動時將自身配置為VCP(虛擬COM端口,即串行端口)和HID(人機接口設備,在我們的例子中是鼠標)USB設備。

彈出/卸載pyboard驅動器並使用RST開關重置它。您的PC現在應該將pyboard檢測為鼠標!

8.1。手動發送鼠標事件
要讓py-mouse執行任何操作,我們需要將鼠標事件發送到PC。我們將首先使用REPL提示手動執行此操作。使用串行程序連接到pyboard並輸入以下內容:

>>> hid  =  pyb 。USB_HID ()
>>> 隱藏。發送((0 , 10 , 0 , 0 ))
你的鼠標應該向右移動10個像素!在上面的命令中,您將發送4條信息:按鈕狀態,x,y和滾動。數字10告訴PC,鼠標在x方向上移動了10個像素。

讓我們讓鼠標左右擺動:

>>> 進口 數學
>>> 高清 OSC (ñ , d ):
...   對於 我 在 範圍(ñ ):
...     藏。送((0 , INT (20  *  數學。罪(我 /  10 )), 0 , 0 ))
...     PYB 。延遲(d )
...
>>> OSC (100 , 50)
函數的第一個參數osc是要發送的鼠標事件的數量,第二個參數是事件之間的延遲(以毫秒為單位)。嘗試使用不同的數字。

練習:讓鼠標圍成一圈。

8.2。用加速度計製作鼠標
現在讓我們使用加速度計,根據pyboard的角度移動鼠標。可以直接在REPL提示符下鍵入以下代碼,也可以將其放入main.py文件中。在這裡,我們將投入,main.py因為要做到這一點,我們將學習如何進入安全模式。

目前,pyboard充當串行USB設備和HID(鼠標)。因此,您無法訪問文件系統來編輯main.py文件。

您也無法編輯您boot.py的HID模式並使用USB驅動器返回正常模式...

為了解決這個問題,我們需要進入安全模式。這在[安全模式教程](tut-reset)中有描述,但我們在此重複說明:

按住USR開關。
在按住USR的同時,按下並釋放RST開關。
然後LED將循環綠色變為橙色至綠色+橙色並再次返回。
繼續按住USR直到只有橙色LED亮起,然後鬆開USR開關。
橙色LED應快速閃爍4次,然後關閉。
您現在處於安全模式。
在安全模式下,不會執行boot.py和main.py文件,因此pyboard將使用默認設置啟動。這意味著您現在可以訪問文件系統(應該出現USB驅動器),您可以編輯main.py。(保持boot.py原樣,因為我們仍然希望在完成編輯後返回HID模式main.py。)

在main.py下面的代碼中:

導入 pyb

switch  =  pyb 。Switch ()
accel  =  pyb 。Accel ()
hid  =  pyb 。USB_HID ()

而 不是 switch ():
   隱藏。發送((0 , 加速度。X (), 加速度。ÿ (), 0 ))
   PYB 。延遲(20 )
保存文件,彈出/卸載pyboard驅動器,然後使用RST開關重置它。它現在應該充當鼠標,並且板的角度將移動鼠標。嘗試一下,看看你是否可以讓鼠標靜止不動!

按USR開關可停止鼠標移動。

您會注意到y軸是反轉的。這很容易解決:只需在hid.send()上面一行的y坐標前面加一個減號。

8.3。將pyboard恢復正常
如果按原樣保留pyboard,每次插入時它都會像鼠標一樣運行。您可能希望將其更改回正常狀態。為此,您需要先進入安全模式(參見上文),然後編輯該boot.py文件。在boot.py文件中,註釋掉(在前面放一個#)VCP+HID設置的行 ,所以它看起來像:

#pyb.usb_mode('VCP + HID')#充當串行設備和鼠標
保存文件,彈出/卸載驅動器,然後重置pyboard。它現在恢復正常運行模式。

9.計時器
pyboard有14個定時器,每個定時器由一個以用戶定義的頻率運行的獨立計數器組成。它們可以設置為以特定間隔運行功能。14個定時器編號為1到14,但3個保留供內部使用,5和6用於伺服和ADC / DAC控制。盡可能避免使用這些計時器。

讓我們創建一個計時器對象:

>>> tim  =  pyb 。定時器(4 )
現在讓我們看看我們剛剛創建的內容:

>>> tim
定時器(4)
pyboard告訴我們tim附加到4號計時器,但它尚未初始化。所以讓我們初始化它以10 Hz(每秒10次)觸發:

>>> 蒂姆。init (freq = 10 )
現在它已初始化,我們可以看到有關計時器的一些信息:

>>> tim
Timer(4,預分頻器= 624,週期= 13439,模式= UP,div = 1)
該信息意味著該定時器設置為以外圍時鐘速度除以624 + 1運行,它將從0到13439計數,此時它會觸發中斷,然後從0再次開始計數。這些數字是設置為使定時器觸發為10 Hz:定時器的源頻率為84MHz(通過運行找到tim.source_freq()),因此我們得到84MHz / 625/13440 = 10Hz。

9.1。計時器計數器
那麼我們的計時器怎麼辦呢?最基本的是獲取其計數器的當前值:

>>> 蒂姆。counter ()
21504
此計數器將不斷變化,併計數。

9.2。定時器回調
我們接下來要做的是為計時器註冊一個回調函數,以便在觸發時執行(有關 回調函數的介紹,請參閱開關教程):

>>> 蒂姆。回調(拉姆達 噸:PYB 。LED (1 )。切換())
這應該會立即啟動紅色LED閃爍。它將以5 Hz的頻率閃爍(1次閃光需要2次切換,因此以10 Hz的頻率切換使其以5 Hz的頻率閃爍)。您可以通過重新初始化計時器來更改頻率:

>>> 蒂姆。init (freq = 20 )
您可以通過傳遞值來禁用回調None:

>>> 蒂姆。回調(無)
傳遞給回調的函數必須使用1個參數,即觸發的計時器對象。這允許您從回調函數中控制計時器。

我們可以創建2個定時器並獨立運行它們:

>>> tim4  =  pyb 。定時器(4 , freq = 10 )
>>> tim7  =  pyb 。定時器(7 , freq = 20 )
>>> tim4 。回調(拉姆達 噸: PYB 。LED (1 )。切換())
>>> tim7 。回調(拉姆達 噸: PYB 。LED (2 )。toggle ())
因為回調是正確的硬件中斷,所以我們可以在這些定時器運行時繼續使用pyboard進行其他操作。

9.3。製作微秒計數器
您可以使用計時器來創建微秒計數器,這在您執行需要精確計時的操作時可能很有用。我們將使用定時器2,因為定時器2有一個32位計數器(定時器5也是如此,但如果你使用定時器5,那麼你不能同時使用伺服驅動器)。

我們按如下方式設置計時器2:

>>> micros  =  pyb 。定時器(2 , 預分頻器= 83 , 週期= 0x3fffffff )
預分頻器設置為83,這使得定時器計數為1 MHz。這是因為以168 MHz運行的CPU時鐘除以2,然後除以預分頻器+ 1,為定時器2提供168 MHz / 2 /(83 + 1)= 1 MHz的頻率。週期設置為a大數字,以便計時器可以計數到大數,然後迴繞到零。在這種情況下,它需要大約17分鐘才能循環回零。

要使用此計時器,最好先將其重置為0:

>>> 微觀。櫃檯(0 )
然後執行你的時間:

>>> start_micros  =  micros 。櫃檯()

... 做 一些 東西 ...

>>> end_micros  =  micros 。櫃檯()
10.內聯彙編程序
在這裡,您將學習如何在MicroPython中編寫內聯彙編程序。

注意:這是一個高級教程,適用於那些已經了解微控制器和彙編語言的人。

MicroPython包含一個內聯彙編程序。它允許您將彙編例程編寫為Python函數,您可以像普通的Python函數一樣調用它們。

10.1。返回一個值
內聯彙編程序函數由特殊函數裝飾器表示。讓我們從最簡單的例子開始:

@micropython 。asm_thumb
高清 樂趣():
   MOVW (R0 , 42 )
您可以在腳本或REPL中輸入。此函數不帶參數,返回數字42. r0是寄存器,函數返回時該寄存器中的值是返回的值。MicroPython始終將其解釋r0為整數,並將其轉換為調用者的整數對象。

如果你跑步,print(fun())你會看到打印出42。

10.2。訪問外圍設備
對於更複雜的東西,讓我們打開一個LED:

@micropython 。asm_thumb
DEF  led_on ():
   movwt (R0 , STM 。GPIOA )
   MOVW (R1 , 1  <<  13 )
   STRH (R1 , [ R0 , STM 。GPIO_BSRRL ])
此代碼使用了一些新概念:

stm是一個模塊,它提供了一組常量​​,便於訪問pyboard微控制器的寄存器。嘗試運行,然後在REPL。它將為您提供所有可用常量的列表。import stmhelp(stm)
stm.GPIOA是GPIOA外設的內存地址。在pyboard上,紅色LED位於端口A,引腳PA13上。
movwt將32位數字移入寄存器。它是一個便利功能,變成2個拇指指令:movw後跟movt。它movt還將立即值右移16位。
strh存儲一個半字(16位)。上面的指令將低16位r1存儲到存儲單元中。這具有將端口A上的所有引腳設置為高的效果,其中相應的位被設置。在上面的示例中,第13位被置位,因此PA13被拉高。這會打開紅色LED。r0 + stm.GPIO_BSRRLr0r0
10.3。接受論點
內聯彙編程序函數最多可以接受4個參數。如果它們時,它們必須被命名為r0,r1,r2和r3反映寄存器和調用約定。

這是一個添加其參數的函數:

@micropython 。asm_thumb
def  asm_add (r0 , r1 ):
   add (r0 , r0 , r1 )
這執行計算。由於結果被放入,這就是返回的內容。試試,它應該返回3。r0 = r0 + r1r0asm_add(1, 2)

10.4。循環
我們可以使用分配標籤label(my_label),並使用b(my_label)條件分支分配給它們 bgt(my_label)。

以下示例閃爍綠色LED。它閃現了r0幾次。

@micropython 。asm_thumb
高清 flash_led (R0 ):
   #在R1得到GPIOA地址
   movwt (R1 , STM 。GPIOA )

   #得到PA14位掩碼(銷LED#2接通)
   MOVW (R2 , 1  <<  14 )

   b (loop_entry )

   標籤(loop1 )

   #接通LED
   STRH (R2 , [ R1 , STM 。GPIO_BSRRL ])

   針對位#延遲
   movwt (R4 , 5599900 )
   標籤(delay_on )
   子(R4 , R4 , 1 )
   CMP (R4 , 0 )
   BGT (delay_on )

   #轉LED熄滅
   STRH (R2 , [ R1 , STM 。GPIO_BSRRH ])

   針對位#延遲
   movwt (R4 , 5599900 )
   標籤(delay_off )
   子(R4 , R4 , 1 )
   CMP (R4 , 0 )
   BGT (delay_off )

   #循環R0倍
   子(R0 , R0 , 1 )
   的標籤(loop_entry )
   CMP (R0 , 0 )
   BGT (LOOP1 )
10.5。進一步閱讀
有關內聯彙編程序支持的指令的詳細信息,請參閱參考文檔。
11.電源控制
pyb.wfi()用於在等待中斷等事件時降低功耗。您將在以下情況下使用它:

而 True :
   do_some_processing ()
   pyb 。wfi ()
控制頻率使用pyb.freq():

pyb 。freq (30000000 ) #設置CPU頻率為30MHz

1.控制業餘愛好伺服電機
pyboard上有4個專用連接點,用於連接業餘愛好伺服電機(參見例如 維基百科)。這些電機有3根電線:接地,電源和信號。在pyboard上,您可以在右下角連接它們,信號引腳位於最右側。引腳X1,X2,X3和X4是4個專用伺服信號引腳。


在這張圖片中,有男性 - 男性雙適配器將伺服器連接到pyboard上的插頭引腳。

伺服器上的接地線通常是最黑的,黑色或深棕色。電源線很可能是紅色的。

伺服電機的電源引腳(標記為VIN)直接連接到pyboard的輸入電源。通過USB供電時,VIN通過5V USB電源線通過二極管供電。連接到USB,pyboard可以為至少4個中小型伺服電機供電。

如果使用電池給pyboard供電並運行伺服電機,請確保它不大於6V,因為這是大多數伺服電機可以承受的最大電壓。(有些電機最高只需4.8V,因此請檢查您使用的是哪種類型。)

1.1。創建一個Servo對象
將伺服插入位置1(帶有引腳X1的伺服)並使用以下命令創建伺服對象:

>>> servo1  =  pyb 。伺服(1 )
要改變伺服角度,請使用以下angle方法:

>>> servo1 。角度(45 )
>>> 伺服1 。角度(- 60 )
這裡的角度以度為單位,範圍從約-90到+90,具體取決於電機。angle不帶參數調用將返回當前角度:

>>> servo1 。角度() -
60
請注意,對於某些角度,由於設置脈衝寬度時的捨入誤差,返回的角度與您設置的角度不完全相同。

您可以將第二個參數傳遞給angle方法,該方法指定達到所需角度所需的時間(以毫秒為單位)。例如,要從當前位置到50度需要1秒(1000毫秒),請使用

>>> servo1 。角(50 , 1000 )
該命令將立即返回,伺服將繼續移動到所需的角度,並在它到達時停止。您可以將此功能用作速度控制,或同步2個或更多伺服電機。如果我們有另一台伺服電機()那麼我們就可以做到servo2 = pyb.Servo(2)

>>> servo1 。角(- 45 , 2000 );  伺服2 。角(60 , 2000 )
這會將伺服系統移動到一起,使它們都需要2秒才能達到最終角度。

注意:使用上面兩個表達式之間的分號,以便在REPL提示符下按Enter鍵時,它們會一個接一個地執行。在腳本中,您不需要執行此操作,您可以將它們一行寫入另一行。

1.2。連續旋轉伺服系統
到目前為止,我們一直在使用移動到特定角度並保持該角度的標準伺服系統。這些伺服電機可用於創建機器人的關節,或平移機構等。在內部,電動機具有可變電阻器(電位計),該電阻器測量電流角度並向電動機施加與其距所需角度的距離成比例的電動機。所需的角度由伺服信號線上的高脈衝寬度設定。1500微秒的脈衝寬度對應於中心位置(0度)。脈衝以50Hz發送,即每秒50個脈衝。

您還可以獲得連續順時針或逆時針旋轉的連續旋轉伺服電機。旋轉的方向和速度由信號線上的脈衝寬度設定。1500微秒的脈衝寬度對應於停止的電動機。小於或大於此的脈衝寬度意味著以給定的速度以一種方式或另一種方式旋轉。

在pyboard上,連續旋轉電機的伺服對象與以前相同。事實上,使用angle你可以設置速度。但為了更容易理解預期內容,還有另一種方法speed可以設置速度:

>>> servo1 。速度(30 )
speed具有與以下功能相同的功能angle:您可以獲得速度,設置速度,並將其設置為達到最終速度的時間。

>>> servo1 。speed ()
30
>>> servo1 。速度(- 20 )
>>> 伺服1 。速度(0 , 2000 )
上面的最後一個命令將電機設置為停止,但需要2秒鐘才能完成。這基本上是對連續伺服加速度的控制。

伺服速度為100(或-100)被認為是最大速度,但實際上你可以比這快一點,具體取決於特定的電機。

angle和speed方法(除了名稱)之間的唯一區別是輸入數字(角度或速度)轉換為脈衝寬度的方式。

1.3。校準
從角度或速度到脈衝寬度的轉換由伺服對象使用其校準值完成。要獲得當前校準,請使用

>>> servo1 。校準()
(640,2420,1500,2470,2200)
這裡有5個數字,它們有意義:

最小脈衝寬度; 伺服接受的最小脈衝寬度。
最大脈衝寬度; 伺服接受的最大脈衝寬度。
中心脈衝寬度; 將伺服置於0度或0速度的脈衝寬度。
脈衝寬度對應90度。這設置了angle角度與脈衝寬度方法的轉換。
脈衝寬度對應於速度100.這設定了speed速度到脈衝寬度的方法的轉換。
您可以使用以下方法重新校準伺服(更改其默認值):

>>> servo1 。校準(700 , 2400 , 1510 , 2500 , 2000 )
當然,您可以更改上述值以適合您的特定伺服電機。

2.褪色LED
除了打開和關閉LED之外,還可以使用脈衝寬度調製(PWM)來控制LED的亮度,這是一種從數字引腳獲得可變輸出的常用技術。這使我們可以淡化LED:



2.1。組件
你會需要:

標準5或3 mm LED
100歐姆電阻器
電線
麵包板(可選,但更容易)
2.2。連接起來
在本教程中,我們將使用該X1引腳。將電阻器X1的一端連接到LED 的另一端,將另一端連接到LED 的陽極,即較長的支路。將LED 的陰極連接到地。


2.3。碼
通過檢查pyboard的快速參考,我們看到它X1連接到計時器5()的通道1 。因此,我們將首先為計時器5創建一個對象,然後為通道1 創建一個對象:TIM5 CH1TimerTimerChannel

來自 pyb  import  計時器
從 時間 導入 睡眠

將創建
#timer 5,頻率為100 Hz tim  =  pyb 。定時器(5 , freq = 100 )
tchannel  =  tim 。信道(1 , 定時器。PWM , 銷= PYB 。引腳。板。X1 , pulse_width = 0 )
通過控制脈衝寬度來控制PWM中LED的亮度,脈衝寬度即LED在每個週期上的時間量。定時器頻率為100 Hz,每個週期需要0.01秒或10 ms。

為了達到本教程開頭所示的衰落效果,我們希望將脈衝寬度設置為較小的值,然後慢慢增加脈衝寬度以使LED變亮,並在達到某個最大亮度時重新開始:

#最大和最小脈衝寬度,對應於最大
#和最小亮度
max_width  =  200000
min_width  =  20000

#每步改變脈衝寬度
wstep  =  1500
cur_width  =  min_width

而 真:
 tchannel 。pulse_width (cur_width )

 #這決定了我們改變脈衝寬度的頻率。這是
 #類似於幀每秒
 睡眠(0.01 )

 cur_width  + =  wstep

 如果 cur_width  >  max_width :
   cur_width  =  min_width
2.4。呼吸效應
如果我們想要有一個呼吸效果,LED從昏暗到亮,然後從亮到昏暗,那麼我們只需要反轉wstep當我們達到最大亮度時的符號,並在最小亮度時再次反轉。為此,我們將while循環修改為:

而 真:
 tchannel 。pulse_width (cur_width )

 睡覺(0.01 )

 cur_width  + =  wstep

 如果 cur_width  >  max_width :
   cur_width  =  max_width
   wstep  * =  - 1
 elif  cur_width  <  min_width :
   cur_width  =  min_width
   wstep  * =  - 1
2.5。高級練習
您可能已經註意到LED亮度似乎緩慢消退,但增長很快。這是因為我們的眼睛以對數方式解釋亮度(韋伯定律 ),而LED的亮度線性變化,每次都相同。你怎麼解決這個問題?(提示:對數函數的反義詞是什麼?)

2.6。附錄
我們也可以使用數模轉換器(DAC)來實現相同的效果。PWM方法的優點是每次驅動LED具有相同的電流,但是時間長度不同。這允許更好地控制亮度,因為LED不一定表現出驅動電流和亮度之間的線性關係。


3. LCD和触摸傳感器皮膚
焊接和使用LCD和触摸傳感器皮膚。




以下視頻顯示瞭如何將接頭焊接到LCD外殼上。在視頻結束時,它將向您展示如何將LCD外觀正確連接到pyboard。

關皮膚組件的電路原理圖和數據表,請參閱pyboard硬件。

3.1。使用液晶顯示器
要開始使用LCD,請在MicroPython提示符下嘗試以下操作。確保LCD外殼貼在pyboard上,如本頁頂部所示。

>>> import  pyb
>>> lcd  =  pyb 。LCD ('X' )
>>> lcd 。light (True )
>>> lcd 。寫('你好uPy!\ n ' )
您可以使用以下代碼製作簡單的動畫:

import  pyb
lcd  =  pyb 。LCD ('X' )
液晶顯示屏。光(真)
為 X  在 範圍(- 80 , 128 ):
   LCD 。fill (0 )
   lcd 。文本(“你好uPy!' , X , 10 , 1 )
   LCD 。show ()
   pyb 。延遲(25 )
3.2。使用觸摸傳感器
要讀取觸摸傳感器數據,您需要使用I2C總線。MPR121電容式觸摸傳感器的地址為90。

要開始使用,請嘗試:

>>> import  pyb
>>> i2c  =  pyb 。I2C (1 , PYB 。I2C 。MASTER )
>>> I2C 。MEM_WRITE (4 , 90 , 0x5e )
>>> 觸摸 =  I2C 。MEM_READ (1 , 90 , 0 )[ 0 ]
上面的第一行產生一個I2C對象,第二行產生4個觸摸傳感器。第三行讀取觸摸狀態,touch變量保持4個觸摸按鈕(A,B,X,Y)的狀態。

有一個簡單的司機在這裡 ,它允許您設置的閾值和去抖參數,並輕鬆地閱讀觸摸狀態和電極的電壓水平。將此腳本複製到pyboard(閃存或SD卡,在頂級目錄或lib/目錄中),然後嘗試:

>>> import  pyb
>>> import  mpr121
>>> m  =  mpr121 。MPR121 (PYB 。I2C (1 , PYB 。I2C 。MASTER ))
>>> 用於 我 在 範圍(100 ):
...   打印(米。touch_status ())
...   PYB 。延遲(100 )
......
這將連續打印出所有電極的觸摸狀態。嘗試依次觸摸每一個。

請注意,如果將LCD外殼置於Y位置,則需要使用以下命令初始化I2C總線:

>>> m  =  mpr121 。MPR121 (PYB 。I2C (2 , PYB 。I2C 。MASTER ))
還有一個演示,它將LCD和触摸傳感器結合在一起,可以在這裡找到。

4. AMP音頻皮膚
焊接和使用AMP音頻皮膚。




以下視頻顯示瞭如何將接頭,麥克風和揚聲器焊接到AMP皮膚上。
有關皮膚組件的電路原理圖和數據表,請參閱pyboard硬件。

4.1。示例代碼
AMP皮膚有一個揚聲器,DAC(1)通過一個小功率放大器連接。放大器的音量由數字電位器控制,數字電位器是總線上具有地址46的I2C器件IC2(1)。

要設置音量,請定義以下功能:

import  pyb
def  volume (val ):
   pyb 。I2C (1 , PYB 。I2C 。MASTER )。MEM_WRITE (VAL , 46 , 0 )
然後你可以這樣做:

>>> 音量(0 )   #最小音量
>>> 音量(127 ) #最大音量
要播放聲音,請使用對象的write_timed方法DAC。例如:

從pyb import DAC 導入數學
 

#創建包含正弦波的緩衝器
BUF  =  字節組(100 )
用於 我 在 範圍(LEN (BUF )):
   BUF [ 我]  =  128  +  INT (127  *  數學。罪(2  *  數學。PI  *  我 /  LEN (buf )))

#以400Hz
dac  =  DAC (1 )
dac 輸出正弦波。write_timed (BUF , 400  *  LEN (BUF ), 模式= DAC 。CIRCULAR )
您還可以使用Python wave模塊播放WAV文件。你可以在這裡獲得wave模塊,你還需要這裡提供的塊模塊。將它們放在你的pyboard上(在閃存或頂級目錄中的SD卡上)。您將需要一個8位WAV文件來播放,例如這個,或者使用該命令轉換您擁有的任何文件:

avconv  - 我 原創。wav  - ar  22050  - 編解碼器 pcm_u8  測試。WAV
然後你可以這樣做:

>>> 導入 wave
>>> 來自 pyb  import  DAC
>>> dac  =  DAC (1 )
>>> f  =  wave 。打開('test.wav' )
>>> dac 。write_timed (˚F 。readframes (˚F 。getnframes ()), ˚F 。getframerate ())
這應該播放WAV文件。請注意,這會將整個文件讀入RAM,因此必須足夠小以適應它。

要播放較大的波形文件,您必須使用micro-SD卡存儲它。此外,必須以小塊的形式讀取文件並將其發送到DAC,以適應微控制器的RAM限制。這是一個示例函數,可以播放高達16kHz採樣的8位波形文件:

進口 波
從 PYB  進口 DAC
從 PYB  進口 延遲
DAC  =  DAC (1 )

def  play (filename ):
   f  =  wave 。open (filename , 'r' )
   total_frames  =  f 。getnframes ()
   幀率 =  ˚F 。getframerate ()

   對 位置 在 範圍(0 , total_frames , 幀率):
       ˚F 。setpos (position )
       dac 。write_timed (˚F 。readframes (幀率), 幀率)
       延遲(1000 )
該函數讀取一秒鐘的數據並將其發送到DAC。然後它等待一秒鐘並將文件光標移動到新位置,以在for循環的下一次迭代中讀取下一秒數據。它每秒播放一秒鐘的音頻。

5. LCD160CR皮膚
本教程介紹如何開始使用LCD160CR皮膚





有關顯示器驅動程序的詳細文檔,請參閱 lcd160cr模塊。

5.1。插入顯示屏
顯示器可以直接插入pyboard(支持所有pyboard版本)。將顯示器插入pyboard的頂部,位於X或Y位置。顯示屏應覆蓋pyboard的一半。請參見上圖,了解如何實現這一目標; 圖片的左半部分顯示X位置,右半部分顯示Y位置。

5.2。獲得司機
您可以使用電源/使能引腳和I2C總線直接控制顯示,但使用lcd160cr模塊提供的驅動程序要方便得多 。此驅動程序包含在最新版本的pyboard固件中(請參閱此處)。您也可以在此處找到GitHub存儲庫中的驅動程序 ,要使用此版本,您需要將文件複製到您的板上,然後復製到通過import搜索的目錄(通常是lib /目錄)。

安裝驅動程序後,需要導入它才能使用它:

導入 lcd160cr
5.3。測試顯示器
有一個測試程序可用於測試顯示器的功能,也可作為開始創建使用LCD的代碼的基礎。該測試程序包含在最新版本的pyboard固件中,也可以在GitHub上 找到。

要從MicroPython提示符運行測試,請執行以下操作:

>>> 導入 lcd160cr_test
然後它會打印一些簡短的說明。您將需要知道顯示器連接到哪個位置(X或Y),然後您可以運行(假設您在X位置顯示):

>>> test_all ('X' )
5.4。繪製一些圖形
您必須首先創建一個LCD160CR對象來控制顯示。這樣做使用:

>>> import  lcd160cr
>>> lcd  =  lcd160cr 。LCD160CR ('X' )
這假定您的顯示器連接在X位置。如果它在Y位置,則使用。lcd = lcd160cr.LCD160CR('Y')

要擦除屏幕並畫一條線,請嘗試:

>>> lcd 。set_pen (LCD 。RGB (255 , 0 , 0 ), LCD 。RGB (64 , 64 , 128 ))
>>> LCD 。erase ()
>>> lcd 。線(10 , 10 , 50 , 80 )
下一個示例在屏幕上繪製隨機矩形。您可以通過在提示符下按“Ctrl-E”,然後在粘貼文本後按“Ctrl-D”將其複制並粘貼到MicroPython提示符中。

來自 隨機 導入 randint
for  i  in  range (1000 ):
   fg  =  lcd 。RGB (randint (128 , 255 ), randint (128 , 255 ), randint (128 , 255 ))
   BG  =  LCD 。RGB (randint (0 , 128 ), randint (0 , 128 ), randint(0 , 128 ))
   的LCD 。set_pen (fg , bg )
   lcd 。矩形(randint (0 , LCD 。瓦特), randint (0 , LCD 。ħ ), randint (10 , 40 ), randint (10 , 40 ))
5.5。使用觸摸傳感器
顯示器包括電阻式觸摸傳感器,其可以報告屏幕上單個基於力的觸摸的位置(以像素為單位)。要查看屏幕上是否有觸摸,請使用:

>>> lcd 。is_touched ()
這將返回False或True。觸摸屏幕時運行上述命令以查看結果。

要獲得觸摸的位置,您可以使用以下方法:

>>> lcd 。get_touch ()
這將返回一個3元組,第一個條目為0或1,具體取決於當前是否有任何觸摸屏幕的內容(如果有,則為1),元組中的第二個和第三個條目為x和y坐標。當前(或最近)的觸摸。

5.6。將MicroPython輸出定向到顯示器
該顯示器支持來自UART的輸入並實現基本的VT100命令,這意味著它可以用作簡單的通用終端。讓我們設置pyboard將其輸出重定向到顯示器。

首先,您需要創建一個UART對象:

>>> import  pyb
>>> uart  =  pyb 。UART ('XA' , 115200 )
這假定您的顯示器連接到位置X.如果它位於Y位置,則使用。uart = pyb.UART('YA', 115200)

現在,將REPL輸出連接到此UART:

>>> pyb 。repl_uart (uart )
從現在開始,您在MicroPython提示符下鍵入的任何內容以及您收到的任何輸出都將顯示在顯示屏上。

此模式無需設置命令,您可以使用顯示屏監控任何UART的輸出,而不僅僅是來自pyboard。所需要的只是顯示器具有電源,接地和電源/使能引腳驅動為高電平。然後,顯示器的UART輸入上的任何字符都將打印到屏幕上。您可以使用該set_uart_baudrate方法從默認值115200調整UART波特率 。

1.去掉引腳輸入
用作來自開關或其他機械裝置的輸入的引腳可能在其上具有大量噪聲,當首次按下或釋放開關時,從低到高迅速變化。使用電容器(去抖動電路)可以消除這種噪聲。它也可以通過一個簡單的功能來消除,確保引腳上的值穩定。

以下功能就是這樣做的。它獲取給定引腳的當前值,然後等待值更改。新的引腳值必須穩定連續20ms才能記錄更改。如果您仍有噪音,可以調整此時間(比如說50毫秒)。

導入 pyb

def  wait_pin_change (引腳):
   #等待引腳改變值
   #它需要穩定連續20ms
   cur_value  =  引腳。值()
   活性 =  0
   而 活性 <  20 :
       如果 銷。value () !=  cur_value :
           active  + =  1
       else :
           active  =  0
       pyb 。延遲(1 )
使用它像這樣:

導入 pyb

pin_x1  =  pyb 。引腳(“X1” , PYB 。引腳。IN , PYB 。引腳。PULL_DOWN )
,而 真:
   wait_pin_change (pin_x1 )
   PYB 。LED (4 )。切換()

檢視會員個人資料 http://iotboard.666forum.com

2 回復: pyboard的MicroPython教程 于 周一 10月 22, 2018 9:56 am

Admin


Admin
2.製作UART - USB通過
它很簡單:

導入 pyb
導入 選擇

def  pass_through (usb , uart ):
   usb 。setinterrupt (- 1 )
   而 True :
       選擇。選擇([ usb , uart ], [], [])
       如果是 usb 。any ():
           uart 。寫(usb 。讀(256 ))
       如果 uart 。any ():
           usb 。寫(uart 。讀(256 ))

pass_through (PYB 。USB_VCP (), PYB 。UART (1 , 9600 , 超時= 0 ))

ESP8266的快速參考


Adafruit Feather HUZZAH板(圖片屬性:Adafruit)。

以下是基於ESP8266的電路板的快速參考。如果您是第一次使用此板,請首先閱讀以下部分:

有關ESP8266端口的一般信息
ESP8266的MicroPython教程
安裝MicroPython
請參閱教程的相應部分:在ESP8266上開始使用MicroPython。它還包括故障排除小節。

一般董事會控制
MicroPython REPL位於波特率115200的UART0(GPIO1 = TX,GPIO3 = RX)上。製表完成有助於找出對象具有的方法。粘貼模式(ctrl-E)可用於將大量Python代碼粘貼到REPL中。

該machine模塊:

進口 機器

機器。freq ()          #獲取CPU
機器的當前頻率。freq (160000000 ) #將CPU頻率設置為160 MHz
該esp模塊:

導入 特別是

ESP 。osdebug (無)       #關閉供應商O / S調試消息
esp 。osdebug (0 )          #redirect 供應商O / S調試消息到UART(0)
聯網
該network模塊:

進口 網絡

wlan  =  網絡。WLAN (網絡。STA_IF ) #創建站接口
WLAN 。active (True )       #激活接口
wlan 。scan ()             #scan for access points
wlan 。isconnected ()      #檢查該站是否連接到AP
wlan 。connect ('essid' , 'password' ) #連接到AP
wlan 。config ('mac' )      #獲取接口的MAC地址
wlan 。ifconfig ()         #獲取接口的IP / netmask / gw / DNS地址

ap  =  網絡。WLAN (網絡。AP_IF ) #創建接入點界面
AP 。active (True )         #激活接口
ap 。config (essid = 'ESP-AP' ) #設置接入點的ESSID
連接到本地WiFi網絡的有用功能是:

def  do_connect ():
   import  network
   wlan  =  network 。WLAN (網絡。STA_IF )
   WLAN 。如果不是wlan,則為active (True )
   。isconnected ():print ('連接到網絡......' )wlan 。連接('essid' ,'密碼' )而不是wlan 。isconnected ():傳遞print ('network config:'  
       
       
         
           
   , wlan 。ifconfig ())
一旦建立了網絡,該socket模塊就可以像往常一樣用於創建和使用TCP / UDP套接字。

延遲和時間
使用time模塊:

進口 時間

時間。睡眠(1 )           #睡眠1秒
時間。sleep_ms (500 )      #sleep 500毫秒
時間。sleep_us (10 )       #sleep 10微秒
start  =  time 。ticks_ms () #get millisecond counter
delta  =  time 。ticks_diff (時間。ticks_ms (), 啟動) #計算時間差
計時器
支持虛擬(基於RTOS)的計時器。使用計時器ID為-1 的machine.Timer類:

從 機器 導入 計時器

tim  =  定時器(- 1 )
tim 。INIT (週期= 5000 , 模式= 定時器。ONE_SHOT , 回調= 拉姆達 噸:打印(1 ))
添。INIT (週期= 2000 , 模式= 定時器。週期, 回調= 拉姆達 噸:打印(2 ))
週期以毫秒為單位。

引腳和GPIO
使用machine.Pin類:

從 機器 導入 Pin

p0  =  引腳(0 , 引腳,OUT )    #在GPIO0
p0 上創建輸出引腳。on ()                 #將引腳設置為“on”(高)電平
p0 。off ()                #將引腳設置為“off”(低)電平
p0 。value (1 )             #set pin to on / high

P2  =  引腳(2 , 引腳。IN )     #創建GPIO2輸入引腳
打印(P2 。值())       #GET值,0或1

P4  =  引腳(4 , 引腳。IN , 引腳。PULL_UP ) #實現內部上拉電阻
P5  =  引腳(5 , 引腳。OUT , 值= 1 ) #組引腳上建立高
可用引腳為:0,1,2,3,4,5,12,13,14,15,16,分別對應ESP8266芯片的實際GPIO引腳編號。請注意,許多最終用戶板使用自己的adhoc引腳編號(標記為例如D0,D1,...)。由於MicroPython支持不同的電路板和模塊,因此選擇物理引腳編號作為最小公分母。有關板邏輯引腳和物理芯片引腳之間的映射,請參閱電路板文檔。

注意,引腳(1)和引腳(3)分別是REPL UART TX和RX。另請注意,Pin(16)是一個特殊引腳(用於從深度睡眠模式喚醒),可能無法用於更高級別的類 Neopixel。

PWM(脈衝寬度調製)
除引腳(16)外,所有引腳均可使能PWM。所有通道都有一個頻率,範圍在1到1000之間(以Hz為單位)。佔空比介於0和1023之間。

使用machine.PWM課程:

從 機器 導入 Pin , PWM

pwm0  =  PWM (引腳(0 ))      #從引腳
pwm0 創建PWM對象。freq ()             #獲取當前頻率
pwm0 。freq (1000 )         #set frequency
pwm0 。duty ()             #獲取當前佔空比
pwm0 。duty (200 )          #set duty cycle
pwm0 。deinit ()           #關閉引腳上的PWM

pwm2  =  PWM (引腳(2 ), freq = 500 , 佔空比= 512 ) #一步創建和配置
ADC(模數轉換)
ADC可通過專用引腳獲得。請注意,ADC引腳上的輸入電壓必須介於0v和1.0v之間。

使用machine.ADC類:

來自 機器 導入 ADC

adc  =  ADC (0 )            #在ADC引腳
adc 上創建ADC對象。read ()              #讀取值,0-1024
軟件SPI總線
有兩個SPI驅動程序。一個是用軟件實現的(bit-banging),適用於所有引腳,可通過機器訪問.SPI 類:

從 機器 導入 Pin , SPI

#構造給定的銷SPI總線
#極性是SCK的空閒狀態
#相位= 0意味著在SCK的第一邊緣採樣,相位= 1表示所述第二
SPI  =  SPI (- 1 , 波特率= 100000 , 極性= 1 , phase = 0 , sck = Pin (0 ), mosi = Pin (2 ), miso = Pin (4 ))

spi 。init (波特率= 200000 ) #設置波特率

spi 。read (10 )            #在MISO
spi 上讀取10個字節。讀(10 , 0xff的)      #讀取10個字節,而在MOSI outputing 0xff的

buf  =  bytearray (50 )     #create buffer
spi 。readinto (buf )       #讀入給定的緩衝區(在這種情況下讀取50個字節)
spi 。readinto (buf , 0xff ) #讀入給定的緩衝區並在MOSI上輸出0xff

spi 。寫(b '12345' )#     寫上MOSI 5個字節

buf  =  bytearray (4 )      #create buffer
spi 。write_readinto (b '1234' , BUF ) #寫MOSI和MISO從讀入緩衝區
SPI 。write_readinto (buf , buf ) #將buf寫入MOSI並將MISO讀回buf
硬件SPI總線
硬件SPI速度更快(高達80Mhz),但僅適用於以下引腳: MISOGPIO12,MOSIGPIO13,SCKGPIO14。它具有與上面的bitbanging SPI類相同的方法,除了構造函數和init的引腳參數(因為它們是固定的):

從 機器 導入 Pin , SPI

hspi  =  SPI (1 , 波特率= 80000000 , 極性= 0 , 相位= 0 )
(SPI(0)用於FlashROM,用戶無法使用。)

I2C總線
I2C驅動程序以軟件實現,適用於所有引腳,可通過機器訪問.I2C類:

從 機器 導入 Pin , I2C

#構造I2C總線
i2c  =  I2C (scl = Pin (5 ), sda = Pin (4 ), freq = 100000 )

i2c 。readfrom (0x3a , 4 )   #從地址為0x3a
i2c的從設備讀取4個字節。writeto (0x3a , '12 ' ) #將'12'寫入地址為0x3a的從設備

buf  =  bytearray (10 )     #創建一個10字節
i2c 的緩衝區。writeto (0x3a , buf )  #將給定的緩衝區寫入從站
實時時鐘(RTC)
見機器.RTC

從 機器 導入 RTC

rtc  =  RTC ()
rtc 。日期時間((2017 , 8 , 23 , 1 , 12 , 48 , 0 , 0 ))  #設定一個特定日期和時間
的RTC 。datetime () #獲取日期和時間
深度睡眠模式
將GPIO16連接到復位引腳(HUZZAH上的RST)。然後可以使用以下代碼來休眠,喚醒並檢查重置原因:

進口 機器

#configure RTC.ALARM0能夠喚醒設備
rtc  =  machine 。RTC ()
rtc 。IRQ (觸發= RTC 。ALARM0 , 喚醒= 機器。DEEPSLEEP )

#檢查設備從沉睡中醒來
,如果 機器。reset_cause () ==  machine 。DEEPSLEEP_RESET :
   打印('從深度睡眠中醒來' )

#設置RTC.ALARM0在10秒後喚醒(喚醒設備)
rtc 。報警(RTC 。ALARM0 , 10000 )

#把設備放到睡眠
機上。deepsleep ()
OneWire驅動程序
OneWire驅動程序在軟件中實現,適用於所有引腳:

從 機器 導入 Pin
導入 onewire

ow  =  onewire 。OneWire (Pin (12 )) #在GPIO12
ow 上創建OneWire總線。掃描()                #返回總線上的設備的列表
流。復位()               #重置總線
流。readbyte ()           #讀取一個字節
ow 。writebyte (0×12 )      #寫總線上的一個字節
流。寫('123' )#         寫總線上的字節
流。select_rom (b'12345678' ) #通過ROM代碼選擇特定設備
DS18S20和DS18B20設備有一個特定的驅動程序:

導入 時間, ds18x20
ds  =  ds18x20 。DS18X20 (ow )
roms  =  ds 。scan ()
ds 。convert_temp ()
時間。sleep_ms (750 )
用於 ROM  中 ROM的:
   打印(DS 。read_temp (ROM ))
確保在數據線上放置一個4.7k的上拉電阻。請注意,convert_temp()每次要對溫度進行採樣時都必須調用該方法。

NeoPixel驅動程序
使用neopixel模塊:

來自 機器 導入 Pin
來自 neopixel  導入 NeoPixel

銷 =  引腳(0 , 引腳。OUT )   #集GPIO0到輸出以驅動NeoPixels
NP  =  NeoPixel (銷, 8 )   #創建GPIO0為8像素NeoPixel驅動
NP [ 0 ]  =  (255 , 255 , 255 ) #設定第一個像素到白色
np 。write ()              #將數據寫入所有像素
r , g , b  =  np [ 0 ]         #獲取第一個像素顏色
對於NeoPixel的低級驅動:

導入 esp
esp 。neopixel_write (pin , grb_buf , is800khz )
APA102驅動程序
使用apa102模塊:

從 機器 導入 引腳
從 apa102  導入 APA102

時鐘 =  引腳(14 , 引腳。OUT )     #集GPIO14到輸出驅動時鐘
數據 =  引腳(13 , 引腳。OUT )      #集GPIO13輸出到驅動數據
APA  =  APA102 (時鐘, 數據, 8 ) #創建上的時鐘驅動器APA102和8個像素的數據引腳
APA [ 0 ]  =  (255 , 255 , 255 , 31 ) #將第一個像素設置為白色,最大亮度為31
apa 。write ()                  #將數據寫入所有像素
r , g , b , brightness  =  apa [ 0 ]  #獲取第一個像素顏色
對於APA102的低級駕駛:

導入 esp
esp 。apa102_write (clock_pin , data_pin , rgbi_buf )
DHT司機
DHT驅動程序在軟件中實現,適用於所有引腳:

import  dht
import  machine

d  =  dht 。DHT11 (機器。銷(4 ))
d 。measure ()
d 。溫度() #例如。23(°C)
d 。濕度()    #例如。41(%RH)

d  =  dht 。DHT22 (機器。銷(4 ))
d 。measure ()
d 。溫度() #例如。23.6(°C)
d 。濕度()    #例如。41.3(%RH)
WebREPL(Web瀏覽器交互式提示)
WebREPL(通過Web瀏覽器進行REPL,可通過Web瀏覽器訪問)是ESP8266端口中的實驗性功能。從https://github.com/micropython/webrepl下載Web客戶端(託管版本可從http://micropython.org/webrepl獲得),並通過執行以下命令對其進行配置:

import  webrepl_setup
並按照屏幕上的說明操作。重啟後,它將可用於連接。如果在引導時禁用了自動啟動,則可以使用以下命令按需運行已配置的守護程序:

import  webrepl
webrepl 。開始()
支持使用WebREPL的方法是連接到ESP8266接入點,但守護進程也在STA接口上啟動(如果它是活動的),因此如果您的路由器設置正常並且工作正常,您也可以在連接到普通Internet時使用WebREPL接入點(如果遇到任何問題,請使用ESP8266 AP連接方法)。

除了終端/命令提示符訪問,WebREPL還提供文件傳輸(上傳和下載)。Web客戶端具有相應功能的按鈕,或者您可以使用webrepl_cli.py 上面的存儲庫中的命令行客戶端。

檢視會員個人資料 http://iotboard.666forum.com

回頂端  內容 [第1頁(共1頁)]

這個論壇的權限:
無法 在這個版面回復文章