卒業研究奇 死闘編 変換地獄
前回まででとにかくセンサーから値をとりだせた。
えっとこの値はなんだろう。ということで。(大変がんばって検索して)調べたところ。
spiデバイスからの応答、(だいたい)10bitでかえってくるそうです。つまり0-1023の間です。
でその値は電圧に読み替えるには、ということでgoogle呪文「fsr 電圧」で召還された偉人のページを拝見すると。
サンプルコードにこうある。
void setup(){
Serial.begin(9600); // シリアル通信速度
}
void loop(){
// 変数の宣言
double Vo, Rf, fg;
int ain = analogRead(1);
// アナログ入力値から出力電圧を計算
Vo = ain * 5.0 / 1024;
// 出力電圧からFRSの抵抗値を計算
Rf = R1*Vo / (5.0 - Vo);
// FRSの抵抗値から圧力センサの荷重を計算
fg = 880.79/Rf + 47.96;
// 荷重データをシリアル通信で送る
Serial.println(fg);
delay(1000);
}
つまり、アナログ値0-1023 → ボルト範囲 0-5.0 にマッピングするばよいということになる。
上記は Arduino なので使用電圧は5v 、こっちはRaspberry Pi なので 3.3v
なので FSRからの電圧 = 取り出したデータ /1024 * 3.3 ということ。
で、この電圧から重さを出すには まず 抵抗値を算出 して、そこから計算式で荷重をだせばいいのですね。
fg = 880.79/Rf + 47.96;
これは、どこから? どこからかの引用のようですね。
ArduinoとFSRで重さを調べる(1) - フィジカル・コンピューティング
ArduinoとFSRで重さを調べる(2) - フィジカル・コンピューティング
実際のモノの重さと値の相関から回帰式を捻出している。
なぜだろう。公式の資料にあたろう。
データシートをみるとこうある。
センサーは、物理的にいく層のレイヤーになっていて、もともと電気的に抵抗がかかっている状態。でも、上から力がかかると、レイヤーの接触面が増えて電気の通りがよくなる(=抵抗が減る)。その電気の通りの程度→電圧の変化によって間接的に力を検知するのがこのセンサーらしい。(いまさら理解。。)
で、電圧の変化と力の関係は以下とのこと。
抵抗が減少(=電圧が増える) ということは力が強くかかっているという関係を表したのが左のグラフ。電圧が増えることと力の関係を表したのが右側のグラフ、構成する回路にはさむ抵抗の値によって関係式が変わってくるようです。私の場合は10Kオームの抵抗なので紫の線ですね。でこの線の関数式はどこに。
‥‥
‥‥
どこにもない。インテグレーションガイドにもない。グラフでしか提供されいない。
もしかしてイメージですか、こんなイメージでございます、ということなのか。
「お客様の個人的な意見です、適切な運動と食事管理もおこなった結果です」
と、そういうことなのか orz
そうか。だから、さっきの偉人は回帰式を専用のソフトで捻出していたのですね。
もう、これ以上自分の環境と同一の偉人は召還できなさそうなので、変換式はみずからなんとかしなければならなくなりました。(続)
閑話休題: このときのchromecast はこれ、文句なし。
卒業研究奇 死闘編 工作迷路
Raspberry Pi側の設定が終わったので、残すは工作のみ。
それはもう、ここをみてこのまま作ればいいわけで。
‥‥ん。A/DコンバーターがMCP3002 で、私が買ったキットに付属してるのはMCP3008 。
でデータシートをみにいくと。3002が
で、3008が
それぞれ何を意味してるのかさっぱり。
まあ、VDD/VREF が二つにわかれーのVSSが消滅して、あらたにAGNDとDGNDが出現したことと、チャンネルが増えたということが違うなと。
で、(すごくがんばって)調べたところ、VDD/VREFは電源的な意味あいと考えてよし、でVSS、GNDはアースなので、VSSでつながってた線は、AGND DGNDに読み替えればよしという、「あくまで個人の感想です」レベルで工作を始める。
ラズパイ側のピン配列を上記で確認しつつ。
#!/usr/bin/env python import spidev import time import subprocess #spiデバイスオープン spi = spidev.SpiDev() spi.open(0, 0) try: while True: res = spi.xfer2([0x68, 0x00]) value = (res[0] * 256 + res[1]) & 0x3ff print value time.sleep(1) #sleep 1sec except KeyboardInterrupt: spi.close()
意味合いとしては、デバイス(チャンネル0)を呼び出して、かえってきたデータを読んで一秒ごとに画面表示する、スクリプトですよね。
センサーを指でいくらつまもうが、0,0,0,0 表示。
配線が悪かったかな、もう一回見直し。 0,0,0,0
さっきの読み替えが悪かったかな調べなおし。0,0,0,
ワイヤーのコネクタとセンサーのピン(平たい)の適合性がわるからかな。ボードに直指し。0,0,0
‥‥。
はい、動きませんでした。
こういうまったく、未知のとこでうまくいかないとどうしようもない。
いったん戻るベースキャンプないわけです。
僕にとって電子工作で、いったん退却するところはほぼふもとなわけです。
そんなときオトナは、悲しまず、広大なネットから新たな偉人を召還します。
見つかったのは海外の偉人。
Using a Force Sensitive Resistor with a Raspberry Pi
MCPも3008で配線図もばっちり、Pythonスクリプトも githubで公開している。
spidev ではなく、GPIOライブラリを使っているので、コードもちょっと細かくなる。
見たところ、0.5秒ごとに、センサー値を読んで、変化があれば値(0-1023 の間) で表示する。
みたいなスクリプトで、やっていること自体はそんなかわらなさそう。
でほぼそのままのスクリプトをファイルにして、sudo python (スクリプト名).py で実行、センサーをつまむと、実際123,358‥‥、とか値が画面に表示される。おお。
「やった、もうできた。完成だ」
いや、まったく完成してないけどね。(続)
閑話休題: このときのchromecastしてたのは、これ。めちゃくちゃかっこいい。
卒業研究奇 続暖機編
アナログ機器のコントロールには、Pythonでそれ用のライブラリ spi を使用する必要があるらしい。
ということで、その準備をする。以下もテックシェアストアからの引用です。
sudo apt-get update
sudo apt-get upgrade
用心のためのRaspberry Pi の更新とアップグレード。
次にpythonの開発バージョンをいれとく
sudo apt-get install python-dev
git 経由でライブラリ入れるので、git もいれとく
sudo apt-get install git
で、spi ライブラリをgit で入手する。
git clone http://github.com/doceme/py-spidev.git/
cd py-spidev
sudo do python setup.py install
で spi ライブラリのインストール完了。python を起動し、インタラクティブモードで
import spidev
でエラーがでなければインストール成功。
で、import spidev でエラーなし、成功。
もちろんspidevライブラリについてクラスとか関数とかグローバル変数とかそういったことをまじめに調べるなどということは、淡きこと水の如しを信条としているため一切しない。(続)
卒業研究奇 暖機編
数年ぶりのLinuxであるし、そもそもハードウェアコントロールや電子工作なんて初心者なので、購入したテックシェアストアのスターターキットに付属のチュートリアルにそって、とにかく動くものを作ることにする。(以下、テックシェアストアから引用)
まず、そもそもこの配線板というか、ブレッドボードすら知らないわけで。
サイドがずらっとつながってて、真ん中は横がセグメントごとにつながってると。
これにジャンパワイヤーとよばれる細い線をつなぐんですね。
で、LEDをRaspberry Pi からの命令で点灯するための、これが回路図。
はい、もうすでにわかりません。
とはいえ、というところで。もうほんといっぱいネットを調べました。
左の箱がRaspberry Pi のピンたちをあらわしていて5v とか 3V3(3.3V)は電源らしくっていわゆる+の電極のイメージ、GNDはアースとかグラウンドとかいっていわゆる-のこと。その他 GPIOなんたらは、コントロールするためのI/Oの口みたいなもの。で上記は、3.3Vの電圧でLEDを点灯させて、39番のアースにつなぐという意味、でLEDは抵抗がないので、そのまま流すと電流流れすぎるいわゆるショートしてしまうので、510オームの抵抗をいれている。
で、これは3.3Vにそのままつないでるので、Raspberry Pi に電源いれるとそのままLEDがつく。で、実際やってみたら点いた。もうこれ以上は深く考えない。
次にPythonから、LEDの点灯、消灯を行う。
こんどは、29番PINであるGPIO5 からLEDにつなぐ。で sudo pythonで起動。
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
LED1 = 5
GPIO.setup(LED1, GPIO.OUT)
GPIO.setup(LED1.GPIO.HIGH)
で、LED点灯
GPIO.output(LED1, GPIO.LOW)
で消灯。
GPIO.cleanup()
exit()
で、GPIOの接続クリアして、終了。
なるほど、点いたし消えた。
で、当然、もうこれ以上GPIOライブラリをマニュアルをみるとか深入りはしない。
ということで、次はアナログ機器との接続を試すことにする。(続)
卒業研究奇 設定編
ということでまずは、Raspberry Pi のセットアップ。やることは。
1. OSのインストール
2. ネットワーク設定
3. もろもろ環境設定
でそのあとにやっとセンサーうんぬんとなる。
1.OSのインストール
Raspberry Piをモニターとキーボードなしで導入する(その1)SSHでのログインまで | 株式会社インデペンデンスシステムズ横浜
我が家は、ノートPC環境で、キーボードやモニタがないので、ネットワーク経由でのインストールが条件なので、上記を参考にインストール。
OSは「NOOBS」、「Raspbian」などのLinux がインストール可能とのこと、深い意味もなく「Raspbian」を選択(ちなみ、もともとLinuxディストリビューションにはDebianというのがあってそれにちなんでRaspberry Pi用に開発されたものだと思うので、なにかその別の意味合いがある名前ではないと略)した。
ということで、Raspbianのディスクイメージをダウンロード、SDカードに焼いて、Raspberry Piにさして、192.168.0ネットワークを前提に、ノートPC側のIPをあわせて、Raspberry Piを探索、発見できたらログイン、なんと Raspberry pi 3には無線LANがついてるので、以下ページを参考に、我が家の設定にあわせる。
2. ネットワーク設定
Raspberry Pi の初期設定 | OpenRTM-aist
これで、ノートPCから、無線で Raspberry Pi に接続できるようになった。
3. もろもろ環境設定
で、もろもろ設定は、いらないサービスとめたり、aptでパッケージ更新したり、gitで更新したり。
とくにもろもろやりはしたが、ネット情報そのままで特につっかかるトコロなし。
ダルい感しかなく、嵐の前のシヅケサ。(続)
卒業研究奇 購買編
前回リサーチで、ほぼ自分の研究が完成したと思った私は、学校と実習と仕事に存分に蹂躙されつくして年末を向かえた。
教官の先生からの圧が高まるつれ重い腰をあげ、部品の調達を行う。
Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Lab
- 出版社/メーカー: TechShare
- メディア: エレクトロニクス
- この商品を含むブログ (4件) を見る
あと、メモリとあと、センサーもうってる。アマゾンすごい。
で早速購入、そしてすぐ届く(続)
卒業研究奇 慢心編
卒業研究のお題を以下に決めました。
「胸椎アジャストメントの物理学的負荷の計測とその評価」
で、What の次は Howです。
イメージ、胸椎に体重計のせて、そこアジャストすればいいんじゃないかということで、さっそく調査(ネットサーフィン)を開始。
高額なものものしい機器や難しい物理学用語におしつぶされないために、オトナは華麗に画像検索です
すると以下のページの画像がヒット。
おお、数千円の小型コンピューターに、数百円のセンサーつけたら
なにやら圧力が測定できるらしい、サンプルコードの言語もCかなんかで、いけそう。
そして、圧力センサー(FSR)でさらに検索したら以下のページ。
前述のArduinoとは違い、Raspberry piには専用のLinux OSがあって、外部機器とのやりとりも、自分にもなじみのある言語 Python が使えるみたい。
みると数行のサンプルコードで、センサーから値が取れているご様子。すばらしい!!
「できた、もうすでにできた、卒業研究は完成したよ」
もうそんな気分で、逆にやる気をなくしたほどです。
あとで地獄がまっていたわけですが。(続)