星期四, 4月 24, 2014

Raspberry Pi 筆記(二十):MCP3008 讀取類比訊號測溫度與光度

[2014/04/22]
兩三個星期前到台北光華商場電子材料行找 MCP3008 這顆 IC,竟然問了三家都沒有賣這個IC,還是上網去買才買到。為什麼要使用這個 IC 呢? 主要是因為Raspberry Pi沒有支援類比訊號輸入,例如要用Raspberry Pi去讀取溫度或光度偵測的類比訊號,是無法達成的。MCP 3008這個 IC的功能就是將類比訊號轉換成數位訊號(Analogue-to-digital converter, ADC),它有8通道 ,每個通道可依類比設備的輸入值傳回一個10位元的數值。MCP3008可使用SPI介面跟Raspberry Pi連接,以下就來看看如何運用MCP3008偵測溫度和光度。


[MCP3008]

MCP3008讀取ADC數值時,會傳回一個10-bit的數字,介於0到1023之間,可以根據輸入電壓與傳回值的電壓,計算出類比訊號的值,再根據類比設備的特性得到所需的資訊。可參考MCP3008 Datasheet 。

圖片來源:MCP3008 Datasheet

MCP3008 pinout description (接腳說明)
來源:MCP3008 Datasheet

Digital Ground (DGND):Digital ground 連接至內部數位電路
Analog inputs (CH0 - CH7):類比通路0 - 7
Chip Select/Shutdown (CS/SHDN):CS/SHDN pin當設定為低電壓時,被用來啟動設備間的通訊;設定為高電壓時,停止設備間的通訊進入等待狀態。CS/SHDN pin在通訊時必須設定為高電壓才能進行通訊。
Serial Data Output (DOUT):SPI串列通訊時資料輸出,資料會因為設備間通訊的時序變化而改變。
● Serial Data Input (DIN):SPI Port串列資料輸入,用來載入設定資料給通訊設備。
● Serial Clock (CLK):SPI clock pin被用來啟動通訊。
來源:MCP3008 Datasheet

[溫度感測元件LM35]

LM35是一個常見的溫度感測IC,根據技術文件說明LM35輸出電壓與攝氏溫標呈線性關係,0℃時輸出為零,每提高1℃輸出就增加10mV。由此特性,我們可以根據輸出電壓換算測得的溫度,例如:測得電壓0.24V時,表示當時溫度為24℃。可參考LM35 Datasheet 。

  來源:網路

[光敏電阻(Photocell)]

光敏電阻是一種特殊的電阻,簡稱光電阻,又名光導管。它的電阻和光線的強弱有直接關係。當有光線照射時,電阻內原本處於穩定狀態的電子受到激發,成為自由電子。所以光線越強,產生的自由電子也就越多,電阻就會越小。在光線越暗時,電阻值會越高。
  來源:網路

[材料]

• Raspberry Pi 主板 x1
• MCP3008 IC  x1
• LM35 IC x1
• 光敏電阻 x1
• 10K電阻 x1
• 連接線  x N條

[線路連接與電路圖]

• MCP3008 CH0接光敏電阻,光敏電阻另一隻腳接地(GND)
• MCP3008 CH0接10K電阻,10K電阻另一隻腳接3.3V
• MCP3008 CH1接LM35中間接腳,LM35另外兩隻腳分別接3.3V及接地
• MCP3008 pin16(VDD)及pin15(VREF)接3.3V,pin14(AGND)及pin9(DGND)接地
• MCP3008 pin13(CLK)接Pi pin23(SCLK);pin12(DOUT)接Pi pin21(SPI0_MISO);pin11(DIN)接Pi pin19(SPI0_MISI);pin10(CS/SHDN)接Pi pin24(SPI0_CE0)

[2017/02/21] 更新上述接線,改為表格。


MCP3008
Pi
Pin 1 (CH0)

Pin 2 (CH1)

Pin 3 (CH2) 

Pin 9 (DGND)
Pin 6 (Ground)
Pin 10 (CS/SHDN)
Pin 24 SPI0_CE0 (GPIO8)
Pin 11 (DIN)
Pin 19 SPI0_MISI (GPIO10)
Pin 12 (DOUT)
Pin 21 SPI0_MISO (GPIO9)
Pin 13 (CLK)
Pin 23 SCLK (GPIO11)
Pin 14 (AGND)
Pin 6 (Ground)
Pin 15 (VREF)
Pin 1 (3.3V)
Pin 16 (VDD)
Pin 1 (3.3V)



[程式碼]

import spidev
import time
import os

# open(bus, device) : open(X,Y) will open /dev/spidev-X.Y
spi = spidev.SpiDev()
spi.open(0,0)

# Read SPI data from MCP3008, Channel must be an integer 0-7
def ReadADC(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

# Convert data to voltage level
def ReadVolts(data,deci):
    volts = (data * 3.3) / float(1023)
    volts = round(volts,deci)
    return volts

# Calculate temperature from LM35 data
def ConvertTemp(data,deci):
    temp = data * 100
    temp = round(temp,deci)
    return temp

# Define sensor channels
light_ch = 0
temp_ch  = 1

# Define delay between readings
delay = 3

while True:

  # Read the light sensor data
  light_data = ReadADC(light_ch)
  light_volts = ReadVolts(light_data,2)

  # Read the temperature sensor data
  light_data = ReadADC(light_ch)
  light_volts = ReadVolts(light_data,2)

  # Read the temperature sensor data
  temp_data = ReadADC(temp_ch)
  temp_volts = ReadVolts(temp_data,4)
  temp       = ConvertTemp(temp_volts,2)

  # Print out results
  print "Temp  : ",temp_data, " (",temp_volts ,"V) -->",temp,"~C    Light : ",light_data," (",light_volts,"V)"

  # Delay seconds
  time.sleep(delay)

*註:data = ((adc[1]&3)<<8) + adc[2] 其中<< 因造成網頁編碼錯誤,改用全型小於符號,如需複製程式使用請改為半型

[程式解說]

程式中有一行spi.xfer2,他會送出3 Bytes 給Device,第一個位元是1,相當於二進位的00000001,″8+ch″表示Device的頻道位置,變成"00001000",″<<4″往左移 4個位元(bits),變成 ″10000000",最後一個字元是0,亦即 "00000000"。而程式中 "spi.xfer2([1,(8+channel)<<4,0])"會送出 " 00000001 10000000 00000000" 給接收設備,設備回應三個Bytes回來,而傳回值會放在最右邊10個Bits位置,該值介於0跟1023之間。我們可根據這個數字,判斷光度、溫度等類比的訊號。

[執行結果]


[參考資料]

Raspberry Pi Cookbook
Raspberry Pi Spy : Analogue Sensors On The Raspberry Pi Using An MCP3008
● 維基百科 : 光敏電阻
Share:

星期二, 4月 08, 2014

Raspberry Pi 筆記(十九): Webcam 拍照與瀏覽串流媒體

[2014/04/03]
RaspBerry Pi官方推出直接安裝在 Pi主機的攝影鏡頭,使用軟性排線插在主機板上,而非使用USB介面。考量Webcam的多用途性,我買了相容性比較高的 Logitech Webcam C310,畫質稍好,價格又不會太高。Webcam有兩個用法,一是拍照存檔成jpeg檔,另一個功能是拍攝成影片,前者安裝 fswebcam就可以達成,要作為監視器使用,則需安裝 motion 軟體。

[安裝fswebcam]

下載安裝fswebcam軟體:
$ sudo apt-get install fswebcam

拍照存成 test.jpg
$ fswebcam test.jpg

拍成的照片,畫質不佳,如果要改變畫質,可以在同目錄下建立conf 檔:
$ vi .fswebcam.conf
設定檔內容如下:
device /dev/video0
input 0
loop 15
skip 20
background
resolution 640x480
set brightness=60%
set contrast=13%
top-banner
font /usr/share/fonts/truetype/msttcorefonts/arial.ttf
title "EvilEye cam-O-tron"
timestamp "%d-%m-%Y %H:%M:%S (%Z)"
jpeg 95
save /home/pi/fswebcam/viewcam.jpg

執行fswebcam結果如下:




[安裝影像軟體 Motion]

先檢查插在USB的 Webcam 是否已經驅動:
$ sudo lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 005: ID 046d:081b Logitech, Inc. Webcam C310
Bus 001 Device 004: ID 0bda:8179 Realtek Semiconductor Corp.

安裝 motion 軟體
$ sudo apt-get install motion

安裝完成後,修改設定檔 motion.conf ,將DAEMON OFF改為ON,設定為自動啟動motion,Webcam_localhost ON改為 OFF,不從Raspberry Pi連線至Webcam
$ sudo vi /etc/motion/motion.conf
daemon on
webcam_localhost = off

[2017/12/11]
沒找到上述第二行,改成:
steam_localhost  off

# Web連線使用8081 Port
webcam_port 8081
# 管理用的連線使用8080 Port
control_port 8080

#如果要修改畫面大小,可修改
# 影像寬度 (pixels). 預設: 320
width 640
# 影像高度 (pixels). 預設: 240
height 480
# 影像品質(百分比). 預設: 50
webcam_quality 100

 
640*480, 畫質75% 畫面

修改 /etc/default/motion 將 start_motion_daemon=no 改為 yes
$ sudo vi /etc/default/motion
start_motion_daemon=yes

重新啟動 motion 服務
$ sudo service motion start

 如果要查詢您的 USB WebCam是否支援Raspberry Pi,可以到以下網站查詢:
http://elinux.org/RPi_USB_Webcams

剛開始我使用 IE 連線時,會要我下載檔案,然後下載了2-3mb還是無法看到影像,在論壇上找了很久,有網友告知使用 Firefox 或 Safari 就可以看到影像畫面了。可參考:Raspberry Pi Forum : can't view streaming in browser

參考資料
Raspberry Pi Cookbook
Pi Cam
● R3uk.com: Webcam capture using fswebcam
Share:

星期一, 4月 07, 2014

Raspberry Pi 筆記(十八):模擬DOS環境

[2014/04/07]
大約在1980年代,電腦都是從DOS開始學起,看著 C:\>的符號,輸入指令,感覺很復古又很熟悉。現在 Raspberry Pi 系統也可以模擬DOS環境,也可以執行DOS程式及玩遊戲。最懷念的是以前學習 Basic 語言及 DBASE III 資料庫系統,竟然在RaspBerry Pi系統可以執行DBASE III程式,真是感動。在Raspberry Pi我安裝兩種模擬DOS的程式,一是 rpix86,另一套是DOSBOX,若以執行的功能而言,我會推薦 DOSBOX,它在 X-Win 的環境下,可正常執行VGA畫面的程式。以下就來看看如何在RPi安裝DOS模擬程式:


[DOSBOX]

下載安裝:
$ sudo apt-get install dosbox

執行時需在X-Windows環境下,在LXTerminal終端機輸入dosbox:
$ sudo dosbox
即可看到以下畫面:

此時,鍵盤對應有問題,按鍵無法對應正確的英文字,必須修改Conf 檔(以0.74版為例):
$ vi /root/.dosbox/dosbox-0.74.conf

找到usescancodes 將 true 改成 false
usescancodes=false

預設Z:\>僅只有系統檔案,如果要將/home/pi掛載進來,可修改.conf 檔,找到[autoexec]哪段,加入以下紅字部分即可。
[autoexec]
# Lines in this section will be run at startup.
# You can put your MOUNT lines here.
mount c /home/pi
c:


或執行以下指令掛載磁碟機:
Z:\> mount c /home/pi

下載 Chess Genius 3 進行測試,可以成功執行,只是速度稍微慢一點。

有名的正宗台灣十六張麻將2,DOS版。


[rpix86]


rpix86特點如下:
• rpix86 模擬 80486 CPU 大約 20MHz 速度
• rpix86 模擬 Super-VGA 介面卡,可以執行 640x480  256 色解析度
• rpix86 模擬 SoundBlaster 2.0音效卡
• 支援 US鍵盤及兩鍵滑鼠
• 支援 COM1串列Port

下載安裝 rpix86 DOS模擬程式
$ wget http://rpix86.patrickaalto.com/rpix86.tar.gz

解壓縮並執行程式
$ tar -xf rpix86.tar.gz
$./rpix86

此時會出現以下畫面,要求下載4DOS程式,回覆 Y

執行DOS指令及程式
我下載GWBASIC測試,結果V3.23這個版本可以正常執行,其他一些VGA畫面的DOS遊戲都無法執行,改天找時間再來測試看看。

執行GWBASIC後發現只要有用到Shift按鍵的字元都無法呈現,不知如何解決?

執行DBASE III畫面
如果要瞭解支援哪些程式,可到以下網站查看清單:DSx86 Compatibility WIKI


參考資料
rpix86:http://rpix86.patrickaalto.com/index.html
DOSBOX:http://www.dosbox.com/
Share: