先前做的實驗控制智能車,是利用鍵盤控制方向 (可參考 Raspberry Pi筆記(十四):用鍵盤透過無線網路控制智能車),操控車子的方向不是那麼便利。如果可以透過搖桿的方式操控,應該會更容易控制小車的方向。這次實做希望使用搖桿的方式來控制車子的方向,由於搖桿的特性是類比訊號,如要轉成數位,需要透過 MCP3008 讀取搖桿的位置,再轉換成數位數值,透過判斷這些數值,可以用來控制智慧小車的方向。以下就來看看如何安裝與設定搖桿與 Pi 連接。
使用 MCP3008 之前,需要先開啟 SPI,有關如何開啟 SPI,可參考:Raspberry Pi 筆記(二):GPIO接腳與 I2C 及 SPI 安裝 。
有關本篇 MCP3008 IC 規格及相關介紹,可參考另一篇文章:Raspberry Pi 筆記(二十):MCP3008 讀取類比訊號測溫度與光度 。
• 搖桿 JoyStick x 1
• MCP3008 x 1
• 10K 電阻 x1
• 排線 x 17 條
• MCP3008 連接 Raspberry Pi
• 接線完成的照片
• 本實驗使用的搖桿 JoyStick
• 接線線路圖
在測試按下搖桿時,讀取的數值都是1023,後來是將電阻換成 1K的,按下時會是 1023,放開時,數字低於 1023。10K電阻主要是將開關輸入電壓拉高 (3.3V),當按下開關時,輸入連接到地(0V)。如果沒有電阻,當搖桿沒有被按下並讀取隨機值時,輸入將處於未定義狀態。可以試一試。
上述的程式參考 Matt Hawkins 撰寫的程式,如需要原始程式測試搖桿,可到以下網址下載:
下載後,執行程式:
使用 MCP3008 之前,需要先開啟 SPI,有關如何開啟 SPI,可參考:Raspberry Pi 筆記(二):GPIO接腳與 I2C 及 SPI 安裝 。
有關本篇 MCP3008 IC 規格及相關介紹,可參考另一篇文章:Raspberry Pi 筆記(二十):MCP3008 讀取類比訊號測溫度與光度 。
[材料]
• Raspberry Pi 2 Model B x 1• 搖桿 JoyStick x 1
• MCP3008 x 1
• 10K 電阻 x1
• 排線 x 17 條
[線路連接與電路圖]
• 搖桿 JoyStick 連接線路
搖桿
|
Pi / MCP3008
|
GND
(Ground)
|
Pi Pin 6 (Ground)
|
5V (3.3V)
|
Pi Pin 1 (3.3V)
|
SW (Switch)
|
MCP3008 Pin 1 (CH0)
|
VRx
(X voltage)
|
MCP3008 Pin 2 (CH1)
|
VRy
(Y voltage)
|
MCP3008 Pin 3 (CH2)
|
• MCP3008 連接 Raspberry Pi
MCP3008
|
Pi
|
Pin 1
(CH0)
|
|
Pin 2
(CH1)
|
|
Pin 3
(CH2)
|
|
Pin 9
(DGND)
|
Pin 6 (Ground)
|
Pin 10 (CS)
|
Pin 24 (GPIO8)
|
Pin 11 (DIN)
|
Pin 19 (GPIO10)
|
Pin 12 (DOUT)
|
Pin 21 (GPIO9)
|
Pin 13 (CLK)
|
Pin 23 (GPIO11)
|
Pin 14 (AGND)
|
Pin 6
(Ground)
|
Pin 15 (VREF)
|
Pin 1
(3.3V)
|
Pin 16 (VDD)
|
Pin 1
(3.3V)
|
• 接線完成的照片
• 本實驗使用的搖桿 JoyStick
• 接線線路圖
[程式]
import spidev import time import os # open SPI bus spi = spidev.SpiDev() spi.open(0,0) # read SPI data from MCP3008 , Channel must be 0-7 def ReadChannel(channel): adc = spi.xfer2([1,(8+channel)<<4,0]) data = ((adc[1]&3) << 8) + adc[2] return data # Define sensor channels sw_ch = 0 vx_ch = 1 vy_ch = 2 # Define delay between readings delay = 0.5 while True: # Read the joystick position data vx_pos = ReadChannel(vx_ch) vy_pos = ReadChannel(vy_ch) # Read switch state sw_val = ReadChannel(sw_ch) if int(vx_pos) >= 800: print "UP..." if int(vx_pos) <= 300: print "Down..." if int(vy_pos) <= 300: print "Left..." if int(vy_pos) >= 800: print "Right..." if int(sw_val) >= 1023: print "Press..." # Wait time time.sleep(delay)
[程式說明]
為了要使用搖桿控制小車,將程式改為判斷搖桿的方向,並在螢幕顯示搖桿往上「Up」、往下:「Down」、往左:「Left」、往右:「Right」及按下:「Press」。程式判斷往左及往下時當數字小於 300時,觸發顯示。往右及往上時,當數字大於 800時,觸發顯示。在測試按下搖桿時,讀取的數值都是1023,後來是將電阻換成 1K的,按下時會是 1023,放開時,數字低於 1023。10K電阻主要是將開關輸入電壓拉高 (3.3V),當按下開關時,輸入連接到地(0V)。如果沒有電阻,當搖桿沒有被按下並讀取隨機值時,輸入將處於未定義狀態。可以試一試。
上述的程式參考 Matt Hawkins 撰寫的程式,如需要原始程式測試搖桿,可到以下網址下載:
$ wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/mcp3008/mcp3008_joystick.py
下載後,執行程式:
$ sudo python mcp3008_joystick.py
張貼留言