前言
Raspberry Pi 是像名片一樣大小的低價電腦 ,搭配各種外接裝置,能做許多應用。最近對這類開發板有興趣,於是我也買了一片 Raspberry Pi 2 來學習使用。原計畫的應用要搭配可感測壓力的 sensor,偵測使用者施壓的力量大小,但過程中遇到許多困難,尤其是類比訊號的 sensor 適合 Arduino 用,但接上 Raspbery Pi 無法直接使用。基於這方面的中文文件較少,逐一摸索克服之後,決定寫一篇教學,分享給有同樣需要的朋友,可以少走一些冤枉路。本文使用的硬體裝置
- Raspberry Pi 2 開發板
- 類比-數位轉換器 (ADC): Microchip MCP3008
- 力量感測 (FSR): Interlink FSR 406
- 麵包板及各種杜邦跳線
MCP3008 |
FSR 406 |
詳細實驗過程
類比-數位轉換器 (ADC, analogue to digital converter)
坊間買得到的 sensors,部份是輸出類比訊號 (例如 linear hall effect sensor、溫度感測...等等),而 Raspberry Pi 無法讀取類比訊號 (Arduino 可以),要額外加裝一枚 ADC 晶片,才能讀取。但這是值得的投資,可以在不用買 Arduino 轉板的情況下,讓 RPi 可以玩 Arduino 的類比 sensors。推薦大家用 Microchip MCP3008,因為外國網站的教學幾乎都是這款,資料好找。缺點是電子商場不常賣。拍賣網站可取得,但推薦 RS components 網站訂購,便宜不少還免運費 (缺點是一次一定要買兩顆以上,到貨要一週)
MCP3008 是 10-bit 的 ADC,可以將輸入類比訊號轉成 0 - 1024 之間的數值,透過 SPI 界面 (不是一般 GPIO) 讓 Raspberry Pi 讀取
連接 MCP3008 到 RPi 有兩篇不錯的教學可以參考 (請搭配下列注意事項):
https://learn.adafruit.com/reading-a-analog-in-and-controlling-audio-volume-with-the-raspberry-pi/overview
http://atceiling.blogspot.tw/2014/04/raspberry-pi-mcp3008.html#.VnWKzHYiLmU
有幾點要特別注意的
- 這兩篇適用舊款 Raspberry Pi 一代,若是 RPi2,照著前述教學文件接,是完全不會動的,因為 GPIO 腳位改了。請照新的 RPi2 腳位圖連接,接法相同,但所有 SPI 相關的 pin 位置幾乎都不同。
- Rasbian 系統預設沒開 SPI 界面,需要手動開啟 (可用 raspi-config 工具,在 Advanced 選項裡面開啟 SPI)
- 若 SPI 無法運作,可用 spi-test 程式檢測。需要注意的是,檢測時要用一條母-母跳線,把 SPIO MOSI 和 SPIO MISO 這兩個 pin 直接對接起來。這個動作很容易漏掉,會造成測試失敗。(原理是直接把 SPI 輸出 loop back 回輸入,也就是你送出去的資料會繞一圈送回來又送給自己,所以理論上只要 SPI 有運作,一定收得到資料,故可用來檢測)
力量感測器 (force sensing resistor)
感測的是「力量」而非「壓力」,偵測範圍約 10 g - 10 Kg,在 sensor 上有效區域施力都能偵測,但精度不佳,且無法判斷施力點位置。主要的生產商是 Interlink,型號從 FSR 400-408 有多種尺寸,但一般店面少見大尺寸,款式很少,建議網拍購買較便宜。(本文使用 FSR406)需要特別注意的,是 FSR 406 的連接方式。FSR 尾端的接頭"理論上"直接插上麵包板即可用,但這樣使用容易折彎連接頭造成 FSR 損壞或訊號干擾,建議還是用連接線。不幸的是,一般接 sensor 和麵包板用的杜邦 2.54 mm 跳線母頭,無法接上這款 FSR。經實驗可使用 JST (XH-style) 2.5 mm 的母頭代替,可密合得很好。建議購買這種線,然後在另外一端「自行壓製」杜邦 2.54 mm 的公頭,就可以製作出能從麵包板轉接到 FSR 406 的延長線了。
XH-style 的 JST 2.5 mm 線,以及其塑膠頭 |
FSR 406 的尾端接不上一般杜邦 2.54 跳線母頭,我問了三間電子商場,都說沒這種接頭,建議我直接焊接。我不死心,把每一種母頭都拿起來試接,發現 JST 2.5 mm 的正好可以密合,如圖,接得很好。 |
自行購買的杜邦 2.54 公端子和塑膠套,準備壓在 JST 2.5 線的另外一端 |
把 JST 2.5 mm 的線材,另外一端自行壓上杜邦 2.54 端子,就成了特製的延長線了,可以順利插入到麵包板上。理論上壓製線材,有專用的端子鉗,但是售價太過昂貴,我又很少用。所以最後是使用尖嘴鉗和蠻力土法煉鋼。一樣可以壓緊,也能用,但是形狀較為醜陋,而且我壓壞了一個... |
FSR 連接方式
連接 FSR 可以參考這篇教學,照著接即可,只有幾點要注意- 原教學是把電壓變化的類比訊號,接到 Arduino 的訊號輸入,而我們是要接給 ADC 讀取轉成數位訊號,所以是要改接到 MCP 3008 的 channel (0 - 8 都可以,程式內可以控制要讀哪個 channel)
- FSR 只是一個電阻,本身不發出訊號,但它受到壓力電阻會變小。所以施加電壓,通過的電流大小,就可以反映出所受到的力量 (但不是線性變化)。不過我們不能直接讀電流大小,所以需要額外串聯一個電阻 Rm 做 voltage dividing,來讀取 Rm 兩端的電壓,而這個電壓就是我們給 ADC channel 的訊號輸入。(原理是:當 FSR 受到越大壓力,電阻變小,則通過的電流越大,此時串聯的電阻 Rm 兩端就會有較高的電壓 V = I * Rm 所以我們讀取 ADC,就會讀到比較大的數值了)
- 施加外力大小,和 FSR 的電阻或可以量到的電壓都不是線性關係,請見官方文件有曲線圖
- 串接的電阻不同,會使得能夠測量到的數值範圍改變,雖然教學文件建議 10K歐姆,不一定適合每種應用,需要實驗。
如果還需要 FSR 更完整詳細的資訊,可參考這篇 Integration Guide
程式範例
#!/usr/bin/env python3
import time
import spidev
# Read SPI data from MCP3008, Channel must be an integer 0-7
def ReadADC(spi, ch):
if ((ch > 7) or (ch < 0)):
return -1
adc = spi.xfer2([1,(8+ch)<<4,0])
data = ((adc[1]&3)<<8) + adc[2]
return data
if __name__ == "__main__":
spi = spidev.SpiDev()
spi.open(0,0)
try:
while True:
value = ReadADC(spi, 0)
print("ADC", value, float(value)*100/1024, "%")
time.sleep(0.1)
except KeyboardInterrupt:
pass
spi.close()
省錢小撇步
使用麵包板時,經常需要用跳線連接。市售跳線盒很方便,有多種長度彩色的短線可用。或也可用杜邦公-公跳線取代,但跳線盒一個通常要 80 - 150 元不等,而杜邦跳線現成的一包十條約 65元,長度通常太長,很難使用。推薦可以買單芯線替代,用剪刀就能輕易剪出所需長度,再兩端剝皮,可做麵包板跳線,三公尺才約台幣 10 元,非常划算又好用。(剝皮用剪刀輕輕的就可以剝,小心一些並不需要專用鉗子)
把公-公跳線都換成單芯線,清爽很多,才花不到十元。缺點是我只買了一種顏色。後來我把接地的那幾條用奇異筆塗成黑色,就不會搞錯了... =.= 其實應該要買白色的,這樣需要什麼顏色的線就自己塗色就好了 XDD |
以上是本次實驗的經驗分享,希望對有在玩 RPi + FSR 的朋友有幫助。