読者です 読者をやめる 読者になる 読者になる

"Diary" インターネットさんへの恩返し

いつもソースコードコピペばかりなので,みなさまへ少しばかりの恩返しを

【ラズパイ】Raspberry piと圧力センサーでなんか作ろう by python



スポンサーリンク

f:id:azumami:20140125082900j:plain
秋月で買ってきた、圧力センサー FSR400 SHORT(大でよかったな)でRaspberry piのpythonから値取得をやってみます。

必要な道具は以下の通り,

  1. Raspberry Pi Type B 512MB
  2. MCP3002 ・・・ラズパイはデジタル入力しかないのでADコンバータが必要
  3. 無線LAN USBアダプタ GW-USNano2 ・・・もちろん有線LANで十分
  4. 圧力センサー(大) こっちのほうが良かったな→ 四角い圧力センサー(特大)
  5. Raspberry Pi Type B ケース (Clear 透明) •••• お好みで

もちろんほかにブレッドボードや配線,SDカード(linuxインストール用)がありますが割愛します。

配線

配線は以下を参考に作りました。
Analog Inputs for Raspberry Pi Using the MCP3008

f:id:azumami:20140125154049j:plain

プログラム作成

ソースはこんな感じ。「sudo python <プログラム>.py」で実行

#!/usr/bin/env python
import time
import datetime
import locale
import os
import RPi.GPIO as GPIO
 
GPIO.setmode(GPIO.BCM)
DEBUG = 1
 
# read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7)
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
        if ((adcnum > 7) or (adcnum < 0)):
                return -1
        GPIO.output(cspin, True)
 
        GPIO.output(clockpin, False)  # start clock low
        GPIO.output(cspin, False)     # bring CS low
 
        commandout = adcnum
        commandout |= 0x18  # start bit + single-ended bit
        commandout <<= 3    # we only need to send 5 bits here
        for i in range(5):
                if (commandout & 0x80):
                        GPIO.output(mosipin, True)
                else:
                        GPIO.output(mosipin, False)
                commandout <<= 1
                GPIO.output(clockpin, True)
                GPIO.output(clockpin, False)
 
        adcout = 0
        # read in one empty bit, one null bit and 10 ADC bits
        for i in range(12):
                GPIO.output(clockpin, True)
                GPIO.output(clockpin, False)
                adcout <<= 1
                if (GPIO.input(misopin)):
                        adcout |= 0x1
 
        GPIO.output(cspin, True)
 
        adcout >>= 1       # first bit is 'null' so drop it
        return adcout
 
def median(ls):
return sorted(ls)[len(ls)//2]
 
# change these as desired - they're the pins connected from the
# SPI port on the ADC to the Cobbler
SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25
 
# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)
 
# 10k trim pot connected to adc #0
potentiometer_adc = 0;
 
last_read = 0       # this keeps track of the last potentiometer value
tolerance = 5       # to keep from being jittery we'll only change
                    # volume when the pot has moved more than 5 'counts'
 
d = datetime.datetime.today()
count = 0
count_max = 20
while count < count_max:
d = datetime.datetime.today()
        # we'll assume that the pot didn't move
        trim_pot_changed = False
 
        # read the analog pin
        trim_pot = readadc(potentiometer_adc, SPICLK, SPIMOSI, SPIMISO, SPICS)
 
        # how much has it changed since the last read?
        pot_adjust = abs(trim_pot - last_read)
 
        if DEBUG:
print d.strftime("%Y%m%d%H%M%S"),' ',trim_pot
 
        # hang out and do nothing for a half second
        time.sleep(0.1)
count += 1
else:
GPIO.cleanup()


実行結果はこんな感じ 1023はノータッチ状態。圧力センサーを触ると、それを下回る。

pi@raspberrypi ~/work $ sudo python get_sencer_val.py
20140125082623   1023
20140125082623   1022
20140125082623   1023
20140125082623   1023
20140125082623   1023
20140125082623   999
20140125082623   930
20140125082624   897
20140125082624   897
20140125082624   885
20140125082624   885
20140125082624   882
20140125082624   867
20140125082624   862
20140125082624   892
20140125082624   1003
20140125082624   1023
20140125082625   1023
20140125082625   1023
20140125082625   977


エアガン的あてゲームでも作るかな。

関連投稿