【ラズパイ】Raspberry piと圧力センサーでなんか作ろう by python
スポンサーリンク
秋月で買ってきた、圧力センサー FSR400 SHORT(大でよかったな)でRaspberry piのpythonから値取得をやってみます。
必要な道具は以下の通り,
- Raspberry Pi Type B 512MB
- MCP3002 ・・・ラズパイはデジタル入力しかないのでADコンバータが必要
- 無線LAN USBアダプタ GW-USNano2 ・・・もちろん有線LANで十分
- 圧力センサー(大) こっちのほうが良かったな→ 四角い圧力センサー(特大)
- Raspberry Pi Type B ケース (Clear 透明) •••• お好みで
もちろんほかにブレッドボードや配線,SDカード(linuxインストール用)がありますが割愛します。
プログラム作成
ソースはこんな感じ。「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
エアガン的あてゲームでも作るかな。
関連投稿