最近文章

Raspberry Pi 筆記(二十九):MCP3008 讀取搖桿值

[2017/02/21]
先前做的實驗控制智能車,是利用鍵盤控制方向 (可參考 Raspberry Pi筆記(十四):用鍵盤透過無線網路控制智能車),操控車子的方向不是那麼便利。如果可以透過搖桿的方式操控,應該會更容易控制小車的方向。這次實做希望使用搖桿的方式來控制車子的方向,由於搖桿的特性是類比訊號,如要轉成數位,需要透過 MCP3008 讀取搖桿的位置,再轉換成數位數值,透過判斷這些數值,可以用來控制智慧小車的方向。以下就來看看如何安裝與設定搖桿與 Pi 連接。

使用 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

[參考資料]

• raspberrypi-spy:Using A Joystick On The Raspberry Pi Using An MCP3008

沒有留言