pit-rayの備忘録

知識のあうとぷっと

【Raspberry Pi】インコのためのスマホアプリをつくった(温度管理、カメラ、ラジオ、タイマー駆動)~①導入と準備~

今回はペットのための管理アプリを制作したので、数回に分け、その技術的な説明をしたいと思います。

ただし、今回の構成ではハードウェアや家のネットワーク構成に著しく依存しているとともに、1週間ほどで突貫工事的に取り組んだため、インストーラーなどは制作していません。

まず、この記事では、イントロダクションとしてその方針をまとめます。

アプリの機能

・外から様子を観察
・現在の温度を測る
・温度の推移をグラフ化し、ヒータの故障がないか確認
・ラジオを一定間隔でオンオフ制御
(インコは人の声を聴かせれば寂しさが紛れるらしい。知らんけど。)
・朝晩のタイマー駆動
(ex: 朝6時にソフトが起動し、夜は稼働しない. etc)
・それぞれの機能の遠隔操作
・温度警告

完成品

f:id:pit-ray:20200218032725g:plain

カメラの映像はプライバシー的な問題で表示していません。
また、待ち受け画像は著作権的にぼかしております。

ネットワーク構成

f:id:pit-ray:20200218010254j:plain:w512
ネットワークの構成
 アプリはApacheでHTTPサーバとして稼働させ、ローカルなWebページとして作ります。また、ローカルに組んだHTTPサーバには、SoftEther VPNでL2TP / IPsecを用いて外部からアクセスします。このとき、SoftEther ServerとHTTPサーバが共存することになりますが、前者にeth0(有線LAN)、後者にwlan0(無線LAN)をIP固定し、同一LAN内からのアクセスは、wlan0を優先するようにルーティングを行います。(具体的にはeth0は仮想ブリッジbr0を持つことになるため、br0よりもwlan0がmetric的に近くするようにします。ちなみに、SoftEtherを物理LAN(eth0)にするとブリッジが組みやすくなります。)

 それぞれの機能は、systemdデーモンとしてラズパイ上に実装し、CSVとして温度ログやパラメータ類をHTTPサーバーにダンプしたり、読み込んだりします。遠隔操作は、CGIにGETリクエストを送り、パラメータCSVを変更することで反映させます。

加えて、WebページをPWA化することで、ネイティブアプリ風にします。

使用機材

すでに所持していたものは価格の計算から外しています。

機材 目的・用途 購入時の価格
Raspberry Pi 3 Model B+
(以下ラズパイ)
メインサーバー 6000円
ラズパイのケース 本体の防塵や冷却 1099円
ACアダプタ ラズパイの 電源 1199円
SDカード 16GB ラズパイのデータ保持 1280円
Webカメラ カメラです 2005円
高精度温度センサ 温度測定 774円
RTL2832Uチップ搭載のチューナー ラジオの電波傍受のためのSDR 1699円
無線LAN中継器 無線→有線の変換 -
合計 14056円

 それぞれの詳細と、実際に購入した商品を順番に載せます。商品ページには、画像をクリックするか、上記の表から飛べます。(AdBlockが有効になっている場合は、画像が表示されません。)
 ラズパイ本体は、購入した商品が売り切れになっていたため、同じ商品の別の正規代理店のページを載せました。しかし、Amazonではなく、RCコンポーネンツなどのほうが安く手に入れられるかもしれません。

ラズパイ本体


 Raspberry Piは、イギリスのラズベリーパイ財団から発売されている教育用の小型パソコンです。工学系の大学生なら一度は聞いたことがあるくらい有名で、最近のモデルではWi-Fiの高速通信に対応し、IoTデバイスとして活用されています。

 OSは、公式が提供しているDebianベースのRaspbianが主流です。

 現時点での最新の4モデルでは、メモリが4GBでCPUも非常に高性能になっていますが、4ではHDMIケーブルが特殊で、一般的なHDMIケーブルでは接続できないため、3+がオススメです。といってもケーブルは1000円程度で購入できます。

 ラズパイは省電力であるので、サーバーとして24時間365日稼働させても経済的に負担が少なく、省スペースで邪魔になりません。

 今回は、Amazonで購入しましたが、大学生協に安価に販売されていたのでショックでした ...

ラズパイケース

 ケースは必須です。数千円ですし、裸で使うのと大して差がないように思われがちですが、PC内部にはエアフロ―というものがあります。自作PC界隈ではよく知られた話ですが、風の流れを意識してケースに組み込むことで、裸で組むよりも高い冷却効果が得られます。加えて、防塵効果もあります。

 ケース自体はなんでも良いですが、ファンとヒートシンク(放熱板)が付属したものが良いです。特にヒートシンクは必須です。チップセットやCPUに使用されている半導体は、ヒートシンクの有無により、許容電力が大きく変化します。

ACアダプタ


 MicroUSBの5Vで2.5A以上が推奨ですが、高負荷時を考えると3A以上がオススメです。4ではType-Cになり、3A以上が推奨となりましたので、より高出力のものが必要です。

 スマホやタブレットのACアダプタは、1A ~ 2A程度なので、オススメできませんが、動いている事例はあるようです。また、MacのACアダプタでも動いている事例も多々あります。(3B+)

 スイッチ付きが再起動しやすく便利です。

SDカード


 大きさはmicroで16GBがオススメです。今回は、OS含め、8GBほど使いました。ただし、ラズパイはSDカードの相性問題があり、メーカーによっては認識してくれません。RPi SD cards - eLinux.orgに動作報告が多数掲載されています。購入する際には、必ず確認しましょう。
 
 東芝製は比較的動作しなかったケースが少ないようですので、東芝のClass10にしました。このSDカードでは、上記のサイトでも動作確認がなされており、使用した際も安定していました。

Webカメラ


 mjpg_streamerでカメラを使います。外から見るため、高解像度のものは必要ありません。高解像度で配信すると、データ通信量が馬鹿になりませんし、通信速度によってはカクつきが目立ちます。最低限、320 x 240以上あれば問題ないと思います。

 また、ラズパイには専用のカメラモジュールを接続することができますが、配線の取り回し上、USBで接続したほうが無難です。

温度センサ

デジタル温度センサー ADT7310 DIP化モジュール MDK001の通販ならマルツオンライン

 センサ自体は、なんでもよいですが、コントローラは自作する必要があります。
 今回使用したADT7310のコントローラは、Pythonにてクラスモジュール化しましたので、importして利用してください。

 ADT7310のDIP化モジュールは、実際に温度を測るときは延長する必要があります。私はピンをはんだ吸い取り線で取り外し、メスpinーリード線ーはんだ付けという風にしましたが、メスpin ー メスpinで延長することもできます。

 テスト時には、ブレッドボード上で作業しました。

チューナー

 チューナーを買うときが、最も注意が必要です。

 今回利用するラジオは、SDRを利用したものになります。一般的なラジオがコンデンサの電気容量を電気的に変化させるなどして復調するのに対し、SDRはそのチューニングをソフトウェアで行うことができます。SDRはピンキリで、Amazonでは1万円を超えるものもゴロゴロあります。

 今回使用するrtl-sdrというソフトは、蟹のマークで有名なRealtekのRTL2832Uチップが搭載されたSDRが必須です。

 rtl-sdrは、海外製の安価なチューナーがSDRとして利用できるということで、日本でも多くの記事がありますが、それぞれのサイトで共通して紹介されている緑のパッケージのとある商品は、現在ではRTL2832Uのチップではなくなったようです。今回リンクに挙げたチューナーにはRTL2832Uが搭載されておりましたし、rtl-sdrもしっかりと動作しました。

 Amazonのレビューを参考にするとよいと思います。

無線LAN中継器

 無線から有線への変換器として利用します。ラズパイを有線で接続する場合には必要ありません。今回は、自宅で監視用のWebサーバを動作させ、加えてSoftEtherによるVPNサーバーを介して外からアクセスします。SoftEtherは、プロミスキャスモードに対応した無線デバイスが必要であり、有線が確実です。
 Wi-Fiルータの親機を中継器として利用することもできるので、自宅に不要なルータが転がっていたら、再利用できます。私は、Buffaloのルータを用いました。

総括

 以上が導入となります。
 私は、ネットワーク系の経験が浅いため、betterな実装や、セキュリティ的に甘い箇所があればご指摘いただけると非常に勉強になります。
 この記事は、後日、記事と辻褄を合わせるため、再編集すると思います。