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

卒業研究奇 死闘編 蘇る屍鬼

その後順調にマニピュレーションのデータを取得する中、自分の作った回帰式に疑いが。。。

 

 omta.hatenablog.jp

この記事で作った際、センサーは

f:id:komta:20170215113629j:plain

 ボード直差しで、その後、実験しやすいように

f:id:komta:20170215115934j:plain

こうやってターミナルとワイヤーで延長して

f:id:komta:20170215121630j:plain

最終的にこうなったんです。

なので、回路の構成がかわったので、直差しのときとなんか取れるデータのレベルが

変ってしまっていた。

ワイヤーとか間にはさんだから抵抗値が変った?

とにかく、以前の構成で作った回帰式のあてはまりが悪いようなので

再度推定する必要がでた。

ということで、再計算。。

こんどはサンプリング数を増やして、128g、578g、706g、1,156g、1,600g、2,051g、3,651g、6,251g、8,300g の お水 をまた用意。

推定した。方式は前回に同じ。

f:id:komta:20170323064002j:plain

ということで、新回帰屍鬼、完成。相関係数もまずまず。

がしかし、そのお、ちょうど計りたそうな範囲がピーキーですね、という指摘は聞きたくない。

 

 

 

 

卒業研究奇 死闘編完結 戦士の帰還

電子工作の日々

前回までで、ほしいデータを取得するための戦は終えた。

この開発における天王山は、つまり

 

「センサーを利用できるハードウエア構成とセンサーデータの取得とその解釈が可能なソフトウェア処理の実現」

 

である。

omta.hatenablog.jp

 あとは次の戦場に以降するために残党を狩るだけだ。

てな考えでやるとたいがいドハマるもんです。

そして案の定ドハマる。

まずは、センサー(FSR406)のテスト環境において配線はこんな感じでやってたわけです。

f:id:komta:20170215113629j:plain

基盤にしかさせないんです。なぜなら

f:id:komta:20170215114205j:plain

ひらたいからです。とてもひらたい。

f:id:komta:20170215114243j:plain

すかすかでコネクタにはまらないからです。

でも、計測するときに、テープでとめようにもスカスカすぎて接触してないのでデータがとれない。

なので、ワイヤーとつなぐものがないか、でもなんって検索すればいいのかわからないし。。

名前が、わからない。。

検索でできた画像では、なにかそういったものが存在してることを示唆している。

https://cdn-learn.adafruit.com/assets/assets/000/000/432/original/force___flex_fsrhead.jpg?1396762967

https://cdn-learn.adafruit.com/assets/assets/000/000/433/original/force___flex_fsrterminal.jpg?1396762972

だが、これがなんなのかがわらからない。

君の縄、ちがった、君の名は。と調べたがよくわからず。

しかたなく、私はマトリックスから出て、機械の都市(マシンシティ)、アキハバラへ。

「なにもわからないので、こういった部品がほしい」と電子のマスターに懇願しまくるも。

みなさん異口同音

ハンダづけすれば(やれやれだぜ

 

そうなんですが、嫌なんです、したことないし不可逆で熟練が必要な作業を行うのは。

テスターなどちゃんとした環境がないんです、プロトタイピングだけで進行したいのです。

プログラマーはそういう賭けはおいそれとやらないんです、そもそもそうじゃないソリューションを探しに、なれないマシンシティにやってきたわけですから。

そういった顧客のニーズへの気遣いのなさにカチンと来た私は、すぐさま

そ、そうですよね、お忙しいところすいませんでした

と言い放ち、店をあとにした。 まったく。

当然あきらめられない、ないことはないんだから。なのでさらに○○電子など有名どころのパーツ屋さん、私などにはまったくの異空間で、なみだ目になりながら手探りで部品を探す。

そしてやっと、ネットでみた写真に似た部品を探し出す。

f:id:komta:20170215115934j:plain

ターミナルブロック(特小)というやつ、ねじ式でピンをはさみこむ、そこからボードにささる歯がでてる。

ターミナルブロック2P緑・縦・特小: パーツ一般 秋月電子通商 電子部品 ネット通販

ぴったりではないが、ワイヤーのメスに少しはまるので、こんな感じでさして、あとからテープで補強した。あとでテストしたら接触は問題なさそうだった。ふう。

これで、ワイヤー経由でデータとれるので、本体からの延長ができて実験がやりやすくなる。

次に、Raspberry Pi の電源について、もちはこびや計測場所の環境に依存したくないので、とりあえず。モバイルバッテリーを買うことにする。選び方はこちらを参考にした。

 

densikousaku.com

ここを参考に、Anker Power Core 10000 をアマゾンで買った。

早速確認メールがきた。

f:id:komta:20170215121413g:plain

おれはいったい何を買ったんだ。何になりたいんだ。

後日、鉄の面ではなくバッテリーが無事とどいたので安心した。

でなんやかやがあって、最終的なハードウェ構成はこのようになった。

f:id:komta:20170215121630j:plain

そして、持ち運び性を飛躍的に向上させる

f:id:komta:20170215121741j:plain

100円ショップのプラスチックケース を導入し、それはついに完成をみた。その名も

マニピュレーションロガー 

TOC-IE(トシイエ)」

 Thrust On Cervical ,  Investigate Enabler の略で

 頚椎スラストの研究に道を拓くためのものという思いをこめました。

コンタクトハンドと頚椎の間にセンサーを挟んで計測することから、板ばさみで苦しんだ武将の名前を探して、検索結果の一番上が前田利家でそのあとにアルファベットを適当にあてたというわけではない。

 

しかし、嗚呼、長かった、長かったよ、でもできたよ。

これで、陣に帰ることができる。

父上、戦果は上々でござりますると報告できる。

次の戦は、実際の計測と分析となろうぞ。(続く)

 

あ、ちなみに計測対象は胸椎から頚椎になりました。

というのも、圧力センサーがせいぜい10KG程度が補足限界であろうとのだからです。

なお、購買初期に買ったものが古い型番のため 10Nぐらいが限界とのことで、新しい型番のセンサーを買いなおしたことを報告しておきます。amazonで買うときは注意すべしです。

 

自分を鼓舞するために、これをchromecast してました。


Shakira - Try Everything (Official Video)

卒業研究奇 死闘編 魁鬼屍鬼

電子工作の日々

前回、重さのサンプリングデータを涙ながらに作成したので、回帰式の推定です。

 

omta.hatenablog.jp

推定作業には、統計言語R を利用します。;

これは、統計データ処理言語というか、処理環境というかとにかくスクリプトベースで

データのハンドリングと各種統計処理や視覚化が可能なフリーソフトウェアである。

10年ほど前に、某業界で市場データ分析のまねごとをしていたときに覚えたものです。

www.okadajp.org

当時見ていたwikiが存続していた。すばらしい!!困ったときは絶対ここ。

で、回帰式には通常、線形回帰を使うのですが今回は以下のような、非線形っぽい分布に式をあてはめる必要があるのです。

f:id:komta:20170206142952p:plain

 

で、以下のサイトを参考にやってみました。

R言語で統計解析入門: 非線形回帰分析 A nonlinear regression analysis 梶山 喜一郎

が、しかしモデルによって計算不能になってしまい唯一可能だったの累乗モデルだけでした。

で、累乗モデルは、Y = a*X^b で式をたてる、a, bの係数を求めるものです。

推定できた重みは以下。

 a = 1872000;

b = -1.265;
よって式は、Y=1872000*X^(-1.265)

この式の当てはまり具合を視覚化すると以下

f:id:komta:20170206143804p:plain

で、式の評価をみてみると

> cor.test( 予測データ, 実績データ , method="pearson")

        Pearson's product-moment correlation

data:  予測データ and 実績データ
t = 1406.5, df = 13792, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.9964149 0.9966460
sample estimates:
      cor
0.9965324

相関係数が 0.99以上なのでまあよしとする、がもうちょっと改善したいので

deta.hateblo.jp

ここのマルカート法でモデルで再計算。

Parameters:
                Estimate Std. Error t value Pr(>|t|)    
a.(Intercept)  1.872e+06  1.383e+04   135.4   <2e-16 ***
b.log(X)      -1.265e+00  1.455e-03  -869.5   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 114.1 on 13792 degrees of freedom
Number of iterations to termination: 11
Reason for termination: Relative error in the sum of squares is at most `ftol'.

で、相関分析をする。

Pearson's product-moment correlation

data: 予測データ2 and 実績データ
t = 1407.4, df = 13792, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.9964194 0.9966502
sample estimates:
cor
0.9965367

 わずかながら改善したので、式としては

Y = 187169 * X ^(-1.265368)

を血と汗と涙のFSR抵抗値→グラム変換式として採用することにする。(続)

 

 

卒業研究奇 死闘編 未開凍土

電子工作の日々

前回の調査によって、

「センサー値を力に変換する公式な”式"がない」

という衝撃の事実を知ったわたしは、フテくされることなく未開の地を行く決心をした。未開の地のいいところは、どう行こうが誰も文句を言わないところだ。(強がり)

 

omta.hatenablog.jp

講義、実習、夜勤仕事の合間でやるにはお行儀よくはできないのです。

だからこそ、シンプルにいこうとこの研究にしたのに、なんでこんな目に僕があわな(省略)

まあ、気をとりなおしてまず現状TODOを整理しておこう。

  1. 自分の環境におけるセンサー値vs力の変換式をつくる
  2. 実際のアジャストの計測が可能な機器や環境要件をつめる。
  3. どういうアウトプットにするか考える(この研究で何を言い切るか)

3は1,2をやりながら、それが終わってデータを取り始めてからも何回もラウンドするようなものと認識しておく。具体的には、なにもデータがない状態でも論文を書き始めるということ。

2.について、実際アジャストする際には以下が考慮点でしょうか

  1. 機器の持ち運び性
  2. 機器をコントロールするためのPC
  3. 上記との接続環境(ネットワーク)
  4. とったデータをその場で、ある程度確認できるようにすること
  5. 機器を、計測時の物理力に耐えかつ計測できるような構成にしておくこと

なんか箱にいれて持ち運びができて、計測機器とPCを繋げたいけど、実際計測時に電源やLANケーブルがごちゃごちゃするのは実験ノイズとして多きすぎる、バッテリーで動いて、無線LANでつなげたい、ああでも学校の無線LANは接続性が低くて、実用に耐えないしどうしよう。とったデータをエクセルでみるかじゃあcsvで吐き出すか、ああその場でくエクセルなんて起動してグラフつくってデータ確認なんて現実的じゃないしどうしよう。5なんて、ボードにセンサーがささったままなので、コンタクトポイントまで延長しないといけないけど、ジャンパワイヤーとセンサーの平たい端子とまったく適合しないので、コネクターが必要だけどどこで買えばいいのだろう。。と一人ブレスト、まあ観点は洗い出したので、次。

 

3.は、目下の大問題、変換式のこと。方針は、実際センサーにいくつかの重りを乗せて、そのデータから回帰式を算出するということ。当たり前だけどそれしかない。

しかし、我が家にはそんな都合よく重りがない、で用意したのがこれ。

 

f:id:komta:20170206112314j:plain

泣けます。

このペットボトルと軽量カップで、重りを自作する。ペットボトル自体の重さも考慮に入れる必要があるので、環境省の調査資料から、南アルプス天然水のペットボトルの重さも調べる(泣)

南アルプス天然水 500mm 本体24.5 キャップ3.2 ラベル0.6 = 28.3g
南アルプス天然水2000mm 本体46.8 キャップ3.1 ラベル1.4 = 51.3g

で、それらを考慮し、各ペットボトルに軽量カップで水をいれて、以下の重さをFSRでサンプリングする。

128g , 278g, 528g , 806g, 2051g , 4100g

で、取得したデータを電圧に変換して重さとの関係を示したのがこれ。

 

 

f:id:komta:20170206123507p:plain

 

で、前調べたメーカー資料の右側の10KΩのラインと符号している、よかった。

f:id:komta:20170206102224p:plain

 

でもこのままだと回帰式をたてづらいので、FSRの抵抗値に変換する必要がある、変換式は公式資料から変換した電圧をさらにFSRの抵抗値に変換する。

FSR抵抗値 = ((電源V - 取得電圧V) * 使用抵抗値) / 取得電圧
なので
FSR抵抗値 = ((3.3 - 取得電圧V) * 10,000Ω / 取得電圧

 で算出した 抵抗値vs重さのグラフ

f:id:komta:20170206124104p:plain

 メーカ資料の右側のグラフと符号している、よかった。

次は、これに回帰式をたてることにする。(続)

 

 

 

 

閑話休題: この作業時にchrome cast してたのは、こちら。

反する万の理由があろうと、私の希望にはひとつの理由さえあればいい。

勇気をもらえる。

 


Lady Gaga - Million Reasons (Live At Royal Variety Performance)

 

 

卒業研究奇 死闘編 変換地獄

電子工作の日々

前回まででとにかくセンサーから値をとりだせた。

 

omta.hatenablog.jp

えっとこの値はなんだろう。ということで。(大変がんばって検索して)調べたところ。

spiデバイスからの応答、(だいたい)10bitでかえってくるそうです。つまり0-1023の間です。

でその値は電圧に読み替えるには、ということでgoogle呪文「fsr 電圧」で召還された偉人のページを拝見すると。

denshi.blog.jp

サンプルコードにこうある。

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) - フィジカル・コンピューティング

 

実際のモノの重さと値の相関から回帰式を捻出している。

なぜだろう。公式の資料にあたろう。

Interlink Electronics

 

データシートをみるとこうある。

センサーは、物理的にいく層のレイヤーになっていて、もともと電気的に抵抗がかかっている状態。でも、上から力がかかると、レイヤーの接触面が増えて電気の通りがよくなる(=抵抗が減る)。その電気の通りの程度→電圧の変化によって間接的に力を検知するのがこのセンサーらしい。(いまさら理解。。)

 

f:id:komta:20170206102208p:plain

で、電圧の変化と力の関係は以下とのこと。

f:id:komta:20170206102224p:plain

抵抗が減少(=電圧が増える) ということは力が強くかかっているという関係を表したのが左のグラフ。電圧が増えることと力の関係を表したのが右側のグラフ、構成する回路にはさむ抵抗の値によって関係式が変わってくるようです。私の場合は10Kオームの抵抗なので紫の線ですね。でこの線の関数式はどこに。

‥‥

‥‥

どこにもない。インテグレーションガイドにもない。グラフでしか提供されいない。

もしかしてイメージですか、こんなイメージでございます、ということなのか。

 

「お客様の個人的な意見です、適切な運動と食事管理もおこなった結果です」

 

と、そういうことなのか orz

 

そうか。だから、さっきの偉人は回帰式を専用のソフトで捻出していたのですね。

もう、これ以上自分の環境と同一の偉人は召還できなさそうなので、変換式はみずからなんとかしなければならなくなりました。(続)

 

 

 

 

閑話休題: このときのchromecast はこれ、文句なし。


Bruno Mars - 24K Magic [Official Video]

卒業研究奇 死闘編 工作迷路

電子工作の日々

Raspberry Pi側の設定が終わったので、残すは工作のみ。

 

iinpht.jeez.jp

それはもう、ここをみてこのまま作ればいいわけで。

‥‥ん。A/DコンバーターがMCP3002 で、私が買ったキットに付属してるのはMCP3008 。

でデータシートをみにいくと。3002が

f:id:komta:20170206091703p:plain

で、3008が

f:id:komta:20170206091754p:plain

それぞれ何を意味してるのかさっぱり。

まあ、VDD/VREF が二つにわかれーのVSSが消滅して、あらたにAGNDとDGNDが出現したことと、チャンネルが増えたということが違うなと。

で、(すごくがんばって)調べたところ、VDD/VREFは電源的な意味あいと考えてよし、でVSS、GNDはアースなので、VSSでつながってた線は、AGND DGNDに読み替えればよしという、「あくまで個人の感想です」レベルで工作を始める。

pinout.xyz

ラズパイ側のピン配列を上記で確認しつつ。

 

#!/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で公開している。

gist.github.com

spidev ではなく、GPIOライブラリを使っているので、コードもちょっと細かくなる。

見たところ、0.5秒ごとに、センサー値を読んで、変化があれば値(0-1023 の間) で表示する。

みたいなスクリプトで、やっていること自体はそんなかわらなさそう。

でほぼそのままのスクリプトをファイルにして、sudo python (スクリプト名).py で実行、センサーをつまむと、実際123,358‥‥、とか値が画面に表示される。おお。

 

「やった、もうできた。完成だ」

 

いや、まったく完成してないけどね。(続)

 

 

 

 

閑話休題: このときのchromecastしてたのは、これ。めちゃくちゃかっこいい。


三浦大知 (Daichi Miura) / (RE)PLAY -Music Video-

卒業研究奇 続暖機編

電子工作の日々

アナログ機器のコントロールには、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ライブラリについてクラスとか関数とかグローバル変数とかそういったことをまじめに調べるなどということは、淡きこと水の如しを信条としているため一切しない。(続)