2020年3月3日火曜日

怪我をしたので松葉杖に取り付ける荷重管理デバイスを製作しました。

数年前に下書きを作って公開してない記事でした。令和になって初公開です。

膝の内側を怪我しました。前十字靭帯付着部裂離骨折という骨折のようです。
経緯についてはこちらの動画をどうぞ…

前十字靭帯の付け根にあたる膝の骨を剥離骨折する、
"前十字靭帯付着部裂離骨折"という怪我のようです。
骨にトンネルを開け、ワイヤを通し靭帯と結び、浮いた骨を元の位置に抑える手術をしました。
入院は一週間半、私は大学生で学期末の時期だったので
ちょっと成績的にまずくなったりしましたが、大学生活に疲れ精神的にも参っていた中、
一時の休みを得られてよかったとも感じています。
名医に出会えたので、術後の経過は良好で疼痛もなく順調でしたが、
骨が接合するまでには3ヶ月の時間を要するということで、術後2ヶ月は杖を欠かせませんでした。

術後の経過日数により、はじめの2週間は負傷側の足を地面につくことなく過ごすこと、
次の週は体重の1/3まで掛けてよい…など、徐々に負荷制限が緩和されていきました。
しかし、極度の運動音痴の私は、1/3荷重がこれくらいだと両足別々の体重計に乗せられて、
教えられたところで感覚を覚えられません。負傷側にも体重をかければ、
松葉杖を持つ手は楽なのですが、荷重制限を越えるとどうなるかわかったものではありません。
一方で、荷重を掛けず養生している負傷側はどんどん衰えていき、リハビリの先生には、
「寝たきりの老人並」と言われました。太ももが頬のように柔らかくなったのはショックでした。
荷重を掛けなければ筋肉を取り戻すことはできないのです。

そんなジレンマを抱えつつ、やはりこわいので余り荷重を掛けないようにしていたまま、
全体重の2/3荷重を負傷側に掛けていいと許可されました。
2/3荷重を掛けられると、松葉杖を両手に抱えずに1本で歩く、「片松葉」ができるようです。
以前と同じ荷重のままでは、手に掛かる荷重は両松葉のときの2倍になってしまいます。
右手がボロボロになりながら、ちゃんと2/3荷重を掛けられるようになろう。と考えました。

前置きが長くなりましたが、製作工程を…。

Wii fitというゲーム用コントローラーのバランスWiiボードをAmazonで買いました。
早速バラし…


松葉杖用の先端に取り付けました

テープ固定じゃ心もとないので、Amazonで杖の先のゴム石突部を買って加工しねじ止めしました。


測定値を正確にするために、校正用の機能と設備も用意。


で、ちょいちょいっとしきい値を設定してLEDが点くようにしてみました。

ESP32でBosch BME680の拡張ライブラリ Bsecを使う

少し前に、秋月でも気温・湿度・気圧に加え、MEMSガスセンサを搭載した、
Bosch BME680の取り扱いが始まりましたね。
サクっと4ピン出ていてすぐにI2Cで繋げられそうな感じになっています。
自分は去年しばらくストロベリーリナックスのBME680を使って
しばらく実験していたので、使い方について少しまとめてみます。

BME680は、公開されているデータシートやサンプルコードを使うと
・気温
・湿度
・気圧
・ガスセンサの抵抗値
が取得できるセンサーです。
ガスセンサの構造ですが、電気応用みたいな名前の科目で習った通りだとすると
金属をヒーターで温める→酸化して抵抗値が上がる
周辺の雰囲気に水素などがあると還元されて抵抗値が下がる
という原理で可燃性ガスの有無がわかるという原理だったと思います。
なのでセンサがしっかりと加熱されるまでしばらく新鮮な雰囲気下で動かして、
ベースラインの抵抗値を控えておいて、それより抵抗値が下回ったら
何かガスが出てるなという判断が可能です。

しかし、抵抗値が表示されても相対的な評価しかできないので、
何か単位がついた空気品質の指標が欲しいですよね。

そこでBosch謹製のBsecライブラリというものをご紹介します。
ボッシュのラボテストの結果、センサーから取得できる生データをもとに、
・推定CO2
・IAQ(屋内空気品質)
・推定呼気VOC
・湿度・気温補正値(ヒーターの影響を考慮した値)
を計算してくれるArduinoライブラリです。(RPi版もある)

最新版はGitHubにあります。早速cloneしましょう。

README.mdを読むとわかるのですが、インストールに一癖も二癖もあります。
なぜかというと、BoschはこのBsecライブラリのソースコードを公開していません。
特定環境向けに、コンパイル済みバイナリとヘッダーファイルという形で提供しています。
このコンパイル済みのライブラリを使うために、Arduino IDEに修正が必要です。

現時点で最新のインストール方法についてご説明します。

はじめに、Arduino IDE 1.8.11のポータブル版を用意します。
ここに過去バージョンの一覧があるので入手可能です。
Windows ZIP file for non admin installとあるリンクからZipファイルになったポータブル版をダウンロードして解凍しました。Macの場合は知りません。

解凍したら、できたフォルダにportableという名前のフォルダを作成します。
これですでに入っているArduino IDEとパスを共有しなくなります。
ライブラリやボードマネージャの設定などは入れなおしになります。

フォルダ内のexeからArduino IDEを起動します。
今回はESP32を使うので、ボードマネージャでESP32を使えるように設定し、(省略)
ライブラリをインクルードより、まずは普通にダウンロードした
Bsecライブラリをインポートします。
なお、ESP32ボードのパッケージはv1.0.4を使います。


Arduino 1.8.11のフォルダ\portable\packages\esp32\hardware\esp32\1.0.4
を開きます。



platform.txtを開き、
compiler.c.extra_flags=
compiler.c.elf.extra_flags=
compiler.S.extra_flags=
compiler.cpp.extra_flags=
compiler.ar.extra_flags=
compiler.objcopy.eep.extra_flags=
compiler.elf2hex.extra_flags=

あたりを

compiler.c.extra_flags=
compiler.c.elf.extra_flags=
#compiler.c.elf.extra_flags=-v
compiler.cpp.extra_flags=
compiler.S.extra_flags=
compiler.ar.extra_flags=
compiler.elf2hex.extra_flags=
compiler.libraries.ldflags=
とします。(コメントアウトが増えてるけど公式のやつそのままコピペなので)



さらに、
## Combine gc-sections, archives, and objects
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {build.exception_flags} -Wl,-Map "-Wl,{build.path}/{build.project_name}.map" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{archive_file_path}" -Wl,--end-group  "-L{build.path}"

の行を

recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -Wl,--start-group {object_files} "{archive_file_path}" {compiler.c.elf.libs} -Wl,--end-group {compiler.libraries.ldflags} -Wl,-EL -o "{build.path}/{build.project_name}.elf" -lm -lgcc

とします。
これでコンパイルが通るようになります。



そして、Arduino IDEを再起動後、スケッチ例→Bsec Software Library→basic
をコンパイルしてみましょう。I2C接続でセンサーデータを取得するサンプルです。
必要に応じて、LED_BUILTINを#define LED_BUILTIN 19のように置き換え
BME680_I2C_ADDR_PRIMARYを0x77(BME680_I2C_ADDR_PRIMARYは0x76)
としてあげると動くと思います。
ESP32の場合、Wire.beginの部分で
Wire.begin(21, 22);のようにピンを置き換えしてあげる必要があります。


成功するとこんな感じでセンサーデータが出てきます。
呼気VOCなんかは簡易アルコールチェッカーとして使えそうだったり、
気温測定の代わりに今流行っているCO2も推定値が出てきます。
また、空気品質もIAQという指標となる値が出てくるため評価しやすい値となっています。

春休みにBME680をいじってみてはいかがでしょうか。