Quantcast
Channel: CAVEDU教育團隊技術部落格
Viewing all 673 articles
Browse latest View live

華碩Tinker Edge-T在Donkey Car的應用—下篇( Tinker Edge-T Donkey Car的神經網路自駕車訓練與測試)

$
0
0

中篇主要的內容主要是著重在Tinker Edge-T Donkey Car操作環境的設定(文章連結,請點我),在操作環境建置完成之後,便可以進行相關Donkey Car的自駕訓練流程。

Tinker Edge-T Donkey Car操作環境建置完成之後,接下來便是進入實際操作的階段,本篇將針對Donkey Car的操控調整、控車與影像資料蒐集、神經網路訓練、自駕車神經網路模型推論與車輛運作進行說明,在執行本篇所有介紹的過程有個前提,就是必須先將Asus Tinker Edge-T在Donkey Car所有的作業系統建置與相關程式套件安裝都完成,相關的安裝與設定流程請參考上篇與中篇的相關介紹。

作者/攝影 曾俊霖
時間 約6小時
難度

★★★☆☆

材料表

一、Edge-T Donkey Car操控調整

Donkey Car基本上必須透過實際的操控,進行車輛動作特性參數(如:驅動輪油門速度、方向舵機轉動角度)的調整,這些特性參數若沒有適當設定,將會造成Donkey Car在進行後續的影像資料蒐集過程與實際自駕時車輛運動特性的不穩定問題,所以請大家都務必確實在這個階段妥善設定各種特性參數。

方向舵機轉動角度調整

  1. 執行 donkey calibrate –channel 1 –bus=2
  2. 輸入方向舵機PWM數值,數值範圍約在400到300之間,方向舵機的中間值約略在360左右,請小心仔細調整PWM數值變化量約為+/- 10,增加數值或減少數值會對方向舵機產生轉動。
  3. 請將PWM數值調整使方向舵機轉動到左轉最大臨界值(即STEERING_LEFT_PWM)與右轉最大臨界值(即STEERING_RIGHT_PWM),請用紙筆記下這些數值。
  4. 以nano編輯myconfig.py檔案中找到STEERING_RIGHT_PWM與STEERING_LEFT_PWM項目,並且將步驟(3)所記錄的數值輸入至對應的項目。

 

驅動輪油門調整

  1. 執行 donkey calibrate –channel 0 –bus=2
  2. 油門PWM數值中間值(Stop)約在370,若在輸入PWM值時聽到ESC嗶嗶聲,表示已校準到正確的中間值,此時驅動輪馬達應該是停止的,請微調數值直到找到使馬達停止的PWM數值,並將該數值記錄下來(即THROTTLE_STOPPED_PWM)。
  3. 請輸入大於停止PWM數值的參數大小,大家應該可以觀察到車輪開始前進轉動,請找到合理的驅動輪最大前進轉動速度,並記住該前進PWM數值(即THROTTLE_FORWARD_PWM)。
  4. 請輸入小於停止PWM數值的參數大小,大家應該可以觀察到車輪開始後退轉動,請找到合理的驅動輪後退轉動速度,並記住該前進PWM數值(即THROTTLE_REVERSE_PWM)。
  5. 以nano編輯myconfig.py檔案中找到THROTTLE_STOPPED_PWM、THROTTLE_FORWARD_PWM與THROTTLE_REVERSE_PWM項目,並將步驟(2)至步驟(4)所記錄到PWM數值對應輸入至對應的項目中。

二、控車與蒐集影像資料

Edge-T Donkey Car完成上述的調校過程之後,就可以進行控車,基本上Edge-T Donkey Car的神經網路訓練所需要的跑道影像資料,也可以在控車階段進行資料的蒐集,但也由於在這個階段Edge-T Donkey Car已經是實際進行運動,因此在這個階段的操作就必須透過SSH的方式進行遙控,SSH的遙控方式請參考「上篇」的內容有關MobaXterm的操作流程操作即可,此外在此階段Edge-T Donkey Car會透過Web的方式開啟操作介面,因此在電腦端也必須要有Web瀏覽器。

1、SSH輸入以下命令,執行Edge-T Donkey Car控車程式:

cd ~/mycar
python manage.py drive

2、開啟Web瀏覽器,並在網址列輸入:<Edge-T Donkey Car的IP位址>:8887

3、進入操作畫面如下:

鍵盤快捷鍵

    • Space(空白鍵) :停止汽車並停止記錄
    • r鍵:切換錄音
    • i鍵:增加油門
    • k鍵:降低油門
    • j鍵:轉左
    • l鍵:右轉

4.由於在Edge-T Donkey Car尚無法使用實體搖桿操作,所以強烈建議使用手機進行Web畫面的操作,透過觸控螢幕的按壓滑可以較易操作車輛的動作,因此建議手機和Edge-T Donkey Car基本上都必須使用Wi-Fi並且都處在同一個網段上,這樣才能夠正確操作Edge-T Donkey Car。

5.在操作的過程中,只要按壓「Start Recording」,Edge-T Donkey Car便會開始記錄操作者的操作油門與方向舵機的操作參數並且連同影像資料一併存入在Edge-T Donkey Car的SD卡中。

6.收集數據所應該要注意的事項:

      • 務必在跑道上多練習幾次駕駛控車,一般至少要跑10圈以上。
      • 如果發生撞車或跑出賽道,請立即按壓「Stop Car」以停止記錄。
      • 在收集10-20圈好的數據(5000~20​​000張圖像)後,在SSH按下Ctrl-C將Edge-T Donkey Car停下來。
      • 收集的油門、方向舵機與影像數據程式將存於最新的tub文件夾中的data文件夾中。

7.將tub文件夾中的data文件夾所有資料壓縮並傳至個人電腦。

8.打開個人電腦虛擬環境(利用Anaconda prompt),由於個人電腦上的虛擬環境需要安裝Donkey Car相關套件程式,並且透過Python進行訓練程式的運作,個人電腦的Anaconda程式的安裝與設定,請參考以下網址進行安裝設定(http://docs.donkeycar.com/guide/host_pc/setup_windows/),並在安裝相關套件程式後,再請輸入以下指令進入Donkey Car電腦虛擬環境:conda activate donkey

9.在(donkey)虛擬環境下完成以下流程,進行神經網路的訓練:

cd mycar
python manage.py train --tub <解壓縮後的資料夾位置與名稱> --model <自行定義的模型名稱> --type coral_tflite_linear
(例如:python manage.py train --tub tub_23_19-08-16 --model model_0816.tflite --type coral_tflite_linear )

10.訓練完成之後,會產生(例:model_0816.tflite)模型檔,將這個檔案進行Edge-TPU的編譯,沒有編譯成Edge-TPU的tflite是無法在Edge-T上執行推論的,而Edge-TPU的編譯程式的安裝,則是需以Google Coral網站上的內容進行安裝,請自行參考至以下網址進行設定與安裝(https://coral.ai/docs/edgetpu/compiler/#usage),本次編譯步驟如下:

edgetpu_compiler <tflite檔案>
(例如:edgetpu_compiler model_0816.tflite)
編譯完成後會產生(例:model_0816_edgetpu.tflite),請將這個edgetpu.tflite檔案複製到Edge-T Donkey Car的mycar資料夾中即可。

三、Edge-T Donkey Car的自駕運作

經過以上這些編譯流程的操作之後,基本上在以SSH進行Edge-T Donkey Car的遙控操作,在這個部分的操作,基本上如同之前drive的動作一樣,只是要把訓練好的神經網路模型檔案匯入至程式當中運作,步驟如下:

  1. SSH輸入以下命令,執行Edge-T Donkey Car控車程式:
cd ~/mycar

python manage.py drive --model <Edge-TPU格式的tflite檔案> --type coral_tflite_linear

(例如:python manage.py drive –model model_0816_edgetpu.tflite –type coral_tflite_linear)

  1. 開啟Web瀏覽器,並在網址列輸入:<Edge-T Donkey Car的IP位址>:8887
  2. 進入操作畫面如下:

  1. 在Local Pilot全自駕模式下,操作者無法操作Edge-T Donkey Car,Edge-T Donkey Car會按照神經網路訓練後的結果進行油門與轉向的動作,但在操作畫面上若操作者選擇User模式,則使用者可完全自行控車,也可以選用Local Angle模式,使用者僅能操作油門,轉向交由神經網路模型進行推論自動運作,即所謂的半自動駕駛的概念。

 

  1. 在自駕的模式下,過程中只要按壓「Start Recording」,Edge-T Donkey Car便會開始記錄操作者的操作油門與方向舵機的操作參數並且連同影像資料一併存入在Edge-T Donkey Car的SD卡中,透過這樣的方式亦可讓Edge-T Donkey Car一邊跑車一邊蒐集影像資料,以利後續的神經網路訓練效能的提升。


【3DP小教室】常見3D列印問題與注意事項,大公開!

$
0
0

3D列印隨著近年的技術發展,已經進入了成熟穩定的期間,因應了許多產品開發以及設計需求,大多數的設計者們為提升開發的時程而選擇使用3D列印,本文將介紹3D列印常見問題與注意事項說明分享。

作者/攝影  怡婷、皇甫

3D繪圖軟體在網路上選擇眾多也易取得,但是擁有一台3D印表機卻是一般人需要多方考慮下才會擁有的機具,機器人王國提供了「3D代客列印」的服務,若您有3D列印的需求,代客列印也是一個不錯的選擇喔!以下介紹幾項3D列印前常見問題與注意事項(本文建議與注意事項以「印匠」3D印表機(更多產品資訊)作為依據,如使用其他印表機請自行斟酌參考):

一、3D繪圖

繪圖軟體選擇

繪圖軟體網路上的資源相當充沛,選擇一個符合您需求且操作習慣親切的軟體最為重要喔!

若您是無從下手或是對軟體沒有使用喜好的朋友們,也推薦從DesignSpark Mechanical 開始操作使用,而在CAVEDU技術部落格中也有相關的系列教學,歡迎參考喔!(延伸閱讀DSM教學文章)

繪製作品的大小

在繪製您的作品時,請多留意作品大小是否符合您所選的印表機的列印範圍,若遇上作品超出列印範圍時,建議可以分件列印後再組合。(印匠列印範圍:長10X寬10X高15cm)

兩個物件接合

當遇到兩個列印件需要做接合時,可因應自行需求調整接合的鬆緊度,由於3D列印時印料會有熱漲冷縮的問題,建議在設定時,預抓0.1mm~0.5mm的公差差距。這樣後續在接合成功率也會比較高喔!

無法接合時該怎麼辦?

一般來說,遇到無法接合時,可以回頭調整繪圖檔物件孔位、接合處的大小,大約伸縮0.1mm~0.2mm左右。另外,若是比較喜歡手作的朋友,也可以利用200號砂紙磨掉或是筆刀削去過多的部份;或是利用補土的方式增加較少的地方,來讓部件能更順利的接合。

 

二、準備發印!我該注意什麼事項?

再次確認作品的大小

印匠列印範圍:10cmX10cmX15cm(長X寬X高)。

檔案分件

3D印表機雖然能在同一個列印範圍內,列印多個作品,但有時候還是會遇到無法列印或是列印失敗的時候,為了降低失敗的機率,我們都還是會將單個物件獨立存檔,如此一來,在匯入到切層軟體時,才有更高的自由度可以調整物件的位置、高度。

發印檔案

繪圖完成後的檔案並不能直接被3D印表機讀取,需要另存成「.stl檔」或是「.obj檔」,再經由切層軟體讀取並轉成路徑檔(一般是.gcode檔)。而一般的繪圖軟體,通常都有支援「.stl檔」或是「.obj檔」的存檔格式。

科普一下,什麼是STL?

STL(STereoLithography, 立體光刻)是由3D Systems軟體公司所創立,其中特徵於可輕易取得成品每層的剖面資料,方便3D印表機分層輸出並塑造成品。現有的3D繪圖軟體皆可輸出stl檔案格式,因此也慢慢演變成為3D模型標準格式。

 

三、列印

3D列印耗材

本公司代客列印服務所使用的3D列印耗材為PLA(Polylactic Acid聚乳酸,又名玉米澱粉樹脂),好處是它為生物可分解材質,在列印加熱的狀態下,產生的氣味較少,冷卻後材質堅固,常溫下不易軟化。

支撐設定

當遇到某些列印件有部份突出或是懸空時,就會需要開啟支撐。支撐並非檔案的一部份,而是在切層軟體裡做額外的設定,讓物件能更順利的被列印出來。以下圖為例,左邊為不開支撐、右邊為開支撐的設定,您可以看到右邊多了幾條支撐的長方體,就像天橋下的柱子一樣,撐住上方的物件不易倒塌。

列印精緻度

3D印表機列印的精緻度除了機器本身的精度以外,再來就是看噴頭擠出的線材厚度,也就是所謂的層高。您可以把它想成是在畫一幅水彩畫時,如果下筆的力道較大,則畫出的線條較粗,堆疊之間的空隙也較明顯;反之力道較小時,則畫出的線條較細,雖然要畫較多筆,花的時間較長,但表現出來的圖面也比較細緻。

以印匠來說,0.2mm的層高(精細度)在列印件的表面平滑度上,已經有非常好的表現,除非有特殊的需求或是追求高精度,否則一般0.2mm的層高已經非常夠用。而印匠可以列印的最小層高為0.1mm,當然,列印的時間也會較長。

3D列印件的填充率就像填充布偶一樣,塞的棉花愈多愈緊實,反之則較鬆散。以下四張圖分別為填充率10%、20%、50%、100%時的比較圖。一般來說,10%~20%的填充率就已經較堅固,但若是需要承受重物或是較大的壓力時,可以考慮使用較高的填充率。另外,愈小的物件,填充率高低的效果較不明顯;愈大的物件,填充率的高低影響物件的堅固效果會較明顯。(填充率:0%為空心、100%為實心)

 

四、代客列印

機器人王國代客列印說明頁面(請點我!)

如有需求歡迎來信洽詢,機器人王國客服Email:serice@robotkingdom.com.tw

【教學】以ArduinoIDE設計LinkIt 7697藍牙遙控車

$
0
0

之前我們介紹過如何使用LinkIt 7697自己動手做藍牙遙控車(文章連結,請點我),這次我們將更進一步介紹如何使用ArduinoIDE,寫出使用藍牙連線就可以控制車子的Linklt Remote App介面,讓車子前後左右移動並且可以用PWM控制馬達的轉速。

LinkIt Remote 是一個用來產生手機App介面的小程式,是以 BLE 與 LinkIt 7697開發板搭配使用。只要在程式端設定好,就可以在兩者連線之後產生對應的介面。

作者/攝影 郭俊廷
時間  2HR
難度

 ★★☆☆☆

材料表

今天我們要來介紹如何使用ArduinoIDE寫出使用Linklt Remote App藍牙連線就可以輕鬆設計各種簡易的控制界面來控制馬達,讓車子前後左右移動並且可以用PWM控制馬達的轉速。

LinkIt Remote 是一個用來產生手機App介面的小程式,是以 BLE 與 LinkIt 7697開發板搭配使用。只要在程式端設定好,就可以在兩者連線之後產生對應的介面。

首先放上Linklt Remote App載點,先把它下載到手機中吧!

 

一、Arduino IDE環境設定

若Arduino IDE沒有新增相關LinkIt 7697的開發版環境設定可以按照以下步驟安裝額外的 board support package 。

 

對 Arduino IDE 來說,LinkIt 7697 屬於第三方開發板,因此需要安裝額外的 board support package 才能在 IDE 中正常使用 LinkIt 7697。設定的步驟如下:

1.開啟 File > Preferences 選單如下圖:

2.將下方的 URL 加進 Additional Boards Manager URLs 的欄位:

http://download.labs.mediatek.com/package_mtk_linkit_7697_index.json

欄位所在處如橘色框標示:

3.點選 OK 完成設定。

4.選擇 Tools > Board > Boards Manager… 以開啟 Board Manager 視窗:

5.開啟後,Board Manager 會根據上述提供的 URL 下載第三方套件資訊。下載完成後,可以在支援列表當中找到 LinkIt 7697 by MediaTek Labs 的欄位。若列表太長不易尋找,也可以在搜尋欄位 (框框處) 輸入 LinkIt 進行過濾:

6.選擇 LinkIt 7697 項目,然後點選 Install 按鈕:

7.此時 IDE 就會開始下載及安裝所需的軟體與工具。 待完成後點選 Close 關閉此視窗。

8.完成安裝程序後,應該就能在 Tools > Board 裡看到 LinkIt 7697 的項目顯示出來。

至此已完成 LinkIt 7697 board support package 的安裝程序。

 

二、車子馬達與馬達驅動板接線

關於馬達跟車子的接線我們使用直流馬達接上馬達驅動板Robot Shield

兩顆馬達連接馬達驅動板Robot Shield接線圖

 

馬達的腳位跟 Robot Shield的腳位對應表

 

車子實體圖

 

三、如何使用 LinkIt Remote

LinkIt Remote 能讓開發者透過手機程式去遙控 LinkIt 7697。它主要由兩個部分構成:

  • LinkIt 7697 上面的 Arduino LRemote 程式庫,讓開發者指定手機上面的遙控器程式的介面外觀,並接收處理來自手機的遙控指令。
  • 在 iOS 與 Android 上面的 LinkIt Remote 程式,它可以掃描附近有執行 LRemote 程式庫的 LinkIt 7697,並連線遙控它們。

上述的兩個部分,中間是透過低功耗藍牙來進行資料與指令的傳輸。

 

範例程式

1.打開 Arduino IDE 的選單,並選擇 File > Examples > LRemote > RemoteControl,然後上傳此範例程式到 LinkIt 7697

2.打開 Arudino IDE 的 Serial Monitor。請維持 LinkIt 7697 的電源,讓他持續運作。

3.用 iOS 或是 Android 手機,從下面的 app store 的連結下載並安裝 LinkIt Remote。

4.在手機上面打開 LinkIt Remote 程式。程式會開始掃描附近有運行 LRemote 程式庫的裝置。應該會在手機程式的介面上面看到一個名叫 “LinkIt 7” 或是 “LinkIt 7697” 的裝置。

5.點擊顯示的「LinkIt 7697」項目,程式會花一些時間連接到 LinkIt 7697,然後顯示如下的遙控器介面:

6.首先點擊 USR LED 這個切換按鈕。應該會看到 LinkIt 7697 板子上面的內建 USR LED 會亮起來。

7.然後,接著拖動 Value Slider 這個捲動軸。會看到 Arduino IDE 的 Serial Monitor 會印出捲動軸的目前數值。

這個範例簡單的展示了要怎麼利用 LRemote 與 LinkIt Remote 來建造可以用於 LInkIt 7697 的手機遙控程式。

 

進一步瞭解範例程式

在上面描述的範例程式中,我們首先建立了一個叫做 LinkIt 7697 的低功耗藍牙裝置,並且添加了數個對應到遙控器介面的 GATT 屬性。LinkIt Remote 手機程式會掃描並且解析這些 GATT 屬性,然後在手機畫面上顯示出相對應的遙控器控制元件。

使用 LRemote library 的第一步就是先設定欲建立的裝置。透過 LRemote 程式庫,可以直接指定開發者要呈現的裝置名稱、遙控器介面是橫向或是直向,以及在遙控器介面上的畫布的網格數目。

// 設定遙控器的顯示介面
  LRemote.setName("LinkIt 7697");
  LRemote.setOrientation(RC_PORTRAIT);
  LRemote.setGrid(3, 5);

在上面的範例程式碼中

我們把裝置取名為 LinkIt 7697

並且指定了一個直向、等分為 3 x 5 的網格。這個網格並不會實際顯示出來,而是作為後續擺放遙控按鈕元件的參考座標。網格的示意圖如下:

設定好手機的方向以及網格數量之後,我們就可以開始把控制元件擺放到網格上面。比如說,如果我們要添加一個可以用來開關 USR LED 的開關按鈕,我們首先要在全域變數空間當中宣告一個 LRemoteSwitch:

#include <LRemote.h>
 LRemoteSwitch switchButton;
然後我們接著要設定該按鈕的文字標籤、顏色、大小、以及位置:
void setup() {
  // Add an on/off switch
  switchButton.setText("USR LED");
  switchButton.setPos(0, 1);
  switchButton.setSize(1, 1);
  switchButton.setColor(RC_BLUE);
  LRemote.addControl(switchButton);
}

在上面的範例中,

我們將文字標籤設定為 “USR LED”

我們將按鈕的顏色設定為 RC_BLUE

位置座標設定為 (0, 1),也就是 X = 0、Y = 1,意思是要把這個按鈕擺放到第 1 欄的第 2 列,可以參考下面的圖片來瞭解座標系的編排方式:

設定完成之後,我們要呼叫  LRemote.addControl(switchButton) 來將這個按鈕真正的加到控制器的介面裡面。

請注意,一定要將按鈕宣告為全域空間變數(global scope) ,並且呼叫 addControl。要不然,按鈕將會無法正確的運作。

 

當設定好所有的按鈕之後,我們可以呼叫 LRemote.begin() 來啟動我們的裝置,並向周圍發送廣播。

  LRemote.begin();

我們可以不斷的用 LRemote.connected() 來檢查是否已經有 LinkIt Remote 程式連接到我們的 LinkIt 7697 裝置:

if(!LRemote.connected()) {
    Serial.println("waiting for connection");
    delay(1000);
  }

當 LinkIt Remote 連線到此裝置之後,手機程式會查詢有哪些控制元件,並且在手機畫面上面顯示出來:

接著,使用者可以透過點擊手機畫面上面的控制元件,來發送指令到 LinkIt 7697。在 LinkIt 7697 上面,我們需要不斷的在 loop() 函式當中定期呼叫 LRemote.process() ,來檢查並且處理來自手機的指令:

void loop() {
  // Process the incoming BLE write request
  // and translate them to control events
  LRemote.process();

}

在存取控制元件的數值變化之前,請務必先呼叫 LRemote.process(),如此數值才會被正確的更新。

 

在手機傳送過來的指令都被處理完成之後, LRemote 會更新每一個控制元件的相關數值,比如說,針對開關按鈕,可以使用下列的 API:

LRemoteSwitch::isValueChanged() 可以得知使用者是否有撥動開關按鈕
LRemoteSwitch::getValue() 可以取得當前的開關狀態:
0 表示「關」
1 表示「開」

範例程式便是利用這兩個 API 來決定要不要打開或是關閉板子上內建的 USR LED。

  if(switchButton.isValueChanged()){
    digitalWrite(LED_BUILTIN, switchButton.getValue());
  }

其他按鈕 (LRemoteButton and LRemoteCircleButton) 的 API 比較單純:

getValue() 回傳 0 表示按鈕沒有被按下

getValue() 回傳 1 表示按鈕處於被按下的狀態

另外,也可以使用 LRemoteLabel 來顯示單行文字。不過,因為使用者沒辦法跟標籤進行互動,所以這個類別不會提供 getValue() 這個 API。

 

四、程式設計

接著開始使用ArduinoIDE寫程式,我們程式的需求是要使用Linklt Remote App來藍牙連線控制我們的車子。

程式碼設計我們分成三個部分

  • 第一個部分要先宣告使用的函式庫跟Linklt Remote App要使用到的UI
  • 第二個部分要設定LinkIt Remote藍牙連線的名稱跟各個UI的名稱內容跟大小、位置等等。
  • 第三個部分要設定甚麼UI按下去或是改變它的狀態時會對馬達做出甚麼相對應的動作。

 

首先帶大家認識一下我們使用了哪一些函式與代表的意思

我們宣告了Linklt Remote函式庫、一個文字標籤、五個按鈕分別是前、後、左、右、停止跟一個滑桿。

如果想要了解更多UI的功能可以上聯發科的LinkIt 7697 for Arduino 開發指南 使用 LinkIt Remote網站上查詢

https://docs.labs.mediatek.com/resource/linkit7697-arduino/zh_tw/developer-guide/using-linkit-remote

#include <LRemote.h>  //宣告引用Linklt Remote函式庫LRemote.h
LRemoteLabel label1;    //Linklt Remote App的文字標籤
LRemoteButton F;         //Linklt Remote App的F方形按鈕
LRemoteButton B;         //Linklt Remote App的B方形按鈕
LRemoteButton L;         //Linklt Remote App的L方形按鈕
LRemoteButton R;         //Linklt Remote App的R方形按鈕
LRemoteButton S;         //Linklt Remote App的S方形按鈕
LRemoteSlider slider1;  //Linklt Remote App的滑桿

接著要設定函式的部分要設定App端介面的UI

首先要宣告我們LinkIt Remote App藍牙連線搜尋到的裝置名稱(每台藍牙裝置名稱要不一樣才可以分別連線上不同車子)還有App端介面的UI格式設定,例如UI是直式還是橫式,還有UI的螢幕棋盤格數大小。另外一點要注意的是UI介面的位置設定是從(0, 0)開始設定的。

每個UI的格式要設定UI的位置、UI上顯示的文字、UI的標籤大小、UI的顏色等等。

  LRemote.setName("RK Car");   //Linklt Remote App的藍牙連線名稱
  LRemote.setOrientation(RC_PORTRAIT);   //Linklt Remote App的UI設定成直式
  LRemote.setGrid(3, 9);   //Linklt Remote App的UI設定螢幕棋盤格數 3行9列
    
    label1.setPos(2, 2);   //label1的標籤位置設定在(2, 2)的位置
    label1.setText("RK Car");   //label1的標籤名稱顯示為RK Car
    label1.setSize(1, 1);   //label1的標籤大小設為1*1
    label1.setColor(RC_GREEN);   //label1的標籤顏色設為綠色
    LRemote.addControl(label1);   //新增一個label1的文字標籤

    //加入按鈕F
    F.setPos(1, 2);   //按鈕F的位置設定在(1, 2)的位置
    F.setText("Foward");   //按鈕F的名稱顯示為Foward
    F.setSize(1, 1);   //按鈕F的大小設為1*1
    F.setColor(RC_ORANGE);   //按鈕F的顏色設為橘色
    LRemote.addControl(F);   //新增一個F的按鈕

    //加入按鈕B
    B.setPos(1, 4);
    B.setText("Back");
    B.setSize(1, 1);
    B.setColor(RC_ORANGE);
    LRemote.addControl(B);

    //加入按鈕L
    L.setPos(0, 3);
    L.setText("Left");
    L.setSize(1, 1);
    L.setColor(RC_ORANGE);
    LRemote.addControl(L);

    //加入按鈕R
    R.setPos(2, 3);
    R.setText("Right");
    R.setSize(1, 1);
    R.setColor(RC_ORANGE);
    LRemote.addControl(R);

    //加入按鈕S
    S.setPos(1, 3);
    S.setText("Stop");
    S.setSize(1, 1);
    S.setColor(RC_ORANGE);
    LRemote.addControl(S);

    //加入滑桿
    slider1.setPos(0, 7);   //slider1的滑桿位置設定在(0, 7)的位置
    slider1.setSize(3, 1);   //slider1的滑桿大小設為3*1
    slider1.setText("速度值");   //slider1的滑桿名稱顯示為速度值
    slider1.setValueRange(0, 255, 0);   //slider1的滑桿範圍為0到255初始值為0
    slider1.setColor(RC_ORANGE);   //slider1的滑桿顏色設為橘色
    LRemote.addControl(slider1);   //新增一個slider1的滑桿
 
  //開始廣播您的遙控器、設定腳位輸入輸出模式
  LRemote.begin();   //開始廣播您的遙控器
  pinMode(10, OUTPUT);   //設定PIN10為輸出
  pinMode(12, OUTPUT);   //設定PIN12為輸出
  pinMode(13, OUTPUT);   //設定PIN13為輸出
  pinMode(17, OUTPUT);   //設定PIN17為輸出

最後是無限迴圈的部分我們要設定當Linklt Remote開始處理手機程式指令時需要做的動作,需要做的動作這邊我們設計成當按下前後左右的按鈕時會偵測滑桿數值有無改變如果有改變就送出PWM訊號到對應的馬達腳位做對應的動作。

LRemote.process();    //開始處理手機程式指令
//如果F按鈕按下去則車子依照滑桿的速度前進
  if (F.getValue() == 1) {    //如果F按鈕得到的值為1做以下動作
    if (slider1.isValueChanged()) {    //如果滑桿數值改變做以下動作
      analogWrite(10, 0);    //PIN10腳位寫入PWM訊號0
      analogWrite(12, slider1.getValue());    //PIN12腳位寫入PWM訊號滑桿的數值
      analogWrite(13, 0);    //PIN13腳位寫入PWM訊號0
      analogWrite(17, slider1.getValue());    //PIN17腳位寫入PWM訊號滑桿的數值

    }

  }
//如果B按鈕按下去則車子依照滑桿的速度後退
  if (B.isValueChanged()) {
    if (slider1.isValueChanged()) {
      analogWrite(10, slider1.getValue());
      analogWrite(12, 0);
      analogWrite(13, slider1.getValue());
      analogWrite(17, 0);

    }

  }
//如果L按鈕按下去則車子依照滑桿的速度前進
  if (L.isValueChanged()) {
    if (slider1.isValueChanged()) {
      analogWrite(10, 0);
      analogWrite(12, slider1.getValue());
      analogWrite(13, slider1.getValue());
      analogWrite(17, 0);

    }

  }
//如果R按鈕按下去則車子依照滑桿的速度前進
  if (R.isValueChanged()) {
    if (slider1.isValueChanged()) {
      analogWrite(10, slider1.getValue());
      analogWrite(12, 0);
      analogWrite(13, 0);
      analogWrite(17, slider1.getValue());

    }

  }
//如果S按鈕按下去則車子停止
  if (S.getValue() == 1) {    //如果S按鈕得到的值為1做以下動作
    analogWrite(10, 0);    //PIN10腳位寫入PWM訊號0
    analogWrite(12, 0);    //PIN12腳位寫入PWM訊號0
    analogWrite(13, 0);    //PIN13腳位寫入PWM訊號0
    analogWrite(17, 0);    //PIN17腳位寫入PWM訊號0

  }

燒入的時候記得開發版要改成7697

 

五、LinkIt 7697藍牙遙控車操作介紹

燒入完成之後就是開啟Linklt Remote APP藍牙連線,選擇剛剛命名的藍牙名稱,連線之後就會開啟我們的UI介面。

程式寫好產生出來的UI介面如下圖,可以看到有前後左右和停止的按鈕,下面還有可以拖曳馬達速度值的滑桿。

只要按下前後左右並改變速度值的滑桿就可以讓車子進行對應速度的移動,按下停止就可以讓車子停止。

以上我們程式設計部份的講解在這告一段落,大家可以依照自己的喜好設計相對應的UI來設計我們 LinkIt 7697藍牙遙控車控制App介面。

影片操作說明(請觀看基礎篇0:00~1:23的部分):

 

完整的程式碼如下如有需要請至雲端硬碟下載:

https://drive.google.com/file/d/1xLhipA7iPlB-GbPd1hoQBLkaM3rn-7El/view?usp=sharing 

 

部分引用自MEDIATEK labs:

  • Resources LinkIt 7697 for Arduino 環境設定 設定 Arduino IDE
  • Resources LinkIt 7697 for Arduino 開發指南 使用 LinkIt Remote

【開箱評測】集博科技Tibbo Technology公司 TPS系統裝置開箱介紹

$
0
0

目前現行商用標準化的微電腦自動控制系統的方式不外乎有PIC、工控電腦(或嵌入式系統)等,對於許多初學者都有較高的起步門檻,較高起步門檻來自於各種PIC自控語言、或LINUX環境的程式撰寫,與較複雜的程式開發軟硬體環境移植過程等。

集博科技Tibbo Technology是台灣一家設計模組標準化嵌入式系統的廠家,該公司推出了一套命名為Tibbo Project System (簡寫TPS)的嵌入式系統,基本上這套系統主要以高度模組化的精神進行設計,在基礎的微電腦控制平台上發展出各種介面模組,這些介面模組就像是積木方塊一般透過標準化的接腳連接格式讓使用者自行選用並加裝在嵌入式系統中,這些積木方塊該公司亦建置了相當完整的資料庫與程式函式庫,使用者透過該公司自行設計的Basic或C語言(稱為Tibbo Basic或Tibbo C )透過的該公司自行開發設計的環境(Tibbo IDE)便可以快速設計開發整個嵌入式系統並且應用於各種自動控制的場合。

作者/攝影 曾俊霖
時間 約4小時
難度

 ★☆☆☆☆

材料表
  • TPB2L主機
  • TPS之RS485電路積木模組
  • TPS之電源積木模組
  • TPS之輸入輸出埠積木模組

圖1外觀與圖2內部構造就是TPS的其中一種型號(TPB2L系列),也是本次開箱介紹的主角,其實TPS還有另外一種尺寸功能更多的型號(TPS3系列,圖3與圖4),但不論是哪一種型號系列,基本上都秉持著一樣的精神,也就是高度模組化的方式進行設計,給予使用者自行設計安裝的高度彈性。

本次開箱介紹的主角TPB2L的系統(如圖5與圖6),安裝了RS-485積木模組(編號#05)、WiFi模組(WA2000)、9埠端子台積木模組(編號#20)、外接電源端子台積木模組(編號#18)與5V電源積木模組(編號#10),這些積木基本上都安裝在微電腦主控板TPP2(G2)上,TPP2(G2)安排了許多的標準化的擴充插槽,所有的電路積木模組都必須符合這樣的標準化的插槽設計,視實際的應用場合需要,使用者可以自行決定電路積木模組在TPP2(G2)的插槽位置,Tibbo也針對沒有安裝電路積木模組在TPB2L外殼上設計了標準的擋板積木,對於這些機構設計的小細節可說是安排非常仔細;此外,在官網上還有許多積木模組可供使用者自行採購選用,相關電路積木模組的參考資訊如以下網址:https://tibbo.com/store/tps/tibbits.html

TPP2(G2)主機板上各電路積木模組的安裝(如圖7),都採用了鍍金排針與鍍金插槽的設計,安裝的時候,只要按照對應的位置進行安裝即可,這些標準化的插槽都有很明確的圖示提醒,可以幫助使用者正確安裝這些電路積木模組。

TPP2(G2)主機板上對外部元件電路的輸出埠與輸入埠的安裝(如圖8),TPB2L系統可以連接外埠的感測元件或是控制電路,這些輸入埠與輸出埠的大小都是經過標準化的設計,此外TPS系統也針對不同的輸入與輸出電路所需要的連接埠型式設計出許多不同的制式連接埠模組供使用者選用安裝。

TPS也提供了多種RS485介面感測模組,Tibbo Technology稱這些模組為Bus Probes(如圖9與圖10),種類也是相當完整,本次開箱介紹有溫溼度感測模組(編號BP#01與BP#02)、光照度感測模組(編號BP#03)與三軸加速度感測模組(編號BP#04),利用RS485的特性這些模組都可以進行並聯,並且將信號一起送至安裝在TPP2(G2)主機板上的RS485介面積木模組(編號#05)上進行環境監控,相關Bus Probes的參考資料,如下列網址:https://tibbo.com/store/rs485-modbus-sensors.html

在這次的開箱測試,我們將會把這些模組並聯相接,並且透過TPB2L的TFT-LCD顯示器進行數據的顯示。

TPB2L人機介面(如圖11),外觀主要是分成4個區塊,分別是TFT-LCD顯示器(解析度為320*240,256色的可程式規劃顯示器)、LED顯示燈號(8個燈號都可以透過程式控制)、控制按鈕(固定RESET鈕與1個可程式規劃的按鈕)與4鍵觸摸感應器(透過磁場感應手指觸摸),TPB2L的人機介面透過Tibbo IDE各種函式庫進行規劃設計,TFT-LCD顯示可支援文數字、自繪線條圖塊與BMP圖片的顯示,此外,TPB2L內部也提供了可程式規劃的蜂鳴器警示輸出,透過這些人機介面便可以進行各種人工的控制。

圖11 TPB2L人機介面

TPS系統基本上是一個高度整合的系統,除了前述的相關硬體裝置都進行標準化的整合之外,TPS系統軟體開發環境Tibbo IDE(如圖12)也是以標準化概念進行設計,Tibbo IDE主要是以兩種程式語言進行設計分別是Tibbo Basic與Tibbo C兩種,這兩種程式語言都可以同時並存運作,使用者透過Tibbo IDE進行程式設計開發後,可透過網路線、無線網路(Wi-Fi)的方式將程式燒錄至TPS主機板上,可透過TCP/IP的規範進行程式的燒錄,這讓使用者可以獲得相當大的開發彈性與未來升級程式安裝的便利性。

圖12 Tibbo IDE整合開發環境

簡單的圖形化介面示範:

利用4鍵觸摸感應器切換4種不同的BMP圖形顯示。

 

簡單的RS485環境感測模組的測試:

分別是溫度、溫溼度、光照度、三軸加速度。

 

相關參考網站:

一張圖教你檢查Raspberry Pi 4的記憶體大小

$
0
0

想知道手邊的 Raspberry Pi 4的記憶體大小,可以在終端機中下指令查詢,也可以直接觀察硬體的差異。

Raspberry Pi 4 不同於以往,發行了三款記憶體大小不同的版本,來滿足不同客群的需求,想要知道手邊的Raspberry Pi 4的記憶體大小。除了可以在終端機中下指令查詢,也可以直接觀察硬體的差異。

本文大綱

  • 不同版本的Raspberry Pi 4硬體外觀差異
  • 查詢記憶體大小及使用量
  • 改變Swap交換空間大小
作者/攝影 蔡雨錡
難度

 ★☆☆☆☆

材料表

Raspberry Pi 4(機器人王國購物連結,請點我)

    • 1GB RAM
    • 2GB RAM
    • 4GB RAM

不同版本的Raspberry Pi 4硬體外觀差異 

不同版本的黑色記憶體上會顯示不同文字

  • 1GB – 一個QRcode+文字
  • 2GB – 美光logo+文字 (重點文字差異:D9WHZ)
  • 4GB – 美光logo+文字 (重點文字差異:D9WHV)

查詢記憶體大小及使用量

 

打開Terminal輸入以下指令:

free -h

就可以看到有多少記憶體資源以及已經使用量。如下圖範例中,可用的資源為1.7GB,可以看出使用的Raspberry Pi 4是2GB記憶體版本。

Mem 那一列包含的資訊如下:

  • Total:開發板的記憶體量。
  • Used:記憶體總量減Free、Buffers、Cache的總和。
  • Free:未使用的記憶體量。
  • Shared:tmpfs文件系統使用的記憶體量。
  • Buff / cache:用於緩衝區和緩存的記憶體量。
  • Available:可用於處理來自應用程式和其他任何運行軟體的記憶體量估計。

Swap 那一列包含的資訊如下:

  • Total:交換分區或文件的大小,可以看到預設的大小為100MB。
  • Used:正在使用的交換空間量。
  • Free:未使用的交換空間量。

 

改變Swap交換空間大小

如果買的是1GB的樹梅派,有時候會覺得因為記憶體不足而有延遲或是當機。使用記憶卡的空間做swap交換空間雖然效能可能沒有實體記憶體好,但可以改善這個問題。

由於樹梅派原本預設已經配置100MB的swap,你可以參考以下步驟來增加swap交換空間的大小。

 

Step 1. 先暫停swap服務

在Terminal中輸入以下指令:

sudo dphys-swapfile swapoff

 

Step 2. 使用你喜愛的編輯器改變設定文件中的swap大小

在terminal中輸入以下指令,本範例中使用nano編輯器:

sudo nano /etc/dphys-swapfile

找到CONF_SWAPSIZE變數,原本為

CONF_SWAPSIZE=100

這裡的單位為MB,可以將此行註解掉,改成1024MB,也就是1GB的swap空間。

CONF_SWAPSIZE=1024

你也可以直接註解掉不要加新的設定,讓開發板自行計算適當的swap大小。

改好後記得存檔退出。

 

Step 3. 初始化 swapfile

sudo dphys-swapfile setup

 

Step 4. 重新啟動swap服務

sudo dphys-swapfile swapon

 

Step 5. 檢查swap狀態

可以同樣在Terminal中使用以下指令

free -h

再看一次資源分配的情況。

也可以使用以下指令僅看swap狀態

swapon -s

祝大家都可以順暢的使用樹梅派!

 

防疫小尖兵-用Arduino來做溫度計吧!

$
0
0

之前我們有在FB分享防疫小尖兵-用Arduino來做溫度計吧!

我們使用MLX90615紅外線非接觸溫度計感測器連接Arduino與OLED,就能夠即時看到偵測到的溫度呢,當身體接近感測器時就能夠明顯看出溫度的變化喔!

 

今天就來完整教學如何製作吧!

作者/攝影 郭俊廷
時間

3HR

難度

 ★★☆☆☆

材料表

關於MLX90615紅外線非接觸溫度計感測器(以下簡稱MLX90615)如何連接Arduino與OLED我們今天就來分享如何自己製作呢!

首先先來看看我們執行的成果影片:

一、硬體接線

首先要先查看我們的硬體的腳位是什麼?如何接線到Arduino呢?

我們先來查看MLX90615的Datasheet(相關檔案請至下方連結下載)

MLX90615-Datasheet-Melexis.pdf

根據MLX90615的Datasheet的圖表(如下圖)查看我們需要在SDA跟SCL腳位放一個300K的提升電阻,VSS接地,VDD接電源
這個提升電阻是由於這個電路是使用開極集設計的,是為了提供導通電流,確保高低電位的電壓準位而使用的。

而在大部份的 Arduino板子上,SDA接在analog pin 4,而SCL接在 analog pin 5。

OLED的部分我們採用I2C的介面,一樣接在A4跟A5。

MLX90615腳位圖表(引用自MLX90615-Datasheet-Melexis.pdf)

MLX90615跟Arduino接腳對應表

MLX90615 Arduino
VCC 3.3V
SDA A4
SCL A5
GND GND

OLED跟Arduino接腳對應表

OLED Arduino
VCC 5V
SDA A4
SCL A5
GND GND

 

根據腳位圖表所提供的資訊我們的電路圖設計如下:

MLX90615、OLED、Arduino整體電路接線圖

 

二、程式設計

首先我們要匯入相關的程式庫

第一個是MLX90615的程式庫 根據下列網址把函式庫下載完解壓縮至自己使用的Arduino所在的libraries資料夾(如下圖),或是使用ZIP檔匯入程式庫

https://github.com/skiselev/MLX90615

MLX90615解壓縮至函式庫資料夾

 

接著還要下載OLED顯示功能的程式庫U8g2,可以在管理程式庫裡搜尋U8g2 by oliver的程式庫(如下圖)

點選工具、管理程式庫裡進入搜尋介面

 

搜尋U8g2並下載最新版本

 

下載完成開始設計我們的程式

//首先定義會使用到的程式庫
#include <Wire.h>
#include <mlx90615.h>
#include <U8g2lib.h>

//這裡是定義MLX90615所得到的值跟U8G2使用什麼型號尺寸的OLED
MLX90615 mlx = MLX90615();
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

//這裡開始定義OLED上要即時顯示的畫面有什麼
void draw(void) {
u8g2.setFont(u8g2_font_helvB24_tf );//定義要顯示什麼字型
u8g2.drawStr(10,30,"TEMP:");            //設定在10行30列的位置顯示TEMP:
u8g2.setCursor(10, 60);                      //設定在10行60列的位置        
u8g2.print(mlx.get_object_temp(),1);  //顯示得到的目標溫度數值到小數點一位
u8g2.drawStr(80,60,"\260C");             //設定在80行60列的位置顯示℃
}

//這裡定義u8g2開始設定序列埠鮑率跟偵測MLX90615有無正常讀取顯示它的ID
void setup() {
  u8g2.begin();
  Serial.begin(9600);
  Serial.println("Melexis MLX90615 infra-red temperature sensor test");
  mlx.begin();
  Serial.print("Sensor ID number = ");
  Serial.println(mlx.get_id(), HEX);
}

//重覆執行的部分設定在序列埠上顯示MLX90615內部環境溫度跟測量目標溫度,還有設定一直更新OLED的顯示畫面
void loop() {
  Serial.print("Ambient = ");
  Serial.print(mlx.get_ambient_temp()); //ambient temperature
  Serial.print(" *C\tObject = ");
  Serial.print(mlx.get_object_temp()); //object temperature
  Serial.println(" *C");
  delay(500);

  u8g2.firstPage();
  do {
  draw();
  } while( u8g2.nextPage() );
  delay(100);

}

以上我們的程式碼解說到這裡

 

三、執行成果

我們使用KEYES Arduino UNO R3來當我們的Arduino開發板

它有另外把I2C腳位拉出來方便我們接線

實際測量的畫面如下:

沒有手指接近時的溫度

 

手指接近時的溫度

 

以上就是我們使用MLX90615、OLED、Arduino實作溫度計的教學,喜歡DIY的朋友們也可以嘗試看看自己焊在麵包板上讓它移動更方便更容易測量其他地方的溫度歐。

*注意此專題為Maker專題分享,非醫療用途。

 

參考資源:

U8g2 相關教學:https://www.twblogs.net/a/5d207eeabd9eee1e5c83a6bb

Jetson Nano新舊版本差異 – A02 vs B01

$
0
0

Jetson Nano 新版本 B01出爐了,相較於舊版本A02,硬體有更新與升級。

NVIDIA在2020年3月發布了新的Jetson Nano開發板B01,本篇文章將分析Jetson Nano新版本B01相較於舊版本A02有哪些顯著的差異、一些常見的問答、以及新出爐的Jetpack 4.3有什麼優勢。提供給對Jetson Nano有興趣或是已經有Jetson Nano的使用者判斷是否需要購買新版本的開發板。

本文大綱

  • Jetson Nano B01 常見快問答
  • JetPack 4.3 優勢
  • Jetson Nano 開發版新舊硬體差異 – A02 vs B01
作者/攝影 蔡雨錡
材料表

 

Jetson Nano B01 常見快問答

整理了一些常見的Jetson Nano B01問答供大家參考。

Q1. 價格是否有變動?

A1. NVIDIA提供的價格一樣是99美金,舊版本則是降價到89美金。

Q2. 40 Pin GPIO 腳位配置順序是否一樣?

A2.  40 Pin GPIO 腳位配置順序是一樣的,一般使用不用擔心有所不同,只有腳位標記轉向而已,變成面向電源這側。但想要改pinmux表的人要注意一下,A02的pinmux表不能用在B01板子上,B01的pinmux表可以用在A02上。

Q3. 舊版本的JetPack可以透過下指令升級嗎?

A3. (參考NVIDIA回覆) 目前4.3之前的版本不行,但Jetpack 4.3有使用新的APT服務器來託管JetPack套件升級。一旦使用JetPack 4.3後,就可以SSH遠端連線或是直接在terminal中下指令升級JetPack版本。

Q4. 如果灌好B01的映像檔,是否可以拿回去A02的板子上使用?

A4. 遇到很多人會問這個問題。從NVIDIA下載的目前(撰文日期為 2020/03/30)JetPack 4.3映像檔可以用在B01,也可以用在A02上。我們實際測試過安裝JetPack 4.3的SD卡可以順利在Jetson Nano B01跟A02上運行。但在A02硬體上用的舊的JetPack無法在B01上正常運作。所以想要使用新版Jetson Nano需要重新製作開機用的SD卡。

Q5. 這次開箱是否有附用來選擇電源用的跨接器(Jumper)?

A5. 跟以前一樣沒有附。

Q6. JetPack 4.3在機器學習訓練、推論、輸入影像的部分有怎麼樣的差異?

A6. 用於Jetson Nano的Jetpack 4.3與新的TensorRT 6.0.1和cuDNN 7.6.3函式庫一起發布,有助於使人工智慧推論(inference)性能提高25%。 視覺程式介面(VPI, Vision Programming Interface) 使用GPU + CPU硬體編碼器/解碼器來加速4K影片或多個1080P影片傳送(同時傳送最多可以達到8倍速度),並且借助機器學習演算法,它可以多工進行物件偵測、物件辨識和追蹤。

Q7. 電源部分有什麼不同嗎?

A7. 電源部分參考最新版(2020/01/15)的使用者手冊中的Power Guide是一致的。

  • 透過Micro-USB供電僅能供5V-2A。
  • 透過J25電源孔供電可以供5V-4A。
  • 如果有更大的供電需求,可以使用J41的2個5V腳位各供應5V-2.5A,總共5V-5A。
  • 在無任何外接設備的情況下,5V-2A時的功耗是0.5W;5V-4A時的功耗是1.25W。

JetPack 4.3 優勢

  1. 可以用apt更新升級:支援透過Debian套件包安裝JetPack,以後可以用apt安裝跟更新JetPack。
  2. 函式庫支援度提高:CUDA Toolkit增加功能及改善、cuDNN性能提高、TensorRT改善、Multimedia API增加多項多媒體相關功能、支援DeepStream 4.0.2、ISAAC SDK 2019.3。
  3. 對容器 (Container) 的支援度提高:支援所有Jetson系列產品上容器中的CSI跟NVENC,支援Jetson AGX Xavier系列上容器中的NVIDIA深度學習加速器 (DLA) 引擎。

如果打算用舊版 Jetson Nano A02,你也可以取得NVIDIA提供的JetPack 4.3 for Jetson Nano,提升舊版Jetson Nano的性能。而且在新JetPack上開發的專案也可在你升級硬體為Jetson Nano B01時無痛轉移。

 

Jetson Nano 開發版新舊硬體差異 – A02 vs B01

  • UART序列埠接排針 (Serial Port Header, J44) 跟系統電源/重置功能排針(Button Header, J40) 被改到SD卡插槽的正下方變成 J50。

  • 上述的位置新增了一個新的 CSI (Camera Serial Interface) 攝影機介面(CAM1, J49),原本的 CSI 攝影機介面(CAM, J13)也往旁邊移動。

  • 可以用跨接器(Jumper)來選擇電源來源的排針組(J48)也換位置了。

NVIDIA Jetson Nano Developer Kit 使用手冊圖片參考:

新版的硬體最大的亮點就是多了一個CSI攝影機介面,兩顆CSI攝影機可以做很多有趣的應用,在這邊拋磚引玉一下,你可以做:

  • 做兩組照片的即時影像接圖(廣角效果)
  • 計算物品距離(深度計算)
  • 搭配3D點雲函式庫建立物體的3D模型

如果專案只需要使用一顆鏡頭的話,現在是趁機入手舊版Jetson Nano A02的好時機。你如果有其他有趣的想法及專題,歡迎跟我們分享!

 

參考資料:

【教學】Processing互動專題:結合 LinkIt 7697

$
0
0
作者/攝影 曾吉弘
時間 1小時
難度

★★★☆☆

材料表

Processing 互動介面開發環境

    CAVEDU 使用 Processing 來教學也算有一段時間了,相當好用。學生用相對簡短的程式碼就可以產生相當豐富的互動介面、對於顏色、位置、聲音都有很不錯的效果(以下為阿吉老師FB貼文示範)。

雖然沒有圖形化介面這麼簡易,但就豐富度與支援度來說都相當不錯。今年我在北科互動系就再次嘗試使用 Processing 來完成 1/3 個學期的課程(後半學期為 Python)。

要匯入 opencv、Kinect 等各種的函式庫也很方便,當年很想寫一本 Processing的書啦,但就…算了。

更別說 p5.js 最近與 Google Teachable machine 有很好的連結,可以吃訓練好的神經網路模型做到視覺辨識的效果,超棒!

來看看創辦人 Daniel 的教學影片:

因此 Arduino 這類平價開發板來取得真實環境中的訊號變化,再由 Processing 來呈現聲光效果,是個相當不錯的選擇。

這樣的思維我覺得對於互動設計背景的同學而言:你要好好思考到底要呈現怎樣的效果,才去思考要用怎樣的軟硬體技術來支援你。

 

Processing 端程式

執行畫面如下,按下畫面不同顏色按鈕會送出字元 ‘A’ 與 ‘B’ 給 7697,7697 自然是接受什麼指令就做什麼事。比較重要的指令說明如下:

myPort = new Serial(this, Serial.list()[0], 9600);
宣告一個 Serial 序列通訊物件,baudrate 為 9600。請注意 Serial.list()[0] 代表您電腦 USB 裝置清單中的第一個裝置。但這有時候不一定會抓到 7697,可以改為 () 來指定  COM port
com port 請以 Windows 裝置管理員為準
MAC  Linux 可在 terminal 下指令來看,會是 /dev/ttyACM0 這樣的結果

myPort.write('B');
送出字元給對應裝置(7697)
myPort.read();

 從對應裝置端讀取資料,預設格式為 ASCII code.

影片連結:

import processing.serial.*;

int rectX, rectY;      // Position of square button
int circleX, circleY;  // Position of circle button
int rectSize = 90;     // Diameter of rect
int circleSize = 93;   // Diameter of circle
color rectColor, circleColor, baseColor;
color rectHighlight, circleHighlight;
color currentColor;
boolean rectOver = false;
boolean circleOver = false;

int bg=0;

Serial myPort;

void setup() {

  myPort = new Serial(this, Serial.list()[0], 9600);
  size(640, 360);
  rectColor = color(0);
  rectHighlight = color(51);
  circleColor = color(255);
  circleHighlight = color(204);
  baseColor = color(102);
  currentColor = baseColor;
  circleX = width/2+circleSize/2+10;
  circleY = height/2;
  rectX = width/2-rectSize-10;
  rectY = height/2-rectSize/2;
  ellipseMode(CENTER);
}

void draw() {
  
  update(mouseX, mouseY);
  
  while (myPort.available() > 0) {
    int inByte = myPort.read();
    if (inByte == 'C') {
      bg++;
      if (bg>1) bg=0;
      if (bg==1) currentColor=color(0,255,0);
      if (bg==0) currentColor=color(255,0,0);
    }
  }
  
  background(currentColor);
  
  if (rectOver) {
    fill(rectHighlight);
  } else {
    fill(rectColor);
  }
  stroke(255);
  rect(rectX, rectY, rectSize, rectSize);
  
  if (circleOver) {
    fill(circleHighlight);
  } else {
    fill(circleColor);
  }
  stroke(0);
  ellipse(circleX, circleY, circleSize, circleSize);
}

void update(int x, int y) {
  if ( overCircle(circleX, circleY, circleSize) ) {
    circleOver = true;
    rectOver = false;
  } else if ( overRect(rectX, rectY, rectSize, rectSize) ) {
    rectOver = true;
    circleOver = false;
  } else {
    circleOver = rectOver = false;
  }
}

void mousePressed() {
  if (circleOver) {
    currentColor = circleColor;
    myPort.write('A');  #送出字元A
  }
  if (rectOver) {
    currentColor = rectColor;
    myPort.write('B');  #送出字元B
  }
}

boolean overRect(int x, int y, int width, int height)  {
  if (mouseX >= x && mouseX <= x+width && 
      mouseY >= y && mouseY <= y+height) {
    return true;
  } else {
    return false;
  }
}

boolean overCircle(int x, int y, int diameter) {
  float disX = x - mouseX;
  float disY = y - mouseY;
  if (sqrt(sq(disX) + sq(disY)) < diameter/2 ) {
    return true;
  } else {
    return false;
  }
}

7697端程式

如果您想用一般的 Arduino (Uno, Mega 2560等等,請參考本文即可,會更簡單。Arduino端只要下載內附的範例 StandardFirmata 就可接收來自 Processing 端的指令。但由於 7697端的 Firmata 還要改,所以先使用 serial 送字元的方式處理。

void setup()
{

  Serial.begin(9600);
  pinMode(3,INPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
}


void loop()
{

  if (Serial.available()) {
    char code = Serial.read();
    if (code == 'A') {
      digitalWrite(4,HIGH);
      digitalWrite(5,LOW);
    }
    if (code == 'B') {
      digitalWrite(4,LOW);
      digitalWrite(5,HIGH);
    }
  }

  if (digitalRead(3)==LOW) {  //如果#3按鈕被按下,送字元 C 給 Processing
    Serial.print('C');
    delay(200);
  }
}

UP Squared RoboMaker Pro 機器人套件–具備深度視覺功能的機器人平台

$
0
0

UP Squared RoboMaker Pro 機器人套件具備深度視覺功能的機器人平台

作者/攝影 曾吉弘/圖片引用自UP Board RoboMaker Pro 官網 在此感謝授權使用

總覽

UP Squared RoboMaker Pro 機器人套件與 Intel 所提供的深度感測與視覺推論加速功能

 

Up board 是研揚科技所推出的系列單板電腦,並可結合 Intel Movidius VPU 進行硬體視覺加速,之前就有機會幫 UP board 寫一些評測文(延伸閱讀。最近看到他們推出了 UP Squared RoboMaker Pro 機器人平台,除了理所當然使用 Intel 處理器之外,還加入了近來詢問度超高的 Intel RealSense 深度攝影機 D435i,搭配 IMU 慣性量測單元之後就能解決自動化移動式機器人 (AMR) 所需的視覺、測距與導航問題。(預購 $1799美金,預購頁面請點我) 

另一個亮點就是可結合 ROS 與 Amazon Web Services 等資源,例如 Gazebo 與 AWS RoboMaker 等現成工具套件。

Upboard 採用 Intel® x7-E3950 處理器,並加入了PCIe 介面的 Intel® Movidius™ Myriad™X(原文連結)fps 最高可到 105 fps(一般狀況也有 80 fps),這款 VPU 正是針對原本運算速度有限的邊緣裝置來加強其視覺推論速度。另外也有 USB 介面的 NCS 加速棒,我們用NCS搭配 Raspberry Pi 做了不少專題(延伸閱讀)

單純就售價來看,UP Squared RoboMaker Pro 機器人平台售價 $1799美金,約 $54,000 台幣,折掉了 D435i 之後與我們自己設計的 RK-Jetbot(了解商品) 依然有兩倍以上的價差。AWS Deepracer(了解商品) 的售價為 $399 美金約為台幣$12000;相較之下,RK-Jetbot(了解商品)才$16,000台幣還包8小時教育訓練,真的很超值QQ 。)

AWS RoboMaker 雲端服務

UP Squared RoboMaker Pro 機器人平台標榜與 AWS RoboMaker(原文連結有相當好的整合,像是諸多 AWS 的分析服務、機器學習與監測服務都不是問題,當然啦,雲服務會根據您的使用程度(例如呼叫次數、流量或使用時間)收取費用。

AWS RoboMaker 提供了 ROS 套件(原文連結),且 ROS / ROS2 都有支援,讓開發者得以運用各種 ROS 功能,還能搭配 ROS Gazebo 等虛擬環境來測試。

 

機器人與深度感測

要在機器人加入 RGB camera 不是太大的問題,但立體視覺與深度感測通常是仰賴光學雷達來產生點雲來做。我知道 Elon Musk 堅持不使用光學雷達,但普遍的做法還是會用類似的光學測距裝置。這時候就很感謝 Intel 出了 RealSense D435 / D435i,整合在 UP Squared RoboMaker Pro 機器人平台上的是 D435i,差別在於後者多了一個一個慣性量測單元 (IMU),讓入門者就有機會整合 SLAM 與路徑追蹤等功能,與點雲功能的搭配會更臻完美。

 

OpenVINO

OpenVINO 是 Intel 公司所開發的免費 toolkit,可透過推理引擎將深度學習模型從框架端到部署到 Intel 硬體上的流程都進行最佳化。共有兩個版本:由開源社區支持的 OpenVINO toolkit 以及由 Intel 公司支援的 Intel(R) Distribution of OpenVINO toolkit。請參考 CAVEDU做過的專題(延伸閱讀)

 

您能做到哪些事情?

以下是 UP Squared RoboMaker Pro 機器人平台標榜與 AWS RoboMaker 結合之後的四大特色,可讓您的 AMR 具備立體視覺並自主決策,並有效運作 SLAM(即時定位與地圖構建)。

Intel® RealSense™ 深度攝影機 D435i 作為 SLAM 輸入源

AWS RoboMaker Simulation – 於虛擬環境中執行您的機器人

 

套件包內容

硬體規格

 

已安裝於 upboard 的軟體

元件連線示意圖

詳細 ROS / ROS2 的比較,請參考下方連結:

https://up-board.org/up-squared-robomaker-pro-kit/?f

 

影片連結

(本文部分內容翻譯自UP Squared RoboMaker Pro Kit官方網頁,且感謝授權圖片引用)

RK-JetBot 常見問題及解決方法

$
0
0

本篇文將RK-JetBot使用者常遇到並詢問我們的問題,進行「私下問公開答」,希望可以協助有相同問題的RK-JetBot使用者解決困擾。

本文大綱

  • 散熱風扇
  • 攝影鏡頭
  • 系統運行速度慢
  • 電腦跟JetBot連線
作者/攝影 蔡雨錡
難度

 ★★★★★

材料表

RK-JetBot x 1(機器人王國購物連結,請點我)

散熱風扇

常見的問題如下:

Q1. 風扇為什麼不運轉?

A1. 散熱風扇的控制細節以及指令可以參考這篇文章:【教學】NVIDIA® Jetson Nano™ 散熱風扇 使用教學

 

Q2. 怎麼讓風扇在JetsonNano一開機時就運轉?

A2. 想要控制散熱風扇自動開關的溫度設定以及風速,可以照這個Github安裝程式並進行數值設定:https://github.com/Pyrestone/jetson-fan-ctl

 

Q3. 怎麼知道機器有沒有過熱?

A3. 想要知道機器有沒有過熱,可以安裝Psensor程式協助你監控Jetson Nano的溫度。詳細步驟如下:

Step 1. 點選「Software/軟體」搜尋Psensor並安裝。安裝後點選左上角圖示搜尋Psensor並點選就可以開啟。

Step 2. 沒有加上風扇並執行資源需求較大的程式時,下兩張圖以執行RealSense深度攝影鏡頭範例為例,JetBot/Jetson Nano溫度可以高達52度。

Step 3. 加上風扇後,自動降溫(也就是50度啟動風扇這個機制)可以將系統維持在40 度上下。

 

可以參考Jetson Nano散熱風扇的教學,在terminal輸入以下指令:

$ sudo sh -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'

強制將風扇風速調整至100%,就可以在五分鐘內降溫到24度左右!

更改 echo後的數字可以控制風扇轉速0-255對應到0%-100%轉速。

將視窗邊界拉寬,展開Psensor可以看到溫度歷史紀錄。

 

攝影鏡頭

由於在JetBot專案中攝影鏡頭扮演很重要的角色,所以這方面的問題也較多人詢問,常見的問題如下:

 

Q1. 在運行JetBot本身提供的避障程式時,相機會當掉。

A1.

  1.  由於不同環境下的網路頻寬跟使用人數不同,會導致JetBot無法快速回傳影像,建議可以修改程式中的回傳影像的fps(frame per second):

將這行程式:

camera = Camera.instance(width=224, height=224)

修改如下:

camera = Camera.instance(width=224, height=224, fps=5)

    有人有延伸問題,請問除了降低影像張數?降低影像畫質是否也能改善?或者因機器學習輸入的資料原因不建議改畫質?)

2. 或是檢查分享器、JetBot、電腦這三者之間的障礙物是否過多影響訊號穩定度,如果有手機吃到飽分享網路給JetBot會比用公共網路穩定且快很多。

3. 現場可連線Wi-Fi數量多也會有影響。

4.  建議最佳執行避開障礙物「道路跟隨」等需要影像串流的情況為小於十名學生且場地空曠,例如將課桌椅集中放置留下教室中間或前後空地放置場地供測試用。

5.  JupyterLab雖然方便教學,可以將講義跟程式做成同一份檔案,也可以分段執行程式。但其實佔了不少資源,直接撰寫python程式並用ssh方式遠端JetBot執行程式會比用JupyterLab運行.ipynb快一些。

 

Q2. 降低影像解析度是否可以改善影像不即時的問題

Q2. 開機第一次測試camera成功,第二次之後測試會出現camera無法更新的問題。

這樣的問題可能是因為資源被你先前使用但當下沒在用的程式佔用。

在這樣的情況下,有三個解決辦法,從輕微到嚴重分別如下:

1. 在程式中不需要用到攝影鏡頭時,使用「camera.unlink()」這個指令

2.  shutdown所有沒在用的.ipynb檔案

3.  JetBot關機重新開機,聽到開機時鏡頭自動校正的聲音就會恢復正常了

 

系統運行速度慢

雖然Jetson Nano已經比Raspberry Pi 運行的快不少,但還是會常常有收到系統運行速度慢的回饋。

以下為幾個可以改善JetBot速度慢的方法,指令皆須於terminal中執行:

 1.  停用沒有用到卻待命中的PiOLED服務,該服務可以讓你外接OLED時在通電時顯示Jetson Nano網路連線的ip位置

$ sudo systemctl disable jetbot_stats

$ sudo systemctl stop jetbot_stats

2. 清除快取

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

3.  升級ipython

$ pip install --upgrade ipython

這邊盡量不要使用sudo,不然未來可能會遇到操作上的權限問題

電腦跟JetBot如何連線

可以參考這篇文章的G部分-「如何在沒有螢幕、鍵盤、滑鼠時連線Wi-Fi」,有詳盡的說明。

【專題使用說明】Nvidia開發板, RK-JetBot專案從開機到三種遠端連線_人工智慧自走車教學模組

希望有幫助到使用RK-JetBot的你,有進一步問題都歡迎詢問!

MIT App Inventor 重磅更新!Personal Audio Classifier 聲音辨識

$
0
0

MIT App Inventor 重磅更新,使用Personal Audio Classifier 來做「聲音」的AI訓練吧!

作者/攝影 曾吉弘

 AI 行動化(AI on mobile)呼應了人類生活早已離不開手機的事實,另一方面,手機處理晶片速度一日千里,今天跑不動的東西,很快就不再是問題。對於 AI 這個議題,大家可以期待的事情就是一般化(大家都可以用)與 行動化 (網頁或app中就能直接使用),不需要理解複雜的技術理論也可以享受 AI 帶給我們的便利。

延續去年所推出的 Personal Image Classfier   (我說這個 PIC 網站的介面可以再改良一點啊…),MIT App Inventor 於 4/21 進一步推出了 Personal Audio Classifier,可以讓使用者錄製固定時間的短音效檔並使用該網站來訓練神經網路,訓練好的模型也可以放在 app 中離線執行。請參考 MIT App Inventor 團隊提供的 PAC 教學

根據文件,這概念都是來自於 Google Teachable Machine,並使用 TensorFlow.js (MobileNet) 來訓練網路,但 TM還可以用 poseNet 來偵測人體姿勢,希望 App Inventor 也可以支援(敲碗~)。

哪些手機可以用:

   MIT App Inventor 小組已表示 PAC extension 目前只有較新的 android 機種才可使用,並提供一個 apk 檔來測試,請下載並安裝這個 apk (也可以掃描以下 QRCODE)

  把這個 apk 安裝在您想要執行 PAC 功能的 android 手機。開啟app,會先看到畫面左上角有一個 “Waiting…” 字樣,之後如果變成 “Ready and working!” 代表您的手機可以執行 PAC 聲音辨識,如果沒有的話就無法…   快去續約換新手機吧(誤)

測試用 apk 執行畫面,本手機可用PAC功能

 

開始訓練網路

STEP1. 進入 PAC 網站,點選 + 來新增一個 label,例如下圖的 hello。

STEP2. 按下 Record 來錄製聲音,錄好就會多一個綠色的頻譜(spectrum)方塊,如果錄錯了也可以刪除該檔案

STEP3. 根據 MIT App Inventor 教學,一個類別準備5~10個 sample就可以進行訓練了。訓練前可以設定一些超參數,對於進階需求的朋友可說是相當方便 (PIC網站可以讓你新增網路層! 但是也要先知道這些網路層在幹嘛才行。

MIT App Inventor PIC 網站的超參數設定

 

STEP4. 訓練中,請稍等……

STEP5. 完成可以進行驗證,按下 Record 錄製一段聲音,稍等一下就會載入頻譜並在畫面右邊看到辨識結果與信心程度。老話一句,要有好的辨識結果就要有好的樣本資料,多多提供不同語氣的聲音樣本才是重點喔!(試著加入喜怒哀樂七情六慾的感覺來說 good morning 吧~)

STEP6. 匯出檔案 (mode.mdl) ,再將這個模型檔匯入您 app inventor 專案中的 PAC 元件就可以了,或者您可以用 MIT App Inventor 團隊提供的 aia檔案 (PAC元件已經在裡面了)來玩玩看。happy inventing~

 

相關文章:

 

小體積高效能的NVIDIA Jetson Xavier NX登場

$
0
0

想要效能比Jetson Nano更好的邊緣運算開發板,可以考慮新的Jetson Xavier NX。

2020年登場的Jetson Xavier NX在還沒上市前就令人引頸期盼,本文簡單向大家介紹這塊開發板的特色以及在Jetson家族中的定位。

本文大綱

  • Jetson系列簡單介紹
  • Jetson Xavier NX與Jetson Nano的比較
作者/攝影 蔡雨錡/圖源:NVIDIA購買網頁
材料表

Jetson家族

Jetson 家族的硬體族譜可以透過JetPack的歷史版本來一窺究竟。

整理出來的時間軸如下圖,Jetson Nano可以想成是Jetson Tegra系列的精華濃縮入門款,而Jetson Xavier NX則是Xavier系列的入門款。

Jetson Xavier NX跟其他Jetson家族前輩一樣有兩種版本-模組跟Developer Kit,售價為399USD,台灣可以購買的參考價格為15500NTD(2020/05/11撰文時資訊)。

Jetson Xavier NX與Jetson Nano的比較

由於Jetson Nano B01(新版本)跟Jetson Xavier NX的上市時間接近,根據常見問題整理了以下表格幫助有需要的人做選擇,想看更詳盡的Jetson家族的Nano/TX2/Xavier NX/AGX Xavier比較表請點此連結

 

Jetson Nano B01 Jetson Xavier NX
尺寸 45mmx70mm 45mmx70mm
功耗 5W/10W 10W/15W
腳位 260pin 260pin
GPU NVIDIA Maxwell架構,128個NVIDIA CUDA核心 NVIDIA Volta架構,384個NVIDIA CUDA核心及48個Tensor內核
CPU 四核心ARM Cortex-A57 六核心 NVIDIA Carmel
RAM(記憶體) 4 GB 64-bit LPDDR4 25.6 GB/s 8 GB 128-bit LPDDR4

51.2GB /秒

儲存空間 16 GB eMMC 16 GB eMMC
效能* 472GFLOPS 14TOPS/21TOPS(INT8)
DL加速器 2x NVDLA 引擎
視覺加速器 7-Way VLIW 視覺處理器
價格 99USD/3300NTD 399USD/15500NTD

 

*註解:FLOPS為每秒浮點數運算次數(floating point operations per second),OPS是處理器每秒可以進行幾次操作(operations per second per watt)。而開頭的符號G(Giga)代表10的9次方,T(Tera)代表10的12次方。

從表格中可以看出Jetson Xavier NX的價格為Jetson Nano的4~5倍,在尺寸、腳位無差異的情況下,選擇時應以專案所需要的運算效能為主進行評估。開發專案若為單一主要目的且不要求即時影像串流辨識可以選擇Jetson Nano做開發,但如果希望開發需高fps(frame per second)的即時影像串流辨識或是多工的程式,則可以考慮Jetson Xavier NX。

 

參考資料:

  1.  NVIDIA 文件下載區
  2.  NVIDIA Jetson 家族比較表

不藏私!CAVEDU超實用感測器介紹大公開!

$
0
0

本團隊一直以「物聯網實作」作為研發的主打項目,日積月累的課程研發與專題實作之下讓團隊的研發同事們,也使用了相當多地感測器(是黑歷史啊),在這些寶貴的經驗中,也讓我們開始正視到感測器需要多元變化且相容性強,不論是初階學習好上手,也要擁有進階時的自由度。

本文將介紹由CAVEDU X 機器人王國共同出品的教學套件包中的感測器介紹,想了解更多教學教學材料包中的感測器使用範例,歡迎多加利用本團隊的GitBook網站(網站頁面,請點我) 喔!接下來,由筆者分享幾項好玩有趣的感測器,大家不妨試試喔!

 

全文大綱:

  • 各式LED模組
  • 蜂鳴器
  • 土壤濕度感測器
  • 火焰感測器
  • 手指偵測心跳模組、心律感測器
  • STEAM課程推薦法寶-教學材料套件
    • 洞洞么教學套件材料包
    • 洞洞兩教學套件材料包
    • BOSON電子積木套件
作者/攝影 郭俊廷/CAVEDU教育團隊
編輯

怡婷

材料表

各式LED燈模組

LED燈是最簡易的發光模組,顏色也非常多種選擇以紅、黃、綠為常見顏色(有時也會有藍色)。LED燈模組目前已廣泛應用於LED顯示螢幕、指示燈、交通燈、汽車燈、照明燈、裝飾燈等方面。

另外三色LED模組也是經常使用的感測器模組之一,三色RGB LED有分為共陽極、共陰極的部分,各位在使用的時候請記得要留意一下喔。

「共陽極」為共同使用同一個電源,當 R/G/B的腳位拉高到 3.3V/5V,電流就不會流過,LED就不會點亮;當R/G/B的腳位拉低,電流就會流過,LED 就會點亮。而「共陰極」則是共同使用同一個接地,當給R/G/B給高電位的時候LED就會點亮,R/G/B給低電位的時候LED就不會點亮。

另外筆者加碼介紹,超大顆LED紅綠燈整合模組,此模組在製作交通號誌或是需要紅綠燈的物聯網實作專題中,它將紅、綠、黃LED燈結合再一起,如果想要做道路情境模擬時這個模組非常實用喔!

LED燈為物聯網實作中大量廣泛使用的感測器,舉凡明滅、漸明漸滅、閃爍、變換不同顏色等等都是初階時常見的操作主題,而擁有不同的LED燈模組時,可因應不同的情境與需求而選擇不同的LED燈模組喔!

 

更多LED教學資源:

 

蜂鳴器

蜂鳴器在物聯網實作課程中常見使用的感測器,舉凡會需要發出警報、告示、提醒的聲音時,都會非常直覺地使用它喔!而蜂鳴器又分為「有源蜂鳴器」及「無源蜂鳴器」,「有源蜂鳴器」僅能發出單一頻率的聲音;「無源蜂鳴器」可依據不同的頻率發出不同聲調的聲音。

如果您是想讓蜂鳴器當作單一警示音時,可直接使用有源蜂鳴器即可,利用高地電位交錯所發出聲音或靜音。

換而言之,如果您是想讓蜂鳴器演奏出一首曲的旋律,那麼就要使用無源蜂鳴器,無源蜂鳴器模組為脈衝寬度調變(Pulse Width Modulation)訊號,只要依照曲的旋律宣告,音樂的旋律即可使用無源蜂鳴器發出一首曲的高地音。

如何分辨有源及無源蜂鳴器:

*本影片教學為洞洞么教學材料包內有源及無源蜂鳴器之說明,提供給大家做參考喔!

 

更多蜂鳴器教學資源:

土壤濕度感測器

土壤濕度感測器可以檢測出土壤濕度,廣泛應用於節水農業灌溉、溫室、花卉蔬菜、草地牧場、土壤速測、植物培養、科學試驗等領域。

在物聯網實作中,您可以自己設計出一個自動澆花的程式,當您忙碌或長時間不在家中可以利用此模組來達成自動澆花的專題。

 

更多土壤濕度教學資源:

 

火焰感測器

火焰感測器模組為可偵測火焰的強度或是有無火焰等功能的感測器,此類感測器常見應用為消防安全預防措施啟動,如自動灑水裝置或是火災警報器。

火焰感測器模組有類比跟數位輸出,類比訊號可以顯示火焰的強度,數值越小代表感測器偵測到的火焰越強,數值越大代表沒有火焰。數位訊號可以判斷有沒有火焰0代表偵測到火焰1代表偵測沒偵測到火焰。

*使用火焰感測器時請注意安全喔!感測器與火焰要保持一定距離,以免高溫損壞感測器,當火焰越大,測試距離越遠。

 

更多火焰感測器教學資源:

手指偵測心跳模組、心律感測器

手指偵測心跳模組由紅外線LED和光敏電晶體所構成,原理是透過手指放在紅外線發射器和光敏電晶體之間後,隨著心臟跳動,光敏電晶體的電阻值也在不斷變化,通過這種變化來檢測心跳。為防止外界光線對資料造成影響,最好將手指偵測心跳模放在一個封閉的盒子裡或是用套子包住感測器,在進行心跳檢測。

BOSON的心律監測感測器採用光學技術通過皮下毛細血管內的血氧量變化來檢測人體的心率,心率檢測可廣泛應用於可穿戴設備、健身輔助器材等場景。

心律感測器則用於測試人的心率,通過簡單連接心跳貼片,連貼到左心房、右心房跟兩個心房中間,編輯相對應的程式即可偵測人的心率。

手指偵測心跳模組、心律感測器還有BOSON的心律監測感測器都是用來偵測心跳速率的模組但使用方法跟方便性各有不同,歡迎參考下方教學資源列表。

 

更多手指偵測心跳模組、心律感測器教學資源:

 

STEAM課程推薦法寶-教學材料套件

洞洞么教學材料包

洞洞么材料包使用的開發板是LinkIt™ 7697 開發板 搭配 LinkIt™ 7697 NANO 擴充板

可使用的模組包括但不限於以下介紹提供的模組,並且大部分的感測器直接接3PIN杜邦線即可使用。

更多洞洞么教學材料包模組使用教學

 

材料包亮點:

 

洞洞兩教學材料包

洞洞兩教學材料包使用的開發板是科易KEYES ARDUINO UNO R3開發板搭配擴充板,目前有不用使用擴充板的KEYES UNO R3超夠力版也可以搭配使用。 

可使用的模組包括但不限於以下介紹提供的模組,並且大部分的感測器直接接3PIN杜邦線即可使用。

更多洞洞兩教學材料包模組使用教學

 

材料包亮點:

  • 科易KEYES Arduino UNO R3 開發板,FCC認證。
  • 適用於全國貓咪盃SCRATCH硬體組競賽。

BOSON電子積木套件

BOSON電子積木套件為一簡易操作又功能豐富的積木式教學套件(延伸閱讀:與您一同迎接跨領域導向式學習:面臨科技浪潮該如何挑選合適的教學套件呢?)。

不需要編寫任何程式即可上手,裡面也有許多有趣的感測器可以使用,例如.一般常見的溫溼度感測器、光感測器、傾斜感測器、聲音感測器等等……

可以結合樂高積木等等做成一個智慧小屋(延伸閱讀:【電子積木玩程式】 STEAM好好玩: 樂高小屋大改造!!結合BOSON電子積木、micro:bit,立馬升級成智慧小屋!)。

另外還有比較特別的心律監測感測器、酸鹼值感測器等等也都可以使用看看。

更多BOSON電子積木使用教學

 

套件亮點:

  • 外觀可愛操作上較為親切。
  • 不需要編寫程式也可以學習初階數位邏輯。
  • 可與樂高、磁鐵、螺絲等相關材料相容,讓創作能夠無限制。
  • 可搭配Micro:bit、Linkit 769開發板。

 

除了目前的這三套教學套件外,也有其他的感測器模組喔!如上述提到的火焰感測器、手指偵測心跳模組、心律感測器等感測器模組

更多其他感測器模組
後續如有其他新增專題用到的感測器模組們,都會一併更新於 CAVEDU教育團隊GitBook網站 裡面喔,歡迎大家多多利用呢!

 

Jetson Xavier NX 系統安裝教學

$
0
0

Jetson Xavier NX 安裝系統的方式跟Jetson Nano 不同,需要NVIDIA SDK Manager的幫忙。

Jetson Xavier NX安裝系統的步驟跟Jetson Nano的步驟不盡相同,這篇文章將簡單介紹如何應用NVIDIA SDK Manager安裝Jetson Xavier NX的系統。

作者/攝影 蔡雨錡/CAVEDU教育團隊
時間 1hr
成本 15500 NTD
難度 ★☆☆☆☆
材料表

Step 1.

首先要準備一台安裝Linux作業系統的電腦,本文中使用的作業系統為Ubuntu 20.04 LTS

 

Step 2.

NVIDIA網站上下載NVIDIA SDK Manager,本文中使用的版本為1.1.0。

 

Step 3.

下載後點擊檔案並選擇install按鈕即可安裝。

也可以打開terminal,前往檔案所在資料夾後,輸入以下指令安裝。

$ sudo apt install ./sdkmanager-[version].deb

Step 4.

安裝好後,搜尋SDK Manager就可以點擊後開啟以下畫面。

也可以在terminal中輸入以下指令開啟。

$ sdkmanager

畫面開啟後要登入NVIDIA帳號,還沒有帳號需要先註冊(免費)。

 

Step 5.

接下來需要確認所有的硬體裝置都準備完成,你現在正在使用的電腦(Host Machine)跟Jetson Xavier NX(Target Hardware)有連接在一塊並在同一個網域下,並選擇JetPack 4.4DP,這個版本有針對Jetson Xavier NX做一些最佳化。

Step 6.

都確認好後就是確認要下載的項目,本文中按照預設進行下載,記得要勾選下方的accept license。如果你的Xavier NX還沒到貨,只是想要先下載,可以勾選Download now. Install later。

Step 7.

接下來就是會花一段時間的下載與安裝。

Step 8.

看到這個畫面就代表下載完成囉! (本畫面為Download now. Install later 的最終成果圖)

之後的文章會再測試邊緣運算裝置常見的幾款攝影鏡頭在Jetson Xavier NX上面的表現。有任何Xavier NX相關的有趣主題歡迎在底下留言分享。

 

參考資料:

  1. NVIDIA SDK Manager
  2. NVIDIA SDK Manager教學

UP Squared RoboMaker Pro 機器人套件–具備深度視覺功能的機器人平台

$
0
0

UP Squared RoboMaker Pro 機器人套件具備深度視覺功能的機器人平台

作者/攝影 曾吉弘/圖片引用自UP Board RoboMaker Pro 官網 在此感謝授權使用

總覽

UP Squared RoboMaker Pro 機器人套件與 Intel 所提供的深度感測與視覺推論加速功能

 

Up board 是研揚科技所推出的系列單板電腦,並可結合 Intel Movidius VPU 進行硬體視覺加速,之前就有機會幫 UP board 寫一些評測文(延伸閱讀。最近看到他們推出了 UP Squared RoboMaker Pro 機器人平台,除了理所當然使用 Intel 處理器之外,還加入了近來詢問度超高的 Intel RealSense 深度攝影機 D435i,搭配 IMU 慣性量測單元之後就能解決自動化移動式機器人 (AMR) 所需的視覺、測距與導航問題。(預購 $1799美金,預購頁面請點我) 

另一個亮點就是可結合 ROS 與 Amazon Web Services 等資源,例如 Gazebo 與 AWS RoboMaker 等現成工具套件。

Upboard 採用 Intel® x7-E3950 處理器,並加入了PCIe 介面的 Intel® Movidius™ Myriad™X(原文連結)fps 最高可到 105 fps(一般狀況也有 80 fps),這款 VPU 正是針對原本運算速度有限的邊緣裝置來加強其視覺推論速度。另外也有 USB 介面的 NCS 加速棒,我們用NCS搭配 Raspberry Pi 做了不少專題(延伸閱讀)

單純就售價來看,UP Squared RoboMaker Pro 機器人平台售價 $1799美金,約 $54,000 台幣,折掉了 D435i 之後與我們自己設計的 RK-Jetbot(了解商品) 依然有兩倍以上的價差。AWS Deepracer(了解商品) 的售價為 $399 美金約為台幣$12000;相較之下,RK-Jetbot(了解商品)才$16,000台幣還包8小時教育訓練,真的很超值QQ 。)

AWS RoboMaker 雲端服務

UP Squared RoboMaker Pro 機器人平台標榜與 AWS RoboMaker(原文連結有相當好的整合,像是諸多 AWS 的分析服務、機器學習與監測服務都不是問題,當然啦,雲服務會根據您的使用程度(例如呼叫次數、流量或使用時間)收取費用。

AWS RoboMaker 提供了 ROS 套件(原文連結),且 ROS / ROS2 都有支援,讓開發者得以運用各種 ROS 功能,還能搭配 ROS Gazebo 等虛擬環境來測試。

 

機器人與深度感測

要在機器人加入 RGB camera 不是太大的問題,但立體視覺與深度感測通常是仰賴光學雷達來產生點雲來做。我知道 Elon Musk 堅持不使用光學雷達,但普遍的做法還是會用類似的光學測距裝置。這時候就很感謝 Intel 出了 RealSense D435 / D435i,整合在 UP Squared RoboMaker Pro 機器人平台上的是 D435i,差別在於後者多了一個一個慣性量測單元 (IMU),讓入門者就有機會整合 SLAM 與路徑追蹤等功能,與點雲功能的搭配會更臻完美。

 

OpenVINO

OpenVINO 是 Intel 公司所開發的免費 toolkit,可透過推理引擎將深度學習模型從框架端到部署到 Intel 硬體上的流程都進行最佳化。共有兩個版本:由開源社區支持的 OpenVINO toolkit 以及由 Intel 公司支援的 Intel(R) Distribution of OpenVINO toolkit。請參考 CAVEDU做過的專題(延伸閱讀)

 

您能做到哪些事情?

以下是 UP Squared RoboMaker Pro 機器人平台標榜與 AWS RoboMaker 結合之後的四大特色,可讓您的 AMR 具備立體視覺並自主決策,並有效運作 SLAM(即時定位與地圖構建)。

Intel® RealSense™ 深度攝影機 D435i 作為 SLAM 輸入源

AWS RoboMaker Simulation – 於虛擬環境中執行您的機器人

 

套件包內容

硬體規格

 

已安裝於 upboard 的軟體

元件連線示意圖

詳細 ROS / ROS2 的比較,請參考下方連結:

https://up-board.org/up-squared-robomaker-pro-kit/?f

 

影片連結

(本文部分內容翻譯自UP Squared RoboMaker Pro Kit官方網頁,且感謝授權圖片引用)


Jetson Xavier NX 系統安裝教學(直接下載映像檔/使用NVIDIA SDK Manager)

$
0
0

Jetson Xavier NX 安裝系統的方式跟Jetson Nano 不同,需要NVIDIA SDK Manager的幫忙。

Jetson Xavier NX安裝系統有兩種方式,使用NVIDIA SDK Manager或是直接下載官方提供的映像檔進行燒錄,這篇文章將簡單介紹如何應用兩種方法安裝Jetson Xavier NX的系統。

大綱

  • 直接下載映像檔進行安裝 (Windows/Mac/Linux系統電腦可用)
  • 使用NVIDIA SDK Manager (Linux系統電腦)
作者/攝影 蔡雨錡/CAVEDU教育團隊
時間 1hr
成本 15500 NTD
難度 ★☆☆☆☆
材料表

直接下載映像檔進行安裝 (Windows/Mac/Linux系統電腦可用) 

本文使用NVIDIA 的Getting Started With Jetson Xavier NX Developer Kit中提供的映像檔。

Step 1.

NVIDIA網頁下載Jetson Xavier NX映像檔

Step 2.

將準備好的SD卡插上電腦(本文使用SAMSUNG Micro SD 快閃記憶卡64GB)

Step 3.

下載balenaEtcher並開啟,會看到以下畫面。

Step 4.

點選Flash from file,選擇剛剛下載好的檔案後,會看到以下畫面。

Step 5.

選擇Select target後,會跳出選單,選擇剛剛插入的SD卡後,點選Continue。

Step 6.

接著點選Flash!,Windows會跳出警告示窗問你是否授權,Mac/Linux系統則是會請你輸入密碼進行授權。授權完就可以順利執行SD卡燒錄。

Step 7.

燒錄完畢後,就可以將SD卡插上Jetson Xavier NX開機使用啦!

 

使用NVIDIA SDK Manager (Linux系統電腦)

Step 1.

首先要準備一台安裝Linux作業系統的電腦,本文中使用的作業系統為Ubuntu 20.04 LTS

 

Step 2.

NVIDIA網站上下載NVIDIA SDK Manager,本文中使用的版本為1.1.0。

 

Step 3.

下載後點擊檔案並選擇install按鈕即可安裝。

也可以打開terminal,前往檔案所在資料夾後,輸入以下指令安裝。

$ sudo apt install ./sdkmanager-[version].deb

Step 4.

安裝好後,搜尋SDK Manager就可以點擊後開啟以下畫面。

也可以在terminal中輸入以下指令開啟。

$ sdkmanager

畫面開啟後要登入NVIDIA帳號,還沒有帳號需要先註冊(免費)。

 

Step 5.

接下來需要確認所有的硬體裝置都準備完成,你現在正在使用的電腦(Host Machine)跟Jetson Xavier NX(Target Hardware)有連接在一塊並在同一個網域下,並選擇JetPack 4.4DP,這個版本有針對Jetson Xavier NX做一些最佳化。

Step 6.

都確認好後就是確認要下載的項目,本文中按照預設進行下載,記得要勾選下方的accept license。如果你的Xavier NX還沒到貨,只是想要先下載,可以勾選Download now. Install later。

Step 7.

接下來就是會花一段時間的下載與安裝。

Step 8.

看到這個畫面就代表下載完成囉! (本畫面為Download now. Install later 的最終成果圖)

之後的文章會再測試邊緣運算裝置常見的幾款攝影鏡頭在Jetson Xavier NX上面的表現。有任何Xavier NX相關的有趣主題歡迎在底下留言分享。

有興趣的人也可以參考JetsonHacks的開箱影片:

 

參考資料:

  1. NVIDIA SDK Manager
  2. NVIDIA SDK Manager教學
  3. Getting Started With Jetson Xavier NX Developer Kit

【教學】Processing 結合 LinkIt 7697 互動專題:控雨

$
0
0
作者/攝影 曾吉弘
時間 1小時
難度

★★★☆☆

材料表

這學年我在台北科大互動設計系上課,上學期使用 LinkIt 7697 來上互動物聯網專題,這學期則是 Processing 與 Python 各半學期。班上人數居然有79人,4個人一組也是有20組,期中看大家的 demo 真的很累啊… 一組5分鐘就兩個小時過去了。有興趣的朋友歡迎參考我的上課講義以及 CAVEDU blog

Processing 一直是我很喜歡的一個主題,使用相對簡易的語法就可以設計出豐富有趣的介面,加上執行在電腦上就很容易透過 USB 來與 Arduino 這類裝置溝通。所以也很高興看到這組同學有不錯的結合:使用 Processing 讀取裝在 LinkIt 7697 的超音波感測器與三軸感測器,超音波用來控制球的移動速度,三軸則是控制方向。

 

影片:

本文範例與影片,感謝班上鄭同學與朱同學協助整理。

[北科互動系 期中demo]這組使用 Processing 讀取 Arduino 的超音波感測器與三軸加速度感測器,超音波用來控制球的移動速度,三軸則是移動方向。基本的 filter 寫得不錯呢

Posted by 曾吉弘 on Friday, May 1, 2020

功能說明

引用這組的期中報告,專題名稱為 [rit.]。就是樂曲上漸慢的意思

我們從電影「出神入化」中一幕控制雨水暫留於空中甚至向上漂浮的畫面獲得靈感,想要將這樣具戲劇張力的畫面實現,讓平凡人也可以擁有控制地心引力或甚至是時間的超能力。我們的功能主要是透過超音波感測器偵測手部,靠近時,畫面中的雨滴會漸慢停止,而遠離時,雨滴會回流向上,手離開感測器則雨滴恢復原行進狀態。

流程圖

說明

7697端透過 Serial.write(); 語法不斷把超音波與加速度感測器的 Y 軸送出

Processing 則是語法  serial.read(); 語法把資料讀進來之後控制雨點的速度與方向

一般人常碰到的問題是抓不到 Arduino,解決方法要讓 Arduino 的程式先跑起來,且不要開 Arduino Serial Monitor 否則會被占住而無法連線(除非你又開一個 SerialX 來顯示資料但不建議這麼做),語法: serial = new Serial(this, Arduino.list()[0], 9600);   這裡的 Arduino.list()[0] 是指電腦上抓到的第一片 Arduino,也可以直接用 “COMX” 來指定。 

以這樣的概念來說,PC 上要接多片 7697 當然是可行的。設計背景的同學在進入互動裝置時不一定需要寫很複雜的程式,但通常都會以”場域”的概念來思考專題,例如用很多感測器感測人在一個區域中的動作。這與資電背景同學(通常是做一個裝置)相比各有其趣。

 

rit 程式說明 – Processing端程式

Spot[] spots; // Declare array

import processing.serial.*;
import cc.arduino.*;
Serial serial; 
Arduino arduino;

int a1=0;
int a2=0;
int sensorValue;

void setup() {
  size(700, 700);
  serial = new Serial(this, Arduino.list()[1], 9600);  //指定 Arduino 位置
  int numSpots = 100; // Number of objects
  int dia = 15; // Calculate diameter
  spots = new Spot[numSpots]; // Create array
  for (int i = 0; i < 100; i++) {
    float x = 20*random(0, 35); //決定球圓心位置
    float rate = random(-1.0, 1.0);

    for (int i1 = 0; i1 < 100; i1++) {
      float y = 20*random(0, 35); //決定球圓心位置

      // Create each object
      spots[i] = new Spot(x, y, dia, rate);
    }
  }
  noStroke();
}

void draw() {
  fill(0, 15);
  rect(0, 0, width, height);
  fill(255);

  for (int i=0; i < 100; i++) {
    spots[i].move(); // Move each object
    spots[i].display(); // Display each object
  }
}

class Spot {   //自定義雨滴
  float x, y;         // X-coordinate, y-coordinate
  float diameter;     // Diameter of the circle
  float speed;        // Distance moved each frame
  int direction = 5;  // Direction of motion (1 is down, -1 is up)
  float diameter1;     // Diameter of the circle
  float speed1;        // Distance moved each frame
  int direction1 = 5;
  // Constructor
  Spot(float xpos, float ypos, float dia, float sp) {
    x = xpos;
    y = ypos;
    diameter = dia;
    speed = sp;
  }

  void move() {     //根據Arduino 丟過來的值決定雨滴動作
    if ( serial.available() > 0) {
      sensorValue = serial.read();

      a1=sensorValue/10;
      a2=sensorValue;
    }
    if (a1<5) {

      if (a1==0) {
        println("a2"+a2);
        if (a2==2) {
          a2=-1;
        }
        x += a2*(speed * direction1); 
        if ((x > (width - diameter1/2)) || (x < diameter1/2)) { 
          direction1 *= -1;
        }
      } else {  
        y += 0.1*a1*(speed * direction); 
        if ((y > (height - diameter/2)) || (y < diameter/2)) { 
          direction *= -1;
        } 
        x += 0.1*a1*(speed * direction1); 
        if ((x > (width - diameter1/2)) || (x < diameter1/2)) { 
          direction *= -1;
        }
      }
    } else if (a1==5) {
      y += (speed * direction); 
      if ((y > (height - diameter/2)) || (y < diameter/2)) { 
        direction *= -1;
      } 
      x += (speed * direction1); 
      if ((x > (width - diameter1/2)) || (x < diameter1/2)) { 
        direction1 *= -1;
      }
    }
  }

  void display() {   //顯示雨滴
    ellipse(x, y, diameter, diameter);
  }
}

rit 程式說明 – Arduino端(7697)程式

#define Y_PIN A1                //加速度 Y軸
int trigPin = 12;                     //超音波 Trig Pin
int echoPin = 11;                  //超音波 Echo Pin
long duration, cm, inches;
int a = 0;

float toG(float v) {
  return v * 6 / 1023 - 3;       
}

void setup() {
  Serial.begin (9600);             // Serial Port begin
  pinMode(trigPin, OUTPUT);        //Define inputs and outputs
  pinMode(echoPin, INPUT);
}

void loop()
{
  int y  = analogRead(Y_PIN);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);     // 給 Trig 高電位,持續 10微秒
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT);             // 讀取 echo 的電位
  duration = pulseIn(echoPin, HIGH);   // 收到高電位時的時間

  cm = (duration / 2) / 29.1;
  a = cm / 8;

  if (a < 5) {
    if (a == 0) {
      if (y > 360) {
        a = a * 10 + 2;
        Serial.write(a);
      }
      else if (y < 300) {
        a = a * 10 + 1;
        Serial.write(a);
      }
      else {
        a = 0;
        Serial.write(a);
      }
    }
    else {
      a = a * 10;
      Serial.write(a);
    }
  }
  else {
    a = 50;
    Serial.write(a);
  }
  delay(100);
}

 

 

為了Cloud-Native Demo在Jetson Xavier NX上裝NVMe SSD

$
0
0

本篇將使用NVMe SSD增加儲存空間以及swap空間,並且測試SD卡跟SSD的效能差異。

NVIDIA為了展示服務機器人的AI應用提供了Cloud-Native展示範例,部分程式需要使用到NVIDIA Jetson 平台中的Jetson AGX Xavier跟Jetson Xavier NX獨有的Tensor Core。服務機器人是自動化機器人,且需要在不同的場所與人互動。舉例來說,在一個零售賣場駐點的服務機器人可能需要執行以下任務:

  • 識別顧客/人
  • 判斷顧客是否在跟自己交談
  • 了解顧客跟機器人互動時指向的位置,可能是商品詢問或是問路等等
  • 了解顧客需求
  • 提供有效的回覆

所以四個Cloud-Native展示範例分別為以下內容:

  • 路人偵測,可用於計算視線內總人數
  • 姿態檢測,可以用於判斷顧客的肢體語言
  • 注視檢測,可用於判斷顧客是否與自己交談
  • 語音辨識與自然語言處理,可以用於與顧客交談

這四個展示範例中的模型都是包裝成容器(container)的形式,並託管給NVIDIA NGC

由於這些展示範例並未針對記憶體跟儲存空間大小完全的最佳化,因此在執行展示範例之前要使用NVMe SSD增加儲存空間以及swap空間。本篇也會順便測試SD卡跟SSD卡的使用效能差異。

本文大綱:

  • 安裝SSD並設定swapfile
  • 比較SSD跟SD卡效能
作者/攝影 蔡雨錡/CAVEDU教育團隊
時間 1hr
難度 ★☆☆☆☆
材料表

安裝SSD並設定swapfile

 

Step 1. 在Jetson Xavier NX上安裝SSD

使用M2螺絲起子將下圖中綠色圓圈中的螺絲轉開拿起來。再把NVMe規格的PCIe SSD插入Jetson Xavier NX的底部M.2 Key M插槽(為圖中紅色框框的左側)。插進去後要注意金屬接點部分會如下圖看不到,這個時候就可以把綠色圓圈中的螺絲鎖回。

接下來的步驟為按照NVIDIA Cloud-Native範例Github操作,文字中以符號$為首的指令需要在terminal中輸入。

 

Step 2. 格式化NVMe為ext4的Linux檔案系統

檢查NVMe是否有裝上Xavier NX

$ ls /dev/nvme*

畫面如下圖黃字所示,就可以進行格式化

$  sudo mkfs.ext4 / dev / nvme0n1

Step 3. 安裝 NVMe

創建安裝資料夾

$ sudo mkdir /home/your_home_directory_name/nvme

並安裝(mount) NVMe

$ sudo mount /dev/nvme0n1 /home/your_home_directory_name/nvme

 

Step 4. 在檔案系統表(File System Table)中新增要掛載的項目

用你習慣的文字編輯器,本文中使用nano編輯器。沒有nano編輯器的人可以透過下列指令先行安裝:

$ sudo apt-get install nano

編輯檔案系統表

$ sudo nano /etc/fstab

新增下列這行內容,成果如下圖

/dev/nvme0n1 /home/your_home_directory_name/nvme ext4 defaults 0 1

完成後,重新啟動系統

$ sudo reboot

Step 5. 設定將docker儲存在NVMe

創建新資料夾

$ sudo mkdir /home/your_home_directory_name/nvme/docker

建立連結

$ sudo ln -s /home/your_home_directory_name/nvme/docker /var/lib/docker

Step 6. 關閉zram後重啟系統

$ cd /etc/systemd

$ sudo mv nvzramconfig.sh nvzramconfig.sh.orig

$ sudo reboot

Step 7. 在nvme上添加swapfile並驗證

新增32G swap空間

$ sudo fallocate -l 32G /home/your_home_directory_name/nvme/swapfile 

改變檔案權限為 600 ,僅有owner可以讀/寫

$ sudo chmod 600 /home/your_home_directory_name/nvme/swapfile 

$ sudo mkswap /home/your_home_directory_name/nvme/swapfile 

$ sudo swapon /home/your_home_directory_name/nvme/swapfile 

$ sudo swapon -s

顯示出以下畫面就成功了。

Step 8. 在檔案系統表(File System Table)中新增掛載swapfile

編輯檔案系統表

$ sudo nano /etc/fstab

新增下列這行內容

/home/your_home_directory_name/nvme/swapfile swap swap defaults 0 0

完成後,重新啟動系統

$ sudo reboot

比較SSD跟SD卡效能

搜尋Disks後可以看到以下畫面,由於有32G做swapfile了,所以可用空間為457GB。

因為有指定docker要存入NMVe SSD裡,所以到先前創建的資料夾( /home/your_home_directory_name/nvme)下可以看到以下畫面

使用剛剛Disks畫面中右上角的Benchmark功能測試SSD跟SD卡的效能。

 

100個樣本測試平均讀取速度結果:

SSD為2.8GB/s,而SD卡為85.2MB/s

 

1000個樣本測試平均存取時間:

SSD為0.07msec,而SD卡為0.63msec

 

可以看出有十分顯著的差異!

 

測試中使用的硬體規格如下:

  • SSD –  SanDisk Extreme PRO M.2 NVMe 3D SSD 500GB
  • SD卡 – SAMSUNG microSDXC UHS-I Card 64G

Jetson Xavier NX在需要更高存取速度的情況下,加裝一條SSD是一個不錯的解決辦法!

 

參考資料:

 

 

 

Raspberry Pi 4 之輸送帶影像辨識分類機電整合專題

$
0
0

視覺辨識在產業界的應用已經非常普遍,產業界運用視覺辨識進行缺陷偵測(品管)也是一種很重要的功能,透過電腦視覺辨識可以大幅提升產線品管過程中的量能,並且減少產線上人工視覺判別的失誤。

本次專題主要是以樹莓派為基礎進行輸送帶影像辨識分類機電整合專題製作,在這次專題製作裡,我們採用的影像辨識分類的神經網路訓練平台是透過Teachable Machine的Image Project進行,並且匯出成Tensorflow-Lite框架於樹莓派上進行推論,程式設計是以Python為基礎進行影像辨識分類、馬達控制、光遮斷偵測等動作;此外,輸送帶本身是透過金屬加工的H型鋁架與3D列印件組成基本的機構,輸送帶本身採用與產業界輸送帶相同的編織面輸送帶材質進行製作,這個專題製作基本上只有模擬輸送帶一小段的過程,透過串接不同長度規模的輸送帶即可以做出類似生產線上的運作過程。

作者 曾俊霖
時間 1hr
成本 低於300元
難度 ★★★★☆ 
材料表

一、影像辨識部分

1. Teachable Machine

2.透過Python3執行影像分類程式,程式的運作流程是採用「觸發辨識」的概念進行設計,為降低樹莓派在執行程式的運算負荷,影像辨識程式採用的是偵測觸發而後進行影像分類神經網路運算,這樣樹莓派的在運作的過程便可以不需要一直處於大量運算的狀態而降低整體系統運作效能。

3.影像辨識的攝影機採用羅技系列的Webcam,架設在輸送帶的上方以俯視的視角進行影像資料的擷取,這樣的設計可以有效綜覽辨識物件的外觀,透過3D列印件固定於輸送帶的運作軌道上,詳細的架設照片如圖1與圖2。

4.本次影像辨識分類是模擬電路板製造生產線上的狀況,主要是要判別電路板上是否有缺件的狀況,在測試階段,我們透過辨識以下這些影像資料進行分類辨識,如圖3至圖6。

5.本次的影像辨識搭配光遮斷器感測進行定點的偵測識別,電路板載盤到達光遮斷器的偵測位置時,樹莓派程式會進行輸送帶驅動馬達的暫停(約1秒),以此穩定攝影機蒐集影像的品質提高辨識正確率,光遮斷器、光遮斷電路模組與導正軌道的結合如圖7至圖9。

二、輸送帶機構驅動部分

1.輸送帶機構設計

驅動馬達基本上採用24V的直流減速馬達轉速約在60RPM左右,樹莓派透過繼電器板模組控制馬達的轉動,減速馬達透過驅動皮帶連結輸送帶驅動輪軸,輸送帶驅動輪軸必須透過培林減少摩擦力,輸送帶在運作的過程採取定速的方式運作,樹莓派在接受光遮斷器信號觸發,會暫停輸送帶馬達的轉動,待影像辨識分類完成後再行驅動減速馬達。

2.分類撥桿機構設計

分類撥桿主要的功能是將影像分類的結果進行物件在輸送帶「轉向」運輸的機構,在本專題當中採用伺服馬達進行撥桿轉動的控制,伺服馬達控制電路主要是透過PCA9685模組的PWM信號輸出進行轉動角度的控制,撥桿與伺服馬達固定架是以3D列印件製作,撥桿啟動的主要是針對影像識別類別中的「NO_IC」、「NO_LED」與「EMPTY」這三種類別進行轉動撥桿促使這些物件會在輸送帶上產生轉向運輸的效果。

三、樹莓派程式部分

    1. 樹莓派系統環境與應安裝程式套件
    2. Python程式部分
      • Python測試程式(連結請點我)
      • Tensorflow-Lite模型檔(.tflite)與標籤檔(.txt)可以透過Teachable Machine的Image Project進行訓練產生並且下載(連結請點我)
      • 測試程式對於GPIO的存取,必須打開I2C、GPIO的功能,I2C主要是給PCA9685控制電路模組使用,GPIO主要是給繼電器電路模組與光遮斷偵測模組控制使用。

四、測試過程

針對四種狀況進行影像分類,分別是PASS(完整電路)、NO_LED(缺少LED電路)、NO_IC(缺少IC驅動電路)、EMPTY(空盤)進行影像分類,以下便是影像辨識所拍得與識別的狀況。

測試過程影片:

【Makerpor】Maker電子學 SPI 界面解密—PART 1

$
0
0

先前花了兩篇文章的篇幅談了非接觸式的溫度感測器,再讓我們回到通訊介面的題目吧!這次的主角是歷久彌新的 SPI 通訊介面。

作者 Bird,本文經Makerpor同意轉載,原文連結

歷史悠久的 SPI

SPI 的歷史可以回溯到 1980 年代初期,當時 Motorora 仍然是微處理器市場上的主要供應商(後來 Motorola 在 2004 年將半導體事業部拆分,成立 Freescale 飛思卡爾半導體,Freescale 又在 2015 年賣給 NXP 恩智浦半導體)。Motorola 在 8-bit 的微控制器(MCU)68HC11 上首度加上了這個四隻腳的介面,並稱之為 SPI:

圖片來源:Bird 提供

上圖是 1985 年出版的 MC68HC11 datasheet 中,關於這個微控制器的方塊圖(SPI 旁邊的 Serial Communication Interface 其實就是 UART),直到今日我們仍然可以在 NXP 半導體的網站上找到這份文件的最新版,而且這個零件目前還持續在生產,仍有大量的車用電子裝置跑在這個平台上。

Motorola 當年設計 SPI 的用意,主要是為了用串列介面的方式減少連接周邊裝置時所需要的接腳數量,SPI 的全名 Serial Peripheral Interface 就是這麼來的,在當年被視為一個「高速」的介面,在 68HC11 上它的 clock 可以跑到 MCU 主頻的一半(初代 68HC11 的速度大約是 1 MHz 左右),且由於它同步傳輸的設計,只要驅動電路推得動、EMI 沒有太誇張,它的速度可以隨著半導體製程的進步與速度的提升,不斷提高。

Arduino UNO 上的 SPI 可以跑到 8 MHz,而在更高階的平台上,如果使用 ESP8266,因爲 CPU 主頻高達 80 或 160 MHz,SPI 甚至可以輕易跑到數十 MHz 以上。

仍然是串列界面

我們第一次談 UART 界面時,曾經說過串列通訊的原始精神是:「把一整排的資料按照順序排列,逐一送到遠方,接收方再用同樣的順序將資料排回去」。

SPI 就是基於這個精神設計出來的界面。當年的微處理器或微控制器都是 8-bit 的,因此用並列界面傳輸資料,一次就會用掉 8 根線,但如果我們用移位暫存器將資料排成串列再依序送出,到了目的地再用移位暫存器將資料排回來,就只需要 data 和 clock 兩個訊號(也許再加上重設移位暫存器的 reset 訊號)。

圖片來源:Bird 提供

 

用這個方法,不管你要傳 8 bits、16 bits、24 bits,還是 32 bits,都只需要三根線。由於 SPI 是在 8-bit 微處理器的年代設計出來的界面,它的所有傳輸都是以 8-bit 爲基本單位(如果你要傳 16 bits,就必須傳兩次;要傳 24 bits,就要傳三次;要傳 18 個 bits,還是得傳 三 次,然後再把多出來的 6 個 bits 丟掉)。

有了移位暫存器的概念後,我們就來看看實際的 SPI 訊號結構。SPI 是典型的主從式(master-slave)通訊架構,它可以是有多個裝置的 bus 形式,但是整個 bus 上只能有一個老大,稱之爲 master,其它的裝置都稱爲 slave。

圖片來源:Bird 提供

(註:master、slave 這樣的詞彙廣泛用於各種有鮮明角色區別的通訊架構上,尤其在硬碟還是 IDE 界面的年代,一個硬碟排線上可以接兩台硬碟,一台叫 master、另一台則是 slave。2003 年加州的洛杉磯郡政府還以這樣的字眼帶有歧視意味爲由,要求電腦設備製造商改善,不應再使用 master、slave 這樣的詞彙。)

SPI 的角色與訊號

master 是整個 bus 上的主控者,它負責提供移位暫存器的 clock,並且決定要和哪個裝置通訊、發起傳輸。SPI 是全雙工的雙向界面,master 可以送資料到 slave,slave 也可以送資料到 master,而且兩路可以同時進行,因此這兩條路徑各自有其專屬的訊號:由 master 送往 slave 的資料線,稱之爲 MOSI(master out slave in)、由 slave 送往 master 的資料線,則稱爲 MISO (master in slave out)。

除了 MOSI、MISO、CLK 外,還有一個訊號稱為 SS,意思是 slave select,就是在多個 slave 裝置之間用來選擇要和哪一個 slave 通訊的訊號。如果系統中只有一個 slave 裝置,在某些狀況下可以不需要 SS,但大部分的裝置仍然需要 SS 訊號來作為傳輸的起始訊號。

圖片來源:Bird 提供

 

上圖是 SPI bus 一對一以及一對多的連接方法。可以看到 MOSI、MISO、CLK 三條線是各自接在一起的;由於 MOSI 和 CLK 是由 master 送往所有的 slave,屬於一對多的傳輸,只要 master 的驅動能力夠且slave 的輸入阻抗夠高,這種接法不會有什麼問題。

但 MISO 必須要全部接在一起,這就會有其他特別的考量,因爲 MISO 是多個 slave 接到一個 master,而 slave 是輸出、master 是輸入,因此這根線上會有多個輸出;如果有兩個 slave 同時送訊號,就會產生邏輯訊號衝突的狀況,這該怎麼辦呢?這時候就輪到 SS 訊號上場了!

SPI 的 master 會爲每一個 slave 準備一根 SS 訊號,且只有被 SS 選到的 slave 可以操控 MISO 腳,其它沒被選到的 slave 必須要將 MISO 變爲高阻抗狀態(注意:不是 high、不是 low,只能是高阻抗,就像它沒有接在這根線上一樣),這是多裝置的 bus 很重要的一個觀念:「一次只能有一個裝置驅動 bus,否則就會有邏輯訊號衝突的問題」。

大部分的 SPI slave 裝置都支援用 SS 控制 MISO 的動作與否,但仍有少部分的晶片或裝置不支援這種工作狀態,而這種不支援 MISO 高阻抗狀態的裝置就不能用在 multi-slave 的 SPI bus 中。

 

小結

這次我們聊了 SPI 界面的基本原理、裝置的角色以及需要用到的訊號,下回我們再繼續深入探討這些訊號的協定、格式,以及它們的電氣特性。

 

*本文經Makerpor同意轉載,特此感謝

Viewing all 673 articles
Browse latest View live