obniz＋各種センサーで個体判別したい

# やりたいこと

> 50個くらいあるたくさんのモノの中から選んだモノを判別したい

全てのモノに1つづつマイコンとセンサーをつけるわけにいかないので（お金が莫大にかかる）、1つのマイコンとセンサーで個体判別できるような仕組みを考えたい。

# obnizとは

javascriptに対応した、クラウド付きの国産マイクロチップ。
AWSのIoT証明書などに振り回されることなく、モノをインターネットに紐づけることができる。


# ① カメラで撮影した画像から判別
obniz＆カメラモジュールで撮影した写真から、色を解析できないか。
色ごとに個体を割り当てておけば判別できると仮定。
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/1bf5c105-6135-f55d-fd9c-f8655a03bb12.jpeg">


[仕組み]
・obniz + ArduCAMMini で写真を撮影
・カラー判別プラグインで色分析
https://www.npmjs.com/package/get-image-colors
https://www.npmjs.com/package/color-thief
https://lokeshdhakar.com/projects/color-thief/
https://www.npmjs.com/package/img-color-extractor
・色が微妙だったので、テキスト解析プラグインもテスト
https://co.bsnws.net/article/198

### 色の解析
[結果]
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/83502b4b-4d7f-e596-6b1c-96b0632a267e.png)
写真の明度に左右されてしまい、透明フィルムなどを使用し後ろから光をあてるなどで色を平均化しないと、安定した色が取得できない。

### 文字の解析

[結果]
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/6968395f-b11b-61a2-2a36-71dfc04c23f5.jpeg">
写真の明度に左右されてしまい、文字を判別できない時がある。
色判別と同じで、透明フィルムなどを使用し後ろから光をあてるなどしないと、安定した文字認識ができない。また認識されない可能性を減らすため、ゴシック体などにしたほうが良い。

**＜結論＞撮影した画像での個体判別は精度として難しい。装置の調整が壮大。**

# ② 重さで判別作戦
obniz ＆ 力系列モジュールで個体判別できないか。
圧力や重さであれば、写真など周りの環境に左右されないと推測する。

[仕組み]
・obniz + 力系列のセンサー で重さを取得
・重さを全てバラバラにしておくことで、個体を判別できると仮定

### 圧力センサー（FSR40X）
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/46f268e0-3ddd-f39c-0b06-ce6aef65f302.jpeg">
36, 220, 440, の3種類の数値しか取れず、複数に対応できない。
また、例えば220になった状態の重さを36になる重さに戻しても、しばらく220のまま反映されないなど、反応精度が安定していない。
このモジュールは、「指を当てて圧力が加わった時」など、1回こっきりのイベント実行でしか使えない。

### ロードセル（HX711）
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/17c4bc93-f029-0f0c-c105-139b48d3e531.jpeg">
重量を測るならロードセルモジュールが一番精度が良いらしい。
obnizの実行結果では常に0しか取得できず、問い合わせたところ、v2.2.0では正しく取得できなくなっているとのこと。修正パッチを作成してもらえたので、それで実行すると、重さの取得が正しくできた。
ただし、ここで、ロードセルは「決まった重さしか測れない」ということが判明。５００gを基準としたら、正確に500gになるまで測れるがその前後の値は正確なgにはならない。
このモジュールは、「ある特定のg数を超えた時」など、1回こっきりのイベント実行でしか使えない。

**＜結論＞実験できた力系列センサーでは１回イベントしか扱えず個体判別できない。**

# ③ モノごとにセンサをつけるしかない

画像も重さも使えないので、全てのモノに1つづつ何かしらの装置をつける作戦に切り替える。
安い部品で使えるものを試していく。

### ボタン
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/55a4a25f-678b-2831-0adf-749d9f34df7e.jpeg">
動くが、ボタンではつまらなすぎるためボツ。

### 光
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/986daee2-a11b-3db0-04f3-448e4ea239a7.jpeg">
[仕組み]
・obniz + Cdsセル(照度センサ：硫酸カドミウム) で電圧の変化を通知

ボタンに変わるものとして、照度センサ を全てのモノにつけて、配線で繋げてobnizで一括管理できるか実験。ひとつのobnizで3つまでの照度センサをつけれる。3つだとしっかり稼働することができた。どれか１つを指で触っておくと、どれが触ってるのか判別できた。ただしもっとたくさんの数を管理するのが目的なので、IOを増やす必要がある。

<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/75f9e887-6365-fa37-eca3-16e0542215b7.jpeg">
ちなみに、このフォトトランジスタも試した。こちらの方が抵抗の数値がピッタリだったので電圧の変化がしっかりとれた。

### 8 ビット シフト・レジスタ（SNx4HC595）
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/5ca9f861-aec1-1a45-beb9-86dae6077b29.jpeg">
https://obniz.io/ja/sdk/parts/SNx4HC595/README.md

出力iOを増やすために試した部品。
obnizに装着することで、出力iOを8個づつ増やすことができる。
結果、電圧自体は流れるが、これを間に挟んで、光センサやLEDをいくつも繋げると、測定できる電圧が不安定になって判定の精度が落ちることがわかった。

### 磁石
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/4e1256c1-b26a-ecc3-1c82-cf8b6bd4a6ed.jpeg">
[仕組み]
・obniz + ホールIC で電圧の変化を通知

すでにこの時点で、５０個のセンサは無理がありそうと気づいていたが、諦めず実験を続行。
ボタンに変わるものとして、磁力のホールセンサを試した。ホールICには、ラッチ式とそれ以外の種類があって、それによって電圧の値の切り替わりが違う。obnizではどちらにしろ電圧の変化を検出できなかった。後日、詳しい方の実験結果をみさせてもらうと、変化の精度は高いが、ホールICと磁石が5mmずれただけでも電圧がなくなるなど、位置の精密さが厳しいことがわかった。

**＜結論＞あまりにたくさんのモノを、配線で繋げてセンサーで管理するには、「電気と回路図への十分な知識」が必要なこと、そもそも配線だけで50個稼働させるのは無理があること、を把握した。**

参考サイト：
・線を長ーくはんだ付けするには
https://www.diylabo.jp/basic/basic-39.html

# ④ スーパーマイコンセンサー“microbit”を使う

obnizで複数のセンサーを扱って思い通りのものを作るのは難しいと判断し、方針を変更。
昨年勉強したmicrobitを使って、選択項目の割り出しと送信、obnizで受信してサーバーに送信する仕組みに切り替える。
obnizは、サーバー通信機 ＆ 1個で成り立つセンサーの起動のみ、という役割に転向させた。
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/0d90c7d3-fbba-2ea6-8512-7c14a97a4c12.jpeg">
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/a9af8012-e2a3-28c9-9060-d0378842ecef.jpeg">
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/0ea8e1c0-59c3-e40a-98ab-078d1d9c4d5d.jpeg">
**＜結論＞obnizは優秀なクラウド付きマイコン通信機。microbitは超ハイスペックセンサモジュール。**

# ⑤ 遊び： LEDが楽しい

一通りの仕組みができたので、LEDで遊んだ。電子部品の中でもLEDが楽しい。
電流が足りないと全てのLED点灯しない。
LEDをマスターするには、電流の計算が必須なので勉強しなくちゃいけない。
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/d1bec2d5-9fef-178e-a053-ad9a72316468.jpeg">
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71982/ce4f9bb1-39c0-6457-5363-9742a8e17579.jpeg">

**＜感想＞**
フロントエンドの人間が電子部品を気軽に扱えるようになっている現在。
とはいえ、電圧や電流、抵抗といった電気の基本なくして前に進むことはできない。
「sassでCSS書いてるので、素でCSS書けません」などと、同じように。

思った以上に、センサーをゼロから組み立てて実現できることが、小さいことだった。
最近の流れ的に、人工知能系のサービスが多々出ているので、そっちの方が精度が高くて優秀だと思った。
パソコンがもとは「0と1でできている」のと一緒で、センサーをゼロから組み立てて、実現できることは小さいことだなーと。