Skip to content

Commit

Permalink
Merge pull request #51 from jphacks/ArduinoReadme
Browse files Browse the repository at this point in the history
独自技術で僕が変なふうにフォーマットを改変してコンフリクトしてたので,そこを正常な方に戻しました.
  • Loading branch information
SSSStanaka authored Oct 31, 2021
2 parents c787613 + 77deab7 commit 5e4b7c2
Show file tree
Hide file tree
Showing 8 changed files with 68 additions and 19 deletions.
87 changes: 68 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# ブックロウ

[![ブックロウ プロトタイプ](./docs/product_image.jpg)](https://youtu.be/S9MBtacrhz4)
[![ブックロウ プロトタイプ](./docs/product_image.png)](https://youtu.be/S9MBtacrhz4)

## デモ動画
[![ブックロウ プロトタイプ](./docs/demo_video.png)](https://youtu.be/S9MBtacrhz4)
[![ブックロウ プロトタイプ](./docs/demovideo_samune.png)](https://youtu.be/S9MBtacrhz4)

## 製品概要
### 背景(製品開発のきっかけ、課題等)
Expand Down Expand Up @@ -105,22 +105,19 @@ iOSアプリケーションはユーザが積ん読している本の登録お
- 表示機にコンシェルジュのような役割を果たすキャラクターを登場させ,長く積まれている本のサジェストや,目標の提案や,設定した目標に基づいて読むことを促す言葉をかける機能をもたせる.

### 注力したこと(こだわり等)
1. 読書情報を自動で記録する点.
- しおりは圧力センサと磁気センサを用いて,読書の開始と終了を検知します.
- 読書を終えると自動で読書の記録をサーバにアップロードするため,ユーザの手をわずらわせることはありません.
2. ページ数をできるかぎり正確に検知する点.
- しおりはクリップ形状になっており,しおりをはさんだときの開度を可変抵抗で読み取ることで本の厚みを検知し,ページ数を算出しています.
- より正確にページ数を測定するために,オペアンプによる信号増幅回路を持ちいて角度の読み取り精度を3.7倍に引き上げました.さらに,センサ値と理論値を一致させるために2次関数近似を用いた補正をしています.
3. おしゃれな外観を与えました
- ブックロウは据え置き型のデバイスです.ユーザのインテリアの一部としても設置できるように,木目調のデザインで統一しました.
- アプリ,しおり,ディスプレイの表示に
<!-- todo 表示機の拡大写真? -->
4. サーバーにおけるgRPCを使用したスキーマファーストの開発
1. 読書情報の自動記録
- しおりは各種センサによって読書したページ数と,読書の開始と終了のタイミングを検知します.
- その情報を元に読書を終えると自動で読書の記録をサーバにアップロードすることで,ユーザの手を煩わせないようにしました.
2. おしゃれな外観
- ブックロウは据え置き型のデバイスです.ユーザがインテリアの一部として設置したいと思えるように,木目調のおしゃれなデザインで統一しました.
- アプリ,しおり,ディスプレイ表示の各所に,ふくろうのデザインを取り入れています.これによって暖かみのあるデザインとなり,ユーザから愛着をもって使ってもらえるようにしました.
![外観デザインのこだわり](./docs/appearance.png)
3. サーバーにおけるgRPCを使用したスキーマファーストの開発
- 仕様書を作成し,その仕様書からコードを生成することで,仕様と実際の動作の差異をなくすことができる.
- 仕様書によってクライアント―サーバー間の通信が詳細に定義されることで,クライアントはサーバーの実装を待たずに通信部分の開発をすすめることができる.これによりサーバとクライアントの開発の分離度を向上させることができる.
5. GitHub Actionsを活用した継続的インテグレーションの実現
4. GitHub Actionsを活用した継続的インテグレーションの実現
- コードをGitHubにアップロードした時点でテストを自動的に実行するよう設定することで,開発者は機能開発に集中しながら,一定のプログラムの安定性を保証するようにした.
6. 本の情報を簡単に登録できるように,iOSアプリケーションでバーコードリーダーとしての機能を実装し,キーボード入力無しで本を登録できるように実装した.
5. 本の情報を簡単に登録できるように,iOSアプリケーションでバーコードリーダーとしての機能を実装し,キーボード入力無しで本を登録できるように実装した.

## 開発技術
### 活用した技術
Expand Down Expand Up @@ -159,10 +156,62 @@ iOSアプリケーションはユーザが積ん読している本の登録お

### 独自技術
#### ハッカソンで開発した独自機能・技術
<!-- todo しおりデバイスの開発秘話 -->
* 独自で開発したものの内容をこちらに記載してください
* 特に力を入れた部分をファイルリンク、またはcommit_idを記載してください。
* しおりセンサの開発
##### しおり型計測器のページ数検出技術
<!-- * 独自で開発したものの内容をこちらに記載してください -->
<!-- * 特に力を入れた部分をファイルリンク、またはcommit_idを記載してください。-->
本の一般的な紙の厚さは0.13mmであるため,ページ数を検出する計測器には極小寸法を計測できる測定精度が必要になります.
厚みゲージやノギスといった計測器具であればこのような極小寸法を計測することができますが,使用には専門知識と手間が必要です.
対して我々のプロダクトは手軽に読書記録をつけられることが魅力であるため,それらの煩雑な計測器具は適しません.
そこで我々は一からしおり型計測器を開発しました.

始めに,ハードウェアとなるクリップに関して様々な種類を試しました.
その結果,色々な挟み方をしても計測値の変化が少ない「洗濯バサミ」を採用しました.
しかし洗濯バサミは簡素なつくりであるため,関節部のガタツキが大きく計測精度を悪化させてしまいます.
そこで極小金属パイプ(直径2 mm)や極小金属ネジ(M2サイズ)を使用して,各部の取り付け剛性を確保しました.

次にしおり型計測器の開閉角度から,どのようにページ数を検出しているかを説明します.
ページ数は次に説明する6つの段階を経て算出されます.
1. 可変抵抗を回転させる

本にしおりをはさむと,洗濯バサミの開閉角度が大きくなります.
すると洗濯バサミに埋め込んだ軸が可変抵抗を回転させ,洗濯バサミと同じ角度だけ回転します.
2. 可変抵抗の出力電圧が変化する

可変抵抗の両端には5Vの電圧がかけられており,回転すると出力電圧が変化します.
今回の角度変化は0〜62度であり,それに伴って変化する出力電圧は0.110 V〜1.09 Vとなりました.

3. 信号増幅回路で電圧変化を増幅する

しかし,後述のArduinoの性能では,1 V程度の電圧変化では正確に電圧を測定することができません.
そこでオペアンプによる差分増幅回路を用いて電圧変化を3.7倍(0.002 V〜3.76 Vの範囲)に増幅しました.
こうすることで,増幅回路がない状態に比べて測定精度を3.7倍に引き上げることに成功しました.
4. Arduinoで電圧変化を計測する

Arduinoのアナログ入力ピンで信号増幅回路の出力電圧を計測します.
Arduinoは5 Vを1024段階で計測することができます.
今回の信号増幅回路の電圧変化に対しては,Arduinoの電圧計測値は0〜764段階まで変化します.
以降,この段階値をArduino電圧測定値と呼称します.
5. 電圧値をページ数に近似する

前項では洗濯バサミの開閉角度を電圧変化に変換し,Arduinoで計測するところまでやりました.
しかし開閉角度とページ数は比例の関係ではありません.
またページ数が多くなればなるほど,紙は洗濯バサミのバネによって圧縮されて,開閉角度の増加は緩やかになります.
そのため,開閉角度とページ数は非線形の関係となり,それを予測することは困難です.

そこで我々はArduino電圧測定値とページ数の関係のデータを36点にわたって測定しました(下図のグラフ参照).
そしてExcelの近似関数を求める機能を利用して,Arduino電圧測定値からページ数を求める2次関数を求めました.これにより,洗濯バサミの開閉角度からページ数に変換することができました.
6. ページ数を紙の厚みで補正する

本によって紙の厚みが異なるので,開閉角度からページ数を求めるのには限界があります.
そこで本の登録時に本全体をはさんだときの計測値(y_all)を取得しておき,ページ数を求める際は現在の測定値(y)との割合y / y_allを求めます.
これに本の全ページ数(P_all)を乗算することで,ページ数の補正値 y' = (y / y_all) * P_all を求めました.

本を登録する際に,本全体をしおりではさんで,ディスプレイに表示される計測値(y_all)をiOSアプリに入力するのはこのためです.([デモ動画の1:27〜2:01参照](https://youtu.be/S9MBtacrhz4?t=87)

以上の6つの段階を経て,しおり型計測器はページ数を検知しています.
読み取り精度に関しては,770ページの本を計測したときにArduino電圧測定値が0〜485段階に変化しているため,分解能は 770ページ ÷ 486段階 = 約1.6 [ページ/段階] となります.したがって,理論的には770ページのうち1.6ページまでを区別して測定できることになります.
ただし,洗濯バサミのはさむ場所や角度,本の状態によって測定結果は変化してしまうため,より測定の誤差は大きくなります.しかし本プロダクトの魅力は手軽にページ数を検出する点にあるため,その用途においては十分な精度になっています.
![ページ数検出の仕組み](./docs/pagenum_detect.png)

<!-- #### 製品に取り入れた研究内容(データ・ソフトウェアなど)(※アカデミック部門の場合のみ提出必須)
*
Expand Down
Binary file added docs/appearance.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/bookshelf.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/demo_video.png
Binary file not shown.
Binary file added docs/demovideo_samune.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/pagenum_detect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/product_image.jpg
Binary file not shown.
Binary file added docs/product_image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 5e4b7c2

Please sign in to comment.