Raspberry Pi で自作するとここにはまる
~問題点と解決策~
02/17/2017 @ NF研究会
システムの概要(ごみ置き場ゲートドアのタイマー制御システム)
マンションのごみ置き場エリア(中)のゲートドアの自動解錠システムを作成。曜日毎に解錠時間と 施錠時間が設定可能。左の写真で、マンションの玄関の手前右にごみ置き場があり、ゲートドア が設置されており、扉の左のポール裏にマグナロック(電磁錠)が取りつけられている。
マグナロックは収集日当日の早朝から、清掃担当者の作業終了予定時間まで解錠され、清掃担 当者がごみ置き場の清掃後に施錠を行う。操作パネルのスイッチおよび、LEDは防水仕様。清掃 担当者は作業前のスイッチOFFおよび、作業後の施錠を行う。作業前に操作パネルのキースイッ チをOFFにすると、コントローラーは制御を中止し、マグナロックおよび、LED点灯用の12V電源を リレーで遮断する。清掃終了後に清掃担当者がキースイッチをONに復帰すると、コントローラーは 制御を再開し、押しボタンスイッチを押す事でタイマーで解錠がスケジュールされている時間帯で も、マグナロックが施錠される。押しボタンスイッチによる施錠はキースイッチがOFFからONに復 帰した最初の1回だけ有効になる様にプログラムで制御されている。
また、タイマーの設定とゲートドアの解錠、施錠はVPN経由でリモートから行う事が可能。
コントローラー(拡大写真、右はカバーを取り外して90度右回転)
コントローラー(MDF内に設置)
ハードウェア構成
Raspberry Pi Model B
SainSmart 4チャンネルリレーモジュールfor Arduino DSP AVR PIC ARM 自作電源/配線回路(ヒューズ、コネクター等を実装した基板)
自作操作盤用LED /スイッチ回路(操作パネル裏のBOX内に取りつけ)
マグナロック(電磁錠)
AC/DCコンバーター(5V, 12V)
スイッチ付電源タップ(オムロン製UPSに接続)
自作BOX(無印良品製アクリルボックス、アクリル台、東急ハンズ アクリルトレー、
ウレタン類、スチロール板等を使用)
スケジュールはリモート変更可能(VPN経由) 監視カメラ映像を見ながら手動制御可能
Raspbian(DebianベースのRaspberry Pi用Linux、CPUはARM)
cron, ntp
rc.shutdown(作者がinittabに組み込み)
Apache2
telnet, xrdp(Windowsからのログイン用)
SMB Client(ルーターに接続されているSSDのファイルアクセス用)
pptp(ルータで使用、VPN用)
自作アプリケーション(開発言語:bash, perl, python, html)
ソフトウェア構成
インターホン の システム配線
各部屋の インターホン
(子機)
自動ドア1 自動ドア2 インターホン
親機(玄関)
インターホン 親機(ホール)
タッチキー1(入館用) タッチキー2(入館用) タッチキー3(退館用)
MDF
光ケーブル(入居者用)
光ケーブル(共用部用)
地デジ/BS/CS 同軸ケーブル CATV 同軸ケーブル 監視カメラ同軸ケーブル
各部屋の 集線BOX
ごみ置き場ドア/パネル配線
監視カメラの モニター
各階の 無線ルータ
タイマー解錠 のシステム
共用部ルータ等
自作または特注
建物全体のシステム概要(除く自動火災報知機)
建物共用部のネットワーク
制御部の配線
Raspberry Pi って何ができる?
CPU/Memory/Storage
-1990年代後半から2000年代初頭のUNIX W/S、サーバーに匹敵
>1GHz, >1GByte, >32GByte 可能 I/O
-上記と同じレベルのI/O性能+マルチメディア入出力 100M Ether, USB 2.0 , HDMI, Audio In/Out, Camera I/F - DI/DOが本体でできる
GPIO
-非同期通信、PWM出力が本体でてきる
USB経由の非同期通信、GPIO経由のSPI/I2C、
GPIOのPWM出力
Raspberry Pi って何ができない?
電源スイッチが無い
- 電源廻りは手を抜いている、レギュレータを搭載しない5V入力前提なので 電圧が下がるとすぐリセットする
リアルタイムクロック(RTC)が無い
- Shutdownからbootまでの時間経過が管理できない。必要な場合は外付けで対応 ハードディスク
- ハードディスク接続はUSB経由、フラッシュも非搭載 USBの拡張性が無い
- USB2.0コントローラが一つだけ LAN/WAN
- Ethernetは100M, Raspberry Pi 3だけがWifi搭載 Direct I/Oがマイコンボードとしては弱い
- Analog 入出力はできない
Arduinoはできる(GPIOのPWM出力はできる)
Why Raspberry Pi?
Arduinoで作ると下図になる(検討用に途中まで試作)
問題点(Raspberry Piで解決):
Weekly Timerの精度(3ヶ月毎ぐらいで時刻合わせが必要)
→ ntpを使用
Weekly Timerの耐久性(バックアップ電池もあるので数年もつかどうかわからない)
→ DYIの方がコントロールし易い 設定変更時の操作性
→ WebサーバーとブラウザーI/F リモート制御ができない
→ VPNでWebサーバーにアクセス
Why DIY?
市販の適当なシステムが無い(大きなオフィスビル用のシステムは有る)
玄関ドアの(インターホン)制御システム経由にすると、
オプションのコントローラーが高価、設置も難しい 屋外用のシステムが無い
制御用のプログラムは特注
→ 特注するとハード(ドア、配線等を除く)、ソフトで数百万かかる
→ 仕上げるのに手間がかかって不満足なものが出来るのは目に見えている DIYでも6人月ぐらいかかる(実際そうだった)
← 特注しても発注側に2-3人月の手間がかかるはず
結果
最初はハウスメーカー、施工業者、誰もシステムが完成するとは思ってなかった
→ あっさり動いて目が点、もうすぐ連続稼働 1,000日達成 オペレーションは極力簡単にしたつもり
→ それでも清掃担当者が慣れるのに10日から2週間かかった
→ 試行(統合テスト)と考えれば妥当
ここからがはまりどころの話
8:2でハードがらみではまります!
フットプリント
軽すぎるし、小さすぎる!繋いだ線の方が重くてコネクターに負荷がかかるし、場所もとる
DIYでは入手しやすい材料に作るものを合わせる方が得策
→ 配線は段階的に太くする
→ ケーブル繋ぎはコネクター、特注オペレータパネルBOXには立ち上り用のバーも
→ 金属シャーシに入れてネジで止める ← プロだとこうする
DIY
なのでプロ以上に考慮が必要↑コネクター繋ぎの際に 線の太さを変更
12V/5V動作なので ATA電源コネクター を使用 ↓
電源
DIY
なのでプロ以上に考慮が必要 感電防止(PLがらみ)→ 屋外電源は使わない
→ 地中配管、配線、パネル接続等は専門業者にさせた
(本来はDCだけなので、配線等に電気工事の資格は不要)
→ 念の為、施設賠償保険に加入(他の理由もありますが)
フェールセーフ(閉じ込め防止、故障時)
→ ドアロックは手動設定
(ボタンを押した最初だけロジックが必要)
→ 12V系のスイッチを切るとドアは開きっぱなし
(停電時にUPSの電池が無くなっても同じ)
Rapberry Pi 特有のクセ(仕様)
5V-3.3V問題
← 5V給電だけど、GPIOは3.3V
→ 5V TTLは Raspberry Pi の3.3V GPIOでも制御可能
→ GPIOへの5V入力は抵抗で3.3Vに落としても問題は少ない リレー駆動問題
← ほとんどのリレーは Raspberry Pi のGPIO出力電流では制御できない
→ プロダクションに使うなら、自作では無く、リレーモジュールを使用 5V貧血問題
← USBの入力電源が一時的に下がってもリセットされる
← 上記の場合、SDメモリーwrite時にファイルシステムが破壊される
→ 5.1V/5.2V仕様のUSBアダプターを使用(最近出て来た。Appleも使える)
→ USBケーブルの長さに注意
→ 電源管理用のHATが各種あるが、過大に期待しない事 リブート時のUSB電源供給継続問題
← 内部メモリーを持つアダプターがreboot時に初期化されない場合がある プロと同じ考慮が必要
リレー制御
Raspberry Pi起動時・シャットダウン時のリレーの誤動作回避
← 秋葉原等で売っているリレーキットの回路だと、GPIOの出力が 確定するまで誤動作する可能性がある。
→ SpurkFunのリレーボードが良くできていたので採用 不論理、初期値はハイインピーダンス
(通電後、一度HIGHにしてからLOWにしないと、NOに電流が流れない)
→ rc.localaまでGPIOの初期設定をまたない cronで@rebootを使用
→ shutdown時も初期値に戻す rc.shutdownを自分で組み込み
DIY
なのでプロ以上に考慮が必要スイッチとオペレータパネルのLED ジッタリング
防水のキースイッチが秋葉原では入手困難
スイッチ仕様の最低作動電圧5Vが屋外配線だと結構厳しい
→ 5V 作動でGPIO 3.3Vに入力電圧を落とす
(抵抗回路使用。12Vだと、一般的で無いレベルシフタが必要)
→
オムロンが産業用をWEB直販、最終的にモノタローで購入プロと同じ考慮が必要
→ ON/OFFはエッジ検出がベター(pull up/pull downだとダメな場合が有る)
12V LEDでも日差しの強い時間帯は 点灯が認識しずらい
→ 結局ひさしをパネルにつけました。
プッシュボタンのLEDはそれでも見にくい というかオーバースペック
(回路変更が面倒なのでそのまま)
ひさし→
← キースイッチ
← プッシュボタン LEDは
12V
放熱
ウレタンに被せる構造にしたら空気が膨張してケースがはずれちゃった!
← アクリルにねじ穴加工をしたくなかった
→ 換気ダクトを作って、虫よけメッシュをつける
→→ ユニバーサル基板の穴がちょうど良かった
DIY
で手を抜いたらそれなりに考慮が必要↑ユニバーサル基板 換気ダクト →
裏面
↑ ウレタンに
カバーをはめ込み
換気ダクトが無いと空気の 熱膨張でカバーがはずれる
オペレーターI/F、管理者I/F、html
DIY
なので手を抜くところは。。。日本語の文字化けとフォントの問題は依然として解決していない
← 永久に解決しないと思った方が良い
→ 自分しか使わない部分は英数半角。コメントも同様
→ いざとなったら、export LC_ALL=C
→ 保存はPCに(CIFS Clientが以外と使い易い)
見るだけならword pad ソースコードの修正
→ いまだに健在、dos2unix, unix2dos
→ TABに注意
スクリプト言語のはやりすたり、if分の制御構造の違い
→ なるべく、シンプルに。ライブラリにたよりすぎない
→→ pythonの文法は勉強しないと Raspberry Pi は使いこなせない!
ネットワークの切断対策と時刻同期
ブロードバンドが障害時以外にもプロバイダーに切断される場合がある
← 長期間接続しっぱなしで一定時間パケットが飛んでいない場合
← プロバイダー側のネットワーク機器の内緒のリブート
→ 1分毎に特定のURLを参照(別のRaspberry Piで実行)
→ ルータの外部アドレスを30分毎にネットワークアクセス可能な ファイルに書き込む
→ 制御アプリケーション自体はネットワーク接続に依存しない様に作成 時刻合わせは?
← OSのTODはRTCより正確
→ 長期間連続稼働が前提なのでntpで時刻同期、RTCは使わない shutdownとrebootの間は?
→ 疑似ハードウェアクロック機能でシャットダウン時に時刻が保存される reboot時にはシャットダウン時刻が設定される(必ず遅れる)
ntpと強制的に同期されるので問題は起り難い
プロと同じ考慮が必要
ネットワークとセキュリティ
外部アドレスをDDNS等で公開したくない
← 監視カメラも同じネットワーク
← 外部アドレスがわからないとVPNができない!
→ 30分毎に外部アドレスをBuffalo NASに書き込み
→ 外部アドレスはBuffalo NASにアクセスして取得
← セキュリティは大丈夫?
→ 以下を順番に突破しないといけないので、まー大丈夫かと
外部アドレスを知るにはBuffalo NASのユーザIDを知る必要がある
(パスワードは必ずしも必要無い)
VPN接続には、PPTPのユーザIDとパスワードを知る必要がある
Raspberry Piのセキュリティホールをつかないとroot特権が得られない
→ 外部アドレスは何らかの原因で年に数回変更されてしまっちゃうし 弱点は?
→
当然ながら、内部ネットワーク側から攻められると厳しい→
一応、プライバシーセパレータはかけてあるけど、じっくりやられると。。。DIY
なのでプロ以上に考慮が必要余談ですが