Raspberry Piで感圧センサー(ALPHA-MF02-N-221-A01 )の情報取得するところまで

こちらのALPHA-MF02-N-221-A01という感圧センサーを購入したので情報を取得するところまで。

感圧センサ(四角形)

感圧センサ(四角形)

  • スイッチサイエンス

感圧センサ(四角形) - スイッチサイエンス

配線

手元にあったA/DコンバータのMCP3002を使いました。

感圧センサーとの接続にはワニ口のジャンピングワイヤーあると便利です。

f:id:yomon8:20180922111043p:plain

SPI有効化

$ sudo raspi-config
5 Interfacing Options >> P4 SPI

スクリプト

実行の前にwiringpi2をインストールしておきます。

$ pip3 install wiringpi2

適当な名前で以下のスクリプトを保存します。

import wiringpi as pi
import time

class mcp3002:
    def __init__( self, ss, speed, vref ):
        self.ss = ss
        self.speed = speed
        self.vref = vref
        
        pi.wiringPiSPISetup( self.ss, self.speed )
        
    def get_value( self, ch ):

        # mcp3002 データシート Table 5-1やFigure 6-1を参考
        # ch0 0x6800(0b01101000), ch1 0x7800(0b01111000)
        senddata = 0x6800 |  ( 0x1800 * ch ) 

        buffer = senddata.to_bytes( 2, byteorder='big' )

        pi.wiringPiSPIDataRW( self.ss , buffer )

        # buffer[0]に上位2bitが入っているのでシフトする
        # buffer[1]に下位の数字が入っているので足す
        # 0x3ff(0b1111111111)なのでANDをとって1023以上は切り捨てられる
        value = (( buffer[0] << 8 ) + buffer[1] ) & 0x3ff

        return value

    def get_volt( self, value ):
        return value * self.vref / float( 1023 )

SPI_CE = 0
SPI_SPEED = 1000000
READ_CH = 0
VREF = 3.3
DELAY = 0.5

adc = mcp3002( SPI_CE, SPI_SPEED, VREF )
while True:
    value = adc.get_value( READ_CH )
    volt = adc.get_volt( value )
    print ("Value:", value, " Volt:", volt )
    time.sleep( DELAY )

実行してみる

準備ができたので、手元の硬貨を乗せてテストしてみます。

f:id:yomon8:20180910135010j:plain

$ python3 get.py

出力安定しないですが、こんな感じです。

Value: 50  Volt: 0.16129032258064516
Value: 45  Volt: 0.14516129032258066
Value: 50  Volt: 0.16129032258064516
Value: 52  Volt: 0.16774193548387095
Value: 50  Volt: 0.16129032258064516
Value: 51  Volt: 0.16451612903225804
Value: 46  Volt: 0.14838709677419354
Value: 50  Volt: 0.16129032258064516
Value: 52  Volt: 0.16774193548387095
Value: 46  Volt: 0.14838709677419354
Value: 45  Volt: 0.14516129032258066
Value: 53  Volt: 0.17096774193548384

py-spidev使った場合

github.com

import spidev
import time

SPI_BUS = 0
SPI_DEVICE = 0
SPI_SPEED = 1000000
READ_CH = 0
VREF = 3.3
INTERVAL = 0.5

spi = spidev.SpiDev()
spi.open(SPI_BUS,SPI_DEVICE)
spi.max_speed_hz = SPI_SPEED


def get_value( ch ):
    # mcp3002 データシート Table 5-1やFigure 6-1を参考
    # ch0 0x6800(0b01101000), ch1 0x7800(0b01111000)
    chdata = 0x6800 |  ( 0x1800 * ch ) 
    chbyte = chdata.to_bytes( 2, byteorder='big' )
    resp = spi.xfer2(chbyte)

    # buffer[0]に上位2bitが入っているのでシフトする
    # buffer[1]に下位の数字が入っているので足す
    # 0x3ff(0b1111111111)なのでANDをとって1023以上は切り捨てられる
    value = (( resp[0] << 8 ) + resp[1] ) & 0x3ff

    return value

def get_volt( value ):
    return value * VREF / float( 1023 )

while True:
    value = get_value( READ_CH )
    volt = get_volt( value )
    print ("Value:", value, " Volt:", volt )
    time.sleep( INTERVAL )

参考URL

センサーの情報

http://www.taiwanalpha.com.tw/english2016/p_e_009.htm

https://www.mouser.jp/datasheet/2/13/alphataiwan_104-MF02-N-221-A01-1155729.pdf http://tekitoh-memdhoi.info/views/745

MCP3002の動き

についてはこちらを大いに参考にさせていただきました。データシート読み慣れてないので助かりました。

Raspberry PiでA/DコンバーターMCP3002を使ってAD変換をしました - てきとうなさいと。べぇたばん