2016年10月30日日曜日

Raspberry Piで圧力センサーを使う

圧力センサーを使うために

どうも、電子工作っぽいことをやってみようと思います。

今回はスイッチサイエンスさんで売られているMouser製の感圧センサーを買ってきました。確かMouserは台湾の会社だったような。。。
お値段はおひとつ400円で、使用用途はとりあえず重さを測ると言う感じです。

しかしコレを使うには問題が!
それはA/Dコンバーターを使わないとラズパイではただの変なペラペラになってしまうことです。
しかし前回A/Dコンバーターをちゃっかり3つも買ってあるので大丈夫です。

それでは実際に回路を作ってみましょう!
SPI通信の設定をされていない方は、前記事のUbuntu mateでの設定方法の健忘録 SPI通信の設定をご覧の上行ってください。

今回使う部品たち
  • Raspberry Pi (お好きなバージョン
  • A/Dコンバーター (MCP3008)
  • 感圧センサー
  • ブレッドボード
  • ジャンパワイヤー
  • 適当な抵抗
まず最初にどうやって重さを測るかを説明しましょう。
興味のない方やもう知っていますという方は読み飛ばしてください。

重さを量るには・・・?

重さを量るにはまずセンサを用いますが、そこから先はどうするのでしょうか。
工業高校へ行った方とか高専とか工業系の方なら基礎過ぎて既にご存知だとは思いますが、
こういったアナログなセンサ類は基準の電圧からどれくらい電圧が下がったかを見ています。

例えば5vの電源に適当な抵抗を2つ追加したとします。
すると2つの抵抗の間の電圧はどうなるでしょうか?
電圧降下が起こり、その中間の電圧は5vから下がってしまいます。
そして今回使う感圧センサは荷重がかかると抵抗が下がるものです。
つまり二つ目の抵抗にこのセンサを使えば重さが計れるということになります。

そしてアナログセンサはその変化を波のように表します。
しかしラズパイはアナログの波を見ることが出来ないのでA/Dコンバーターを使用します。
今回使用するA/DコンバーターはMCP3008で、10bitの精度でアナログ波をデジタル波に変換することが出来ます。
10bitが何を指しているかというと、2^10で2進数を10桁扱えるということです。10進数に変換すると1024ですね。
それで0から1024の値の範囲で実際の重さと見比べればどれくらいの重さかが分かるというわけです。

回路制作

回路と行っても特別なものは何もありません。
上の図から用意に想像できる通りこうなります。
私が使用したラズパイ3はピンの配置が他と違いますのでご確認ください。

MCP3008のスペックシートを参考にラズパイと接続してください。

使用したPIN一覧

Pin02(5v)=MCP:VDD,VREF
Pin06(gnd)=MCP:AGND,DGND
Pin23(GPIO11)=MCP:CLK
Pin21(GPIO09)=MCP:DOUT
Pin19(GPIO10)=MCP:DIN
Pin24(GPIO08)=MCP:CS



作図に使用したもの

値を読み取るプログラム

A/Dコンバーターから受け取った値を見れるようにします。使用する言語はPythonですので簡単かも。
インデントと文字コードでエラーが出るかもしれないので使用する際はご確認願います。
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import spidev
import time
import os

# SPIバスを開く
spi = spidev.SpiDev()
spi.open(0,0)

# MCP3008から値を読み取るメソッド
# チャンネル番号は0から7まで
def ReadChannel(channel):
 adc = spi.xfer2([1,(8+channel)<<4,0])
 data = ((adc[1]&3) << 8) + adc[2]
 return data

# 得た値を電圧に変換するメソッド
# 指定した桁数で切り捨てる
def ConvertVolts(data,places):
 volts = (data * 5) / float(1023)
 volts = round(volts,places)
 return volts

# センサのチャンネルの宣言
force_channel = 0

# 値を読むのを遅らせる
delay = 0.25

# メインクラス
if __name__ == '__main__':
 try:
  while True:
   data = ReadChannel(force_channel)
   print("A/D Converter: {0}".format(data))
   volts = ConvertVolts(data,3)
   print("Volts: {0}".format(volts))
   time.sleep(delay)
# 何か入力したら終了
 except KeyboardInterrupt:
  spi.close()
  sys.exit(0)

実際に測定してみる

先ほど作成した回路を使って重さを測ってみましょう。
では書き込んだプログラムを実行しましょう。
実行するにはターミナルに
python /home/"ユーザー名"/"プログラム名".py
と打ち込みましょう。
""の中身は皆さんごとで違うと思いますが、私はhome上の自分のディレクトリ上にプログラムが置いてあります。

するとターミナル上に不思議な数字がたくさん出てくると思います。
"A/D Conveter"が10bit表記の電圧で、"Volts"が変換済みの電圧の値です。
何もセンサー上に置いてなかったりすると値は1023になっており、電圧は5vになります。
だんだん圧力をかけていくと値が小さくなっていき、電圧が下がります。

本格的にセンサーを使ってみる

回路とプログラムは無事に動きましたが素の状態でセンサーを使うのはどうも不格好だし、測りにくい。
そこで3Dプリンターでこんなものを作ってみました。

ぴったりハマります。ただし端っこに置くと正常に測れなくなりますが、ペットボトルとかなら測れますね。

以上で圧力センサーの使い方の紹介を終わります。

3 件のコメント:

  1. 間違っていたら申し訳ないですが,fritzing回路図中の感圧センサ下の抵抗を刺す位置が1つ下にずれているように見えます.

    返信削除
    返信
    1. すみません,抵抗ではなくその隣の青い線が1つ下にずれているのですね.

      削除
  2. センサーに接続している線はどのようなものを使ったのか教えていただけないでしょうか。

    返信削除