Tag Archives: intel

[Movidius神經運算棒] 認識與操作Neural Compute SDK:mvNCCheck

作者/攝影曾吉弘
文章分類教學(翻譯)
時間3小時
成本
難度******   (1~10)
材料表
  • Raspberry Pi 3單板電腦
  • Intel Movidius神經計算棒

(Original post from Intel Movidius NCS blog: “Using and Understanding the Neural Compute SDK: mvNCCheck”:https://movidius.github.io/blog/mvNCCheck/

 

Neural Compute SDK Toolkit: mvNCCheck

Intel® Movidius™ 神經運算軟體開發套件(Neural Compute Software Development Kit,NCSDK)包含三套工具,用於幫助使用者順利上手,操作Intel® Movidius™ 神經運算棒(Intel® Movidius™ NCS)。這些工具包含:mvNCCheck,mvNCCompile及mvNCProfile。本文將幫助您更認識mvNCCheck工具程式的運作方式,以及如何將它整合至Neural Compute SDK的整體工作流程中。

圖1

 

使用mvNCCheck的網路會有怎樣的效果呢?

您將學到:

  • 如何使用mvNCCheck tool
  • 如何解釋mvNCCheck的輸出結果

 

您會需要:

  • Intel Movidius Neural Compute Stick 神經運算棒 – 購買請按我
  • 執行Ubuntu 16.04的 x86_64 筆記型電腦

 

如果尚未做過的話,請在您的開發電腦上安裝NCSDK。安裝步驟請參考Intel Movidius NCS Quick Start GuideCAVEDU的Intel Movidius相關文章

 

檢查網路

Step 1:開啟terminal,切換至ncsdk/examples/caffe/GoogLeNet目錄下

Step 2:使用mvNCCheck 來使Intel Movidius NCS上的網路生效。

mvNCCheck deploy.prototxt -w bvlc_googlenet.caffemodel

 

Step 3:完成了!您應該會看到類似下面的畫面訊息:

USB: Myriad Connection Closing.
USB: Myriad Connection Closed.
Result:  (1000,)
1) 885 0.3015
2) 911 0.05157
3) 904 0.04227
4) 700 0.03424
5) 794 0.03265
Expected:  (1000,)
1) 885 0.3015
2) 911 0.0518
3) 904 0.0417
4) 700 0.03415
5) 794 0.0325
------------------------------------------------------------
 Obtained values 
------------------------------------------------------------
 Obtained Min Pixel Accuracy: 0.1923076924867928% (max allowed=2%), Pass
 Obtained Average Pixel Accuracy: 0.004342026295489632% (max allowed=1%), Pass
 Obtained Percentage of wrong values: 0.0% (max allowed=0%), Pass
 Obtained Pixel-wise L2 error: 0.010001560141939479% (max allowed=1%), Pass
 Obtained Global Sum Difference: 0.013091802597045898
------------------------------------------------------------

 

mvNCCheck的功能為何,為何要用到它?

作為NCSDK的一部分,mvNCCheck提供以下三項主要功能:

  • 確保資料從fp32轉為fp16時的正確性
  • 快速確認指定網路是否相容於Intel NCS
  • 對網路各層進行快速除錯

 

確保結果的準確性

為確保結果的正確性,mvNCCheck會比較Intel Movidius NCS 與網路原生框架(Caffe/TensorFlow™)兩者間的推論結果。由於Intel Movidius NCS與NCSDK採用16-bit 浮點數資料,因此必須將收進來的32-bit浮點數資料轉為16-bit。fp32/fp16的轉換過程可能在推論結果中產生minor rounding的問題,這時候mvNCCheck工具程式就很好用了,它可檢查您所使用的網路是否產生正確的結果。

 

首先,mvNCCheck工具程式會讀取網路,並將模型轉換為Intel Movidius NCS可用的格式。接著它會在Intel Movidius NCS上使用網路來推論,也會用網路原生框架(Caffe/TensorFlow)來執行推論。

 

最後,mvNCCheck 會產生一份簡易的報表,比較Intel Movidius NCS與網路原生框架兩者的推論結果。這些結果可用於確認某個神經網路在fp32/fp16轉換後,是否還能產生一定正確性以上的結果。比較結果接下來會詳細討論。

 

判斷網路與Intel Movidius NCS的相容性

mvNCCheck也可用於檢查某個網路是否相容於Intel Movidius NCS。有蠻多原因都會造神經網路與Intel Movidius NCS不相容,其中包括(但不限於)記憶體限制、不支援的層或不支援的神經網路架構。若想了解更多原因,請參考 Intel Movidius NCS documentation website 上關於TensorFlow與Caffe框架的說明。另外,最新的 NCSDK Release Notes也會說明關於SDK的勘誤與最新功能⋯⋯等等。

 

使用mvNCCheck對網路進行偵錯

若您的網路執行不如預期,可運用mvNCCheck來對網路偵錯,只要執行 mvNCCheck 時加上 -in-on 選項即可。

  • -in 選項可讓您將某個節點指定為輸入節點
  • -on 選項可讓您將某個節點指定為輸出節點

使用mvNCCheck並搭配 -in-on 參數,透過逐層分析或二元搜尋分析,比較Intel NCS 與Caffe/TensorFlow的結果,這樣便有機會找出發生錯誤/差異的層。

 

偵錯範例:

假設您的網路架構如下:

  • Input – Data
  • conv1 – Convolution Layer(卷積層)
  • pooling1 – Pooling Layer(池化層)
  • conv2 – Convolution Layer(卷積層)
  • pooling2 – Pooling Layer(池化層)
  • Softmax – Softmax

假設您執行mvNCCheck所取得的結果為nan(並非數字)。請用以下指令搭配 -on  選項來檢查第一卷積層(Convolution layer) “conv1” 的輸出結果:

mvNCCheck user_network -w user_weights -in input -on conv1 

 

若是較大的網路時,使用二元搜尋法將有助於降低找到發生問題的那一層所需的時間。

 

理解mvNCCheck的輸出結果

圖2

 

來看看上述 mvNCCheck 輸出所代表的意義:

  • 綠色方框為Intel NCS的前五項推論結果
  • 紅色方框為原生框架(可能是Caffe或TensorFlow)的前五項推論結果
  • 藍色方框是兩者推論結果的各項比較結果

若想要深入理解這些結果,我們得先了解Intel Movidius NCS與Caffe/TensorFlow的輸出都是儲存在一個tensor中(tensor 要簡單定義的話,就是一個值的陣列)。五項測試都是兩個tensor間的數學性比較。

 

名詞解釋:

  • ACTUAL – 神經運算棒的tensor輸出
  • EXPECTED– 框架(Caffe或TensorFlow)的 tensor 輸出
  • Abs – 計算絕對值
  • Max – 計算一個(或多個)tensor的最大值
  • Sqrt – 計算某數值的平方根
  • Sum – 計算某數值的加總

 

 

最小像素正確度(Min Pixel Accuracy):

本數值代表兩個輸出tensor值之間的最大誤差。

圖3

 

平均像素正確度(Average Pixel Accuracy):

兩個 tensor 數值的均差。

圖4

 

錯誤值百分比:

本數值代表Intel Movidius NCS的tensor值,與框架tensor間的誤差是否超過 2%。

圖5

 

為什麼是2%?這個閾值設定扣掉了來自fp32/fp16轉換後的精度降低的影響程度。

 

Pixel-wise L2 error:

本數值代表整個輸出tensor的約略相對誤差。

圖6

 

將差異加總起來:

將Intel Movidius NCS tensor與框架tensor之間的所有差異加總起來。

圖7

 

沒有輸入的話,mvNCCheck如何進行推論?

在神經網路中進行向前傳遞時,常見的作法是以一個tensor或一個數值陣列作為輸入。如果未指令輸入的話,mvNCCheck使用範圍在 -1 至 1之間的隨機浮點數作為輸入tensor。只要在圖像路徑後加上 “-i” 參數,也可將讓 mvNCCheck 接受圖像輸入。

 

可能發生的錯誤與解決方法

若執行 mvNCCheck 但網路發生錯誤時,可能原因如下:

 

輸入值縮放

某些神經網路要求輸入值得先被縮放(scale)調整過。若輸入未經縮放的話,可能造成Intel Movidius NCS與網路原生框架的推論結論不一致的狀況。

 

使用 mvNCCheck 時,可用–S選項來指定用於縮放輸入值的除數。圖像通常以每個顏色通道數值範圍介於 0 到 255 間的方式儲存。若有個神經網路需要輸入值介於 0.0 到 1.0 之間,請用–S 255選項將所有輸入數值除以255,就可以把它們縮放到 0.0 到 1.0 之間了。

 

  –M 選項可用於對輸入值減去均值。例如,若某個神經網路需要輸入值介於 -1 到 1 之間的話,請同時用–S 128–M 128選項將做到此事。

 

未支援的層

Intel Movidius NCS 並未支援前所有的神經網路架構與層。若執行 mvNCCheck 後看見“Stage Details Not Supported”的錯誤訊息,就代表您所選用的網路需額外處理步驟,或是Neural Compute SDK尚未支援這些層。想知道目前支援哪些層,請參考 Neural Compute Caffe SupportNeural Compute TensorFlow Support 等說明網頁。

 

其他Bug

其他造成不正確結果的可能原因就是bug啦!請來這邊回報吧:Intel Movidius Neural Compute Developer Forum.

 

更多關於mvNCCheck

關於 mvNCCheck 所以有可用的參數,請參考 mvNCCheck 文件頁面

 

延伸閱讀

 

相關文章

[AI 人工智慧應用] MovidiusNCS在PC中設定Ubuntu虛擬機並執行NCSDK(上)

作者

袁佑緣

時間

三小時

難度

***

材料表

前言

為了要能夠在電腦上使用Movidius Neural Computation Stick(NCS), 我們必須在個人電腦上準備一些必要的工具, 例如:Ubuntu 16.04作業系統(目前NCS正式支持的系統版號)以及安裝必要的函式庫NCSDK。

由於一般人的電腦的作業系統都不是Ubuntu16.04, 所以我們必須要在電腦上安裝虛擬機來跑一個虛擬的系統。

以下我們將一步一步的帶各位讀者在自己的電腦上完成詳細的虛擬機設定, 如果是想要直接使用我們已經幫您做完的版本, 請直接跳到 “[Movidius NCS] 如何在PC中設定Ubuntu虛擬機並執行NCSDK(下) 的虛擬機的Import/Export 小節“。

懶人包教學影片可以看這裡,想一步一步自己設定請往下繼續看:

懶人包影片軟體連結,想一步一步自己設定請往下繼續看

1、更多Movidius AI運算連結,請下載2、3、4的檔案

2、VirtualBox軟體安裝檔連結

3、VirtualBox 作業系統懶人包安裝檔, Ubuntu for intel Movidius 神經運算棒 作業系統連結

4、VirtualBox USB2.0、USB3.0 Extension Pack.下載連結

安裝VirtualBox與下載Ubuntu作業系統

首先請先到以下的網址下載VirtualBox虛擬機, 並且根據您的作業系統來選擇要下載的安裝檔, 例如:假設讀者的電腦作業系統是Windows的話, 就在VirtualBox 52.6 platform packages, 就點選”Windos hosts”來下載。

接下來我們還必須要去下載VritulBox Extension Pack, 才能讓虛擬機使用USB3.0的功能。

再來請到以下的網站去下載Ubuntu 16.04系統,

新增虛擬機

下載完成後,請打開Virtualbox,並按下New新增一個虛擬機器。

接下來在Name上打上虛擬機的名稱, 並選擇Type為Linux, 選擇Version為Ubuntu (64-bit),如下圖。

接下來指定記憶體的大小,基本上至少要有2GB會比較夠。

接下來選擇建立一個虛擬的硬碟。

選擇硬碟檔案格式為VDI(VritualBox Disk Image)

指定硬碟維dynamically allocated。

最後指定虛擬硬碟的大小,建議10~15GB,或15GB以上。

設定安裝光碟

完成後在VirtualBox左邊的選單應該可以看到剛剛新增的虛擬機, 如下圖中的ubunutu-NCS, 接下來請按下右鍵,並點選Settings。

先選擇擇Storage, 然後在Optical Device點選光碟小圖示, 並選擇剛剛下載的Ubunutu 16.04安裝光碟。

設定USB Controller

接下來我們要來設定USB界面, 為了要讓虛擬機可以辨識到Movidius的NCS, 請先選擇Enable USB Controller, 並勾選USB 3.0 (xHCI) Controller。 如果不能勾選USB3.0的話,有可能是您沒有安裝前面提過的VirtualBox Extension Pack。

接下來在下面的USB Filter新增USB2跟USB3的設定,如下圖。

網路設定

最後,為了要讓使用者可以使用SSH遠端登入虛擬機中, 我們必須設定一個Port Forwarding的設定。

如下圖,將Host的port 2222轉送到Guset的port 22, 也就是說在讀者的電腦上如果用SSH連線到自己localhost的port 2222, 就會連線到虛擬機中的Ubuntu系統中(一般SSH Server預設是port 22)。

安裝Ubuntu系統

以上的設定都完成後, 請點選向右的箭頭(Start), 將虛擬機開機。

進入Ubuntu安裝光碟後, 請選擇右邊的Install Ubuntu。

接下來選擇Erase disk and install Ubuntu。

按下Continue繼續安裝。

選擇時區設定,如下範例中的台北。

在台灣的話,選擇預設的Keyboard Layout即可。

最後設定一下使用者名稱及密碼。

以上設定完成後, 虛擬機會需要花上一點時間安裝全新的Ubuntu作業系統。

當出現以下的圖示時, 就代表已經安裝完成了, 接下來只要按下Restart Now重新開機即可。

一般來說, 安裝完新的系統後,就會需要退出當初使用的安裝光碟, 不過不用擔心,VirtualBox會自動幫你做完, 所以讀者只要直接按下Enter繼續即可。

虛擬機重開之後, 應該就能夠進到新安裝的Ubuntu作業系統, 請輸入您設定的使用者密碼。

成功登入後, 讀者應該就可以看到如下圖的桌面, 代表已經安裝成功囉!

接下來,請讀者繼續到 [Movidius NCS] 如何在PC中設定Ubuntu虛擬機並執行NCSDK(下)完成剩下的NCSDK安裝設定。

 

相關文章:

[Movidius神經運算棒]五步驟打造Intel Movidius NCS影像分類器

(Original post from Intel Movidius NCS blog: “Build an Image Classifier in 5 steps”:https://movidius.github.io/blog/ncs-image-classifier/

 

什麼是影像分類?

影像分類是電腦視覺的重要課題。目標在於把圖像中的某個主題或物體歸類到預先定義的類別中。現實生活中的影像分類問題是把印有各種物體的卡片拿給小孩子看,並讓他們分辨卡片上所印的東西是什麼。傳統的作法是讓機器具備一定的視覺感知能力,這有賴於使用特徵描述器的各種複雜電腦演算法,描述器像是邊緣、角落與顏色等等,來辨識或辨認影像中的一或多個物體。

深度學習採用另一個更有效率的做法來解決現實生活中的影像問題。它運用了多層彼此互聯的神經元,每一層都採用了特定的演算法去辨識或分類某個描述符(descriptor)。舉例來說,如果您想要對交通的[STOP]號誌進行分類的話,要用到深度神經網路 (DNN) 來偵測號誌的邊緣與邊界,第一層則是用來偵測邊角的數量、下一層則是偵測紅色、再下一層偵測紅色周圍的白色邊界,一直反覆執行下去。DNN可以把一個任務分配到執行單一檢算法的多個層,這樣可以處理大量的描述符,讓基於DNN的影像處理應用於現實生活中能更有效率。

作者/攝影  曾吉弘
時間  2小時
成本
難度 * * * * *
材料表
  • Raspberry Pi 3單板電腦
  • Intel Movidius神經計算棒

 

Layer 1: 邊緣偵測(八角形)

Layer 2: 邊緣附近的白色邊界

Layer 3: 紅色本體

Layer 4: “STOP”字樣

注意:上圖僅用於示範DNN如何辨識物體中的不同描述符,並非DNN用於分類STOP標示的正確呈現。

影像分類與物件偵測是不一樣的。分類是假設整張圖中只有一個物體,例如上述的幼童圖卡範例。另一方面,物件偵測可以在同一張圖中處理多個物體,並計算各物體在圖中的位置。

邊做邊學!

您會製作:

從資料夾中讀取單張影像並進行分類。

您會學到:

  • 如何使用預訓練的網路來進行影像分類
  • 如何使用Intel® Movidius™ NCS 的API框架來編寫程式

您會需要:

  • Intel Movidius Neural Compute Stick 神經運算棒 – 購買請按我
  • 32/64位元的桌上型/筆記型電腦,作業系統須為Ubuntu 16.04 (“開發機器”)

如果還沒做的話,請在您的開發機器上安裝完整的NCSDK。請參考Intel Movidius NCS Quick Start Guide上的安裝步驟來完成。

先看結果…

如果想先看看程式輸出結果的話,請用以下使令來取得範例程式 (NC App Zoo) 並執行

mkdir -p ~/workspace
cd ~/workspace
git clone https://github.com/movidius/ncappzoo
cd ncappzoo/apps/image-classifier
make run

make run 指令會下載並建置所有的相依檔案,例如預訓練網路、二元graph檔、ilsvrc資料集均值等。只有第一次執行時要先執行make run;後續只要執行 python3 image-classifier.py 就可以了。應該會看到類似以下的訊息:

 ——- predictions ——–
prediction 1 is n02123159 tiger cat
prediction 2 is n02124075 Egyptian cat
prediction 3 is n02113023 Pembroke, Pembroke Welsh corgi
prediction 4 is n02127052 lynx, catamount
prediction 5 is n02971356 carton

開始吧!

感謝NCSDK 完整的API framework,只需要幾行Python就可以完成影像分類器。以下是image-classifier.py 中一些需要調整的使用者參數::

  1. GRAPH_PATH:要進行推論的graph檔路徑
    • 預設值為 ~/workspace/ncappzoo/caffe/GoogLeNet/graph
  2. IMAGE_PATH:想要分類的影像路徑
    • 預設值為 ~/workspace/ncappzoo/data/images/cat.jpg
  3. IMAGE_DIM:所採用神經網路之影像尺寸規格
    • 例如 GoogLeNet 採用 224×224像素,AlexNet則是227×227像素
  4. IMAGE_STDDEV:您選用之神經網路所定義的標準差(scaling value)
    • 例如:GoogLeNet不採用任何比例因子,但InceptionV3的比例因子為128 (stddev = 1/128)
  5. IMAGE_MEAN:均值減法(Mean subtraction)是深度學習領域中常用的資料整理技巧。
    • 對ILSVRC資料集來說,B、G、R的平均值分別為102、117與123

請先由mvnc函式庫匯入mvncapi模組,才能順利使用NCSDK API framework。

import mvnc.mvncapi as mvnc

 

Step 1:開啟enumerated裝置

如同其他USB裝置,當您將NCS接上應用程式處理器 (執行Ubuntu的桌上型/筆記型電腦) 的USB埠,前者會被後者枚舉為一個USB裝置。我們可以呼叫API來檢視各個NCS裝置。

# Look for enumerated Intel Movidius NCS device(s); quit program if none found.
devices = mvnc.EnumerateDevices()
if len( devices ) == 0:
print( 'No devices found' )
quit()

您知道在同一個應用程式中,可以連接多個NCS神經運算棒來提高推論效能嗎?以下語法是運用API 呼叫單一NCS並開啟 (意即準備好操作).

# Get a handle to the first enumerated device and open it
device = mvnc.Device( devices[0] )
device.OpenDevice()

 

Step 2:將graph檔載入NCS

為了簡易起見,我們採用已訓練好的AlexNet model中的某個已編譯的graph檔,這當您在 ncappzoo 資料夾中執行 make 指令實就已經編譯好了。後續會有文章教您如何編譯一個已經訓練過的網路,但現在先來看看如何把graph載入NCS中。

# Read the graph file into a buffer
with open( GRAPH_PATH, mode='rb' ) as f:
blob = f.read()

# Load the graph buffer into the NCS
graph = device.AllocateGraph( blob )

Step 3:載入單一影像至Intel Movidius NCS並進行推論

Intel Movidius NCS是以Intel Movidius視覺處理元件(VPU)為基礎。這個元件對數百萬種監控攝影機、可用手勢控制的無人機、工業級機器視覺設備提供了視覺智能。如同VPU,NCS在系統中扮演的角色好比是個視覺上的共同處理器。以本範例來說,我們採用Ubuntu系統來讀取資料中的影像並 and offload it to the NCS for inference。NCS負責所有的神經網路運算,,這樣就可以節省CPU與記憶體來執行其它應用層的任務。

我們得先對影像進行處理(預處理)才能將影像載入NCS。

  1. 調整或裁切影像,好符合後續預訓練的網路規格。
    • GoogLeNet格式為224×224像素,AlexNet則是227×227像素
  2. 從整體資料集中,減去各個頻道 (Blue, Green and Red) 的均值。
    • 這在深度學習領域中是常見的 center the data 的技巧。
  3. 將影像轉為半精度浮點數 (fp16) 陣列,接著使用LoadTensor函式將影像載入NCS。
    • 搭配skimage函式庫只要一行程式碼就搞定
# Read & resize image [Image size is defined during training]
img = print_img = skimage.io.imread( IMAGES_PATH )
img = skimage.transform.resize( img, IMAGE_DIM, preserve_range=True )

# Convert RGB to BGR [skimage reads image in RGB, but Caffe uses BGR]
img = img[:, :, ::-1]

# Mean subtraction & scaling [A common technique used to center the data]
img = img.astype( numpy.float32 )
img = ( img - IMAGE_MEAN ) * IMAGE_STDDEV

# Load the image as a half-precision floating point array
graph.LoadTensor( img.astype( numpy.float16 ), 'user object' )

 

Step 4:讀取並顯示NCS的推論結果

根據您想要如何將推論結果整合入應用中,您可以選擇blocking or non-blocking 函式呼叫兩者之一來載入上述步驟中的tensor並讀取推論結果。現在我們使用預設的 blocking 呼叫 (無需使用特定的API).

# Get the results from NCS
output, userobj = graph.GetResult()

# Print the results
print('\n------- predictions --------')

labels = numpy.loadtxt( LABELS_FILE_PATH, str, delimiter = '\t' )

order = output.argsort()[::-1][:6]
for i in range( 0, 5 ):
print ('prediction ' + str(i) + ' is ' + labels[order[i]])

# Display the image on which inference was performed
skimage.io.imshow( IMAGES_PATH )
skimage.io.show( )

 

Step 5:卸載graph與關閉裝置

為了避免記憶體洩漏與/或區段錯誤(segmentation fault),請記得關閉任何開啟中的檔案、資源以及 deallocate 使用中的記憶體。

graph.DeallocateGraph()
device.CloseDevice()

恭喜!您的DNN 影像分類器完成了。

 

還可以試試

延伸閱讀

相關文章

 

使用 Intel® Movidius™ Neural Compute Stick搭配Raspberry Pi 3執行MobileNets

(Original post from Intel Movidius NCS blog: “MobileNets on Intel® Movidius™ Neural Compute Stick and Raspberry Pi 3″:https://movidius.github.io/blog/ncs-rpi3-mobilenets/  

作者/攝影  曾吉弘
時間  2小時
成本需要上網下載的費用
難度 * * * * *
材料表

引言

深度學習之於邊緣運算讓世界各地的創新開發者得以建立各種架構與裝置來解決問題,並提出像是內建了Intel Movidius VPU 的 Google Clips Camera 這樣的創新方案。邊緣裝置應該便於攜帶、低功耗但同時又能為深度學習神經網路提供一定彈性的架構。本文將說明如何使用使用 Intel® Movidius™ Neural Compute Stick (神經運算棒) 搭配Raspberry Pi 3 做為深度學習邊緣運算的解決方案。

應用多個現成的分類網路,有許多具備一定擴充性的網路都提供了一定的客製化程度,針對使用者不同的功耗、運算與精確度需求來提供合適的方案。Google MobileNets就是這類網路其中之一,提供兩個可修改的變數讓您自訂網路來解決問題,並可在這類型低功耗裝置上實現高運算效能與高精確度。

 

* 資料來源:https://research.googleblog.com/2017/06/mobilenets-open-source-models-for.html

第一個變數為輸入影像的大小。如上圖,複雜度與精確度會隨著輸入大小而改變。Google 已針對不同影像尺寸提供了預先訓練好的ImageNet分類檢查點。

第二個變數則稱為depth multiplier。雖然網路架構維持不變,調整這個depth multiplier 會影響每一層的頻道(channel) 數量,進而影響網路複雜度並精確度與 frame rate。一般來說,網路的 frame rate 愈高,精確度就愈低。

接下來會介紹如何安裝並執行NCSDK、下載NCAppZoo,以及在 Intel Movidius 神經運算棒上執行MobileNet。最後要使用NCAppZoo 來示範benchmarkncs app 的用途,它可收集一或多個接在電腦 (例如 Pi ) 上的Intel Movidius 神經運算棒之執行效能。

 

所需硬體

Raspberry Pi 3、電源與記憶卡 (外殼建議有,但非必須)
  1. Raspberry Pi 3 外殼
  2. Raspberry PI 3 Model B
  3. micro SD記憶卡 (建議16g以上)
  4. 支援 HDMI 接頭螢幕 (或其他規格的轉接線)
  5. 鍵盤滑鼠
  6. Intel Movidius Neural Compute Stick

 

按部就班

Step 1:安裝最新的Raspberry Pi 3 Raspbian OS

樹莓派基金會取得最新的作業系統 Stretch img 檔之後,燒錄開機用的 sd卡。確認Raspberry Pi 開機並連上網路之後,使用以下指令更新系統:

注意:需使用 Raspbian Stretch,上一版 Jessie 確認不支援。

sudo apt-get update

Step 2:將 Intel Movidius神經運算棒插上Raspberry Pi 3 的 USB接頭

Step 3:安裝Intel Movidius Neural Compute SDK (NCSDK):

請用以下指令來下載並安裝NCSDK

git clone https://github.com/movidius/ncsdk
cd ncsdk
make install
cd ..

Step 4:取得NCAppZoo github

git clone https://github.com/movidius/ncappzoo
cd ncappzoo

Step 5:執行benchmarkncs.py來收集MobileNets執行效能

cd apps/benchmarkncs
./mobilenets_benchmark.sh | grep FPS

結果

在這些選項中,您一定可以根據自身的精確度與效能需求找到最適合的網路。下圖 (來源:Google’s blog) 可看出使用ImageNet分類時,精確度與效能的消長關係。圖中也可看到 Intel Movidius神經運算棒的效能(單位FPS,數據未經Intel原廠確認)。

* Network Accuracy Data from Google’s Blog https://research.googleblog.com/2017/06/mobilenets-open-source-models-for.html

如上圖,Raspberry Pi 3 搭配 Intel Movidius神經運算棒(橘色線)與單單使用Raspberry Pi 3 相比,前者執行 MobileNets 的FPS速度為後者的9倍 (參數皆為DepthMultiplier=1.0 / 輸入影像大小 = 224×224 / Top5 accuracy of 89.5%)。

Raspberry Pi 是一個相當不錯的開發平台。雖然單單使用Raspberry Pi 3 在推論上已能達到相當不錯的frame rate,NCS 卻硬是把效能提升一個量級,並讓這個平台在執行CNN-based的神經網路時的效能更好。如上表,Intel Movidius神經運算棒搭配Raspberry Pi 3 來使用 MobileNets進行推論運算的效能成長了 718% 到 1254%。

[ Arduino101 專題實作計畫] Arduino101二輪平衡小車DIY

作者/攝影 袁佑緣
時間
  • 3小時
成本
難度  * * * * * *
材料表
  • 厚度3mm壓克力板
  • Arduino101控制板
  • 減速馬達x2
  • 麵包板
  • 杜邦線
  • 排針
  • 電池盒
  • 防滑墊
  • 3.7v鋰電池(14500)
  • 鋰電池充電器
  • TA7279P馬達驅動晶片

1. 平衡車車體製作

本範例的平衡車車體主要是由雷切壓克力構成,壓克力的厚度是使用3mm的板材,再藉由螺絲螺帽組合而成,車子的馬達使用的是兩顆小型的5V減速馬達,輪子的部份也是由壓克力組成,胎皮則是貼上一層防滑墊,車子的底部則有兩個3號電池座,裡面各裝兩顆7V的鋰電池,一個用來驅動控制板,另一個則用來驅動馬達。
詳細的CAD檔可以參考筆者放在網路上的onsahpe專案,有興趣的讀者可以參考看看喔!

圖一、平衡車的模擬動畫

圖二、組裝爆炸圖

圖四六七八、車體的三視圖

圖八、平衡車實體圖

 

2.電路接線

本次範例使用的馬達驅動晶片是TA7279P,其腳位功能與編號如下圖(節錄自官方datasheet) ,請將5號及10號腳位接到鋰電池的電源上,並把A、B兩個channel的馬達訊號輸入腳位,也就是1、3、12、13接到Arduino 101上的3、5、6、9號腳位來當作控制板的訊號控制腳位,因為這些腳位才有辦法做PWM訊號的輸出,也因此才能控制馬達的轉速。
至於馬達的部份,請將下表output(輸出)的腳位各自接到兩顆馬達上即可,例如:A channel想控制左馬達,B channel想控制右馬達,那就把4、6號腳位接到左馬達上,9、11號腳位接到右馬達上。
另外也別忘記要給TA7279馬達驅動晶片供給工作電壓,只要在14號腳位供給5V的電力,7號腳位接地就行囉。

圖九、TA7279P腳位功能圖

圖十、TA7279P腳位編號圖

圖十一、完成車體與電線配置!

3. Arduino環境準備

請先準備好Arduino IDE,並請在Arduion IDE上的Boards Manager那邊搜尋關鍵字intel,並如下圖安裝Intel Cuire Board。至於驅動程式的部份,使用MacOS跟Linux的朋友不用擔心,直接使用就可以了,那如果是windows的使用者在第一次將控制板接到電腦上時,會挑出自動安裝驅動程式的視窗,請耐心等候電腦完成安裝就可以進行到下一步囉!

圖十二、Arduino IDE Boards Manager設定

4.程式設計

#include "CurieIMU.h" //引入Arduino 101 IMU的函式庫,用來偵測車體的            角速度與加速度方向

//宣告PID控制的各個參數,各個參數的最佳數值必須視車體情況而定,不同的車體會有所不同,電力的大小也會有影響
const float kp = 24; 
const float ki = 0.05;
const float kd = 15;

//宣告參數K作為complimentray filter的參數
const float K = 0.95;

//list number的大小會決定取平均的樣本數,越多則越準,但也會花掉更多計算時間
const int angle_list_number = 5;
const int error_list_number = 10;

//設定馬達初速為0
int speed = 0;

//定義馬達的驅動腳位
const int motor_A_1 = 3;
const int motor_A_2 = 5;
const int motor_B_1 = 6;
const int motor_B_2 = 9;

//宣告進行角度計算與PID控制會用到的一些參數
float time, time_pre, time_step;
float gyro_angle = 0;
float acce_angle = 0;
float angle_list[angle_list_number];
float pre_error = 0;
float error_list[error_list_number];
float diff_error = 0;
float offset = 0;

void setup()
{
	for(int i = 0; i < angle_list_number; i++)
		angle_list[i] = 0.0;
	for(int i = 0; i < error_list_number; i++)
		error_list[i] = 0.0;
	pinMode(motor_A_1, OUTPUT);
	pinMode(motor_A_2, OUTPUT);
	pinMode(motor_B_1, OUTPUT);
	pinMode(motor_B_2, OUTPUT);
	pinMode(13, OUTPUT);

	Serial.begin(9600);
	Serial.println("Start!!!");

//設定Arduino 101 的IMU感測器	
      CurieIMU.begin();
	CurieIMU.setAccelerometerRange(4);
	CurieIMU.setGyroRange(250);
	time = millis();
	for(int i = 0; i < 5; i++)
	{
		Serial.println("Ready...");
		delay(200);	
	}
	int time2 = millis();

//待機兩秒後,取得一個初始位置的角度,這個位置將會是平衡車目標的平衡位置
	while((millis()-time2) < 2000)
		offset = get_angle();
	digitalWrite(13, HIGH);
}

void loop()
{
//主迴圈會一直去讀取現在角度與目標角度的誤差,並透過PID控制來回傳修正動作給馬達
	float error = get_angle();
	float feedback = PID_feedback(error);
	if(abs(error) > 70)
//當傾斜角度過大時,會視為倒掉,此時將會停機並等待重啟
	{
		while(true)
		{
			analogWrite(motor_A_1, 0);
			digitalWrite(motor_A_2, LOW);
			analogWrite(motor_B_1, 0);
			digitalWrite(motor_B_2, LOW);
			Serial.println("Stop!!!");
		}
	}
	balance(feedback);
}

//平衡函式將會根據PID算出的回饋數值,呼叫馬達做出相對應的修正動作
void balance(float feedback)
{
	speed = int(feedback);
	if(speed < 0)
	{
		analogWrite(motor_A_1, abs(speed));
		analogWrite(motor_B_1, abs(speed));
		digitalWrite(motor_A_2, LOW);
		digitalWrite(motor_B_2, LOW);
	}
	else
	{
		digitalWrite(motor_A_1, LOW);
		digitalWrite(motor_B_1, LOW);
		analogWrite(motor_A_2, abs(speed));
		analogWrite(motor_B_2, abs(speed));
	}
}

//讀取角度的函式會透過計時器累加的部份,將IMU讀到的角速度離散積分成角度,同時會做平均取值並輔以complimentary filter的方式來將精確的角度數值計算出來
float get_angle()
{
	time_pre = time;
	time = millis();
	time_step = (time - time_pre)/1000;

	float ax, ay, az;
	float gx, gy, gz;
	CurieIMU.readAccelerometerScaled(ax, ay, az);
	CurieIMU.readGyroScaled(gx, gy, gz);

//將以下的註解取消掉的話可以從Arduino 101的Serial讀到此刻感應器的原始數值,記得baud rate要跟前面宣告的一樣設定成9600,另外要提醒一下如果開啟Serial輸出的功能的話,會消耗掉額外的計算資源,所以如果已經不需要再讀取數值時,最好把以下的程式碼註解掉
	//Serial.print(ax);
	//Serial.print("\t");
	//Serial.print(ay);
	//Serial.print("\t");
	//Serial.print(az);
	//Serial.print("\t");
	//Serial.print(gx);
	//Serial.print("\t");
	//Serial.print(gy);
	//Serial.print("\t");
	//Serial.print(gz);
	//Serial.println();
	
	gyro_angle += gy*time_step;
	acce_angle = (180/3.141593) * atan(ax/az);
	for(int i = 0; i < angle_list_number-1; i++)
		angle_list[i] = angle_list[i+1];
	angle_list[angle_list_number-1] = K * acce_angle + (1-K) * gyro_angle;
	float mean_angle;
	mean_angle = 0.0;
	for(int i = 0; i < angle_list_number; i++)
		mean_angle += angle_list[i];
	mean_angle /= 5;
	mean_angle -= offset;
	return mean_angle;

}

//PID回饋的函式會將錯誤進行一連串的計算,並根據開頭我們設定的三個係數來做出適當的回饋
float PID_feedback(float error)
{
	for(int i = 0; i < error_list_number-1; i++)
		error_list[i] = error_list[i+1];
	error_list[error_list_number-1] = error;

	float sum_error = 0;
	for(int i = 0; i < error_list_number; i++)
		sum_error += error_list[i];
	diff_error = error - pre_error;
	pre_error = error;
	float p_term = kp * error;
	float i_term = ki * sum_error;
	float d_term = kd * diff_error;
	float feedback = p_term + i_term + d_term;
	if(feedback >= 255)
		feedback = 255;
	else if(feedback <= -255)
		feedback = -255;

//跟前面一樣,把以下程式碼的註解拿掉的話可以從Serial讀出實際得出的回饋
	// Serial.print("P_term: ");
	// Serial.print(p_term);
	// Serial.print("\tI_term: ");
	// Serial.print(i_term);
	// Serial.print("\tD_term: ");
	// Serial.print(d_term);
	// Serial.print("\tError: ");
	// Serial.print(error);
	// Serial.print("\tFeedback: ");
	// Serial.println(feedback);
	return feedback;
}

 

5.實際操作

 

相關文章:

[活動紀錄 ] Arduino/Genuino 101 教學課程分享in Clubhouse

CAVEDU教育團隊前進Intel Clubhouse!在8週的課程裡,進行Genuino 101的基礎教學,並且讓學員們完成一臺手機藍牙遙控車!

作者/攝影 洪卉君
課程時間  8週 (週四 18:00-20:00)
課程講師 徐豐智
課程場地 Clubhourse

感謝臺灣Intel的邀約,CAVEDU教育團隊從2016年10月至12月,在臺灣Intel Clubhouse(財團法人台北市基督教勵友中心)和學員、志工們一起進行了8週的Genuino 101教學課程

來看看8周的課程都做了什麼吧:

Week 1Week 2Week 3Week 4
Genuino 101 基本操作Genuino 101 功能應用—LED呼吸燈Genuino 101 功能應用—可變電阻遙控車組裝教學
Week 5Week 6Week 7Week 8
學員挑戰—遙控車改裝APP INVENTOR—APP製作程式教學學員挑戰—自己寫程式控制遙控車課程內容整合—遙控車呈現

臺灣Intel Clubhouse的學生、志工們完全沒有任何電子、電路基礎,因此在課程教學上除了教學中學員們常見的疑惑以外,天馬行空的問題也不少,不過這些天馬行空的問題很多是真的有辦法實現或解決的!也很佩服學生們能夠想到一些「意料之外」的方式呢!

首三週的程式教學,雖然是比較死板的安裝、啟動、寫程式碼等等內容,但是安排了LED燈和可變電阻這兩項簡單的元件,讓學生實際透過Genuino 101來操控。學生們對於可以依自己的想法控制這些電子元件都感到很興奮。

從第四週開始,就進入本次課程的重頭戲——遙控車製作與操控了。除了硬體上的Genuino 101加遙控車組裝,我們也加入了App Inventor的教學,讓學生可以寫出自己的手機程式並且用它來控制自己製作的遙控車。寫App得到了很好的迴響,我們先教學生入門款的依指令讓手機發出聲音、跳出圖片等等簡單的小動作。學生們在決定音效、圖片、甚至是呈現的方式,都很有自己的想法!看著學生們七嘴八舌地分享自己為手機做出了什麼酷炫的功能,總是會忍不住想要再多教一點啊!

最後學生們終於可以用手機控制自己的Genuino 101遙控車啦!立刻在教室外面的走廊舉辦了第一屆臺灣Intel Clubhouse盃賽車,還開了Facebook直播。看到同學們都可以做出一臺遙控車,並且結合自己的想法來執行藍牙操控的程式。覺得很開心!希望學生們可以利用我們留在臺灣Intel Clubhouse的材料組,結合這次課程的教學內容,試著實現腦海中的想法。

 

[課程成發]海洋機械Arduino課程期末專題展示

紀錄撰寫  曾吉弘紀錄攝影曾吉弘
課程講師  曾吉弘上課地點海洋大學
課程時間  2016 9月~ 2017 1月

阿吉老師在海洋大學的學期課程[Arduino微處理機課程(課程網站)] 順利結束了,感謝台灣英特爾公司贊助本學期所使用之Arduino 101開發板。2015年則是感謝聯發科技公司贊助的LinkIt ONE物聯網開發板(期末展示請點我)

一學期的課程中,同學要學會使用Arduino進行基礎I/O控制、App Inventor 藍牙控制這兩大主題,期末也要做一個專題出來。評分標準是這樣的:

  • 出席:10%,無故缺席每次扣學期總分2分,扣完為止。請務必親自請假,不接受代請。
  • 回家作業/課堂競賽:30% (5% x 6),取高分
  • 期中專案報告:20%,至少有一個完整的功能可運作
  • 期末專案展示:30%
  • 自評5%
  • 組員互評5%

我對於學生的要求很簡單:用心做,少找藉口。但即便這樣到了學期中還是退選了接近一半的人(10多位…),這件事總之就是教一個算一個囉,不經意找到Facebook回顧兩年前我對於學生期末專題的一些總括性意見,列於文末,想看的朋友請耐心看完吧。

專題製作列表:

  • 手持穩定架
  • 寵物自走餐車
  • Axi draw 寫作業機器人(但是要寫很久…)
  • 變形手機多功能座車
  • 遠端探險遙控車
  • 紅外線遙控自動避障掃地機器人
  • 無用盒子

 

手持穩定架

運用Arduino 101 上的加速度計與陀螺儀做出的手持穩定架,相當不錯

遠端影像遙控機器人

遙控功能使用 App Inventor BLE 控制 Arduino 101,影像串流則使用7688 Duo (學生自己去買的,願意自己去找資源這點還挺欣慰的

學生專題常見的狀況,電路板沒有固定,電線長度嚇死人…   除了容易脫落遭成機器人出問題之外,甚至有可能短路而失火

 

紅外線掃地機器人

壓克力自己切的,但您可以發現馬達安裝孔位太外面了,很容易讓壓克力裂開。另一方面,馬達轉速太高其實很難把灰塵掃起來

無用盒,按下搖頭開關會伸出一隻手(servo帶動) 來把按鈕推回去,可以無限次數一直推推推,適合有強迫症的人使用

Axi draw 學生自己畫圖3D列印出來的寫字機器人,可以把要寫的字轉成G code 之後寫出來,目標是可以幫忙寫作業,但是要寫非常久… (還是自己寫比較快…)

以下是demo照片,各組作品的文件與程式碼都會放在本課程專題頁面

demo 完就吃pizza(當天基隆狂風暴雨,辛苦去拿的同學了),阿吉老師的課就是有棍子也有胡蘿蔔,好好做老師不會虧待大家的啦~

 

阿吉老師2014年寫的感言

以下是我對於這學期某堂課,給同學的評語。我衷心期待每位同學都能在認真學習之後有所收獲。文長慎入…

=======================================

各位同學辛苦了,希望這學期大家都有學到東西。以下是我對於各位在本學期表現的講評:

遲到問題:如果您是習慣性遲到的人,這個特性應該多少也會反映在您的待人接物與專題品質上。

上課態度:這…不用我多說,您自己最知道自己上課是怎麼回事。老師不是媽媽,老師不需要也不應該去一再提醒上課要認真這件事。

專題製作:

基本上大家的文件除了第9組上算完整之外,其他各組的東西都有一定程度上的缺點。包括以下:

  1. 格式不一
  2. 沒有參考資料或說明不清楚(最好都不用查資料就會做)
  3. 甘特圖看不出進度規劃
  4. 組員分工不清楚
  5. 看不出學期專題等級和課堂作業等級的差異(到底有沒有好好檢查過啊!)

至於文件準備方面,我希望大家可以先看看這份投影片(http://www.slideshare.net/mwhan/99-29808114)。文件是讓大家對於專案的進度得以參考與回顧,不是拿來應付。機器人會拆掉,但文件卻能留下來。

有時候您專題做得很好,但文件不完備,這樣學弟妹要參考的時候才有承先啟後的價值。再者,日後您要推甄研究所時,我也希望這學期的東西可以派上用場。如果文件中錯字連篇或是格式不一,您很難去說服別人說這份文件是有認真過的。

我之所以要求一定要現場demo,原因很簡單。電機系的同學對於 presentation 的訓練是稍微缺乏的,這樣您才知道反覆演練,顧到每一個環節之後,才懂得珍惜在台上的每一秒鐘。例如,我明明就有說報告當天要將 word 檔「雙面列印」,幾乎沒有一組做到…當別人知道您卻不知道的時候,我想您需要更謹慎。

有時候,不一定都會有第二次機會。如果您今天去研究所口試,要demo的機器人不會動…

再者,您有好的內容,別人還不讓您有機會說,或是只有非常不足的時間。這時如何「講重點」就很重要。我都讓大家講完,從各位報告的內容當中,我就可大約得知各位在本學期中所付出的程度。

衷心各位在本學期課程中都能有所收穫。

吉弘 2014/01/14

 

 

相關文章:

[Intel好物分享及教學] Intel RealSense 3D攝影機,一開始安裝到試玩小遊戲

深度攝影機已經開始越來越普及,而在有些筆電上面也已經開始應用,深度攝影機可以用在人臉辨識、手勢辨識和一些體感遊戲(例如Xbox上的Kinect)。這次要介紹的是Intel的RealSense Camera F200。開箱可以看這一篇[Intel® RealSense™ Camera F200 開箱文]

作者/攝影  黃品叡
時間  約1小時
成本 Intel RealSense Development Kit 目前暫無販售
難度  *
材料表 ❊RealSense F200

❊Windows 7 / 8 / 10

❊ 電腦需有USB3.0

RealSense最被看好的有那些東西呢? 參考文章

  1. F200擁有三種鏡頭:傳統RGB鏡頭、紅外線鏡頭、 紅外線雷射投影機
  2. 可以進行3DMe – 3D人物臉部掃描
  3. 玩Space Astro Blaster – 體感遊戲
  4. 可以結合Scratch-圖形化語言程式

本篇目標是教大家如何入門使用RealSense。

我們分成兩個部分分享(1)從安裝驅動到安裝SDK,最後會有可以用來(2)測試的遊戲可以用RealSense玩玩看

(1)從安裝驅動到安裝SDK

Step1:首先在Intel RealSense網站上下載Camera F200驅動,安裝完成後會再裝置管理員裡看到RealSense的相機,在左下角windows鍵上按右鍵→裝置管理員 (若有成功安裝驅動,可跳過此步驟)

Step2:

(若有成功安裝完成SDK,或者是只是要安裝驅動而不是要進階功能的人,可跳過此步驟)

首先先下載Intel RealSense SDK(連結)

▼輸入email與國家▼

❊注意:在註冊的地方要注意的是密碼的部分,密碼必須要包含符號「# $ %」、英文、數字各一個,長度8~15

Step3:完成後就會有兩種下載可以選,上面是下載器,下面是直接瀏覽器下載(我是用這個)

Step4:下一步 loop (這就不多解釋摟)


▼完成▼

=================================================================

(2)測試的遊戲可以用RealSense玩玩看

Step1:

開始使用:那現在來玩玩這台攝影機的遊戲吧!

▼[一波遊戲][Warrior Wave] 載點 ▼

▼那下載完,安裝完。(注意你安裝的位置!!)▼

  

▼就開始吧! (開啟資料夾裡的Warrior Wave.exe 應該很明顯吧!)▼

 

Step2:

遊戲開始後選擇語言,當然是最有親和力的繁體中文拉

▼那就開始吧!▼

▼劇情…(pass)▼

▼開始拉~▼

▼這個時候把手放到攝影機前,就有手的輪廓,再來就看你怎麼玩拉▼

▼OK~簡單的第一關~之後就慢慢玩吧~▼

這篇也就是教大家怎麼使用RealSense而已,那接下來會進入到SDK的部分,也就比較進階的應用,而進階應用會關係到程式語言(C++, C#, java…等),所以下一篇在詳細說明。(敬請期待喔~)

 

❊感謝臺灣Intel提供。

 

相關文章:Intel® RealSense™ Camera F200 開箱文,感謝台灣 Intel 支援

 

161012 Arduino微處理機課程@海洋大學 七段顯示器與直流馬達

這是阿吉老師第三年到海洋大學機械系開課了,第一年用Arduino,第二年用 LinkIt ONE,第三年則是使用 Arduino 101 (感謝台灣Intel 公司贊助喔)

學期初當然是從基本的周邊控制開始,LED已經交得差不多了,這兩周的進度是直流馬達(L293D晶片) 與七段顯示器。

1476326732776

img20161012183739-1

 

馬達教學投影片如下,歡迎多多分享喔


 

 

 

Arduino (Genuino) 101 與 ScratchX 環境建置

Arduino 101 是 Intel 與 Arduino.cc 合作推出的開發板,主要特色在於使用 Intel Curie 32bit 處理器,並且板子本身就有3軸加速度計與3軸陀螺儀,還有 BLE 藍牙通訊功能。

本文將告訴您如何使用 ScratchX 來控制 Arduino 101 開發板(開發者網頁),請跟著我們一起操作吧!請看實測影片

延伸閱讀:

[開箱文] Arduino 101 / Genuino 101 – Arduino.cc 與 Intel 合作,板載藍牙 BLE 與六軸加速度計/陀螺儀

Scratch 的 Arduino 101 指令說明

Continue reading

Scratch 的 Arduino 101 指令說明

本文是Scratch 的 Arduino 101 指令說明,整理自Scratch for Arduino 101 作者的頁面,請看以下指令說明:

 

設定指定數位腳位(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)為高電位(on)或低電位(off)


設定支援 PWM 的數位腳位(3, 5, 6, 9),數值範圍為0 – 100(%)


指定數位腳位(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)符合條件(on / off)時觸發本事件。


讀取指定數位腳位(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)。如該腳位為高電位,回傳為 true;反之為 false。


指定類比腳位(A0, A1, A2, A3, A4, A5)符合條件時觸發本事件。


讀取類比腳位的數值(A0, A1, A2, A3, A4, A5),回傳值為0~100(%),而非 Arduino IDE 的 0~1023。


當實際搖晃板子時,觸發本事件。請注意無法決定搖晃的力道。


讀取 Arduino 板子的指向。回傳值是三軸各自的轉動角度,單位為度。方向示意圖如下:

showing the Arduino 101 tilt orientation


設定伺服機轉軸位置(非連續型),單位為度。腳位可接在2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13。可接受的數值範圍為0~180度。

CAVEDU註記:Arduino 101 支援 PWM的腳位編號為3, 5, 6 ,9,應該還是要接在這幾隻腳位才能順利控制伺服機。


讀取指定腳位上的伺服機轉軸位置,回傳單位為度 (0~180)