Category Archives: 物聯網

[Micro:bit]Micro:bit Blockly PBL教材──主題2-1:健康計步器(Pedometer)

作者/攝影

Ted Lee(本文轉載自Ted Lee的部落格「泰布布」,圖文版權均屬於作者Ted Lee,特此致謝。)

文章分類教學
時間
成本
難度***(1~10)
材料表

 

從蔣勲的萬步復健醫囑談起

  美學大師蔣勲在2010年因心肌梗塞緊急送醫手術後,從鬼門關前撿回一條命。從此,他便遵從醫囑,不管刮風下雨、風吹雨打,為了有健康的生活,每日就必需走一萬步復健。

 

  親愛的朋友們,請幫幫蔣先生設計一個可以讓他身體更健康的計步器,以提醒他每日要完成的萬步功課吧!

 

與生活經驗結合

  Micro:bit最迷人的硬體之一,就是板載用來偵測空間運動量變化的3軸(3 axles)加速度感測器(Gyro sensor或Accelerometer)!三軸加速度感測器於日常生活中有許多方面的應用,茲舉數例如下:

 

實例1:App

  現今的智慧型手機內其實暗藏著不少感測器(sensors),您可以藉由Sensors Test app測看看。所以,大家應該猜到了,一定也有app版的健康計步器吧?
沒錯,有一卡車那麼多哩!

 

實例2:手機直/橫向顯示

  它傻瓜,也聰明,就是知道您把手轉一下就把手機畫面打橫,這樣追劇才過癮吧!智慧型手機就是利用一顆加速度感測晶片,以感知螢幕是要直顯還是橫顯的喔!

 

實例3:念佛器

  阮阿嬤生前是佛教徒,所以每天要做的功課就是要念一萬聲佛號。但您也了解年紀大了記性不好,老是記不住念過了五千遍是八千遍,這時要是有念佛神器,那就真的是太帥了!(注意觀察此器的使用:念一遍佛號,按一下,數字+1⋯⋯。這不就是和一般計數器的功能一模一樣嗎?)

 

實例4:人頭計數器

  有去過動物園或遊樂場校外教學的經驗吧?帶隊老師買完團體票後,同學們一個接著一個陸續入場。在入口處,您一定見過會有一個工作人員拿著一個計數器在數人頭。

 

實例5:叫號機

  我們到診所看病時,會先至櫃檯掛號,取得一個號碼後在一旁等候叫號機顯示看診序號後,進入診間就診。

 

任務

  當蔣勲先生換好運動服裝,拿起此小彼特計步器並按下「啟動鈕(Start Button)」,開始在他淡水河畔的八里住處散步。當他達到設定好的萬步目標後,這個小機器會嗶嗶嗶地提醒他,今日功課完成了喔。

 

解說

  不管您能否了解題意,玩一下這個Micro:bit版的東東,先建立直覺(intuition)再說。好玩嗎?來,自己做一個更有fu喔!

  整個問題的核心(core),在用一個變數(variable)「steps」來記錄目前走了幾步。變數,就是指會改變之數,每走一步就累進一。So,只要能精緻處理計數變數(counting variable)的變化,我們就能控制計步的過程。其中,在程式語言(programming languages)裡,變數的使用方式有以下三個步驟:

 

1.宣告(declaration):指定變數名稱(variable name)型別(type)。所謂型別是指該變數屬於哪一類(catalog),例如:整數(integers)、實數(real numbers)⋯⋯等等。

 

2.賦予初始值(initial value):指定變數的起始內容。例如:設定steps從0起跳。

圖1 設定steps從0起跳

 

3.使用(use):變數的累計或計算。例如:走一步觸發(trigger)一次加速度感測器的shake(搖動)事件,並將steps的計數值加1。

圖2

 

  最後,再讓Micro:bit不斷顯示(只要steps之值沒有變化,雖然Micro:bit的5×5 LED點矩陣(dot matrix)反覆刷新,但視覺上並未看到計數值顯示有改變。您也可以把圖3的積木塊移到事件積木(event block)中試試!)steps的值就大功告成了。

圖3

 

圖4 計步器的完整程式碼

 

  1. let steps = 0
  2. onGesture(Gesture.Shake, () => {
  3.   steps += 1
  4. playTone(659, music.beat(BeatFraction.Whole))
  5. })
  6. steps = 0
  7. forever(() => {
  8. showNumber(steps)
  9. })

 

與108課綱的對照

  • 學習表現:

    1. 資t-III-2 能使用資訊科技解決生活中簡單的問題。

    2. 生c-IV-2 能在實作活動中展現創新思考的能力。

  • 學習內容:

    1. 資A-III-1 程序性的問題解決方法簡介。

    2. 生P-IV-2 設計圖的繪製。

 

延伸挑戰:

也可試著改成用加速度感測器的Y軸,改變Y軸的量來玩喔!

 

相關文章

[Micro:bit] Micro:bit Blockly PBL教材──主題1-1:左右手慢動作

作者/攝影

Ted Lee(本文轉載自Ted Lee的部落格「泰布布」,圖文版權均屬於作者Ted Lee,特此致謝。)

文章分類教學
時間
成本
難度** (1~10)
材料表

 

任務

  千呼萬喚始出來,男孩團體TFBOYS終於要來台灣開演唱會了!

 

  各位忠實的粉絲們,請使用「Basic積木抽屜」中的7塊積木,來設計要在會場盡情吶喊的燈光秀吧!

圖1

 

我們先來介紹Basic積木抽屜中的7塊積木:

1.show number:顯示數字,例如:5487、9487。

2.show leds:自繪圖案,例:大、火。

3.show icon:圖庫區(按右上角的倒三角形展開)。

圖2 show icon積木

 

4.show string:顯示字串(英文文字、數字串一串)。

5.pause:暫停。

 

還有更多:

圖3 更多Basic程式積木

 

1.clear screen:清除畫面。

2.show arrow:顯示東、西、南、北、東南、西南、東北、西北的八方位箭頭。

 

解說

1.使用Google Chrome或Firefox瀏覽器(不要使用Microsoft Internet Explorer(IE)),在網址列上輸入關鍵字「lets code」後,按下鍵盤上的Enter鍵。然後用滑鼠點按搜尋排名第一名的連結。

圖4 在網址列上輸入關鍵字「lets code」

 

圖5 用滑鼠點按搜尋排名第一名的連結

 

2.連入Micro:bit官網。

圖6 Micro:bit官網

 

3.再用滑鼠點擊按鈕,進入由微軟公司所維護的視覺化積木式線上開發程式網站「Make Code」。(為了教學與學習方便記憶,請大家記住關鍵字let’s code的台語發音:拉死狗(let’s code念快一點,而且要拉二次))。

圖7 點擊「Let’s Code」按鈕

圖8 Make Code網站

 

4.運用前面所提示的7塊積木,並配合TFBOYS的成名曲《青春修煉手冊》來設計您的彼特看板燈光秀。

 

延伸挑戰

1.與美術整合:製作您專屬的妖怪手錶,並設計錶上顯示您精心設計的燈光圖案。

2.與音樂整合:如同第1題,除了燈光外,嘗試使用Music積木抽屜裡的積木(例如:單音Tone⋯⋯等等),讓您的手錶能自己唱歌。

 

相關文章

[新品介紹]MIT App Inventor Codi Bot物聯網教學互動機器人

作者/攝影曾吉弘
文章分類產品介紹
時間
成本
難度*  (1~10)
材料表

對於會寫程式的人來說,Python/C/Java是完全不同的程式語言。但對於沒接觸過的人來說,通通都是一樣的:很可怕。因此程式語言需要一個圖騰來代表,例如,Scratch的那隻小貓、 Linux的企鵝、Java的咖啡,以及Android的小機器人⋯⋯等等,在相關場合中,我們都可以看見這樣的代表符號。

    MIT App Inventor去年發起了一項募資計畫,目標是加速App Inventor 的 iOS版本。贊助$1500美金以上者可以收到一套實體的物聯網教育套件,但這時大家對於內容還不是很清楚應該如何規劃。Hal Abelson教授就問是否可以幫忙?

當然可以啦,不就是為了幫忙才去MIT的嗎?

輪型或多足型機器人設計相關課程算是CAVEDU教育團體的專長,但MIT App Inventor小組盼望能結合它們的新logo,因為之前的logo太Android了,所以他們於去年推出了新的小蜜蜂logo,與Android 3.0 honeycomb 相當神似。

經過一番努力之後,MIT App Inventor Codi Bot 誕生了!

圖1

MIT App Inventor Codi Bot在設計上有幾項重點:

可愛、易用、教育、可擴充

特色:

為了讓使用者更易入手,我們開發了 LinkIt 7697 的 App Inventor extension,(個人覺得比Arduino 101的好用多了)。LinkIt 7697端只要上傳一次程式就可以順利與App Inventor溝通,也就是使用者只要專心寫App Inventor程式即可。如果在辦短期營隊或是體驗活動的時候,可以先把LinkIt 7697準備好,這樣可以省去現場上傳程式的各種麻煩事。

核心使用 LinkIt 7697Robot Shield V2.0,這樣使得整理電線變得很輕鬆,國內也有許多團隊使用兩者開發出許多有趣的專題。

當然,Codi Bot能做的不只是如此,7697 可以結合 MediaTek Cloud Sandbox等雲端服務結合LINE、IFTTT等通訊軟體

 

教學文件:

  • 單機執行:直接執行 (影片)
  • LED:使用按鈕、滑桿來控制翅膀與底座的LED (影片)
  • 翅膀:使用按鈕、滑桿來控制翅膀(伺服機) (影片)
  • 聲音:控制蜂鳴器發出各種音符或自訂義頻率與時間長度 (影片)
  • 完整app:整合上述功能 (影片)

來看實體照片吧,LED亮起的時候真的很漂亮,影片中可以看到翅膀拍動以及發出聲音的效果。

 

圖2

 

圖3 背面

 

圖4側面

    開發過程中,非常感謝聯發科技實驗室MiniPlan,CAVEDU同仁的超強後勤。

7697 extension感謝林祥瑞袁佑緣兩位小超人,以及MIT App Inventor Codi Bot的設計者:游允赫老師。

比較一下 MIT App Inventor的logo 與 Android 3.0 honeycomb:

圖5 App Inventor的logo

 

圖6 Android3.0 honeycomb

 

相關文章:

[Raspberry Pi] 如何使用遠端桌面

作者

袁佑緣

時間

三小時

難度

***

材料表

  1. 電腦
  2. Raspberry Pi  (2018 Pi3+測試中)
  3. 網路線
  4. USB轉RJ45接頭(如果電腦需要額外的網路孔的話))

[Raspberry Pi] 完全不接螢幕鍵盤滑鼠,電腦一開始就用網路線遠端連線Pi 中, 我們有介紹過如何指透過網路線就可以連進去Raspberry Pi中, 但是有時候我們還是需要一個圖形化的界面來操作, 或者是要顯示圖像或影片, 所以本篇文章要來介紹一下如何使用遠端桌面來解決類似的問題。

以下是兩種常用的方法,VNC以及Xrdp。

使用VNC遠端桌面

首先請先將電腦與Raspberry Pi做連線, 並用SSH登入到Raspberry Pi中, 關於這部份有問題的話, 可以直接參考這篇文章的教學 [Raspberry Pi] 完全不接螢幕鍵盤滑鼠,電腦一開始就用網路線遠端連線Pi

登入之後, 請打上以下的指令來安裝tight vnc server, 好用來在Raspberry Pi上跑一個VNC遠端桌面的服務。

sudo apt-get install tightvncserver -y

安裝完成後, 可以在終端機中輸入以下的指令來開啟這個server,

vncserver

第一次啟動的話, 程式會提示使用者設定一組密碼, 長度為八個英文字母或數字, 另外, 讀者也可以設定一組只能觀看螢幕畫面的密碼, 在本範例是略過這一步, 所以輸入n,跳過這個選項, 設定完成後, 就會在家目錄底下的.vnc資料夾生成一些設定檔,如下圖。

在Raspbian中, 管理圖形話界面的xserver會有一個DISPLAY的環境參數可以去設定, 也就是說可以透過這個參數, 來設定你要輸出的畫面到那一個顯示上, 好比說我們現在開啟的vnc server是開在:1號上,

你可以輸入以下的指令來確認現在的vnc server是開在那一個DISPLAY上。

ps a | grep vnc

所以說vnc server可能會有好幾個DISPLAY正在活動, 例如:1, :2, :3, …​好幾個桌面這樣, 每一個桌面都可以讓各別的使用者進行不同的操作, 但如果說我想要關掉特定的DISPLAY的話, 可以透過以下的指令來關掉特定的桌面, 如以下範例中的:1 號DISPLAY。

vncserver -kill :1

順帶一提, 如果我想要開一個Full HD的桌面, 而且指定為DISPLAY :2號的話, 可以透過下面的指令來完成。

vncserver -geometry 1920x1080 :2

到這邊我們已經把server端的部份搞定了, 接下來就剩下我們的電腦要安裝vnc viewer, 來遠端連線到Raspberry Pi上的桌面系統了。

讀者可以下載Chrome瀏覽器, 並安裝 VNC Viewer for Google Chrome 這個插件。

安裝完成後可以在網址列那邊輸入 chrome://apps 就可以切換到Google Chrome瀏覽器裡的App清單中, 請點擊清單中的VNC Viewer,如下圖中的左上角。

打開VNC Viewer後, 我們就可以透過連到<Raspberry Pi的ip>:<vncserver的port>, 來開啟指定port下的遠端桌面。

理論上我們要透過ssh連線到Raspberry Pi時, 就會需要用到Raspberry Pi的IP位址, 但是如果我們忘記了想要再重新查詢一遍的話, 可以在終端機中打上以下的指令查詢, 如下圖中的10.42.0.135

ip a

至於在連線時, 我們會有指定一個<vncserver的port>, 意思是5900加上DISPLAY的編號, 好比說我要連到DISPLAY :1這個桌面, 就打上5901, :2 就5902, 依此類推。

如以下的範例, 連到10.42.0.135下的:1號桌面。

連線時, 同意非加密的連線。

並打上前面設定過的vncserver的密碼。

成功登入後如下圖。

使用瀏覽器的插件來連到vnc viewer的好處是跨平台, 但是如果讀者想使用其他方法, 例如下載自己作業系統上的vnc viewer程式的話, 以下推薦一個比較常用的 RealVNC Viewer 請根據您電腦的作業系統來下載安裝。

指定SSH中的圖形畫面要在哪一個桌面上輸出

如果說讀者是從ssh登入之後, 直接在終端機上呼叫一個需要跑圖形界面的程式, 例如呼叫xterm

xterm

那麼讀者應該會看到系統回傳一個錯誤, 表示無法開啟顯示, 因為在SSH中, 預設是沒有DISPLAY的設定的。

但是如果我們把DISPLAY設定成:1, 也就是指定到我們vnc server上的:1號桌面, 並再重新跑一次xterm

export DISPLAY=:1
xterm

如此一來就可以在vnc viewer的port 5901上的這個桌面, 看到xterm成功被啟動了,如下圖。

另外, 如果說你想要查一下這個vnc viewer連到的桌面, 現在DISPLAY是設定多少的話, 可以點擊桌面上方的終端機圖示,

打開終端機後,

輸入以下的指令來顯示DISPLAY這個環境變數,

echo $DISPLAY

可以看到, 在這個桌面下,確實是DISPLAY :1呢!

 

設定新的密碼
vncpasswd
刪除舊的密碼
rm -rf passwd

使用Xrdp遠端桌面

另外一個常用的方法是使用Xrdp, 這是一套由windows發展出來的protocal, 因為它一套專門用來做遠端桌面溝通的協定, 所以在功能上會比vnc來的多,而且處理效能會較好一些。

在Raspberry Pi上要使用Xrdp的話, 只要輸入以下指令下載安裝, 系統就會自動執行了。

sudo apt-get install xrdp -y

至於連到Xrdp的工具可以從以下的網址來下載

安裝完成後, 基本上跟vnc viewer的操作上是很類似的, 不過在這邊是指定Raspberry Pi的IP後, 把使用者的帳密打上去, 如下圖所示。

成功登入後就會看到熟悉的桌面系統囉!

[Raspberry Pi] 不再備份整張SD卡,縮小RaspberryPi備份容量

作者

袁佑緣

時間

三小時

難度

***

材料表

  1. Raspberry Pi  (2018 Pi3+測試中)
  2. PC
  3. SD Card

在使用Raspberry Pi時, 我們常希望如果能夠將辛辛苦苦安裝完的系統備份起來, 以後只要將這個備份出來的映像檔燒錄到新的SD Card上, 就可以還原之前的系統了。

好比說在這篇文章中 [AI人工智慧應用] 在Raspberry Pi上安裝NCSDK , 光是安裝NCSDK以及編譯OpenCV函式庫就要花上快半天的的時間, 要是能夠直接備份系統的話, 以後就不用再花時間一直重新安裝了。

所以本篇將介紹如何備份Raspberry Pi的系統, 並把它做成映像檔存起來, 另外,一般來說備份出來的映像檔都會相當大, 好比說原本的記憶卡是16GB大小的, 備份出來的映像檔就會有16GB這麼大, 保存或傳輸檔案都非常不方便, 所以文章的後半段會探討怎麼縮減備份映像檔, 希望盡量壓縮到方便傳輸的大小, 例如本範中將原本16GB的映像檔縮減並壓縮到3.8GB大小的壓縮檔。

 

Windows系統下備份映像檔

在Windows作業系統下備份映像檔我們需要額外下載額外的工具, 請到以下的網址下載win32diskimager。

下載完成後, 請打開win32diskimager程式, 如下圖, 並點擊Device旁邊的資料夾圖示, 選擇映像檔要存檔的位置。

如下圖,選好存檔位置後,打上要存檔的檔名。

完成後,請將要備份的Raspberry Pi SD Card插到電腦上, 並在Device那邊選擇磁區, 如下圖的F槽, 選完按下下方的Read按鈕就會開始備份囉!

Linux系統下備份映像檔

在Linux系統下進行備份的話, 除了可以使用指令直接進行備份外, 還可以對備份出來的映像檔進行縮減大小的加工。

如果讀者的電腦不是Linux的作業系統的話, 建議可以參考此篇的教學[AI 人工智慧應用] MovidiusNCS在PC中設定Ubuntu虛擬機並執行NCSDK(上),使用虛擬機安裝一個Ubuntu linux的作業系統。

接下來我們進到正題, 首先請打開終端機, 輸入以下的指令

sudo dd bs=4M if=/dev/mmcblok0 | zip NCS-raspbian.zip -

讓我們一步步拆解這行指令的內容, /dev/mmcblok0是Raspberry Pi的SD Card插到電腦上後, 電腦辨識出的磁區位置(不同的電腦可能會辨識出不同的位置), 接著我們用dd指令將整個SD Card上的資料以4M的block size進行備份, 備份的過程中我們把這個備份出來的映像檔, 經過pipe(|)傳到zip指令中, 即時的使用zip指令將這個映像檔做壓縮, 最後存成一個壓縮檔叫做NCS-raspbian.zip, 至於前面加了sudo是因為要取用/dev/mmcblk0的話, 會需要用到超級使用者的權限。

順代一提, 使用dd這個備份工具的話, 預設是沒有明顯的備份過程顯示, 所以常常不知道現在的進度到那裡了, 所以筆者建議可以在dd指令中多加一個參數, 將dd的狀態(status)用progress這隻小程式顯示出來。

sudo dd bs=4M if=/dev/mmcblok0 status=progress | zip NCS-raspbian.zip -

備份過程如下圖。

另外如果說讀者的電腦上沒有progress這隻小程式的話, 可以透過系統的套件管理員來安裝, 如下圖(以Ubuntu系統為例)。

sudo apt-get install progress

縮減備份映像檔的大小

實際上, 備份出來的映像檔雖然經過zip壓縮後, 看起來會比較小, 但是在燒錄到新的SD Card時, 還是會解壓縮成原始的大小, 也就是原本的SD Card大小如果是16GB(即便是Raspberry Pi的系統實際上只用了6GB左右), 所以在這一小節, 我們要來探討一下怎麼縮減掉映像檔中不必要的部份。

首先我們把剛剛備份出來的壓縮映像檔解壓縮。 請輸入以下指令來解壓縮, 並存成映像檔NCS-raspbian.img。

unzip NCS-raspbian.zip NCS-raspbian.img

接著我們使用fdisk看一下這個映檔的內容以及大小, 如下圖, 應該會看到兩個部份, 一個其實就是Raspbian的boot的部份, 另外一個則是存放root系統的磁區。

我們記下第二個部份的Start位置, 如上圖的94208, 接下來將這個sector數值乘上512, 轉成標記第二個磁區的offset(單位是bytes) 並用losetup掛載到Linux系統上的loop device(/dev/loop0)

sudo losetup /dev/loop0 NCS-raspbian.img -o $((512*94208))

完成後, 先確認所使用的系統中有沒有gparted這隻程式, 如果沒有的話, 請使用套件管理員將它安裝完成, 以Ubuntu為例,

sudo apt-get install gparted

接著輸入以下的指令來對/dev/loop0這個裝置進行進一步的操作,

sudo gparted /dev/loop0

成功執行的話, 應該可以看到如下的視窗跳出。

請點選/dev/loop0這個裝置, 並按下右鍵選擇Resize, 最後拉動上方的磁區大小滑桿, 拉到想要縮減到的大小(建議在Minimum size外再留一些空間會比較好喔), 如下圖。

Resize設定完成後, 回到主畫面, 並按下上方的Apply按鈕, 開始進行重新劃分大小。

劃分過如下圖。

Resize完成後, 先別急著關掉, 請在Details那邊找到shrink file system底下的resize2fs -p ‘/dev/loop0’ 8388608K (詳細的數字可能有所不同), 這個數字是待會要進行縮減映像檔大小時會用到的數字。

 

怕忘記的話, 建議讀者可以按下Save Details把資料存起來。

最後我們不需要這個loop裝置了, 請輸入以下指令將它消掉。

sudo losetup --detach-all

最後我在重新使用losetup將整個映像檔掛到loop裝置上, 並使用fdisk工具來對它做重新切割磁區。

sudo losetup /dev/loop0 NCS-raspbian.img
sudo fdisk /dev/loop0

接下來, 在fdisk中輸入 d(刪除磁區), 2(指定刪除磁區2), n(新增一個磁區), p(選擇主要磁區), 2(選擇為磁區2), 94208(使用前面記下的起始sector), +8388608K(使用剛剛gpated中記下的縮減後的大小)

實際操作如下圖。

最後輸入w(寫入新的磁區分割), 過程中如果出現以下的提示, 請輸入N, 以保留ext4的檔案格式。

重新切割完磁區後可以輸入

sudo losetup --detach-all

來退出loop裝置。

改完磁區大小後, 我們要把映像檔中的多餘的部份去掉, 請先輸入

fdisk -l NCS-raspbian.img

並記下End Sector的位置, 如圖中的16871423。

最後使用truncate指令來去掉End Sector以後不要的部份。

truncate -s $((512*(16871423+1))) NCS-raspbian.img

讀者可以輸入以下的指令來查看裁剪過的映像檔明顯變小了(14.7GB → 8.1GB)

ls -lh NCS-raspbian.img

(補充) 使用pishrink來縮減映像檔大小

這邊補充網路上有人分享的專門用來縮減Raspberry Pi映像檔的工具, 叫做pishrink, 詳細的介紹可以去參考這個

請輸入以下的指令下載pishrink腳本。

wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh

將pishrink檔案屬性改為執行檔, 並用超級使用者的權限去執行縮減映像檔大小, 如以下的範例中, 用pishrink來縮減backup.img這份備份的映像檔。

chmod +x pishrink.sh
sudo ./pishrink.sh backup.img

燒錄映像檔到新的SD Card上

以上的映像檔縮減操作完成後, 建議可以重新做個壓縮檔, 讓檔案在更小一點方便傳輸。

zip NCS-raspbian.zip NCS-raspbian.img

現在如果說我們要將這個備份的映像檔壓縮檔燒錄到新的SD Card上時, 我們可以透過https://etcher.io/[Etcher]燒錄軟體,

指定映像檔的壓縮檔位置

插入SD Card後選擇裝置的位置,按下Flash燒錄即可。

 相關文章:

[Raspberry Pi] 完全不接螢幕鍵盤滑鼠,電腦一開始就用網路線遠端連線Pi

 

作者

袁佑緣

時間

三小時

難度

***

材料表

  1. 電腦
  2. Raspberry Pi  (2018 Pi3+測試中)
  3. 網路線
  4. USB轉RJ45接頭(如果電腦需要額外的網路孔的話))

我們在使用Raspberry Pi時,常會需要額外的設備例如準備螢幕、鍵盤、滑鼠才可以操作, 使用上非常的不方便,而本文就是我們將介紹如何只透過一條網路線就能操作Raspberry Pi, 並且還可以透過筆電或桌電分享網路給Raspberry Pi,不用再辛苦地去接無線網路。

在PC中設定網路分享

以下的內容將會以Windows的作業系統為主(本範例用的是Win10), 使用macOS的朋友請直接參考另外一篇教學文 Raspberry Pi 教學-使用網路線讓電腦與樹莓派進行連線(For Mac OS X)

首先請先打開控制台(control panel),並打開網路設定。

接下來進到網路共用中心(Network and Sharing Center)。

應該會看到電腦上可以用的網路裝置,以筆者的電腦為例, 筆者有兩個乙太網路裝置,一個是讓電腦可以連到外網的裝置(“乙太網路”), 另外一個則是USB轉乙太網路卡(“乙太網路 2”),我們希望可以將這個連到外網的網路, 透過這個USB轉乙太網路卡分享網路給Raspberry Pi。

如果讀者現在打開左邊的網路介面卡設定(Change adapter settings)的話, 應該可以看另外一個網路裝置是打叉的, 因為我們在這上面還沒有設定網路, 如果直接接到Raspberry Pi上是不會有任何反應的。

所以為了要讓這個要分享給Raspberry Pi能有網路, 我們必須要從另外一個有接到外網的裝置, 分享網路給另外一個裝置。

點選功能(properties), 接下來選擇分享(Sharing)的選項, 並將分享的功能勾選如下圖, 並指定裝置為欲分享網路的裝置, 例如本範例中的”乙太網路 2″。

完成後可以點選欲分享網路的裝置中的詳細資料(Details), 如下圖,讀者可以看到右邊的IPv4 Address是192.168.137.1, 這是所分享的網路中的電腦IP位址, 但實際上Raspberry Pi的IP位址還不知道。

掃描Raspberry Pi的IP

所以我們還需要額外的工具來掃描Raspberry Pi的IP位址, 例如本篇範例中用到的Advaned IP Scanner, 這是一款免費的IP掃描工具, 讀者可以從以下的網址來下載。

接下來請安裝IP Scaner。

安裝完成後,執行IP Scanner, 如下圖,按下Scan之後就可以掃描電腦網域附近的可能裝置, 另外為了要節省少描的時間, 建議讀者可以把欲掃描的IP範圍給定, 例如本範例中的192.168.137.1-254。

最後我們記下掃到的Raspberry Pi IP位址, 例如本範例的(192.168.137.173)。

接下來我們只剩下最後一步, 就是要如何透過網路連線到Raspberry Pi, 一般來說我們會用SSH來去連這個IP, 進而登入Raspberry Pi的系統當中。

SSH連線到Raspberry Pi

為此我們必須準備好SSH的工具, 筆者建議可以透過 Chrome瀏覽器的插件Secure Shell 來進行SSH連線,因為瀏覽器是跨平台的,所以就算在macOS的系統上也可以適用。

安裝完成後,讀者可以直接在瀏覽器的網址列直接打上”ssh”, 接下來再按下Tab鍵就會自動進入ssh插件模式, 然後就可以打上”Raspberry Pi使用者@Raspberry Pi IP位址”, 例如本範例的”pi@192.168.137.173″。

初次登入的話,一開始會先建立金鑰的認證, 請輸入”yes”來同意認證。

成功登入後就會如下圖, 會進到一個Raspberry Pi中的shell中。

補充

如果讀者是在Raspberry Pi上安裝官方推薦的Raspbian系統的話, 一般來說,為了安全考量,預設都是會關閉SSH的功能, 所以說如果Raspberry Pi可以拿到電腦分享網路的IP, 但是卻SSH卻登不進去的話,可以按照下面的步驟來強制開啟SSH的功能,

首先請先將Raspberry Pi的燒錄過系統的SD卡插到電腦上面, 並打開裡面的”boot”磁區,如本範例中的F槽。

接著再右鍵新增一個空白文件,命名為ssh。

 

當Raspbian開機時,如果說boot磁區中有一個檔案檔名叫做ssh的話, 就會強制開啟ssh的功能,如下圖。

相關文章:

 

[Raspberry Pi 3+] 為您介紹新版樹莓派七大特點:Raspberry Pi 3 Model B Plus

 

作者/攝影宗諭 / 英國樹莓派基金會

Raspberry Pi 3 Mode B +購買傳送門

只有信用卡一般大小的Linux系統單板電腦Raspberry Pi(樹莓派),可說是英國電腦工業史上最偉大的成功之一!因為,自從2012年Raspberry Pi開始進行商業生產後,它已經銷售超過1900萬片,並且這個數字仍在快速攀升中。

從Raspberry Pi zero、Raspberry Pi 1、Raspberry Pi 2至Raspberry Pi 3,這塊單板電腦仍在持續進化,其應用也非常廣泛,比方說,試算表、文字編輯、遊戲⋯⋯等等,還能播放高畫質視訊影片,以及控制其他硬體,例如感測器和馬達,甚至可搭配Arduino與樂高機器人進行整合式應用。可以說,只要接上鍵盤、螢幕及滑鼠,Raspberry Pi就是一台小型個人電腦。而就在今天下午(2018年3月14日),其開發者英國樹莓派基金會透過官網對外宣佈,Raspberry Pi 3 Plus正式發行囉!相信大家對此一定非常好奇,現在,就讓小編帶大家一起來看看,究竟Raspberry Pi 3 Model B Plus(以下簡稱Raspberry Pi 3 B+)與Raspberry Pi 3 Model B相較,有何更新:

圖1 最新一代的樹莓派機身

1.CPU 從BC2837升級為 BC2837B0,1.2GHz四核心升級為1.4GHz四核心

 BC2837B0Raspberry Pi 3 Broadcom應用處理器的升級版本,優化了供電迴路,並且加裝了一個金屬蓋,這使Raspberry Pi 3 B+可以降低電壓運作以減少耗電量,同時可更加準確監控晶片的溫度。

Hint:CPU的位置和原本的不一樣,如果有機構/電路和CPU位置有關的話需要做修改

 

2.Wi-Fi升級為雙頻網路 2.4Ghz + 5Ghz

 與Raspberry Pi 3相較,Raspberry Pi 3 B+的Wi-Fi功能在2.4GHz頻寬下,有較佳表現。然而,在5GHz頻寬下,表現更是沒有話說,請參考以下表格:

Tx bandwidth (Mb/s)Rx bandwidth (Mb/s)
Raspberry Pi 3B35.735.6
Raspberry Pi 3B+ (2.4GHz)46.746.3
Raspberry Pi 3B+ (5GHz)102102

(表格資料由LibreELEC developer Milhouse提供)

值得一提的是,Wi-Fi的電路封裝在一片金屬片的屏蔽之下,上面還雕有小小的英國樹莓派基金會的Logo喔!

圖2樹莓派3 B+的CPU(中)與Wi-Fi裝置(左上)

 

3.藍芽升級為4.2版本有線網路升級

Raspberry Pi 3B+的有線網路連線速率,約略是Raspberry Pi 3B的三倍,請參考以下表格:

Tx bandwidth (Mb/s)Rx bandwidth (Mb/s)
Raspberry Pi 3B94.195.5
Raspberry Pi 3B+315315

(表格資料由LibreELEC developer Milhouse提供)

4.增添PoE功能(Power over Ethernet,網路線供電)

使用了有PoE支援的magjack,把PoE所需要的電源/訊號接到4pin header方便PoE Hat使用。

Hint:4pin header在原本的reset pin位置,如果有機構/電路和reset pin位置有關的話
需要做修改

圖3樹莓派3B+新增了PoE的功能,圖中也看見4 pin接頭。

 

5.CPU效能更加優化

這次Raspberry Pi 3 B+ 改善了 BCM2837B0 的供電封裝,而且新的MaxLinear MxL7704 電源管理 IC能夠調整電壓,過去不能調整電壓,只能透過降頻的方式降低電流,現在電壓也可以調整了。

而因為比較不會碰到過熱降頻,在較長時間下的性能也能提升。CPU頻率原本是1.4GHz,在高於70度為降低發熱量以避免過熱觸發降頻保護頻率會降低至1.2GHz。請參考以下這張圖表:

圖4(以上圖表由Gareth Halfacree提供)

6.GPU沒有變化,基於原本VideoCore的東西都不用改

 根據樹莓派基金會於官網上的說明,3D繪圖在Raspberry Pi 3 B+上依舊是可行的,這一點請大家放心。

 

7.價格

 最後一個點,當然就是大家相當關心的價格問題。在這點上,這款新的樹莓派可以說是沒有任何進展,仍然跟Raspberry 3 Model B一樣,維持在35英鎊,相信大家會樂於掏出口袋中的摳摳的。

 

結語

 一直以來,CAVEDU教育團隊製作了非常多運用樹莓派的專題與專案,也開設了許多關於樹莓派的課程及工作坊,可以說,CAVEDU是樹莓派的愛用者也是積極推廣者。透過這篇文章,盼望大家對於新版樹莓派有一個初步的了解,也請大家期待即將推出的Raspberry Pi 3 Model B+開箱文喔!

(本文多數資料與圖片引用自英國樹莓派基金會官網https://www.raspberrypi.org/

Raspberry Pi 3 Mode B +購買傳送門

相關文章:

[ App Inventor + Microbit ] RGB LED控制

本文要介紹如何使用App Inventor來控制 micro:bit的 I/O腳位,以 RGB LED作為輸出應用。(原始碼下載請按我)

請務必先讓您的手機與Micro:bit進行藍牙配對,否則無法正確執行本範例。

作者/攝影  曾吉弘
時間  2小時
成本
難度 * * *
材料表
  • 個人電腦
  • App Inventor開發環境
  • 支援BLE的Android手機
  • BBC Micro:bit開發板
  • RGB LED燈

 

 

硬體清單

本範例所使用的RGB LED實際上是把紅綠藍三色的LED整合到同一個元件中,並且有陰極共用與陽極共用兩種規格。本範例使用的是共陰 RGB LED。以下是本專題的硬體清單:

  • BBC micro:bit 微控制板, 1
  • 麵包板, 1
  • 跳線, 4
  • RGB LED (共陰), 1

 

注意:如果您使用共陽RGB LED的話,最長腳要接到 micro:bit 的 3.3V腳位,並且 App Inventor 端給 1 會讓腳位變成低電位,這與共陰的行為剛好相反

 

 

範例影片

 

請根據以下資訊來連接Micro:bit RGB LED:

Micro:bitRGB LED (共陰)
GNDGND (最長腳、灰線)
P0R (紅線)
P1G (綠線)
P2B (藍線)

完成如下圖。

您可使用鱷魚夾或把線彎成U形來勾住Micro:bit腳位上的圓孔,當然後者比較容易鬆脫囉。

App Inventor

本範例要示範使用 app 來控制接在 micro:bit 腳位上的 RGB LED 發出四種不同的顏色。首先請登入 MIT App Inventor 並建立一個空白專案。.

 

以下步驟是根據App Inventor IoT分站上的基本範例開始一步步加入本專題所需的元件,當然也可以直接下載完整的 .aia。

 

首先要加入本專案所需的擴充檔。

  • 左側Palette區中,找到最下方的Extension,點選”Import extension” → “URL
    • 貼上micro:bit extension的網址: http://iot.appinventor.mit.edu/assets/com.bbc.micro:bit.profile.aix
  • 新增一個Microbit_IOpin元件,設定其BluetoothDevice屬性為”BluetoothLE1” (別忘啦!)

接著加入本範例所需的元件:

  • 新增一個TableArrangement元件
    • 設定寬度為”Fill parent“、高度為”200 pixels“,row(列數)為2,最後設定column(行數)為3
    • 設定其Visible屬性為false,我們會在與micro:bit建立連線之後讓它顯示出來,才能點選按鈕來發送藍牙指令。
  • 新增五個按鈕到tablearrangement元件,將其文字分別改為”Red“, “Green“, “Blue“, “White“與”Off“對應不同的LED動作。

調整之後,您的畫面應該會類似下圖。有一點點不同沒關係,背景顏色、位置與顏色都可以修改,喜歡就好!

 

Blocks

 

STEP 1:連線後要求更新腳位狀態

BluetoothLE1.Connected事件中,我們顯示連線確認訊息,並設定micro:bit腳位為”digital output“,這是因為我們要控制RGB LED所以得這麼作。在此會用到三個Microbit_Io_Pin.ConfigurePin指令,分別設定pinNumber為0, 1, 2 (代表micro:bit的P0, P1與P2腳位),analog欄位設為false,input欄位設為false

仔細來看看Microbit_Io_Pin.ConfigurePin指令,它有三個參數:pinNumber (腳位編號), analog (true代表類比模式,false代表數位模式),input (true代表輸入,false為輸出)。

所以下圖是把micro:bit P0腳位設定為”數位輸出(digital output)“,可連接像是LED、繼電器這種數位輸出元件。更多micro:bit I/O腳位的詳細設定請參考:http://microbit.org/guide/hardware/pins/

下圖則是設定micro:bit P2腳位為”類比輸入(analog input)“。可連接旋鈕電位計、光敏電阻等元件。o this pin.

STEP2: 更新LED狀態的副程式

為了讓程式意讀易懂,我們使用副程式來管理控制micro:bit腳位狀態的多個指令。新增一個副程式(procedure),改名為”ledControl”。

 

接著點選藍色小齒輪來新增三個參數,分別改名為”r”, “g”, “b”。顯然這三個參數是用來代表micro:bit用來控制RGB LED的腳位狀態。

在副程式中加入三個Microbit_Io_Pin.WriteOutputPinData指令,每一個分別控制micro:bit一隻腳位的狀態。因此第一個指令請設定pinNumber為0,pinValue為 r 參數值。後兩者以此類推,完成如下圖:

STEP2: Button to light up red

按下Button_R按鈕會讓RGB LED亮起紅燈,作法是呼叫ledControl副程式並設定參數為(1, 0, 0),代表P0為高電位(1),P1 / P2 為低電位(0)。

STEP3: other buttons for different colors

另外四個按鈕的差別只在於參數差異,這樣您應該可以感受到使用副程式的號處了吧:

  • Button_G: (0, 1, 0) 亮起綠色
  • Button_B: (0, 0, 1) 亮起藍色
  • Button_W: (1, 1, 1) 亮起白色
  • Button_Off: (0, 0, 0) 熄滅.

STEP4: 中斷藍牙連線

點選ButtonDisconnect按鈕會中斷藍牙連線,會讓app回到初始狀態並等候下次連線。

操作

完成啦!請確認您的Android裝置與 micro:bit 已經藍牙配對好了。接著從App端去連線到 micro:bit,連線成功後會出現五個按鈕,點選不同按鈕就可以看到RGB LED亮起紅綠藍白四種顏色與熄滅,如果亮起的顏色不對或是無法亮起請再次檢查接線是否鬆脫與腳位順序是否正確。

 

小挑戰

  1. 試著讓RGB LED更繽紛,例如紅色與藍色腳位同時點亮,就是紫色的光芒喔。
  2. 加入SpeechRecognizer元件,用語音來控制RGB LED。

 

 

相關文章:

[私下問公開答]如何提升LattePanda拿鐵熊貓的能力,從更新BIOS下手

感謝汐止的陳先生,他在使用LattePanda時,覺得裝置跑不出USB3.0應該有的速度,問我們有沒有解,這次解法我們從更新BIOS方面解決問題。

感謝鄭鴻旗先生的[私下問公開答]的梗,鄭老師表示不會付版稅給你XD

作者/攝影  豐智
時間  30分鐘
成本需要上網下載的費用
難度  * *
材料表

LattePanda是一個信用卡大小的Win10小電腦,內建一個Arduino晶片,各位可以看到LattePanda左邊偏中間的地方有一個USB3.0的接頭,如何提升它的速度呢?

LattePanda相關的Arduino、驅動程式、BIOS更新都在GitHub上-連結

這次實驗成果,是透過更新BIOS,提升USB3.0的功能。

首先點選[Star]→[ LattePandaTeam / LattePanda-Win10-Software]-連結

點選進[Bios]的資料夾之後有好幾個版本的Bios:

  • [LattePanda V1.2 for CR200 Z8350 only]
  • [LattePanda v1.0 for Z8300 only]
  • [LattePanda v1.1 for CR110 Z8350 only]

 

應該要裝哪一個呢?初學者會有一個迷思,裝越高版本的越好,首先請各位確認手上的LattePanda的出廠型號,型號裡有幾個關鍵字可供參考。

  • 首先是型號的最後方有Z8300、Z8350、兩個版本。
  • Z8350在型號的前面有R100、R110兩種不同型號。
  • Z8350在型號的前面有R110、R200兩種不同型號。

 

型號對應的Bios版本如下:

S70CR110/S70CR100 Z8300 -> V1.0

S70CR110 Z8350 -> V1.1

S70CR200 Z8350 -> V1.2

 

我使用的LattePanda是R110xxxxxx/Z8350的型號,直接對應資料夾[LattePanda v1.1 for CR110 Z8350 only]

 

接著請各位確認手上LattePanda的硬體/記憶體的規格是哪一個版本?目前有32GB/2GB、64GB/4GB兩個版本。

我使用的是64GB/4GB的版本,將/default BIOS/4G version/路徑下的資料夾內容下載下來。

 

請各位準備一個FAT32格式的隨身碟,將剛剛下載的資料複製到隨身碟的跟目錄並解壓縮LattePanda v1.1 4G default bios-J.zip

 

LattePanda更新Bios的的方法,是趁LattePanda重開機時,優先讀取隨身碟的資料,更新Bios,請把隨身碟接至LattePanda的USB接頭。

  • LattePanda剛開機時尚未開始讀取Win10系統之前,按著鍵盤上的[Esc]或[Del]即可進入
  • 還沒更新Bios之前螢幕上方的版本應該是2016年的版本[Aptio Setup Utility – copyright (c) 2016 American Megatrend, Inc]
  • 更新之後是2017年[Aptio Setup Utility – copyright (c) 2017 American Megatrend, Inc]

 

更新Bios之前需要調整兩個選項,以R110xxxxxx/Z8350的型號為例:

  • 首先到Boot選項,將Machine Status AC/Battery In從[Power off]-→[Power on]
  • 接著將Boot Option #1的選項[Windows Boot Manager]→[你的隨身碟]

 

 

最後儲存設定並重開機即可。到Save & Exit選擇[Save changes and Reset]

 

重新開機後,LattePanda首先讀取隨身碟資料,出現下圖的畫面就成功了,成功之後在鍵盤按下Ctrl+Alt+Del進行重開機,並且把隨身碟拔出來,進入到Bios看到更新年限為2017年即為成功。

 

感謝Scanace的工程師提供建議的USB測試軟體[USB Device Tree Viewer],大家可以下載來試試看,你的隨身碟是否在電腦上被認知為真的USB3.0的傳輸介面。

 

將LattePanda的USB3.0接頭,接上USB3.0的隨身碟

 

將LattePanda的USB3.0接頭,接上USB2.0的隨身碟

 

希望能帶給大家幫助,小智到此一遊。

 

相關文章:

[Micro:bit] 使用DFROBOT BOSON套件設計智慧小屋

在本篇文章中,我們將介紹如何用micro:bit和DFROBOT BOSON套件打造智慧小屋,套件上安裝孔位與樂高相容,組裝上更方便了。

我們將實做三個特別的功能,第一個是能夠根據環境光源自動調整亮度的LED燈,第二是設計一個可以按鈕控制吊扇,第三則是做出一個地震警報器。

作者/攝影  袁佑緣
時間  3小時
成本 放課後的製作時間便是我的成本
難度  * * *
材料表
  • Micro:bit
  • 樂高積木
  • Micro:bit Boson 擴充板

準備工作

Microbit and Boson Kit

 

在這篇文章中,我們將使用BBC推出的Micro:bit開發板來當作是我們智慧屋的控制器。

為了要能夠控制智慧屋中的電子元件,也就是上面的感測器與制動器,除了原本的Micro:bit之外,我們還要額外裝上一塊DFRobot推出的Boson擴充板來控制Boson Kit中的電子模組。

如果讀者想獲得關於 Boson Kit更進一步的資訊的話,不妨去以下的網站觀看詳細的介紹喔。 (https://www.dfrobot.com/boson).

以下是我們在本篇文章中,我們將會用到的Boson電子積木有LED、按鈕、傾斜、風扇、聲音、光感應。

1.Light Sensor Module
2.LED Module
3.Button Module
4.Fan Module
5.Tilt Sensor Module
6.Buzzer Module

Mu editor

接下來,為了要撰寫micro:bit的micro python 程式碼,我們需要去下載以下的編輯器:Mu Editor(https://github.com/mu-editor/mu/releases).

此外,我們也建議讀者可以去官方的文件查看Micro Python API for Micro:bit (https://microbit-micropython.readthedocs.io/en/0.9/)的詳細使用說明,裡面還有許多的範例教學可以參考喔!

硬體

以下的圖片是本文所使用的雙層樂高屋以及樂高屋內部的構造。

注意到除了一般水平放置的Boson元件可以接在樂高的平板上,一些懸掛的Boson元件可以用其他的方式固定在樂高小屋上面,例如下圖中使用BOSON的中間積木,我們使用金屬螺絲與螺絲帽固定,底座固定之後,Boson電子元件就可以用磁力吸附在上面。

範例教學

 

接下來我們就來在 Mu Editor中撰寫 Micro Python吧!

 

1. 小夜燈

在第一個範例中,我們將原本的LED燈擴充成可以自動調整亮度的LED燈,更進一步它能根據環境光的亮度適當地調整LED燈亮度。

於是我們要在LED燈上再加上一個光源感測器,如下圖。

首先,我們必須先用以下的程式碼來去偵測光源感測器的最大最小值,而為了要讓數值更精確一點,我們讓程式在一段時間內的對光感值進行取樣,將光感值加總後再依取樣的次數做平均,經過計算就能得我們想要的平均值。

 

night-light-measure.py

from microbit import *

light_sensor = pin1.read_analog()
counter = 0
timer = running_time()

while (running_time() - timer) <= 3 * 1000:
    light_sensor += pin1.read_analog()
    counter += 1

light_sensor /= counter
print("mean light sensor value: ", light_sensor)

打開Mu Editor的REPL視窗,並在有環境光跟沒有環境光的情況下執行程式,你將會得到如下圖的光源平均值,當環境光很亮時的平均亮值是900多,環境光很暗時的平均暗值10多。

接下來,我們將前面求出的平均亮值跟平均暗值,帶入到變數ligjt跟dark中,將這兩個數值作為最大值與最小值,是按照比例換算成Micro:bit的類比角為數值,控制LED燈的亮度。

 

算式:

((light – light_sensor)/(light – dark)*1023)

比如:light=966、dark=14,數值範圍為952。現在讀到一個光感數值為500,帶入算式((966-500)/(952))*1023 = 500,最後micro:bit的類比輸出值為500。

 

night-light.py

from microbit import *

light_sensor = pin1.read_analog()
counter = 0
timer = running_time()

light = 966.4033
dark = 14.81614

while True:
    light_sensor = pin1.read_analog()
    LED = int((light - light_sensor)/(light - dark)*1023)

    if LED > 1023:
        LED = 1023
    elif LED < 0:
        LED = 0

    print("LED lightness: ", LED)

    pin2.set_analog_period(1)
    pin2.write_analog(LED)
    sleep(0.5)

 

範例影片:

 

2. 吊扇設計

在第二個範例中,我們用以下簡單的程式碼來打造一個可以用按鈕控制的電風扇。

在程式中,我們用一個switch的布林變數紀錄開關的狀態,我們希望使用開關時,每次按下開關再放開,switch的狀態就會切換成相反的狀態。

注意到我們在以下的程式碼中會多加一些延遲,例如sleep(0.5),這是為了要確保可以正確的判斷到一次的開關按壓。

ceiling-fan.py

 

from microbit import *

switch = False

while True:
    if pin12.read_digital() is 1:
        while pin12.read_digital() is 1:
            sleep(0.5)
        switch = not switch
        if switch:
            pin16.write_digital(1)
            print("Turn ON")
        else:
            pin16.write_digital(0)
            print("Turn OFF")

 

3.地震警報器

 

在第三個範例中我們將實做一個安裝在小屋的地震警報器。

為了要偵測到小屋的晃動,我們使用一個傾斜感測器,並在每一次的迴圈中,觀察一小斷時間中的傾斜變化。

如果說屋子靜止不動的話,隨著時間的傾斜變化量應該是完全是零,所以我們只要去計算一段時間的變化是否為零的話,就能推出此時是否有地震的發生。

 

而如果偵測到有地震發生的話,程式會播放一段音樂作為地震的警報,播放音樂的方式直接使用Micro Python內建的music函式庫,music函式庫預設輸出聲音為0號腳位,驅動蜂鳴器發出聲音。

 

如果想自己設計音樂的話,不妨去以下網址查看micro python的範例(https://microbit-micropython.readthedocs.io/en/0.9/music.html),裡面有介紹如何用指定的音符做特定的旋律。

alarm.py

from microbit import *
import music

status = pin8.read_digital()

def detect_shake():
    old_tilt_status = pin8.read_digital()
    sleep(0.1)
    new_tilt_status = pin8.read_digital()
    return abs(new_tilt_status - old_tilt_status)

while True:
    counter = 0
    timer = running_time()
    shake = detect_shake()
    while (running_time() - timer) <= 500:
        shake += detect_shake()
        counter += 1

    status = shake/counter
    print(status)

    if status is not 0.0:
        print("Alarm!!!")
        music.play(music.DADADADUM)

 

範例影片:

 

相關文章:

 

 

[LattePanda] 使用LattePanda打造Line機器人

本文章將來介紹一下如何在LattePanda上面部署一個LINE智慧對話機器人,並拿它來控制LattePanda上的Arduino IO。

作者/攝影  袁佑緣
時間  3小時
成本 時間就是成本
難度  * * *
材料表
  • LattePanda
  • 手機

STEP1. LINE開發者帳號與取用LINE Message API

首先, 我們需要先在 LINE 的開發者官方網站 (https://developers.line.me/en/) 註冊一個LINE開發者帳號。

請點選右邊的 Start using Message API, 接下來系統將會提示使用者完成三個設定步驟以完成新增一個通道。

首先,你必須先選取一個提供者,也就是告訴系統是誰提供這個APP的服務。

接下來,請填上關於取用Messaging API 的必要資訊。

最後一步,確認玩設定都沒錯後,按下confirm,你將會看到一個新增的通道出現在一開始的console頁面。

STEP2. 安裝Node.js與下載 line-bot-sdk-nodejs library

在我們繼續完成 LINE Bot細部設定之前,我們必須先安裝一下LINE Bot的軟體開發環境。 我們開發LINE Bot所使用的程式語言是 node.js,所以請點選以下網址(https://nodejs.org/en/download/) 將Windows版本的node.js下載下來並安裝在LattePanda上面。

安裝完後,我們還需要用到LINE Bot SDK ,請到以下的github 網址(https://github.com/line/line-bot-sdk-nodejs) 下載並解壓縮官方的node.js 版 LINE Bot SDK。

如果有讀者想要查這個LINE Bot SDK的詳細使用資訊的話,可以點選此網址 (https://line.github.io/line-bot-sdk-nodejs/) 到官方的gitbook上看進一步的API使用說明,以及如何去用javascript來撰寫機器人的對話功能。

最後請打開命令提示字元(按下快捷鍵 <Win+R> 並輸入”cmd”叫出command prompt), 並輸入以下的命令將工作目錄移動到方才解壓縮的LINE Bot SDK資料夾下的echo-bot範例(line-bot-sdk-nodejs/examples/echo-bot)。

cd THE_ECHO-BOT_EXAPMLE_FOLDER(ex: C:\Users\lattepanda\line-bot-sdk-nodejs\examples\echo-bot)

接下來請輸入以下的指令來安裝需要用到的node.js套件,在這個範例中,我們會需要安裝兩個額外的套件,一個是用來開啟伺服器的express套件,另外一個則是LINE Bot的SDK函式庫。

npm install

 

STEP3. 用ngrok來將本地伺服器開放到網路上

在前面的步驟中,我們雖然可以開啟一個本地的伺服器,但是為了要能夠取用網路上的 LINE Messaging API,我們必須使用一些工具來將LattePanda上的服務開放到雲端上。

 

請點選此網址(https://ngrok.com/download)來下載ngrok,這套軟體可以讓使用者在本地伺服器與網際網路建立一個加密的網路通道。

下載完成後,請將壓縮檔解壓縮,並點選ngrok.exe,呼叫出一個命令提示字元。

請在上面輸入以下的指令在localhostport 3000開啟一個http的通道。

ngrok http 3000

成功開啟後,將會看到如以下的畫面。你將會得到兩個開放的網址,一個是走HTTP,另外一個則是走有加密的HTTPS,請記住這個連結,待會我們將要把這個連接填到LINE Bot上的回呼位址上。

STEP4. 設定Channel Secret/Webhook/Token

請點選剛剛在 STEP2 新增的APP,我們將要完成LINE Bot上最後三個主要的溝通憑證。

第一個是設定頻道的金鑰,請按下issue並複製這段的金鑰到echo-bot的範例資料夾中的index.js檔中。

接下來,同樣地也請點選issue並把channelaccess token貼到index.jsconfig中。

// create LINE SDK config from env variables
const config = {
  channelSecret: 'PASTE_YOUR_CHANNEL_SECRET',
  channelAccessToken: 'PASTE_YOUR_ACCESS_TOKEN',
};
index.js

最後,我們的APP需要設定一個webhook網址,請填上你在STEP3 中開啟的ngrok所得到的網址,並在最後面加上 “/callback” 。例如: “20c21167.ngrok.io/callback”.

STEP5. LineBot 測試

請用智慧型手機打開LINE APP並掃描這個機器人的QR code來加好友。

接下來回到LattePanda上輸入以下的指令執行echo-bot程式並確認ngrok通道已經正確開啟了且webhook的網址也有設定在LINE Bot console 頁面了。

node .

請在上面手機上用LINE打上一些文字看看LINE Bot會有什麼反應吧!

 

STEP6. 使用 serial來與Arduino做溝通

請下載以下的Arduino程式碼到 LattePanda上的 Arduino Leonardo核心。

這個程式中,我們時做了一個簡單的serial控制的LED開關,如果使用者在序列埠監控視窗中輸入一個大寫的T,LED燈就會被打開,如果輸入大寫的F,LED燈則會被關閉。

void setup()
{
    Serial.begin(9600);
    pinMode(LED_BUILTIN, OUTPUT);
    
}

void loop()
{
    if(Serial.available())
    {
        char cmd = Serial.read();
        if(cmd == 'T')
            digitalWrite(LED_BUILTIN, HIGH);
        else if(cmd == 'F')
            digitalWrite(LED_BUILTIN, LOW);
        else
            Serial.println("Enter T/F to turn ON/OFF LED");
    }
}

STEP7. 在LattePanda上使用LineBot 來控制LED

我們想在LattePanda上使用node.js取用serial來控制LED燈,所以我們必須再新增一個新的node.js函式庫。請在範例echo-bot中的資料夾中打開 package.json ,並如以下的範例加上 serialport 這個套件來讓node.js可以使用Serial來與Arduino做溝通。

package.json

{
  "name": "echo-bot",
  "version": "0.0.0",
  "description": "An example LINE bot just to echo messages",
  "main": "index.js",
  "scripts": {
    "start": "node ."
  },
  "dependencies": {
    "@line/bot-sdk": "^5.0.0",
    "express": "^4.15.2",
    "serialport": "^6.0.4"
  }
}

改完之後別忘了輸入以下的指令來更新node.js的套件。

npm install

現在我們要在原本的 echo-bot 中的index.js 程式中加入Serial的溝通功能。

首先,請如以下的範例加入serialport的設定,並注意設定好指定的COM Port,也就是在LattePanda上的Arduino Leonardo連接到的COM Port,例如:COM2。

 

index.js

'use strict';

const line = require('@line/bot-sdk');
const express = require('express');
const SerialPort = require('serialport');
const serialPort = new SerialPort('COM2', {
    baudRate: 9600
});

最後請修改echo-bot預設的handler函式中的功能,加入以下的程式碼好讓node.js根據不同的情形透過Serial送出大寫的T跟F到Arduino 。

 

 

index.js

// event handler
function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    // ignore non-text-message event
    return Promise.resolve(null);
  }

  if(event.message.text == 'ON') {
      serialPort.write('T');
      const echo = {type: 'text', text: 'Turn ON LED'};
      return client.replyMessage(event.replyToken, echo);
  } else if(event.message.text == 'OFF'){
      serialPort.write('F');
      const echo = {type: 'text', text: 'Turn OFF LED'};
      return client.replyMessage(event.replyToken, echo);
  } else {
      // create a echoing text message
      const echo = {type: 'text', text: event.message.text};
      return client.replyMessage(event.replyToken, echo);
  }
}

現在請重新執行index.js並確認ngrok有正確打開(STEP3),接下來就可以在手機上測試看看是否在LINE上輸入ON/OFF,LINE Bot就會去自動開關LattePanda上的LED燈囉!

以下是本文章的範例LINE Bot範例影片。

 

相關文章:

[ LattePanda] 結合雲端服務-MCS與ThingSpeak

這次向各位介紹常用的雲端服務,分別是台灣聯發科技公司搭配旗下LinkIt系列開發板之MCS與ThingSpeak,我們透過LattePanda實作。你可以從遠端來控制板子的腳位狀態或是檢視板子狀態與感測器的數值變化。類似的雲服務近年來如雨後春筍般冒出來,對於想找尋免費方案的使用者或教學單位來說是相當好的事呢。

作者/攝影  阿吉/豐智
時間  1小時
成本
  • 光感測器約NT200
  • 溫溼度感測器約NT160
難度  * * *
材料表

第一個範例是上傳LattePanda之Arduino的A0類比輸入腳位狀態到MCS雲服務,可以根據我們所設定的條件來觸發手機推播訊息。這裡使用DFRobot套件包中的環境光感測器(或可以改用一般常見的光敏電阻)。

 

一、認識MCS雲服務

MediaTek Cloud SandBox(MCS)是聯發科技創意實驗室為旗下LinkIt系列開發板所提供的專屬網頁介面雲端平台,具有物聯網裝置最需要的資料儲存及裝置管理服務。MCS可以很快速地建立雲端應用程式,對於有意將裝置原型快速商品化的人來說,是一套相當便利的系統。它可以讓使用者專注在取得最重要的實體運算資料,不需要處理網路協定。而在MCS所提供的各種資料通道(Data channel)中,你可以輕易的為物聯網裝置建立一個控制面板,還能夠使用專屬的Android手機應用程式來檢視喔!

 

二、MCS操作說明

接下來會依序介紹如何在MCS上建立原型(prototype)建立資料通道(Data channel),以及透過REST API進行溝通。完成後就可以從網頁或手機應用程式來觀看我們所上傳到MCS的資料啦!

請先到MCS網站(https://mcs.mediatek.com)註冊一個帳號,登入後的首頁如圖10-1。

01-MCS主畫面

 

MCS專有名詞介紹

在開始進入專案之前,介紹一下常見的MCS的專有名詞:

  • 原型(Prototype):裝置原型,具備各種資料通道。
  • 資料通道(Data channel):帶有時間資訊的資料串,分為控制器與顯示器,並根據不同的資料型態有不同的外觀。
  • 資料點(Datapoint):每筆上傳的資料。
  • 測試裝置(Test Device):某一時間點的原型,具備自動產生的DeviceId與DeivceKey。
  • DeviceId、DeviceKey:這組資訊無法修改,用於鎖定測試裝置,需要寫在程式碼中。

圖10-2 MCS雲服務架構(圖片來源:https://github.com/Mediatek-Cloud/MCS)

 

MCS選單功能介紹

  • 開發(Development):
    • 原型(Prototype):新增修改原型、資料通道與測試裝置
    • 測試裝置(Test Devices):已建立之測試裝置清單,可以與開發板互動
  • 管理(Management)
  • 資源(Resources):教學文件、API參考資料、手機端程式下載與更新日誌等。
  • 幫助(Help):常見問題、論壇、回饋
  • 個人檔案:設定使用者大頭照、系統語系以及開啟用於接收App推播訊息的手機(須先安裝MCS Android程式)。

資料通道(Data channel)

資料通道根據其動作分成兩種:用來發送訊息給開發板的控制器(Controller)跟接收開發板回傳的資料的顯示器(Display)。本範例將使用一個整數資料型態的顯示介面來接收來自LattePanda的資料。

表說:資料通道內容比較

三、MCS設定

接下來要帶各位在MCS上建立一個整數資料型態的顯示介面來接收來自LattePanda的資料。

  1. 登入MCS之後,請點選畫面左上角的「開發」,選擇「原型」
  2. 在畫面中點選「Create prototype」來建立新的原型。請按照以下設定完成原型設定:
    • 產品原型名稱:LattePanda
    • 產品原型版本:0
    • 硬體平台:Others
    • 產業:其他
    • 應用程式:其他

View post on imgur.com

創建原型

 

3.進入這個原型之後,請點選建立資料頻道,先選擇顯示器。並按照以下設定完成原型設定:

請注意實際上要填入程式的是資料通道Id,但由於實際上課時多數學員容易搞混,為求簡潔,建議資料通道名稱與Id可以使用相同名稱。

  • 資料通道名稱:sensor
  • 資料通道Id:sensor
  • 描述:隨意填入
  • 資料型態:在此請選整數

單位:在此請選「其他」,後續您可根據所使用的感測器來選擇正確的單位

View post on imgur.com

新增整數型顯示器資料通道

 

4.這樣具有一個顯示器資料通道的原型就建立完成了,請回到原型頁面可以看到方才所建立的原型,由於在此尚未建立測試裝置與裝置,因此兩個數字都是0。請點選其右上角的「…」,可以編輯、複製、匯出以及刪除。其中匯出之後的JSON檔可以讓別人直接匯入來建立原型,這個做法在原型已經很複雜時非常好用。

編輯原型

5.接著是要建立測試裝置(test device)。請點選畫面右上角「創建測試裝置」,在此請輸入裝置名稱即可。

建立測試裝置

 

6.建立測試裝置之後,請進入測試裝置頁面。與原型頁面有點像,但是您可以在頁面右上方看到DeviceId與DeviceKey兩筆參數。這兩筆資料也要填入程式中。

建立測試裝置完成

7.測試裝置設定完成後,就能將建好的測試裝置透過DeviceIdDeviceKey與別人分享,也可以自行設定觸發條件,讓MCS寄信給你。接著在原型頁面下點選「Trigger&Action」標籤,再點選「+ Add trigger & action」來加入新的觸發條件與動作。在此需要三個步驟:

  • 觸發條件名稱請隨意輸入,這會成為手機推播訊息標題或是電子郵件標題。

 

編輯觸發條件

  • 這時會根據既有資料通到來建立觸發條件,請選擇方才建立的資料通道:sensor,條件請設定為大於800

  • 最後一步是選擇觸發動作。動作類型請選擇「手機推播」(另外還有電子郵件與觸發其他網路服務的Webhook選項)。內容請輸入:

LattePanda’s A0 value exceeded: ${deviceName} / ${value}」,其中${deviceName}與${value}可以自動代出裝置名稱與觸發條件時的數值。

選擇觸發動作

8.請注意如果要使用手機推播功能,先到個人檔案中(MCS畫面右上角)打開所要接收推播訊息的手機,如下圖。手機需要先安裝MCS app(目前只有Android版)。

在個人檔案頁面打開要接收推播訊息的手機

 

View post on imgur.com

在測試裝置的「觸發條件與動作」標籤中檢查

在Google Play安裝「 MediaTek Cloud Sandbox」手機程式

程式說明

先安裝Python2.7(https://www.python.org/download/releases/2.7/),建立一個mcs.py檔之後貼入下方的程式碼,修改對應資訊之後使用以下指令執行:

   python mcs.py

執行順序1、先上傳Arduino端的程式之後,2、再執行Python或Node.js任一程式即可。Python或Node.js會透過我們在程式中所設定的序列埠號向Arduino要資料,即類比腳位A0的資料。

之所以使用這樣的架構,雖然使用了兩種程式語言,但是可以發現程式的總行數簡化很多。如果後續改用Raspberry Pi搭配Arduino或是7688 Duo的話,也可以看到這樣的混搭應用。

Python

#1~#3匯入了本程式所需的Python函式庫,其中serial是用來與序列裝置通訊,也就是Arduino。

#05是指定LattePanda上的Arduino晶片所取得的COM埠號,例如「COM4」。

#07 08 則是您先前辛辛苦苦在MCS上取得的測試裝置DeviceId / Key

#10   MCS所設定的資料通道ID

#22   無窮迴圈

#23   抓到來自Arduino丟來的第一筆資料’a’,這等於是標頭檔,以避免封包遺失對於通訊品質的影響。

#24 使用ser.read()取得來自Arduino的資料

#30 上傳資料到MCS

 

mcs.py範例

import serial
import time
import requests

ser = serial.Serial('COMX',9600) 

device_id = "Your device ID"
device_key = "Your device Key"

data_channel = "sensor"
data_channel +=",,"
url = "http://api.mediatek.com/mcs/v2/devices/" + device_id
url += "/datapoints.csv"

def MCS_upload(value,length):
        data = data_channel+str(value)
        r = requests.post(url,headers = {"deviceKey" : device_key,'Content-Type':'text/csv'},data=data)
        print r.text

print "Start"
while True:
        if ser.read()=='a':
                IncommingNum = ser.read()
                sensor = int(ser.read(int(IncommingNum)))
                a = 8
                a += int(IncommingNum)
                MCS_upload(sensor,a)

Node.js

Node.js也是相同的概念,我們可以比較一下與Python的異同,然後選一個喜歡的程式語言來開發。記得先安裝Node.js(https://nodejs.org/en/)。

請建立一個mcs.js檔之後貼入下列內容,修改對應資訊之後使用以下指令執行:

   node mcs.py

mcs.js範例:

var mcs = require('mcsjs');
var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("COMX",
{baudrate: 9600
});

var myApp = mcs.register({
        deviceId: 'your device ID',
        deviceKey: 'your device Key',
});

serialPort.on("open", function () {
        receivedData ="";
        serialPort.on('data',function(data)
        {
                receivedData =data.toString();
                a = receivedData.length;
                myApp.emit('sensor','', receivedData.substring(2,a));
                //從字串的2號位置取長度a,即可取得資料本身
        });
});

 

Arduino

Arduino端程式很單純,主要是多開了一個序列連線(#5的Serial1,代表LattePanda對Arduino的序列通訊)。進入loop()函式之後,#11~#13為搭配標頭a、資料長度與資料本體結合成一個封包之後發送給LattePanda端的Python、Node.js或其他程式。

Arduino端程式

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

#define sensorPin A0

 

void setup() {

Serial.begin(9600);   //Serial monitor

Serial1.begin(9600); //LattePanda對Arduino的序列通訊

}

 

void loop() {

int Sensor = analogRead(sensorPin);

Serial.println(Sensor);   //顯示A0腳位狀態

Serial1.print(‘a’);

Serial1.print(String(Sensor).length());

Serial1.print(Sensor);

//#11~#13為搭配標頭a、資料長度與資料本體

//結合成一個封包之後發送給LattePanda

delay(1000);

}

實際執行

請先將Arduino端程式上傳到LattePanda的Arduino上,接著開啟Windows的命令提示字元來執行Node.js或Python(兩者任一)即可透過序列埠取得來自Arduino端的資料之後上傳到MCS雲服務,我們可以看到數值變化,並點選該資料通道的右上角即可看到歷史數值變化,如下圖。

也可由MCS手機端App檢視資料。

當數值超過我們所設定的上限時, Android手機會收到來自MCS手機端程式的推播訊息,如下圖。

View post on imgur.com

上傳溫溼度感測器資料到ThingSpeak雲服務

這次使用的是DFrobot之DHT11溫濕度感測器-連結

ThingSpeak雲服務與設定

ThingSpeak是另一個好用的雲服務,可以接收來自各種開發板或單一程式傳上去的資料,在網站上可以找到很多熱門開發板的現成範例,包含Arduino、ESP8266與Raspberry Pi等。請開啟ThingSpeak網站(https://thingspeak.com/)註冊一個帳號之後登入,登入之後主畫面如下圖:

ThingSpeak端設定

登入ThingSpeak網站之後點選「Channels」來建立新的Channel,並如下圖填入相關資訊,我們要把DHT11溫濕度感測器的溫度與濕度執分別傳上去,因此請將Field1填入temperature,Field 2則填入humidity

建立Channel之後,點選API Keys 標籤,請把上圖中的Channel ID與Write API Key記下來,後續要把這兩筆資料填入Visual Studio程式中。

於Visual Studio中讀取溫濕度感測器資料

糗確認在LattePanda上是否安裝Microsoft Visual Studio 2015(或以上)。

Arduino

  1. 在Arduino IDE中匯入Adafruit DHT11函式庫,請由函式庫管理員中搜尋「DHT11」後點選Install按鈕即可。

  1. 接著下載Arduino程式碼-連結,找到ino後上傳到LattePanda Arduino上即可。

本範例主要是如何透過Visual Studio取得Arduino的資料之上傳到ThingSpeak雲服務。架構與上一個範例使用Python是一樣的,看各位在PC端喜歡用什麼樣的程式語言。當然在ThingSpeak網站上也可以找到Python結合Arduino的範例,這樣做法就與上一個專題差不多了。

請開啟一個新的Visual Studio C#專案,並於Program.cs中貼入以下程式碼:

program.cs範例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
using LattePanda.Firmata;

namespace DHT
{
    class Program
    {
        const string WRITEKEY = "THINGSPEAK_KEY_HERE"; //ThingSpeak Key
        const int DELAY = 20;          //Delay time for send packet to ThingSpeak
        const int GET_TEMPERATURE = 0x47;
        const int GET_FAHRENHEIT = 0x48;
        const int GET_HUMIDITY = 0x49;
        static void Main(string[] args)
        {
            Arduino arduino = new Arduino();
            while (true)
            {
                Console.WriteLine("Receiving sensor data...");
                arduino.DHT(GET_TEMPERATURE); 
//For Fahrenheit : GET_FAHRENHEIT
                Thread.Sleep(2000);
                string temp = arduino.STRING_DHT;
                //
                arduino.DHT(GET_HUMIDITY);
                Thread.Sleep(2000);
                string hum = arduino.STRING_DHT;
                try
                {
                    string rec = "";
                    string strUpdateBase = "http://api.ThingSpeak.com/update";
                    string strUpdateURI = strUpdateBase + "?key=" + WRITEKEY;

                    strUpdateURI += "&field1=" + temp;
                    strUpdateURI += "&field2=" + hum;

                    HttpWebRequest request = WebRequest.Create(strUpdateURI) as HttpWebRequest;
                    request.Timeout = 5000;
                    request.Proxy = null;
                    //request.Accept = "application/xrds+xml";  
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    WebHeaderCollection header = response.Headers;
                    var encoding = ASCIIEncoding.ASCII;
                    using (var reader = new System.IO.StreamReader(response.GetResponseStream(), encoding))
                    {
                        rec = reader.ReadToEnd();
                        Console.WriteLine("The data was successfully sent. Node Number: " + rec);
                        Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy - HH:mm:ss") + "      Temperature: " + temp + " °C" + "       Humidity: " + hum+" %");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: " + ex.Message);
                }
                Thread.Sleep(1000);
                for (int i = 0; i <= DELAY; i++)
                {                 
                    Console.Write(".");
                    Thread.Sleep(1000);
                }
                Console.WriteLine();
            }
        }
    }
}

實際執行

存檔之後點選 Start 按鈕,會看到Visual Studio執行畫面:

這時請開啟ThingSpeak網站,進入剛剛設定好的Channel,應該會看到類似下方的畫面,試著對感測器呵氣來改變溫度與溼度吧!

於ThingSpeak網站檢視溫度與濕度資料變化

這次介紹兩種雲服務:MCS與ThingSpeak,雖然功能上比Microsoft Azure來得少多了,但使用流程也因此簡化許多,功能上大致上還是可以滿足我們從雲端控制板子腳位或顯示板子資料等兩大訴求。請根據大家的使用需求來選用合適的雲服務。

 

相關文章:

[LinkIt 7697] WiFi 控制RGB三色LED

本文章教各位讀者如何用手機撰寫App Inventor的應用程式,並透過Wi-Fi 來控制LinkIt 7697開發板上所接的 RGB 三色LED燈。在此會把7697作為 web server,App Inventor則是透過 IP 搭配指定字元來與它互動。

作者/攝影  曾吉弘
時間  3小時
成本
難度  * * * *
材料表
  • 個人電腦
  • LinkIt 7697 開發板
  • RGB LED (共陰)
  • 或三顆不同顏色的LED

本文要介紹如何將LinkIt 7697 作為一個簡易的web server (修改自MTK原廠範例),可透過網頁與App Inventor 來控制它。CAVEDU 2017年已經執行了超過30場的 LinkIt 7697研習,請參考我們的教學投影片,也歡迎找我們去上課啦~

LinkIt 7697超詳細教學投影片請按我

硬體組裝

請將LinkIt 7697與共陰RGB LED接上麵包板後,按照以下對應來接線:

RGB LEDLinkIt 7697
RP11 (D11)
GP9
BP7 (也是板載的USR LED)
GND任一GND即可

 

完成如下圖

App Inventor

請登入MIT App Inventor之後,建立一個新專案。或直接App Inventor中文學習網匯入本專案原始檔,唯一要修改的地方就是LinkIt 7697於您所指定網路所取得的IP位址。

Designer

  1. 新增一個HorizontalArrangement,其中放入一個按鈕與Label,按鈕是用於設定IP,label則是用於顯示各種訊息。
  2. 新增一個Textbox,Text設為空,Hint則設為”check 7697 ip in serial monitor”,用於輸入7697的實際IP
  3. 新增一個TableArrangement,寬度設為Fill parent,高度為200像素。Row=2。Column=3。接著放入五個按鈕,寬度各為33%,高度則為100像素。這些分別用於讓RGB LED亮紅色(R)、綠色(G)、藍色(B)、白色(W)與熄滅。
  4. 新增一個

 

完成後如下圖:

STEP1 IP變數與設定IP按鈕

 

在此宣告一個變數,內容為”http://192.168.1.73”,這是LinkIt 7697於您所指定網路中所取得的IP。後續會把這個變數值用於Web元件的Url屬性。如果您只有一片LinkIt 7697或已經確定其IP的話,可以在此把它寫死不用修改。

不過為了方便起見,我們可以透過Textbox來設定新的IP,這在您現場有多片LinkIt 7697要控制時很方便。按下Button_setIP按鈕,會先檢查Textbox是為空,如果已輸入內容就將設定結果顯示於Label,否則將顯示錯誤訊息於Label。

STEP2   副程式用於設定URL與顯示訊息

在此宣告一個副程式來管理每次按下按鈕時所發送的字元與顯示訊息。請新增一個procedure,並點選藍色方塊來新增參數,點選副程式與參數名稱即可修改名稱。在此副程式名稱改為sendData,參數名稱為message / command

在sendData副程式中,我們會把送進來的參數分別用於7697的網址(組合結果:http://192.168.1.73/R,不同字元對應不同動作)與要顯示的訊息。最後再呼叫Web.Get來呼叫LinkIt 7697所產生的網址即可。

STEP3   各顏色燈光按鈕

這樣做程式是否變的很清爽呢?每個按鈕的差別只在於參數不同而已,當然如果我們要發送/W出去的話,LinkIt 7697也要有對應的程式才行。簡列如下:

Button_R(紅燈):Red 與 /R

Button_G(綠燈):Green 與 /G

Button_B(藍燈):Blue 與 /B

Button_W(白燈):white 與 /R

Button_off(紅燈):Red 與 /o   (小寫的o~)

LinkIt 7697Wifi範例:

本範例修改自LinkIt 7697的SimpleWebServerWifi範例(就是多加幾個字元而已),重點段落

1.連上指定網路

while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);
  }
  server.begin();                           // start the web server on port 80
  printWifiStatus();                        // you're connected now, so print out the status

2.於7697簡易網頁中網頁顯示訊息,您可在7697所產生的網頁上編寫簡易的html。在此使用超連結可以直接點選。當然目標是透過App Inventor來發送囉。

client.print("Click <a href=\"/R\">here</a> to light red<br>");
client.print("Click <a href=\"/G\">here</a> to light green<br>");
client.print("Click <a href=\"/B\">here</a> to light blue<br>");
client.print("Click <a href=\"/W\">here</a> to light white<br>");
client.print("Click <a href=\"/o\">here</a> to light off<br>");

3.檢查網址並呼叫自定義函式來控制LED。如果我們檢查到某次client request(手機或透過網頁點選)的結尾等於我們所指定的字元,就呼叫led()函式,並透過參數來決定哪一個顏色亮起。1,0,0就是紅色,0,0,1是藍色等。

 

在此我們並沒有調整每一種顏色的亮度,所以只有亮暗兩種狀態,您可以思考一下如何透過這樣的架構把參數送進來給analogWrite()函式來調整RGB LED的亮度,例如(128, 130, 255),這樣顏色的變化會更繽紛喔!

// Check client request
        if (currentLine.startsWith("GET /R")) {  // GET /R to light red
          led(1,0,0);     
        }
//其餘省略

void led(int R, int G, int B) {
  digitalWrite(11, R);
  digitalWrite(9, G);
  digitalWrite(7, B);
}

操作

請先確認7697端程式已經執行,並開啟Serial Monitor來看7697的IP為何。將App Inventor中的ip變數值改好之後執行(由於本範例並非使用藍牙,所以模擬器也可執行)。

確認好IP之後,先開啟瀏覽器,您所使用的裝置需與7697位於同一個網段之下才行喔,如以下的192.168.1.73。

開啟app吧,設定IP成功畫面如下圖左,點選各個按鈕可以看到畫面右上角的label會顯示對應的訊息,您的RGB LED順利亮起來了嗎?

 

Simple:13

/*
  WiFi 7697 LED control
  If the IP address of your shield is yourAddress:
  http://yourAddress/R to light red
  http://yourAddress/G to light green
  http://yourAddress/B to light blue
  http://yourAddress/W to light white
  http://yourAddress/o to turn off LED

  Circuit:
    LinkIt 7697 HDK
    RGB LED (common cathode) 
    R - LinkIt D11
    G - LinkIt D9
    B - LinkIt D7

  created 25 Nov 2012
  by Tom Igoe
  modified 3 Nov 2017
  by CAVEDU
*/
#include <LWiFi.h>

char ssid[] = "ssid";      //  your network SSID (name)
char pass[] = "pass";   // your network password
int keyIndex = 0;                 // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
  Serial.begin(9600);      // initialize serial communication
  pinMode(LED_BUILTIN, OUTPUT);      // set the LED pin mode
  pinMode(11, OUTPUT);  //R
  pinMode(9, OUTPUT);   //G
  pinMode(7, OUTPUT);   //B

  // attempt to connect to Wifi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);
  }
  server.begin();                           // start the web server on port 80
  printWifiStatus();                        // you're connected now, so print out the status
}


void loop() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/R\">here</a> to light red<br>");
            client.print("Click <a href=\"/G\">here</a> to light green<br>");
            client.print("Click <a href=\"/B\">here</a> to light blue<br>");
            client.print("Click <a href=\"/W\">here</a> to light white<br>");
            client.print("Click <a href=\"/o\">here</a> to light off<br>");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check client request
        if (currentLine.startsWith("GET /R")) {  // GET /F to light red
          led(1,0,0);     
        }
        if (currentLine.startsWith("GET /G")) {  // GET /G to light green
          led(0,1,0); 
        }
        if (currentLine.startsWith("GET /B")) {  // GET /B to light blue
          led(0,0,1);
        }
        if (currentLine.startsWith("GET /W")) {  // GET /W to light white
          led(1,1,1);
        }
        if (currentLine.startsWith("GET /O")) {  // GET /O to light off
          led(0,0,0);
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
}

void led(int R, int G, int B) {
  digitalWrite(11, R);
  digitalWrite(9, G);
  digitalWrite(7, B);
}

 

相關文章:

[Micro:bit ] I/O腳位控制

本文要介紹BBC Micro:bit上的I/O腳位,讀取類比輸入腳位的變化之後來控制開發板上的LED matrix。做出類似長條圖的效果。

作者/攝影  曾吉弘
時間  3小時
成本
難度  * *
材料表
  • 個人電腦
  • BBC Micro:bit開發板
  • LED x1
  • 麵包板 x1
  • 跳線 x2

Micro:bit I/O腳位介紹

Microbit除了明顯的五個腳位(原廠稱為pad)之外,另外還有十多隻腳位,功能定義如下圖。在使用上就如同Arduino或其他的開發板一樣,數位I/O,類比I/O(PWM)、I2C與SPI功能,該有的都有。

在使用上,我們可以用鱷魚夾去夾住pad (0, 1 ,2, 3V GND這五個大的pad),但比較小的腳位在操作上就不是很方便,因為Microbit端建議使用DFRobot BOSON kit for Micro:bit,或是Seeed StudioGrove Inventor kit for micro:bit。如下圖是DFRobot BOSON kit for Micro:bit,您可以看到常用的腳位都做好防呆接頭,其他的腳位也有母座,直接接杜邦線就可以使用了。如果想要用Micro:bit來輸出音效的朋友,左下角的音源接頭,您一定會喜歡的啦。

硬體接線

請將可變電阻先插上麵包板,接著將中間腳位接到Micro:bit0號腳位(#0 pad),接著一側接地(GND)一側接電。

 

請注意Miro:bitGND腳位相當多,但在此使用比較好接的GND pad

Micro:bit程式

寫一個簡單的程式,按下A按鈕之後,會不斷讀取P0類比腳位的狀態(0~1023),如果P0<300的話,亮起 LED matrx 第一列,反之亮起1~4列。您可以自由修改這個判斷值與呈現的效果。

Javascript code

 

有興趣的朋友也可以轉成JavaScript來比較看看,慢慢就會進步喔

input.onButtonPressed(Button.A, () => {
   while (true) {
       if (pins.analogReadPin(AnalogPin.P0) < 300) {
           basic.showLeds(`
               . . . . .
               . . . . .
               . . . . .
               . . . . .
               # # # # #
               `)
       } else {
           basic.showLeds(`
               . . . . .
               # # # # #
               # # # # #
               # # # # #
               # # # # #
               `)
       }
       basic.pause(100)
   }
})

完工了!來試試看吧。確認腳位都沒接錯之後,請慢慢轉動可變電阻,看看LED matrix有沒有變化吧。

 

相關文章:

 

[App Inventor+Microbit小專題 ] 按鈕控制畫面小球

作者/攝影  曾吉弘
時間  3小時
成本
難度  * * * *
材料表
  • 個人電腦
  • App Inventor開發環境
  • 支援BLE的Android手機
  • BBC Micro:bit開發板

本文要介紹如何透過BBC Micro:bit開發板上的按鈕來控制App Inventor畫面上的小球左右移動,碰到畫面邊緣還會在Micro:bit LED matrix 上顯示對應的字樣。

 

範例 aia檔下載請按我

 

藍牙配對

 

Micro:bit端設定:

  1. 同時按住Microbit 正面A、B按鍵,不要放掉
  2. 按住A、B鍵時,把背面的Reset 鍵按下後再放開。
  3. 這時應該可以看到 “PAIRING MODE!” 以跑馬燈方式出現在Microbit LED 螢幕上,若看到這訊息,便可以放開A、B鍵。
  4. PAIRING MODE! 結束後,會看到一個圖形出現在Microbit LED 螢幕上,不同的Microbit 出現的圖案也不同,這是Microbit 不同裝置獨特的”簽名” (Signature) 。

  1. 這時候的Microbit 已經準備好跟其他裝置配對,請看以下影片教學

 

 

 

Android手機端設定:

  1. 進入Android手機的設定–>藍牙
  2. 確認Micro:bit 已進入配對模式
  3. 當Micro:bit上的‘PAIRING MODE!’ 顯示完,搜尋(每隻Android手機這個選項的文字不一定相同,但意思差不多),應該會看到類似 micro:bit [XXXXX]的選項,其中XXXXX 會根據每片micro:bit而不同。點選該裝置來配對。

4.micro:bit 會出現向左的箭頭,然後Android裝置上會跳出畫面要求輸入配對PIN碼的視窗。

5.按住Micro:bit 的按鍵A ,這時microbit 會連續出現六個數字,這就是配對碼。

6.回到Android裝置上,輸入這六個數字。如果Microbit 出現[V],代表配對成功。如果是[X]代表沒成功,請再試一次

 

編寫程式

匯入BLE 與 micro:bit extension

 

請登入MIT App Inventor官方網站,建立新專案,在Designer頁面中點選Palette左下角的Extension,再點選”Import extension“與”URL:

  1. 貼入以下兩個 extension link:

 

2. 請加入 Microbit_LedMicrobit_Button這兩個Microbit元件。兩者的BluetoothDevice 屬性設為 “BluetoothLE1″。這步驟很容易忘記,別漏掉了

  1. 加入四個按鈕放入 horizontalArrangement元件中,分別用於掃描、停止掃描連線與斷線

 

  1. 新增Canvas畫布元件(寬高各為320像素,底色隨意),再放入一個Ball元件。完成後Designer頁面如下圖(可以不用一模一樣)

Blocks頁面

 

本範例的基本概念是按下Micro:bit板子上的兩個按鈕可以控制小球左右移動,碰到Canvas邊緣會在LED矩陣上顯示對應的文字。開始吧:

STEP1: BLE連線成功後啟動Clockl元件

在BluetoothLE1.Connected事件中,首先啟動Clock.Timer(timer Interval 設為100),並顯示相關訊息,最後要求Micro:bit開始更新兩個按鈕的狀態。

STEP2:按下Micro:bit左側A按鈕

Microbit_Button1.ButtonAStateReceived事件中:

○如果按下了左側的A按鈕(Button_State_Value為true),則讓ball_X 變數值累減10。

○讓Ball1元件移動到(ball_X, 100),也就是左移10像素。

STEP3:按下Micro:bit右側B按鈕

現在看到右側的B按鈕,所做的事情幾乎一模一樣但是Ball1元件的移動方向是相反的。

Microbit_Button1.ButtonBStateReceived事件:

○如果按下了右側的B按鈕(Button_State_Value為true),則讓ball_X 變數值累加10。

○讓Ball1元件移動到(ball_X, 100),也就是右移10像素。

STEP4 Ball reached canvas’ edge

當小球碰到Canvas畫面四邊時,我們希望在Micro:bit的LED矩陣上顯示對應的文字。

Ball1.EdgeReached事件中,使用 if / else if 來檢查到底碰到了哪一邊,根據App Inventor的文件,1是北方,所以要透過Microbit_Led1.WriteLEDText指令來顯示’N’。其餘類推,請看下圖:

完工了!來試試看吧。請確認您的Micro:bit與Android已經配對好了。按下Microbit板子上的按鈕應該讓畫面上的小球左右移動,試試看讓小球去撞牆吧,看看有沒有顯示對應的文字。試試看用 Micro:bit LED 搭配 App Inventor 做出更多功能吧

 

 

相關文章: