こんにちは。hagechipです。
毎度の告知ですが、まだ読んでいない方はこちらを先に読んで下さい。
最低「ブログの内容」と「想定読者と読み方」のところは。。。
想像してた内容と全く違った。
なんていう残念な時間の浪費を多少は防止することができます。
Raspberry Piを使用した畑のモニタリング。
前回まででようやくRaspberry Piを使用できるようになったので、
今回はRaspberry Piと土壌センサを使って、土の湿気を
計測したいと思います。
ゆくゆくは今回計測する値を用いて、水やりを自動でできるように
していきたいとは思いますが、そこら辺の仕様は固まってないので、
今回は値を計測するまでです。
取得した値はファイルに保存します。
また、今後必要になる起動時自動実行、定期的に実行、
Raspberry Piのスマホからの操作についても今回行います。
ムダに長くなりました。回数を分けて必要な分だけ読むことを推奨します。。。
目次
用意するもの
・各種電子工作部品
・土壌センサ
・ADコンバータ
電子工作部品については、どのセンサを使用する場合にも
必要なので、下のページにまとめています。
http://ameblo.jp/hagechip/entry-12276345664.html#parts
土壌センサ
今回はこれを使用します。
・Moisture Sensor:SKU:SEN0114 (DFRobot社)
(リンクは秋月電子)
この土壌センサで土の湿気を計測し、
Raspberry Piに測定結果を送ります。
ここで、土壌センサはアナログで値を出力しますが、
Raspberry Piではデジタル値しか処理できません。
そこで、今回はアナログ値→デジタル値の変換を行う、
ADコンバータも使用します。
ADコンバータ:MCP3208-CI/P (Microchip社)
(リンクは秋月電子)
各部品の仕様はリンク先の秋月電子のページの「参考資料」からも
見ることができます。
ADコンバータについては、秋月電子で購入すると
日本語のデータシートも同梱されていました。
土壌センサ。湿度みたいな、絶対的な数値を測るものではないんだな・・・
まぁ目的は"土が乾燥したら水をあげる"なので全く問題はない。
Pythonの使用
土壌センサを使用するに当たってはこの章は読み飛ばしても
問題ありません。
Raspberry Piでセンサから値を受け取る(GPIOピンを制御する)に
あたっては、プログラミングを用います。
このブログではプログラミング言語としてPythonを使用します。
理由としてはRaspberry Piでの標準言語となっているから。
また、世界的にはかなり使用されている言語のようで、
サンプルが多いからです。
簡単な使用方法はRaspberry Pi公式ホームページにも
掲載されています。
https://www.raspberrypi.org/documentation/usage/python/README.md
ちなみに私はC言語ユーザーだったのでPythonは初心者です。
が、まぁ難しさは全く感じませんね。
難しいことをやってないってのもありますが。。。
私にとっては、Pythonで特筆すべきはインタープリター言語
ということでしょうか。
だいたいのコードミスはその行の実行時にエラーになるため、
C言語でコンパイラに頼っていた人は気をつけなければいけません。
長時間実行時にスペルミスで止まってた(´・ω・`)
なんてことにならないように、できるだけ動作確認時に
コードを通しておくのが安全かと思います。
読者のアルゴリズム、プログラミング、Pythonに対する
知識レベルはかなりバラけていると思うので、
このブログにおいては基本的にはサンプルコードを
示すのみとします。
「こうやれば動く!」程度です。
もちろん質問はなんでも受け付けます。
最後に、私がよく用いる簡単な使用方法だけ示します。
まずは任意のフォルダにxxxx.pyというファイルを作成します。
この .pyという拡張子がPythonコードのファイルを示します。
(ここでは/home/pi に作成した、Python_Codeというフォルダに、
sample.pyというファイルを作成します)
まずはファイルを作成したいフォルダで右クリック、
新規作成 - 空のファイルをクリックします。
出てきたウインドウにsample.pyを入力してOKをクリックすると、
sample.pyというファイルができます。
次に作成したファイルをダブルクリックするとエディタ(Python3(IDLE))が起動し、
編集画面が表示されます。
ファイルの中身は、もちろん最初は空っぽです。
ここでは「Hello World!」と表示するプログラムを作成します。
ファイルに下のように書き込みます。
コメントアウトは'#'です。ただし、一行目の文字コードの指定は、
実行時アプリケーションでちゃんと読み込まれているようです。
# -*- coding: utf-8 -*-
#Hello World!を表示
print('Hello World!')
そして実行。
実行はするにはメニューバーのRun - Run Module F5をクリックします。
また、F5キーでも実行できます。
実行結果はこんな感じ。
当たり前ではありますがC言語でいう
コンソールアプリケーションですね。
ファイルの著作権情報を入力しろ的なことを言われていますが
ここでは無視します。
また、ターミナルから
Python [ファイル名(ファイルパス込み)]でも実行できます。
ここまでがデモンストレーションです。
さて、このPythonを使用して、次の章では実際に
計測用のコードを記載します。
プログラミング
それでは早速コードを作成していきます。
前述の通り、こうすれば動く。というコードのみを記載します。
まずは.pyファイルを作成します。
ご自身の好きな場所に、好きなファイル名で作成してください。
ここでは、"/home/pi"に"python_code"というフォルダを作成し、
"MeasureMoisture.py"というファイルで作成しました。
コードは別のページに記載しました。
作成したファイルにリンク先のコードを
コピペすれば使用できるようになっているはずです。
コードは「Raspberry Piで学ぶ電子工作」(著:金丸隆志)に記載のものを元に、
値の計測方法(5回計測・中央値取得)と出力先(ファイル保存)を修正しました。
値の取得方法を変えたのは、特に問題があったわけではありませんが、
誤差や計測ミスでの誤作動を少しでも減らせればという意図です。
失敗すると水やりが始まってしまうのでw
土壌センサ接続
次はハードの接続をしていきます。
各センサをRaspberry PiのGPIOピンに接続していきます。
GPIOピンについては簡単に下記ページに記載しました。
http://ameblo.jp/hagechip/entry-12276345664.html#GPIO
配線ですが、見やすく書くのが面倒なので実際の写真で表現します。
それぞれ同じ色の線がつながっています。
ジャンパワイヤのオス、メスはうまく組み合わせてください。
どことどこがつながっているかわかりづらいと思いますが
がんばってください!←
なお、下のページを参考に作成しました。
リンク先を見ながら作成してもいいと思います。
http://dev.classmethod.jp/server-side/node-js-server-side/raspberry-pi-2-ad-convert-nodejs/
まずは土壌センサ。
同梱されているコードを接続します。
で、そのコードにジャンパワイヤを接続。
次にブレッドボード+A/Dコンバータ。
特にA/Dコンバータの向きには注意してください。
で、これに線をつなぐ。
最後にRaspberry Pi。
ちょっとペイントで編集したら見づらくなった・・・?
線でつながれているものを文字にするとこんな感じ。
ラズパイのピン名称はこれ参照
MCP3208のピン名称はデータシート参照
土壌センサのピンの役割と色の関係はマニュアル参照
MCP3208:VDD - ラズパイ:5VPower
MCP3208:VREF - ラズパイ:5VPower
MCP3208:AGND - ラズパイ:Ground
MCP3208:CLK - ラズパイ:BCM11番ピン
MCP3208:DOUT - ラズパイ:BCM9番ピン
MCP3208:DIN - ラズパイ:BCM10番ピン
MCP3208:CS/SHDN - ラズパイ:BCM8番ピン
MCP3208:DGND - ラズパイ:Ground
土壌センサ:青線 - MCP3208:0ch
土壌センサ:黒線 - ラズパイ:Ground
土壌センサ:赤線 - ラズパイ:3.3VPower
※土壌センサの入力電源(赤線)は、5Vでも良い。
どちらにするかは出力値を見ながら決める。
計測実行
実際にセンサを動かしてみます。
動作確認の際はファイルを開いたりするのは面倒なので、
コードの69行目からを下のように書き換えるといいと思います。
ターミナルに連続で値を出力するようになります。
try:
f = open('/home/pi/MoistureLog.csv', 'a')
f.write(datetime.now().strftime('%Y/%m/%d,%H:%M:%S, ') + str(getval()) + '\n')
except KeyboardInterrupt:
pass
finally:
f.close()
GPIO.cleanup()
これを下のようにする
try:
while True:
print(datetime.now().strftime('%Y/%m/%d,%H:%M:%S, ') + str(getval()))
sleep(1)
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
この場合、ctrl + cでプログラムは終了します。
土壌センサの先端を水につけると最大値。
なににも接触させなければ0になります。
5Vの電源を使用して水につけると4095が出力されました。
どうもサチっているようなので3.3Vを使用すると3000後半に落ち着きました。
マニュアルを読むと、0~900の間を動くようなことが書いてあります。
しかし私の環境ではそうはならず、湿った土では3000前後、
乾いた土では2200前後となりました。
まぁもともと定性的な値なので気にしないで進めます。
ただ、後日配線からやり直して再度測定してみると、
また違った値になっていました。
実際に使用する環境に合わせて、使用する電源電圧、
水やりの有無の閾値設定をしたほうがよさそうです。
cronを使用して自動実行
土壌センサを用いて、土の湿気を計測することができるようになりました。
実際に使用する際には一定時間間隔で長時間計測する必要があります。
また、外で使用するため、ディスプレイ・マウス・キーボードなどがなくても
電源を入れたら勝手に動作するようになってたほうがありがたいですね。
そこで、この章では、Raspberry Piに搭載されているcronという
アプリケーションを使用してこの要件を満たしたいと思います。
cronを使用することで、指定したコマンドを
一定時間間隔で実行することができます。
また、ログインしなくても実行されるため、
パスワードを設定して自動ログインをOFFにしておけば、
外に置いておいても多少は安心です。
セキュリティについてはroot権限などいろいろありそうなので、
別途しっかり調べようと思います。
postfixのインストール
cronを使用するにはメーラーが必要なようです。
必要と言われたのでとりあえずって感覚でインストールします。
ターミナルを起動し、下記コマンドを実行します。
sudo apt-get install postfix -y
途中、メール設定について聞かれます。
なお、ここでの選択はキーボードのTabキー、方向キー、
Enterキーを駆使して進めてください。
今回はメールは使用しないため"設定なし"を選択しました。
メール名にもなにも入力せずに了解を押して進めました。
いつものターミナルの画面に戻ればインストール完了です。
cronの設定
コマンドの自動実行の設定を進めていきます。
cronの設定は全てターミナルから行います。
ターミナルを起動して以下を実行しましょう。
crontab -e
初回起動時はこのような画面が開くと思います。
エディタを選択しろとのこと。
vimに聞き覚えがあったので、"3"を入力して進めました。
使いやすいエディタを選択して進めてください。
ここでは操作はvimを選択した前提で説明しますが、
設定内容はどれでも同じになります。
vimの操作方法は下記ページを参考にしました。
http://qiita.com/okamos/items/c97970ab34ff55ff3167
なお、Raspberry Piに入っているvimは簡易版です。
難しいことをやりたい場合は正式版をインストールしてください。
基本操作は最初から入っているもので問題なく行えます。
また、一度選択すると二回目からは選択したエディタで開かれます。
エディタを変更したい場合は、ターミナルから下記コマンドを実行することで
再度エディタ選択を行うことができます。
select-editor
さて、エディタを選択するとこのような画面が開くと思います。
cronの設定ファイルです。
最初は全てコメントとなっており、何も設定されていません。
cronの設定ファイルの記載方法についてはwikipediaにも書いてあります。
方向キーで一番下にカーソルを移動し、"o"キーを押します。
文字を入力できるようになるので以下の文を入力してください。
*/2 * * * * python /home/pi/python_code/MeasureMoisture.py
この設定文はwikipediaのフィールドの項目を参照しながら見てみてください。
[全分において2分おきに][毎時間][毎日][毎月][毎週]
[python /home/pi/python_code/MeasureMoisture.py ]コマンドを実行する。
という意味です。
まぁ簡単に言うと2分おきに土壌計測を実行するということですね。
実際に実行する時間間隔は好きに決めてください。
私は今のところ30分おきくらいにしようかなぁと思っています。
上記文を入力したらescキーを押し、":wq"を入力、enterキーを押してください。
いつものターミナルに戻り、このように表示されれば設定完了です。
なお、escキーを押した後の":wq"は保存して終了の意味です。
途中で失敗した場合など保存したくない場合は":q!"と入力することで
保存せずに終了できます。
これでRaspberry Piを再起動すれば自動実施されるはずです。
実行時に生成されるファイルを消しておき、
しばらく待って、ファイルできていれば成功です。
最初は短い時間間隔で実行するようにして、
動きを確認してみてください。
VNCを用いたスマホからのログイン/操作
ようやく最後です。ブログを分ければよかったと後悔してます。
外で使用する際、ディスプレイなどは使用したくないですね!
でもRaspberry Piの様子は見たい。。。
そこで、スマホからRaspberry Piを操作できるようにします。
疲れてきてるので早速内容に入ります笑
なお、今回の内容では同じネットワークにある場合のみのお話です。
よくわからない方は、Raspberry Piとスマホを
同じルータやwifiに接続していればOKです。
Raspberry Piの設定
とても簡単です。
VNCは最初からインストールされているため、
設定をEnableにするだけ!
まずはRaspberry Piの設定を開きます。
インターフェースタブを選択し、VNCを有効にするだけ!
完了です。
Raspberry Piを再起動すると、ツールバーにVNCのアイコンが表示されます。
このアイコンをクリックするとこんな画面が表示されます。
(なにかわかりませんが、情報流出が怖いため一部内容を隠しています)
この赤枠で示したIPアドレスはスマホからの設定に使用します。
なお、再起動するとIPアドレスが変わることがあります。
スマホから接続ができなくなったら再度確かめてみてください。
IPアドレスの固定化はインターネット経由でのスマホからの
アクセスを行うときに同時に行う予定です。
スマホの設定
こちらもそこまで難しくはありません。
まずはアプリケーションのダウンロードです。
GooglePlayで"VNC"で検索すると"VNC Viewer - Remote Desktop"という
アプリケーションが出てくると思います。
iPhoneユーザーも似たようなアプリがあるはずです。
これをインストールして開きます。
最初はこんな画面でしょうか。
右下の+を押します。
接続設定が開くのでRaspberry PiのIPアドレスとホスト名を入力します。
IPアドレスはRaspberry PiのVNCの画面で確認したものです。
例にあるポート番号(::の後ろ)は不要です。
ホスト名はRaspberry Piの設定から確認できます。
変更していなければ"raspberrypi"です。
入力してCREATEを押し、一番下に出てくるConnectを押すと。。。
設定が正しければ下のような画面が出てきます。
ユーザー名(ログイン名)とパスワードを入力してください。
これまた正しく入力できれば接続が完了し、
Raspberry Piの画面が表示されます!
最後に、VNCでの簡単な操作方法だけ紹介します。
詳細は他のサイトで調べてくださいww
・マウス
マウスは「Raspberry Pi画面上のカーソルの位置が神様。
スマホ画面上で触っている位置は関係ない」ということだけ
注意すれば簡単に操作できます。
スマホ画面でのスワイプが移動になります。
Raspberry Piの画面がスマホの画面に収まっていない場合は、
カーソルを移動することで自動で表示位置も変更されます。
で、タッチすれば左クリックです。
前述の通り、カーソルの位置でクリックされるため注意。
素早く2回タッチ+そのままスワイプでドラッグ&ドロップの操作になります。
・キーボード
画面上にあるキーボードボタンをタッチしてください。
通常のスマホのキーボード入力がそのまま反映されます。
以上です。
これでRaspberry Piにディスプレイ、マウス、キーボードを
接続しなくても操作できるようになりました!
画面小さくて使いづらいですが、確認程度なら十分です。
今回はここまでです。
読むのもかなり疲れると思います。
お疲れ様でした。。。。w
次回は室内の温度と湿度を計測したいと思います。
ではまた!






























