• 沒有找到結果。

樹莓派3講義(含GPIO與GrovePi擴充)

N/A
N/A
Protected

Academic year: 2021

Share "樹莓派3講義(含GPIO與GrovePi擴充)"

Copied!
25
0
0

加載中.... (立即查看全文)

全文

(1)

1. 樹莓派 3 除原有有線(RJ45 接線)網路,新增無線 Wi-Fi、藍芽,升級到64bits,很適於物聯網相關設計。 2. 樹莓派 2 的 GPIO 有 26pin,樹莓派 3 的 GPIO 增為40pin,所謂GPIO (General Purpose Input /Output)

通用介面 I/O,電壓以3.3V為主,亦有提供 5V,和 Arduino 類似,但無類比腳位,須用GrovePi解決。

3. 開機約 30 秒以內,關機約 5 秒以內完成。作業系統是Linux,所以在 LX 終端機輸入指令或檔案名 稱大小寫並不同。利用 SD 卡儲存作業系統與檔案,建議使用 16GB、class 10速度以上,若欲備份 或複製 SD 需先安裝Win32DiskImager-0.9.5-install.exe軟體,不支援中文路徑或檔名,所以建議放 在 C:\或 D:\根目錄,先做Read讀取 SD 卡,副檔案名稱為.img,檔案大小為 SD 實體總大小,不管 剩餘空間為何,然後更換 SD 再Write即可,過程要很久很久,16GB 超過 1 小時,當可以開機表 示資料正確。

(2)

4. SD 強烈建議要用同廠牌,因為曾遇過都是 16GB,卻因為不同廠牌,只差一點點卻無法寫入的窘境!

5. 輸出若用HDMI 會包含聲音,若是用 HDMI 轉 VGA 則需透過耳機孔輸出聲音,音質不錯。

6. 開機後桌面如下,可自訂工具列和桌面背景,不同作業系統畫面也不同。 7. 系統登入登出與關機 :樹莓派預設帳號是 pi,密碼是 raspberry,但如果在設定時有改過密碼,就要 用新密碼登入(註:使用者 pi 密碼,SD 已經改為 12345678)。 8. 樹莓派右上角若出現彩色方塊,是表示供應的電源電力不足,如果是 Raspberry Pi 3 的話,電流一 定要能夠供應 2A 以上,不然的話,就是表示電源線的品質不好,可利用行動電源 2.1A 輸出亦可。 9. 上網瀏覽器畫面如下: Scratch 圖形化控制 GPIO 免費 Open Office (全) 瀏覽器 檔案總管 LX 終端機 開始/選單 螢幕擷取 因為沒有內建電池, 開機時若有網路才會 自動更新目前時間。 選擇無線網路 縮小所有視窗

(3)

10. 檔案總管雙視窗(檢視→雙窗格模式),PDF 可直接點選開啟檔案,隨身碟位置在『/media/pi』。

11. LX 終端機為純文字模式,類似微軟 MS-DOS 模式,畫面如下,優點是不占資源,速度超快,缺點 是要背指令,輸入指令或檔案名稱大小寫並不同。常用指令如下:

# sudo apt-get update 利用超級管理員全部更新(su=super,sudo 僅暫用 root 權限)

(4)

# sudo apt-get install gimp 安裝 gmip 圖片編輯軟體

# cd Desktop 切換到桌面目錄,大小寫須完全相同 #startx 回到 X 視窗模式,但 SSH 不支援 # ls 查看檔案 #passwd 變更密碼,至少 8 個字元 #df -h 檢查 SD 空間 #clear 畫面清空 # nano test1.py 純文字編輯檔案,有些系統檔案要最高權限方可編輯,就一定要用 nano

# python test1.py 執行檔案,亦可在圖形介面的文字編輯器按F5直接編輯,然後就直接執行測試

# cd Desktop/GPIO 其中桌面單字 D 與 GPIO 都一定要是大寫

# python test1.py 執行控制 GPIO 檔案,測試 GPIO 所有電路功能,無窮迴圈按CTRL+C離開 # cd /home/pi/Videos

# omxplayer -r ocean.mp4 可全螢幕播放高清影片

# sudo shutdown -r now 立即關機再重新啟動 (或直接輸入sudo halt 關機、reboot 重新啟動) # ifconfig 顯示網路設定,可查看自己 IP ,eth0 是指有線網路,wlan0 是指無線網卡,學校

TSSH-Mobile 無線上網是根據 MAC 方可上網,若須申請需將 wlan0 無線網卡 MAC 複製,按申請連結處。

註:可利用↑與↓鍵叫出曾用過的指令再修改,即使重開機紀錄還在。 若直接點擊高清影片,預設 VLC 較佔資源,延遲很嚴重,除了在終端機輸入指令,亦可點選該檔案, 按滑鼠右鍵,選擇『從其他程式開啟』→自訂指令列→輸入omxplayer –r(-r 是全螢幕播放),勾選 底下兩個核取方塊,一定要輸入應用程式名稱,再勾選下面預設,按『確定』(左下圖),將來點選即 可用 omxplayer 開啟,優點是,所佔資源極少,影像不延遲。 註:omxplayer 常用快速鍵請熟記,暫 停播放:空白鍵或 p、離開:q、音量調整:+/-、字幕切換:s、慢轉:1、快轉:2、往前 30 秒:←、 往後 30 秒:→、切換字幕:s、下一字幕:m、顯示字幕:w、前一章節:i、下一章節:o。

12. 樹莓派透過 USB 亦可直接使用 Arduino,版本無法及時更新,程式在『電子學→Arduino IDE』,選 擇 Arduino Leonardo 或 UNO 板後,此時看到串口預設名稱為 /dev/ttyACM0 (註:在微軟是用 comXX 表示),可開啟現成範例 Blink,測試一下是否可以下載程式到 Arduino ?

(5)

13. SSH(Secure Shell)可以遠端控制樹莓派,但僅限於純文字模式,即終端機模式,沒有辦法輸入 startx 切換到圖形介面,優點是流量極小。若想控制遠端的圖形介面,需利用 VNC(Virtual Network Computing)軟體,兩者亦可解決暫無鍵盤與滑鼠的狀況,但須先利用ifconfig查詢樹莓派 IP 位置。 14. SSH 老師的 SD 已經設為開機直接啟用,若欲用手機控制,建議安裝JuiceSSH-SSH Client 軟體,畫 面如下,需先新增使用者名稱『pi』與密碼 12345678(因為自行改過),需留意是否在相同區域網路, 例如無線和有線 IP 區段不同,所以要用手機當基地台分享,才為相同的子網域,192.168.x.x 並非 實際固定 IP 位置。若要關機輸入sudo shutdown -r nowsudo halt,重新啟動sudo reboot。

15. 電腦版要控制 SSH 是利用putty.exe軟體,輸入 IP 後按『open』,然後要求輸入帳號與密碼。

16. Ultra VNC 是一套免費的遠端電腦桌面連線、搖控工具,只要簡單的輸入想要遠端連線的電腦 IP 或 電腦名稱即可快速的連線至遠端電腦,進行畫面搖控或操作鍵盤滑鼠等功能,Ultra VNC 與 Real VNC 較不同的是,Real VNC 雖然也是免費的,但取得免費使用還需要經過簡單的 License Key 註冊 才可使用,而 Ultra VNC 則完全不用註冊即可快速的啟用。 17. 執行 UltraVNCPortableTW\32\vncviewer.exe,視作業系統版本而定,位置輸入192.168.207.103:1, 電腦和樹莓派網卡須同區段,冒號 1是代表 PORT 5901位置,接著按『連線』,輸入預設密碼為 123456 (因為已經內建於 SD),若無法連線請於終端機執行『sudo tightvncserver』啟動 VNC 服務。 註:學校 IP 每次開機因是 DHCP,每天均不同,建議使用前先用ifconfig 查看,或用手機當基地台。 SSH 純 文 字 , 避 免 使 用 中 文,因不方便輸入,透過手 機上網網路流量極少,並熟 記終端機各指令,即可播影 片或控制 I/O,且利用↑、 ↓可瀏覽之前曾輸入指令, 包 括 用 曾 用 電 腦 或 手 機 操 作。

(6)

18. 進去之後並不影響實際樹莓派桌面畫面,因為這僅是虛擬桌面,如下圖,實際原本桌面相關資料

是放在/home/pi/Desktop裡面,這樣可解決樹莓派無鍵盤與滑鼠而不好操作的因素。

19. 實際在練習 VNC 時遭遇很大問題,每當執行sudo tightvncserver 啟動 VNC 服務(實際應用可利用手 機 SSH 輸入啟動 VNC),當重開機後,僅看到輸入帳號與密碼的畫面,但不管怎麼輸入都不行,解 決方式是先按Ctrl+ALT+F1 回到文字視窗,輸入 mv .Xauthority .Xauthority.bkp reboot 重開機即 可恢復,authority 權力,Ctrl+ALT+F7 回到 X 圖形視窗。 (註:VNC 無法進入文字終端機視窗模式)

(7)

20. 控制 I/O 也可使用積木組合式圖形,軟體名稱為Scratch GPIO,藉由拖曳、組合方式撰寫程式,主 程式內有現成範例參考,適於非本科系,請自行研究。

(8)

1. 控制 GPIO 主要是用python 程式語言,副檔名為『.py』,註解用 # 號、陣列使用中括號[ ]、區塊 描述不用{ … }或 endif,而是使用一行空白列區隔,if 等於是 ==、不等於是 != 表示。

2. python 的算術運運算元**表示指數、//表示整數除法、%表示取餘數。 3. 判斷 if a and (not b or not c) or b and (not a or not c) or c and (not b or not a):

4. 可直接點選開啟.py 檔案編輯,按『F5』直接編譯執行,或選Run→Run Module 較方便,另一優點

是可在#後加註中文註解仍可正常執行,若要結束按CTRL+C中斷跳出。

5. 若在 LX 終端機中,執行 nano 指令,若有任何中文註解會出現錯誤而無法執行,若要停止可按

CTRL+ZCTRL+C 停止,若用手機 SSH 軟體操作,因為無法按 CTRL+ZCTRL+C 複合鍵,最簡單 是先退出再進去該 app,或將手機多安裝『Keyboard with Ctrl key』軟體,然後按『設定→語言與 輸入→將預設值變更為 Keyboard with Ctrl key』,此 app不支援中文輸入,但可解決無 ctrl 複合鍵。

6. test1.py 功能為 SW1~4 都 OFF 則全熄滅,SW1=ON 依序點亮、SW1=OFF 且 SW2=ON 每隔 0.5 秒閃 爍、SW1=OFF 且 SW2=OFF 且 SW3=ON 每隔 0.1 秒閃爍、SW1=OFF 且 SW2=OFF 且 SW3=OFF 且 SW4=ON 則全亮,所以 SW1 權位最高。

7. test1.py 是用土法煉鋼方式,test2.py 功能同上,僅利用陣列與FOR 迴圈簡化 test1.py 程式碼。 8. GPIO 的順序應是用『軟體配合硬體』,可避免硬體焊接無謂的跳線。

(9)

不用電路板,直接用排針母座焊接 7 顆 LED,每顆 LED 用兩隻 GPIO 控制為方 便焊接建議先用膠帶固定 LED,並排列 整齊,這樣就可以先嘗試練習 14 個 GPIO,若要收藏於樹莓派內,將排針 母座用尖嘴鉗折彎 90 度再焊。 9. test1.py 與 test2.py 實體電路和程式碼說明如下:  test1.py 程式碼

#import 匯入 RPi.GPIO 物件,GPIO 名稱可自訂,可繼承 RPi.GPIO 所有特性,本語言屬於物件導向程式 import time,RPi.GPIO as GPIO

GPIO.setwarnings(False) #忽略所有警告提示

GPIO.setmode(GPIO.BOARD) #利用腳位編號,若用 GPIO 編號改 BCM 模式,GPIO.xx 是第 2 行自訂名稱 GPIO.setup(3,GPIO.OUT) #設定輸出腳位 GPIO.setup(5,GPIO.OUT) GPIO.setup(7,GPIO.OUT) GPIO.setup(23,GPIO.OUT) GPIO.setup(11,GPIO.OUT) GPIO.setup(13,GPIO.OUT) GPIO.setup(15,GPIO.OUT) GPIO.setup(29,GPIO.OUT) GPIO.setup(19,GPIO.OUT) GPIO.setup(21,GPIO.OUT) GPIO.setup(31,GPIO.IN) #設定輸入腳位 GPIO.setup(33,GPIO.IN) GPIO.setup(35,GPIO.IN) GPIO.setup(37,GPIO.IN) while True: #永久迴圈,按 ctrl+c 離開 if GPIO.input(31) == 0 : #不等於用 != ,if 後面要加冒號 GPIO.output(3,1) #當 SW1 為 ON,LED 依序點亮 time.sleep(0.1) GPIO.output(5,1) time.sleep(0.1) GPIO.output(7,1) time.sleep(0.1) GPIO.output(11,1) time.sleep(0.1) GPIO.output(13,1) time.sleep(0.1) GPIO.output(15,1) time.sleep(0.1) GPIO.output(19,1) GND Pin1

(10)

time.sleep(0.1) GPIO.output(21,1) time.sleep(0.1) GPIO.output(23,1) time.sleep(0.1) GPIO.output(29,1) time.sleep(1) GPIO.output(3,0) #都亮後,一次關閉 LED GPIO.output(5,0) GPIO.output(7,0) GPIO.output(11,0) GPIO.output(13,0) GPIO.output(15,0) GPIO.output(19,0) GPIO.output(21,0) GPIO.output(23,0) GPIO.output(29,0) time.sleep(1)

elif GPIO.input(33) == 0: #否則如果是 elif 要小心

GPIO.output(3,1) #當 SW1 為 OFF、SW2 為 ON,LED 每 0.5 秒閃爍 GPIO.output(5,1) GPIO.output(7,1) GPIO.output(11,1) GPIO.output(13,1) GPIO.output(15,1) GPIO.output(19,1) GPIO.output(21,1) GPIO.output(23,1) GPIO.output(29,1) time.sleep(0.5) GPIO.output(3,0) GPIO.output(5,0) GPIO.output(7,0) GPIO.output(11,0) GPIO.output(13,0) GPIO.output(15,0) GPIO.output(19,0) GPIO.output(21,0) GPIO.output(23,0) GPIO.output(29,0) time.sleep(0.5)

elif GPIO.input(35) == 0: #當 SW1 為 OFF、SW2 為 OFF、SW3 為 ON,LED 每 0.1 秒閃爍 GPIO.output(3,1) GPIO.output(5,1) GPIO.output(7,1) GPIO.output(11,1) GPIO.output(13,1) GPIO.output(15,1) GPIO.output(19,1)

(11)

GPIO.output(21,1) GPIO.output(23,1) GPIO.output(29,1) time.sleep(0.1) GPIO.output(3,0) GPIO.output(5,0) GPIO.output(7,0) GPIO.output(11,0) GPIO.output(13,0) GPIO.output(15,0) GPIO.output(19,0) GPIO.output(21,0) GPIO.output(23,0) GPIO.output(29,0) time.sleep(0.1)

elif GPIO.input(37) == 0: #當 SW1~3 為 OFF、SW4 為 ON,LED 全亮 GPIO.output(3,1) GPIO.output(5,1) GPIO.output(7,1) GPIO.output(11,1) GPIO.output(13,1) GPIO.output(15,1) GPIO.output(19,1) GPIO.output(21,1) GPIO.output(23,1) GPIO.output(29,1) else: GPIO.output(3,0) GPIO.output(5,0) GPIO.output(7,0) GPIO.output(11,0) GPIO.output(13,0) GPIO.output(15,0) GPIO.output(19,0) GPIO.output(21,0) GPIO.output(23,0) GPIO.output(29,0) #底下務必加一行空白,代表區塊結束,相當{....}  test2.py 程式碼 #利用陣列與迴圈簡化程式,功能同 test1.py import time,RPi.GPIO as GPIO

GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) #若是用 GPIO 編號用 BCM 模式 w=[3,5,7,23,11,13,15,29,19,21] #陣列使用『中括號』 r=[31,33,35,37] for x in w: #FOR 迴圈最後加冒號,超過一行最後要多一行空白列代表結束 GPIO.setup(x,GPIO.OUT) #設定輸出腳位(write) for x in r: GPIO.setup(x,GPIO.IN) #設定輸入腳位(read)

(12)

while True: #永久迴圈,按 ctrl+c 離開

if GPIO.input(31) == 0: #不等於用 != ,if 後面要加冒號

for x in range(0,10): #0~9 不是到 10,range 若多第三個引數是指遞增值,預設為 1 GPIO.output(w[x],1)

time.sleep(0.1) #延遲休息 0.1 秒,底下要多一行空白列代表結束

for x in w: #亦可用 for x in range(0,10): ,這種方法較佳,因為不用管陣列內容數量 GPIO.output(x,0) #直接取用陣列內容,所以不是用 w[x] time.sleep(0.1) elif GPIO.input(33) == 0: for x in w: GPIO.output(x,1) time.sleep(0.5) #上面務必加一行空白,意義不同,若無該行表示延遲是迴圈內,會依序點亮 for x in w: GPIO.output(x,0) #底下務必加一行空白 time.sleep(0.5) elif GPIO.input(35) == 0: for x in w: GPIO.output(x,1) time.sleep(0.1) for x in w: GPIO.output(x,0) time.sleep(0.1) elif GPIO.input(37) == 0: for x in w: GPIO.output(x,1) else: for x in w: GPIO.output(x,0)

 test3.py ~ test5.py 實體電路如下,練習控制七段顯示器掃描、按鈕開關(pin37)、Buzzer(pin35)為主。

(13)

 test3_s7_8888.py 程式碼,不用掃描,直接顯示 8888,按下按鈕開關會 BiBi,以測試所有電路功能 import time,RPi.GPIO as GPIO

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BOARD) #若是用 GPIO 編號用 BCM 模式 seg7=[5,33,19,15,13,7,21,11] #a~g and dp

scan=[23,31,29,3] #D0~D3

GPIO.setup(35,GPIO.OUT) #接 Buzzer GPIO.setup(37,GPIO.IN) #接按鈕開關

for x in seg7: #FOR 迴圈最後加冒號,超過一行最後要多一行空白列代表結束 GPIO.setup(x,GPIO.OUT) #設定輸出腳位(a~g and dp)

for x in scan: GPIO.setup(x,GPIO.OUT) #設定輸入腳位(scan 共用腳) while True: #永久迴圈,按 ctrl+c 離開 for x in seg7: GPIO.output(x,1) for x in scan: GPIO.output(x,0) if GPIO.input(37) == 1: #顯示 8.8.8.8. for x in seg7: GPIO.output(x,0) #因為共陽,0 亮 for x in scan: GPIO.output(x,1) time.sleep(0.0001) else:

for x in seg7: #開關按下關閉七段所有顯示內容,同時發出 BiBi 聲 GPIO.output(x,1)

for x in scan: GPIO.output(x,0)

for i in range(1,500): #發出 BiBi 聲 GPIO.output(35,1)

time.sleep(0.001) GPIO.output(35,0) time.sleep(0.001)

 test4_s7_0 to 9.py 程式碼,不用掃描,依序顯示 0~9,按下按鈕開關會 BiBi,以測試所有電路功能 import time,RPi.GPIO as GPIO

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BOARD) #若是用 GPIO 編號用 BCM 模式 seg7=[5,33,19,15,13,7,21,11] #a~g and dp

scan=[23,31,29,3] #D0~D3

TAB=[0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x67,0x00] #七段顯示器 0~9 字型 counter=0

GPIO.setup(35,GPIO.OUT) #BiBi GPIO.setup(37,GPIO.IN)

for x in seg7: #FOR 迴圈最後加冒號,超過一行最後要多一行空白列代表結束 GPIO.setup(x,GPIO.OUT) #設定輸出腳位(a~g)

for x in scan:

(14)

# 副程式,將指定值顯示在七段顯示器上,最低位元為 a def outport(dat): for jj in range(0,8): #0~7 if dat % 2 == 1: #取出 dat 的最低位元 GPIO.output(seg7[jj],0) # 若為 0 代表該段要亮,因為共陽 dat=dat/2 #除 2 取整數,進行下一位元的處理 else: GPIO.output(seg7[jj],1) # 若為 1 代表該段要滅 dat=dat/2 #除 2 取整數,進行下一位元的除 2,進行下一位元的處理,底下務必多加一行空白列處理 while True: #永久迴圈,按 ctrl+c 離開 if GPIO.input(37) == 1: #不等於用 != for x in range(0,10): #0~9 outport(TAB[x]) GPIO.output(scan[x % 4], 1) time.sleep(1) #底下務必多加一行空白列處理 else: counter=0 for x in seg7: GPIO.output(x,1) for x in scan: GPIO.output(x,0)

for i in range(1,250): #BiBi GPIO.output(35,1) time.sleep(0.001) GPIO.output(35,0) time.sleep(0.001)

 test5_counter 程式碼,利用掃描,顯示『分:秒』,按下按鈕開關會歸零,超過額定時間 BiBi 提醒 import time,RPi.GPIO as GPIO

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BOARD) #若是用 GPIO 編號用 BCM 模式 seg7=[5,33,19,15,13,7,21,11] #a~g and dp

scan=[23,31,29,3] #D0~D3 TAB=[0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x67,0x00] max=1 #設定 BiBi ss=0 #秒數 mm=0 #分鐘 delaytime=0.0001 GPIO.setup(35,GPIO.OUT) #接 Buzzer GPIO.setup(37,GPIO.IN) for x in seg7: GPIO.setup(x,GPIO.OUT) for x in scan: GPIO.setup(x,GPIO.OUT) # 副程式技巧,將指定值顯示在七段顯示器上,最低位元為 a def outport(dat): for jj in range(0,8):

(15)

if dat % 2 == 1: # 取出 dat 的最低位元 GPIO.output(seg7[jj],0) # 若為 0 代表該段要亮,因為共陽 dat=dat/2 # 除 2 取整數,進行下一位元的處理 else: GPIO.output(seg7[jj],1) # 若為 1 代表該段要滅 dat=dat/2 # 除 2,進行下一位元的處理,底下務必多加一行空白列 while True: #永久迴圈,按 ctrl+c 離開 if GPIO.input(37) == 1: #不等於用 != GPIO.output(35,0) #關閉聲音 for x in range(0,1111): outport(TAB[ss % 10]+128) #顯示秒數的個位數,加小數點 GPIO.output(scan[0],1) time.sleep(delaytime) GPIO.output(scan[0],0) temp = ss/10 outport(TAB[temp % 10]) #顯示秒數的拾位數,不加小數點 GPIO.output(scan[1],1) time.sleep(delaytime) GPIO.output(scan[1],0) outport(TAB[mm % 10]+128) #顯示分數的個位數,加小數點 GPIO.output(scan[2],1) time.sleep(delaytime) GPIO.output(scan[2],0) temp = mm/10 outport(TAB[temp % 10]) #顯示分數個位數,不加小數點 GPIO.output(scan[3],1) time.sleep(delaytime) GPIO.output(scan[3],0) if x==1110: #重複顯示的次數,該數值是用實際對時慢慢調整出來 ss=ss+1 if ss==60: ss=0 mm=mm+1 #底下務必多加一行空白列 if mm==max: #設定若超過 1 分鐘,則發出 BiBi 聲 GPIO.output(35,1) else: #當開關按下時間歸零,同時關閉聲音 ss=0 mm=0 GPIO.output(35,0) for x in seg7: GPIO.output(x,1) for x in scan: GPIO.output(x,0) 註 1:為方便透過 SSH 控制 GPIO,所以將 test1~5 名稱簡化,方便輸入。

(16)

註 2:茲將上述 test1~5.py 的電路板整合同 一塊板子,如下圖,可避免高頻訊號干擾而造成無法開機。

為什麼要學 nano,主要原因是權限問題,有些系統檔案要 root 最高權限方可變更,可先執行 sudo bash 切換 root 最高權限使用者,再用 nano 編輯儲存方可,另一個原因是 SSH 僅支援純文字編輯。nano 文字 編輯器的基本操作如下:(說明在最下面,^即 Ctrl 鍵)  Ctrl+G(或 F1) 顯示輔助說明  Ctrl+O 儲存(寫入)檔案 Ctrl+X 退出 Nano 文字編輯器(要自行先儲存)  Ctrl+W 搜索文字 (不分大小寫) Ctrl+K 剪下一整行文字 (將游標停在該行即可) Ctrl+U 貼上(不是 Ctrl+V,剪下之後可重複貼上)  Ctrl+C 顯示目前游標位置(C=Current≠Copy)  Ctrl+F 和 Ctrl+B 游標左、右移動 (相當←、→鍵)  Ctrl+P 和 Ctrl+N 游標上、下移動 (相當↑、↓鍵)  Ctrl+A 和 Ctrl+E 分別將游標移至行首和行尾  Ctrl+Y 和 Ctrl+V 進行上、下換頁切換 (Ctrl+V 是 ,不是貼上喔!)

(17)

1. 雖然樹莓派 3 的 GPIO 有 40 pins,但要電子相關科系方能撰寫控制程式,比較不適合非本科系初學 者。但透過 Grove介面,因為 API (Application Programming Interface 應用程式介面)都是現成的 ,只要去呼叫使用即可,而且還有現成範例可做修改,可以減輕軟體的開發過程,由於 Grove 教 學模組可以減少老師教學上的困擾,所以蠻適合中學生入門使用。

2. Grove 教學模組種類很多,有防呆設計,並使用3.3V,若接 5V 會燒毀,可以同時支援 Arduino (for 聯發科 LinkIt ONE) 與 Raspberry Pi ,但兩種轉接擴充板並不同,用於樹莓派會多標示 GrovePi。

3. GrovePi+有15個 Grove 擴充口整合在擴充板上(I2C*3、數位腳*7、類比腳*3、1 Serial port connect to GrovePi、1 Serial port connect to Raspberry Pi,全部均 4 pins),並解決傳統 GPIO 沒有 Arduino類 比的控制,完美相容 Raspberry Pi 2 Model B 和 B+,只需要將它插到樹莓派主機板上,通過 Grove 連接各式感應器。其中 I2C=I²C(Inter-Integrated Circuit)字面意思是積體電路之間,它是一種『串 列通訊匯流排』,所以 Grove LCD 包括 Vcc、GND、串列數據線SDA、串列時脈線SCL,共 4 pins 控制。

4. GrovePi+ 僅有 26 pins 和樹莓派 3 連接,相容 Raspberry B/B+/樹莓派 2,因為兩種版本前 26 pins 腳 位均相同。上層 GrovePi+的 26 pins 仍可繼續當一般 GPIO 控制使用。

(18)

5. GrovePi 可幫忙遠離那些亂糟糟的杜邦線和焊錫,讓 Raspberry pi 隨插即用,讓你的樹莓派與傳感 器連接起來,感知神奇的物理世界吧!學校購買的 Grove 教學模組包括:

- Grove 蜂鳴器× 1 - Grove - 聲音感應器 × 1 - Grove - 溫溼度感應器 × 1 - Grove - 光感應器 × 1 - Grove - 繼電器× 1 - Grove - 按壓模組 × 1

- Grove - 超音波測距儀× 1 - Grove - 角度感測器 × 1 - Grove- LCD RGB 背光模組× 1 - Grove LED 模組(紅) × 1 - Grove LED 模組(藍)× 1 - Grove LED 模組(綠) × 1

6. 使用 Grove 控制方式和之前介紹 GPIO 方式不同,import 元件名稱不同,其他許多範常式式置於 『/home/pi/GrovePi/Projects』或『/home/pi/GrovePi/Software/Python』,請自行參閱修改即可。

7. 透過可調電阻 VR 控制調整 LED 亮度,程式碼參閱/home/pi/GrovePi/Projects/LED_Fade/led_fade.py

import time

import grovepi #grovepi 需另外安裝,目前作業系統已經安裝成功,可直接練習 # Connect the Rotary Angle Sensor to analog port A2 將可調電阻元件接在 A2 位置 potentiometer = 2

# Connect the LED to digital port D5 將 LED 接在 D5 位置 led = 5

grovepi.pinMode(led,"OUTPUT") time.sleep(1)

(19)

i = 0 while True: try:

# Read resistance from Potentiometer i = grovepi.analogRead(potentiometer) print(i)

# Send PWM signal to LED grovepi.analogWrite(led,i//4) except IOError:

print("Error")

註 1:大部分執行中的錯誤, Python 直譯器 (interpreter) 會以發起例外 (exception) 的方式來中斷程式的執 行。實際上,很多情況下我們需要自行控制可能會產生例外的程式碼,因為例外並不全然是程式的邏 輯錯誤,例如程式中打算開啟檔案,然而實際檔名並不存在,這種情況下,我們需要的是例外發生後 的處理動作,而非中止程式的執行。凡是可能會產生例外的程式碼,Python 利用 try - except 陳述 (try-except statement) 讓程式設計師自行處理例外。

註 2:當程式碼用到 grovepi.analogRead( )要接在 A0~A2,傳回值介於 0~1023,因為內建 10 位元 ADC, 當程式碼用到 grovepi.digitalRead( )要接在 D2~D8,為何沒有 D0~D1,因為是要接到 Serial port,在 ATmega328, D0 接 Rx (receive)接收、 D1 接 Tx(transmit)傳送。

註 3:在 Arduino 數位腳有 D0~D13、類比腳 有 A0~A5,而類比腳位亦可當數位腳使用。所以在 GrovePi 中,D2~D8 除可使用於digitalRead( ) 與 digitalWrite( ),其中D3~D6 也同時支援脈波調變控制 Pulse Width Modulation (PWM) ,即 analogWrite( ),值介於 0~255 之間,但 D3~D6 並不支援 analogRead( ) 。

8. 利用超音波讀取距離,低於 10 公分啟動繼電器 Relay,實際繼電器 Relay 應用可控制大門門鎖,程

式碼參閱/home/pi/GrovePi/Projects/ Ultrasonic_And_Relay/ Ultrasonic_And_Relay.py

from grovepi import *

# Connect the Grove Ultrasonic Ranger to digital port D3,腳位 SIG,NC,VCC,GND ultrasonic_ranger = 3

Relay_pin = 2

pinMode(Relay_pin,"OUTPUT") while True:

try:

# Read distance value from Ultrasonic 讀取超音波距離

distant = ultrasonicRead(ultrasonic_ranger) #API 已經幫忙轉換,所以超簡單 print(distant,'cm')

(20)

if distant <= 10: # when object close to it within 10cm, the relay will turn on digitalWrite(Relay_pin,1) else: digitalWrite(Relay_pin,0) except TypeError: print("Error") except IOError: print("Error") 9. 讀取溫濕度數值,透過 LCD 顯示結果,程式碼參閱/home/pi/GrovePi/Projects/LCD_DHT/LCD_DHT.py

# Temperature 溫度 and Humidity 濕度 from the DHT sensor is printed on the RGB-LCD Display # 0 - DHT11 - blue one - comes with the GrovePi+ Starter Kit

# 1 - DHT22 - white one, aka DHT Pro or AM2302 # 2 - DHT21 - black one, aka AM2301

from grovepi import * from grove_rgb_lcd import *

dht_sensor_port = 7 # Connect the DHT sensor to port 7 將溫濕度感測元件接在 D7 位置

dht_sensor_type = 0 # change this depending on your sensor type 參考第 3 行註解,藍色設 0、白色設為 1 while True:

try:

[ temp,hum ] = dht(dht_sensor_port,dht_sensor_type) #從 DHT sensor 取得溫度與濕度數值 print("temp =", temp, "C\thumidity =", hum,"%")

t = str(temp) h = str(hum) setRGB(0,128,64) setRGB(0,255,0) setText("Temp:" + t + "C " + "Humidity :" + h + "%") except (IOError,TypeError) as e: print("Error")

註 1:Grove LCD RGB Backlight 是一款 16×2 的 LCD 顯示器,採用了 RGB 的背光燈,整個模塊使用 I2C 的通信方式,所以只需兩個 I/O 埠(SCL、SDA 兩條)即可完成控制,省下來的 I/O,可以用來做更多有意

義的事情。另外,可以利用程式指令 setRGB 改變 LCD 背光的全彩顏色,關於 LCD 其他控制範例亦可

參考『/home/pi/GrovePi/Software/Python/grove_rgb_lcd』。

註 2:It does not conflict if use I2C Socket simultaneously because every I2C device has its own address.

(21)

Raspberry Pi Pi 3 擴充套件是將樹莓派的 GPIO 介面透過 ARPI600 轉換成 Arduino 的硬體介面可以讓你直接使用 Arduino 介面的擴充板 以及感測器,同時解決樹莓派沒有 AD0~AD5 類比輸入(GrovePi 僅三組)。由於 Arduino 是一個龐大的生態圈,有眾多的感測器,如果能 將 Pi 介面轉換為 Arduino 標準,那就能接入各種 Arduino 擴展板,接入 Arduino 生態圈,獲得更多可用資源。

[ 介面簡介 ] 1. Arduino 介面 方便接入各種 Arduino 擴展板(Shield) 2. ICSP 介面 Arduino 的 ICSP 介面 3. XBee 介面 方便接入各種 XBee 通信模組 4. 感測器介面 方便接入各類感測器模組 5. RPi 連介面 方便接入樹莓派 6. USB TO UART 介面 [ 器件簡介 ] 7. TLC1543 AD 轉換晶片 8. PCF8563 RTC 即時時鐘晶片 9. CP2102 10. 32.768KHZ 晶振 RTC 即時時鐘晶振 11. 電源指示燈 12. XBee 狀態指示燈 13. XBee 和 Arduino 介面重定按鍵 14. XBee EASYLINK 按鍵 15. RTC 即時時鐘供電電池座 接 CR1220 紐扣電池 [ 跳線說明 ] 16. TLC1543 參考電壓配置跳線 17. RTC 跳線 18. UART 跳線 P_RX 接 CP_TX,P_TX 接 CP_RX: USB TO UART 接樹莓派串口 XB_RX 接 CP_TX,XB_TX 接 CP_RX: USB TO UART 接 XBee 串口

XB_RX 接 P_TX,XB_TX 接 P_RX: 樹莓派串口接 XBee 串口 19. Arduino AD 選擇跳線 短接 2 與 3:Arduino 的 A0-A5 作為 AD 輸入腳 短接 1 與 2:Arduino 的 A0-A5 作為數位控制腳 20. Arduino I2C 選擇跳線 短接後,Arduino 的 A4 和 A5 作為 I2C 控制腳 (Arduino AD 選擇跳線的 A4 和 A5 需要懸空) 21. Arduino SPI 選擇跳線 短接 1 與 2:Arduino 的 D11-D13 作為 SPI 控制腳(默 認) 短接 2 與 3:Arduino 的 D11-D13 作為數位控制腳

(22)

樹莓派作業系統均是放在 SD 內,利用 Win32DiskImager軟體備份成映像檔,實際分成 boot 啟動 區與 6.43GB 資料區,資料區由於是 Linux 格式無法查看內容,查看磁區分割方式是在 Windows 7 桌 面『電腦圖示按右鍵→管理→磁碟管理』,若使用較大 SD 卡時,發現會浪費未使用到的空間。

可在樹莓派終端機執行 $sudo raspi-config,直接按 Enter 選擇第一項Expand Filesystem,作

用是將剛才寫入到 SD 卡中的映像文件大小擴展到整張SD 卡中,最後再用 $df -h 檢查 SD 使用空間。

若要變回一個磁區需下載 SD Formatter 4.0 軟體,否則格式化無法使用整個 SD 空間,該軟體下

載網址https://www.sdcard.org/cht/downloads/formatter_4/eula_windows/index.html,安裝後每次執行 都要按『選項設定→邏輯大小調整改設為 ON→OK→格式化→確定→確定→確定』。

(23)

補充:如何將 img 映象檔案16GB 備份到較小的8GB 或相同8GB,但因不廠牌而容納不下之解決方法, GParted 是一個免費 partition 管理工具,僅用於Linux 作業系統,將檔案重新命名 myimage.img 方便複製貼上。 sudo apt-get install gparted

cd /media/pi/32GB sudo modprobe loop sudo losetup -f

sudo losetup /dev/loop0 myimage.img sudo partprobe /dev/loop0

sudo gparted /dev/loop0

掛載後,選取 ext4區→『分割區→調整大小/移動』→拖曳調整大小(須預留一點空間做搬移)→按下方 『調整大小/移動』按鈕→上方綠色 V 按鈕套用→X 關閉視窗,接著下一行目的是卸載 img 檔案。

sudo losetup -d /dev/loop0 fdisk -l myimage.img

上一行是查看 END 做後位置,填入下方0位置,以便實際縮小 img 大小

truncate --size=$[(0+1)*512] myimage.img

(24)

之前介紹的是 Raspbian 免費操作系统,開機與關機都較快,但介面和微軟比較不同,在操作上

各位會較不孰悉。接著介紹 Ubuntu MATE 免費操作系统,中文介面很漂亮,缺點是效能稍慢,優點

是類似微軟操作介面,按SHIFT中英文切換,在終端機執行sudo su 切換到超級使用者需要輸入密碼

(4個空白鍵),兩者都會同時安裝 Libre Office。另外 FireFox 火狐瀏覽器不支援 Google 相簿播放,需 利用Midori 瀏覽器方可正常看到。

Raspbian系统是執行 $sudo raspi-config,選擇Expand Filesystem,將SD卡中的映像文件大

小擴展到整張 SD卡中,但Ubuntu MATE系统方式不一樣,需到『系統→歡迎』裡面直接調整到整個 SD,或系統→偏好設定→硬體→磁碟,將未使用到的磁區重新建立,會在桌面多一個磁碟圖示供使用。 自動偵測 擷取畫面(可延遲) FireFox瀏覽器 Midori 瀏覽器 關機 回收桶 4 個子視窗供切換

(25)

若想專用來看影片,建議使用 OSMC(Open Source Media Center)專門做影音播放,可支援 mkv 高畫 質影片,僅需使用2GB的 SD 即可安裝,並可搭配用手機下載Kore,Official Remote for Kodi APP 當作遙 控器,但需同一網域方可遙控,影片請先複製到隨身碟即可,然後選擇『影片→檔案→隨身碟』。 關機 最後介紹 NOOBS 可做多重開機,即 1 張 SD 可安 裝多種作業系統,V1.3 適用於 Pi2,種類較多,到 2016.8 下載為 V1.9 版本,用於 Pi3 僅剩四種供選擇,但 不建議使用,因為裡面各系統不一定是最新,且磁區無 法自行決定,一個系統錯誤需整張 SD 重弄,所以建議 多準備幾張 SD 卡做練習與備份。---泰山高中 陳致中

參考文獻

相關文件

[r]

使用 MapleTA 做作業,是本課程的主要學習活動之一。今年 4—6 月課程進 行期間,NCUx 學習平臺可以和 Windows 伺服機上面的 MapleTA,以 LTI 介面 進行串接。可是,我們在 9

‡圖形使用者介面( graphical user interface GUI). ‡圖形使用者介面( graphical user

策 – 引導資源 促進參與與發展 訂立「 財政預算 」政策 1.3 應對學生人口下降 – 訂. 立處理超額教師機制 凝聚團隊及擴充財政

• 下面介紹三種使用greedy algorithm產生minimum cost spanning

 其中包括有多款燈具、兩款床頭櫃, 以及可以單獨購買用來給 現有家居升級的充電墊配件 。 據悉這些產品全都是基於 Qi 標 準,市面上主流的那些 無線充電手機應該都可以使用

Zivot and Andrews(1992) 將 Perron(1989) 擴充成考慮未知結構性 轉變的單根檢定 , 其概念與之前 max-Chow 檢定一樣 : 找出一個轉 變點

上傳額外的 媒體素材 點擊以切換至