質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

1011閲覧

3つの感圧センサーを用いてデータを測定したいです。

Noguri_R

総合スコア7

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2020/01/18 09:50

編集2020/01/18 11:22

現状

以下のコードや機材を用いて
1つの感圧センサーを用いた測定はできています。

使用している機材

◯RaspberryPi
◯感圧センサー×3(1pc DF9-40)
◯A/Dコンバータ(MCP3008)

##現在使用しているコード

import RPi.GPIO as GPIO import time GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) def readadc(adcnum,clockpin,mosipin,misopin,cspin): if ((adcnum > 7) or (adcnum < 0)): return -1 GPIO.output(cspin,True) GPIO.output(clockpin,False) GPIO.output(cspin,False) commandout = adcnum commandout |= 0x18 commandout <<= 3 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 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 return adcout SPICLK = 18 SPIMISO = 23 SPIMOSI = 24 SPICS = 25 GPIO.setup(SPIMOSI,GPIO.OUT) GPIO.setup(SPIMISO,GPIO.IN) GPIO.setup(SPICLK,GPIO.OUT) GPIO.setup(SPICS,GPIO.OUT) FSR = 0; T = 15 Ts = 0.1 for i in range(int(T/Ts)): Measured_Voltage = readadc(FSR,SPICLK,SPIMOSI,SPIMISO,SPICS) print(Measured_Voltage*5.0/1023) time.sleep(Ts)

###参考にしたURL

このURLを参考に配線とコードを組みました
※上記のウェブ内の言語はおそらく
インドネシア語です。

教えていただきたいこと

「3つの感圧センサーを用いて各センサーのデータを抽出したい」

私がインターネットで調べている限り、1つの感圧センサーを用いた記事しか
見つけることができませんでした。

⇒複数のセンサーを使用するためには
何か追加するプログラミングはありますか?
それとも現在参考にしているコードでは
複数のセンサーを接続することはできませんか?

お手数をおかけしますが、
ご教示のほどよろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リンク先を見てみましたが、何語か分からなかったので説明はわかりませんが、ざっとコードを眺めてみた感じと、A/Dコンバータの仕様をみた感じだと、簡単に拡張できそうです。

まず、ADコンバータのMCP3008は8chのA/Dコンバータですので、最大8ポート分のアナログ入力を処理できます。

感圧センサは、現在の回路だとCH0につながっていますが、同じような配線で感圧センサをCH1,CH2につなげればいいと思います(抵抗も忘れずに入れてください)。

プログラムとしては、末尾に

python

1FSR = 0; 2T = 15 3Ts = 0.1 4for i in range(int(T/Ts)): 5 6 Measured_Voltage = readadc(FSR,SPICLK,SPIMOSI,SPIMISO,SPICS) 7 print(Measured_Voltage*5.0/1023) 8 time.sleep(Ts)

という行がありますが、ここをちょっと変えるだけでいいと思います。

元々のプログラムにread_adc()という関数があり、その関数の仕様が複数チャンネルの入力に対応しているようなので、読み込みのときに読み込みたいチャネル番号を引数として与えるだけです。

つまり、チャネル1を読み込みたければ、

python

1FSR = 1; 2T = 15 3Ts = 0.1 4for i in range(int(T/Ts)): 5 6 Measured_Voltage = readadc(FSR,SPICLK,SPIMOSI,SPIMISO,SPICS) 7 print(Measured_Voltage*5.0/1023) 8 time.sleep(Ts)

というふうに、FSRに読み込みたいチャネルの番号を代入すれば大丈夫だとおもいます。

要は、

python

1FSR = 1; 2 3Measured_Voltage = readadc(FSR,SPICLK,SPIMOSI,SPIMISO,SPICS) 4print(Measured_Voltage*5.0/1023)

の処理が指定したチャネルのA/Dコンバータの読み込みを行っているわけですので、あとは読み込みたいチャネルの数だけ同じ処理を繰り返せば良いと思います。

もしかしたら、A/Dコンバータの仕様によっては、連続したA/D変換が行えないかもしれません。そのあたりはデータシートに記載されていますので、それを参考にして、必要に応じてreadadc()の後にtime.sleep()を入れてみてください。

投稿2020/01/18 10:47

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Noguri_R

2020/01/22 12:25

ご回答下さり、ありがとうございます。 その後、教えてくださった通りにコードを書き直しました。 その結果、設定した秒毎に反応するセンサーが移り変わっていくデータとなりました。 できれば、 設置した複数のセンサーで同時にデータ測定できるような コードをさらに教えていただきたいです。 お手数をおかけしますが、 よろしくお願い申し上げます。
TsukubaDepot

2020/01/22 12:29 編集

あまり難しく考える必要はないと思います。 チャネル1とチャネル2を読み込ませたいときには、 FSR = 1; Measured_Voltage = readadc(FSR,SPICLK,SPIMOSI,SPIMISO,SPICS) print(Measured_Voltage*5.0/1023) FSR = 2; Measured_Voltage = readadc(FSR,SPICLK,SPIMOSI,SPIMISO,SPICS) print(Measured_Voltage*5.0/1023) のように、連続して書くだけで大丈夫だと思います。 もちろん、繰り返し文などを使うことで、もっとすっきり記述することも可能ですが、まずは愚直にコードを記述してみてはいかがでしょうか。
Noguri_R

2020/01/22 13:56

ご返信ありがとうございます。 度々申し訳ございません。 教えてくださった上記のコードでは、 ch0のセンサーしか反応を得られませんでした。 仮に3本のコードの配線をすべてch0で接続した場合は、 前より小さい値ですが、 同時にデータを測定をすることができました。 また併せてお伺いしたいのですが、 それぞれのセンサーから得られるデータを 合計でなく切り離して 表示したいのですが、 どのようにしたらいいでしょうか? お手数をおかけしますが、 よろしくお願い申し上げます。
TsukubaDepot

2020/01/22 14:11

お力になりたいところですが、手元には同じA/Dコンバータなどがないため、プログラムを見た上での判断になってしまいます。 私がソースコードとデータシートの一部を見た感じだと、readadc()の第一引数はチャネル番号なので、1であればCH1、0であればCH0という具合にそれぞれのチャネルの値が得られそうな感じではあるのですが… この手のトラブルは、ソースコードだけでなく、実際の配線も原因となっていることが多いので、そちらがあるとまた違うんですけどね。 ちなみに、3本のコードを一つのチャネルに入力するすることは物理的に可能ですが、得られる値は違う意味になってしまいます。 おそらく、使われているセンサは、圧力に応じて値が変わるセンサだと思います。 そのセンサを3つ並列につないでいるのであれば、抵抗の並列接続回路と同じ回路になってしまいます。 得られる値は3つのセンサの状況に応じた値ではありますが、どのセンサがどの程度押されたのかということまでは知ることはできません。 たとえば、いまA/DコンバータのCH0に圧力センサを取り付け、FSRの値を0にして数値を取り込んでいると思いますが、センサをCH1に接続し、FSRの値を1にしてみたら、きちんと値はとりこめるでしょうか。 まずは、そこから確認するといいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問