こちらのALPHA-MF02-N-221-A01という感圧センサーを購入したので情報を取得するところまで。
- 出版社/メーカー: スイッチサイエンス
- メディア:
- この商品を含むブログを見る
- スイッチサイエンス
配線
手元にあったA/DコンバータのMCP3002を使いました。
感圧センサーとの接続にはワニ口のジャンピングワイヤーあると便利です。
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 )
実行してみる
準備ができたので、手元の硬貨を乗せてテストしてみます。
$ 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使った場合
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の動き
についてはこちらを大いに参考にさせていただきました。データシート読み慣れてないので助かりました。