最終更新日時:

サーバールーム管理システム作りたい!
【マイコン・バックエンド編】

メイン画像

経緯

実家の私の部屋は、様々なサーバーPCを置いてしまっています。
さらには大学進学で実家から離れることにより私の部屋が完全に
サーバールーム化
してしまった。(笑)

そこで、このサーバールームを 実家にいなくても管理できるシステム を作りたいなぁ...なんて思ったので、行動に移しました 行動力◎

構成内容

今回、私は少し変わった構成にしてみました。

構成図

本来ならRaspberry Pi(ラズパイ)をLANに接続し、Webサーバー化してしまえば簡単です。
しかし私の場合は、Webサーバーが既にあるため、あえて サーバーにArduinoをUSBでつなぎ通信 して表示させるシステムにしました。

使用した物

Webサーバー関連の使用した物については別でブログを書いてますのでそちらを参照ください

製作手順

センサ取り付け

まずはセンサをつなぐところから始めましょう。

ドアセンサー配送時画像 ドアセンサー画像 実写画像汚すぎる

てなわけで、こいつらをはんだ付けとか色々して、Arduinoに読み込ませていきます。

スイッチ系はプルアップで制作しています。
Arduinoのプルアップ機能を使用せず、自分で抵抗を使ってプルアップしました。
10kΩ抵抗が300本近くあるから使いたいんですよぉ~

プルアップを知らない方へ:
マイコンのデジタル入力はHigh(5v,3.3v...etc)とLow(0v)でなければならない。
しかし、スイッチというのは電気の道を繋ぐ/切るしかしません。
ただスイッチを挟むだけだと、接点時にはHighですが、非接点時はHighかLowかわからない(浮き)状態になります。
そのため、Vcc(High)と入力ピンを線で繋ぎ、GNDへの線にスイッチを挟むことにより、マイコンの内部抵抗の差を利用して浮きを無くします。
無接点時はHighで、接点時に短絡しLowになることから「プルアップ」という。その逆を「プルダウン」という。
作業中画像

※左下のユニバーサル基盤は、もともと使用していた入室管理システムのものである。
GPIOに刺してセンサを読み込ませていきます。

プログラムを作る

ハードウェアが完成したら次はソフトウェアに入っていきます。
私が書いたプログラムから説明していきます。

C

※高1で作った入室管理システムのプログラムを改造しているため、コメントアウトなどが恥ずかしいです。 気にしないで
元々の入室管理システムのプログラムはそのまま残して利用しているため、一部は使用していません。
今回追加したのは44行「output」コメントアウトから64行までです。
先にこちらの実行結果を見てくれた方が分かりやすいかと思いますので見てください

実行後コンソール画面

このようになっています。
まず、この出力ですが、Arduino IDEのシリアルモニタで確認しています。
つまり、USBを通してサーバーには シリアル通信 を用いて通信します。
サーバー側でシリアル通信ができるライブラリを導入して通信します。(後述)

続いて通信しているこの文字列ですが、見ればわかる通りweb構造物の代表 自称Json形式です!
jsonってマジでフロントエンドからすると便利すぎる

Json

データ構造をわかりやすくすると、このように出力されます
英語の話ですが、データの内容は次の形です。

  • temp: temperature(温度)
  • rh: relative humidity(相対湿度)
  • isOpen: 開いているか
プログラミングにおける変数 "is_..."
プログラミングで"is_~"と始まる変数は基本的にyesかnoのどちらかを格納する変数が多いです。
そのため、isから始まる変数はboolean型(真偽型)であることがセオリーです。
今回のisOpenでは、開いていたら1(True)、閉じていたら0(False)をデータとしています。

これをwebサーバーバックエンドに読み込ませ、フロントエンドに反映という形を取ることに。

webサーバーのバックエンドを作る

次はwebサーバーのバックエンドを作っていきます。
サーバー側は様々な言語を使用して、htmlに表示できるようにします。具体的には次の形です

  • 通信を受け取る/jsonに変換: 使用言語Python
  • データを読み取る/ページに表示: 使用言語Java Script

このシステムだけで、 Arduino C , Python , JavaScript といった言語を使用します。
言語を覚えるにはぜひ構築してほしい構成です!

では、Arduinoからの通信を受け取るプログラムを作りましょう。
シリアル通信をpythonでするためのライブラリは「serial」です。
また、jsonファイルに変換するため、「json」ライブラリも一応入れます。

Python
一応シリアル番号とhttpのディレクトリは隠しておきましたw

5行目、ser変数にArduinoのシリアル通信のための変数を定義
11行目、readlineメソッドで読み込み、decodeメソッドで変換、stripメソッドで整理
13行目でjson形式に変換
15行目より、httpディレクトリ、info.jsonにデータを上書き
一応何かあったときのために、try-except文を入れ、通信不能時の例外処理+出力も追加

こんなところでしょうか。
これで自動的に htmlファイル直下にinfo.jsonが更新 されますので、後はそれをJava Scriptを使って読み込んで反映させていきます。

次回予告【フロントエンド編】

あ”あ”ぁ”ーーーここまで書くの疲れたぁぁw
次回はjs及びhtml-cssをやっていきます。
「htmlなんて知っているのばっかりだしもういいか」
なんて思ってるそこのあなた!

svgのDOMと画像

温湿度やドアの開閉状態を 文字ではなく"図"で分かりやすく表示 しますよ。
しかもこれは 画像ではなく図として全てHTMLで書いてます よ。
気になった方は次回もご期待を!

次回のリンク

comming soon!