おうちハックデバイスを作りました!

おうち(寮)ハックデバイスを作りました!
f:id:raihun:20180901125503j:plain

はじめに

きっかけ

寮暮らしをする中で、以下のような個人的要望が出てきました。

  • 共用洗濯機・乾燥機がいつ終了したか分からない。
    他の人が使い終わった後、すぐ使いたい。
  • 食堂が何時に開いたか知りたい
  • 郵便物が来たら知りたい

などなど。

→ センサで情報収集して、無線で自室まで飛ばせるデバイスが欲しい!

開発するデバイス

今回は各技術を勉強することを主目的とし、時間をかけて汎用的デバイスを開発するのではなく、
「食堂が何時に開いたか知りたい」
に絞ってデバイスを開発しました。

食堂が開く=電気がつく → 光センサデータを無線で自室へ送るデバイスです。

要求仕様

こんなデバイスだったら良いなーと思いながら、以下の要求仕様を書き出しました。

電源関連

  • 電源が取れない可能性があるため、電池で稼働させる
  • 電池交換の頻度は1〜2ヵ月に1度にしたい
  • 電池残量を知りたい。切れる前に交換したい

通信関連

  • デバイスは無線中継器としても動作し、寮全体を通信可能エリアとする
  • 暗号化通信に対応し、スニッフィング・改ざん・不正コマンド受信を避けたい

→ 通信速度、ネットワーク構築の容易さ、開発ツールの使いやすさ、省電力であること等から、通信モジュールは、TWE-Lite REDを採用しました。

回路関連

  • 外部に水晶発振子をつけ、クロックの精度を保証したい
  • PICデバッグコネクタが欲しい
  • 通信モジュール設定 & ファームウェア書換コネクタが欲しい
  • 電池残量を調べる回路を組み込む
  • デバイスの状態が一目でわかるLEDが欲しい

回路設計編

はじめにハードウェア側から取り掛かりました。

ブレッドボードで試験回路構築

要求仕様を満たせそうな電子部品・回路を考えて、ブレッドボード上で試しました。

下の写真では、直流安定化電源で電圧を変化させ、模擬放電特性カーブによって試験したり、
USB-UART変換を使ってPC側でデバッグをしたり、
テスターで消費電流を調べ、電池が持つ期間を計算したり、
オシロスコープで想定通りに動作しているかを確認しています。
f:id:raihun:20180901153420j:plain

f:id:raihun:20180901153416j:plain

ファームウェア開発 (試験用)

試験回路構築と同時並行で、MPLAB X IDEを使ってファームウェア開発を進めました。

今までArduinoで試験回路を組んで、ATmega328P-PUを本番環境で使っていた私が
PICマイコンを大好きになる程、MPLAB Code Configuratorの使いやすさは凄まじかったです。
f:id:raihun:20180901154601p:plain

参考書籍 : MPLAB Code Configurator

C言語による PICプログラミング大全

C言語による PICプログラミング大全

補足 :
Mac版MPLAB X IDEの、MPLAB Code Configuratorは動作が遅すぎ問題で、
Winでの開発に切り替えました。

基板設計編

回路設計 (KiCad)

ブレッドボード上で組んでいる試験回路を、KiCadの回路図にしました。
この時ついでに小型化・代替できる電子部品は置き換えました。
f:id:raihun:20180901160352p:plain

参考資料 : KiCadことはじめ [PDF]

基板設計 (KiCad)

基板業者のデザインルールを守りながら基板設計をしていきます。

f:id:raihun:20180901160346p:plain

KiCadは3Dビューアーがついているので、部品同士の干渉チェックや、
コネクタが差せるか等を確認でき、便利です。
f:id:raihun:20180901160343p:plain

設計が完了次第、PDF出力し、ネットワークプリント経由でコンビニ印刷。
実寸大の紙にマチ針で穴を開けて、部品を差し込んで大きさ等の問題がないか最終確認します。
f:id:raihun:20180901165058p:plain

プリント基板 発注

発注時には面付けを行い、1枚あたり4基板で注文データを作成しました。
f:id:raihun:20180901191200j:plain

発注はいつもお世話になっている、Fusion PCBさんにお願いしました。
10枚発注して、約2,700円(配送料含)なのでとても安いです!

参考 : Fusion PCB プリント基板の製造&実装&フレキシブル基板 - Seeed Studio

プリント基板 到着

今回は発注から6日で、基板が到着しました。
1枚あたり4個 * 10枚 = 40デバイス分の基板です。

ラジオペンチで4分割した後、ヤスリがけをして部品実装準備完了です。
f:id:raihun:20180901193646j:plain

ケース設計編

Fusion 360

個人で利用する場合は無料とのことで、Autodesk Fusion 360の使い方を勉強してみました。
以下の書籍を途中まで読み進めるだけで、自分のやりたい事は実現できた程、使いやすいソフトです。

参考書籍 :

設計した基板や、電池ボックスの寸法をスケッチで作図。
f:id:raihun:20180901170745p:plain

スケッチから3Dデータを設計。
f:id:raihun:20180901170741p:plain

発注する予定のネジの寸法と、基板厚(1.6mm) 等を考慮しながら進めます。
そのような時は断面解析がとても便利!
f:id:raihun:20180901170737p:plain

ついでにレンダリング機能を使ってみました。
f:id:raihun:20180901170731p:plain

最後にSTLファイルを出力して、ケース設計は完了!

ネジ等の発注

基板とケースを組み合わせるネジ等は、ねじナビ。で発注。
種類がたくさんあり、寸法図もあるので設計時に便利でした。

参考 : ネジ・ナット・ボルト・ビスの通販・販売。ねじの事ならねじナビ。

3Dプリント編

STLファイルからGコード生成

FlashForgeの公式スライサー FlashPrintを使って、Gコード生成(*.x3g)をしました。
f:id:raihun:20180901175540p:plain

3Dプリント

生成したGコードをSDカードに入れて、3Dプリンタに挿し、プリント開始。
f:id:raihun:20180821212543j:plain

調整等は下の記事で書いています。
http://www.raihusoft.jp/entry/2018/09/01/133725www.raihusoft.jp

設計通りのものがプリントできました!
f:id:raihun:20180821215331j:plain

組立編

基板への電子部品はんだ付け

(写真を撮り忘れました。)

各部品取付

電池ボックスをタッピングネジで固定
f:id:raihun:20180821215315j:plain

基板はネジと六角ナットで固定
f:id:raihun:20180821215258j:plain

f:id:raihun:20180821215453j:plain

アンテナ、LED等と基板を配線
(ごちゃごちゃすぎる・・・)
f:id:raihun:20180901125455j:plain

CdSセルも予定通りの位置に!
f:id:raihun:20180901125459j:plain

ファームウェア書込み

通信モジュール TWE-Liteに、専用ポートから書込み。

このポートから、PICマイコンのデバッグや、TWE-Liteの設定もできるようになりました。
f:id:raihun:20180821215524j:plain

ファームウェア開発

MPLABを使い、以下のアルゴリズムをC言語で書いていきます。

電源投入時 初回動作

  1. 電源投入
  2. 親機へ、PING(TIMESYNC信号)を送信
  3. 親機から、デバイスの内部時刻を補正する信号(時刻補正信号)を受信
  4. 省電力動作モード(通常時)へ移行

例外処理として、時刻同期に失敗した場合はLEDを点滅

時刻同期・状態送信 動作

  1. 毎時9分00秒、39分00秒に、TWE-Liteを動作開始。無線受信・中継を有効化
  2. 毎時9分59秒、39分59秒に、光センサデータとバッテリ残量を親機へ送信
  3. 毎時10分10秒、40分10秒に、親機からの時刻補正信号を受け取り、
    内部時刻を補正すると共に、マルチホップで他デバイスの時刻も補正する
  4. 毎時10分59秒、40分59秒に、省電力モード(通常時)へ移行

※時刻誤差を考慮して、2分稼働に設定。水晶発振子をつけたので、1週間に1回の補正でも良いのかも?(要検証)。

目的別 状態送信 動作

今回は、「食堂が何時に開いたか知りたい」を解決するデバイスのため、
午前6時〜6時半頃に光センサデータを5〜30秒間隔(調整中)で送信する。

親機製作編

ハードウェア側

Raspberry Pi 3 Model Bと、TWE-Lite ToCoStickで作成しました。
f:id:raihun:20180901212838j:plain

ソフトウェア側

Python3系に、pyserialを入れてプログラムを書きました。

デバッグ用に書いた暫定的なコードなので、ダメダメです。
f:id:raihun:20180901213850p:plain

評価編

完成したデバイスの仕様

  • 自己バッテリ推定 回路実装
  • 水晶発振子によるクロック保証
  • PICデバッグ&TWE-Lite設定&TWE-Liteファームウェア書換コネクタ実装
  • 汎用出力コネクタ搭載
  • 通常時 1[mAh]以下の消費電流 → 約80日間連続稼働
  • 無線中継器としても機能 (TWE-Liteのマルチホップによる)
  • 暗号化通信(AES128)対応 (TWE-Liteの暗号化機能による)

大体要求仕様を満たせたかなと思います。

最後に

今後実装したいもの

  • 親機でエッジコンピューティング的なことをして、急激な光の変化を受信した時に、
    LINE BOTから「食堂が開いたよ!」と通知
  • 独自インタプリタ言語的なのをPICマイコンに実装して、
    無線経由でファームウェア書換をやってみたい
  • 独自インタプリタ言語もどきのための、簡易コンパイラだったり、
    エンジニアリングツール開発だったりをしてみたい

感想

ようやく念願の回路・基板設計、ファームウェア・ソフトウェア開発、ケース設計、3Dプリントの一連の流れが把握できた!
経験技術一覧(ブログ内リンク)もまた少し増やせました!
(ただし、どれも入門者レベルの知識しかないので、要勉強。)

今後は見せる側(Web?)あたりを勉強し直して、Maker Faire Tokyo・NT〇〇...etcのイベントを目指すのも楽しそう!と思いつつも、
圧倒的アイデア&時間のなさ(やりたい・勉強したい事が多すぎて)に嘆いているところです。