2021-05-28

カモミールの植栽

早いニセアカシアの開花」の続きです。

蜜源植物というよりは花粉源植物となろうかと思いますが、今年からカモミールを植えています。

カモミールは俗に「植えてはいけない植物」として知られており、一度植えると駆除が困難です。幸いなことに養蜂場では、植物にはなるべく手間を掛けたくないのでむしろ丈夫な植物は大歓迎です。

カモミールを植えたのには花粉源以外にも目的があります。ハーブティーにするためです。わたしは学生の頃さまざまなハーブティーを試していました。ハーブは薬草のようで、ティーにするのは煎じているかのようで体に良いというイメージがあったからです。実際はほとんど体に何の影響もなかったというのが現実でしたが。

その後は紅茶にシフトし、紅茶は紅茶で種類が豊富だったため長く色々試したものでした。しかしその分カネもかかるので、再度ハーブティーにチャレンジすることにしたのです。

考えようによっては、そこらへんの雑草を煎じているだけですが、「ハーブティー」というジャンルに括ることで何か特別なことのように思えるのは面白いことです。

タイムの花はヘギイタダニ駆除に有効か」に続きます。

2021-05-21

温度センサーDHT11やDHT22を使った冷却システムの構築について



DHT11やDHT22とは

読者の中には「GPIOピンにセンサーを接続してこそRaspberry pi」という先入観を持っている人もいるかも知れません。しかしRaspberry piは道具に過ぎませんから、そのような縛りは不要です。農業はリアルなものですのでプラグマティックでなければなりません。

その点、Switchbotの温湿度計は広く出回っておりそれほど高価でもなく、温熱治療以外にも巣箱内や養蜂場の温度推移をロギングするのにも使えますし、もちろん普通に温湿度計としても使えるので、前の記事の構成で運用しても何の問題もありません。

それでも、既にRaspberry piで使える温度センサーを持っているなら、それを使わない手はありません。そこで、温湿度センサーとしてDHT11DHT22の使用を検討することにします。

DHT11は温湿度センサーとしては非常に廉価で、Raspberry piの学習キットに入っていることもあります。そのため、既にお持ちの方もおられるでしょう。しかし、温度測定範囲:0℃ から 50℃、温度測定誤差:±2℃と、厳密な温度管理が求められる温熱治療では、不安が残ります。

DHT22は、DHT11よりも高価ですが、温度測定範囲:-40 ℃ から 80 ℃、温度測定誤差:±0.5℃と、信頼性は非常に高いです。下の写真のセンサーがDHT22です。


本記事ではそれら両方の使用方法について検討します。


DHT11やDHT22の接続


DHTには、
・電気供給の端子(+、プラス、VCC)
・電気を逃す端子(−、マイナス、GND、グランド)
・データを送信する端子(DATA、OUT)
の3つの端子があります。

わたしの手元にあるDHT22では、左から「+、OUT、−」となっています。

これらの端子をRaspberry piの対応するGPIOピンとケーブルでつなぎます。

たとえば、
「+、プラス、VCC」は、ピン番号1番の3.3Vに、
「−、マイナス、GND、グランド」は、ピン番号9番のGNDに、
「DATA、OUT」はピン番号7番のGPIO4に、
つなぎます。

次の図で示すと、一番左上の3.3Vと書かれた1番ピンにプラス(+)を、2つあけて4つ目の7番ピンGPIO4にOUT(DATA)を、その下の9番ピンのGroundにマイナス(−)を刺します。


髙橋真 CC BY-NC 3.0

上のとおりにつないだのが次の写真です。



DHT11_Pythonのインストールとスクリプトの記述


DHT11_Pythonとは、szazoがMIT licenseで公開しているDHT11読み取りライブラリーです。

まずは、ターミナルを開き、以下のコマンドを入力して下さい。

----
$ git clone https://github.com/szazo/DHT11_Python.git
----


これでDHT11が使えるようになります。

次に、Thonnyを起動し、
/home/pi/DHT11_Python/dht.py
を作成し、以下のプログラムを書いて保存します。


----
import RPi.GPIO as GPIO
import dht11
import time
import subprocess

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

instance = dht11.DHT11(pin=4)

while True:
   result = instance.read()
   if result.is_valid():
       tmp = result.temperature
       if tmp <= 43:
           subprocess.call("sudo uhubctl -l 1-1 -a off", shell=True)
       if tmp > 43:
           subprocess.call("sudo uhubctl -l 1-1 -a on", shell=True)
       time.sleep(4)
----


"pin=4"はOUT(DATA)と接続しているGPIOのナンバーです。ピン番号ではありません。別のピンにつないでいる場合は書き換える必要があります。

if文の43はファンが回転し出す/停まる温度です。

time.sleepの括弧の数字は温度を読み取る間隔(秒)です。DHT22の場合は2秒以上の間隔を開ける必要があります。


DHT22が使えるように書き換える


25.5℃までならDHT22もDHT11_Pythonで使えます。しかし、それを超えると表示が狂います。温熱治療では40℃を越しますから、ライブラリーの内容を一部修正する必要があります。

/home/pi/DHT11_Python/dht11/__init__.py

というファイルを変更します。
アクセサリにあるText Editorを使うと良いです。



まず、
--
self.__send_and_sleep(RPi.GPIO.LOW, 0.02)
--
この一文を探して、下のように書き換えて下さい。
--
self.__send_and_sleep(RPi.GPIO.LOW, 0.0008)
--


次に、
--
temperature = the_bytes[2] + float(the_bytes[3]) / 10
humidity = the_bytes[0] + float(the_bytes[1]) / 10
--
このニ文を探して、下のように書き換えて下さい。
--
temperature = ((the_bytes[2]*256) + the_bytes[3]) / 10
humidity = ((the_bytes[0]*256) + the_bytes[1]) / 10
--


書き換えたら保存して下さい。
これで、DHT22をDHT11_Pythonで使っても温度を正常に読み込むことができるようになります。


自動起動の設定


まず、ターミナルを起動し
sudo vi /etc/rc.local
と入力します。

"exit 0"の上に"sudo python /home/pi/DHT11_Python/dht.py &"を書き加え、:wエンターで保存して下さい。


以上でDHT11やDHT22が使えるようになりました。
これら以外は前の記事と同様です。
お疲れ様でした。

2021-05-14

“Raspberry pi”を使った温熱治療の冷却システムの構築について


現代農業6月号への寄稿について問い合わせを頂いていますので、Raspberry pi を使った冷却システムの構築方法について公開することにいたしました。


寄稿記事の要点

詳しくは「現代農業」6月号の該当記事を読んでいただきたいのですが、ポイントは「ヘギイタダニは41、42℃を2、3時間保つことで殺すことができる」というものです。しかしミツバチも高温で死ぬため、「ダニは死ぬがミツバチは死なない」絶妙な温度を保つ必要があります。

この温度制御が難しいため、温熱治療は、基礎研究はあるものの、技術的に困難でした。もちろん金に糸目を付けなければできますが、それならわざわざ温熱治療を行う必要もないわけなので、安価で、電気系統のない養蜂場で、誰もができるシステムの確立が課題だったわけです。

幸い、シングルボードコンピュータ“Raspberry pi”は、養蜂箱に入るほど小さく、比較的安価で、柔軟性も高く、モバイルバッテリーで動作することから実現できた次第です。


機材の調達

必ずしもRaspberry Pi でなければならないわけではありませんが、最も多くの人に使われ、情報も多く、今後も生き残ると思われるRaspberry Pi が望ましいです。

Raspberry Pi は、「シングルボードコンピュータ」ですが、家電量販店では取り扱われていません。Amazon楽天などの通信販売で入手するのが一般的です。


「Raspberry Pi 4 Model B / 4GB」が必要ですが、それ以外にも、「micro sdカード8GB以上のもの」、「マイクロUSB TYPE C のACアダプタ 5V3Aのもの」、「micro HDMIケーブル」などが必要です。よく分からない人はセットのものを入手して下さい。


温度センサーとして、SwitchBot社の温湿度計を使います。これはBluetoothでスマホと通信できる温湿度計です。このブログでも度々登場しています。温度や湿度のログをグラフ表示することもできます。温熱治療中の温度検知とモニタリングはこれにかかっています。



他にも、「USBで駆動する冷却ファン」、「モバイルバッテリー」、「ガーデニング用のビニール温室」、「ポリエチレンやポリプロピレンの黒いシート」が必要です。


OSのインストール

上のRaspberry Pi を組み立て冷却ファンやモバイルバッテリーをつないでも、すぐには使えません。Raspberry Pi もパソコンですので、OSのインストールや設定が必要です。

まずパソコンで、ラズベリーパイ財団(Raspberry Pi Foundation)のサイトのSoftwareのページから、ラズベリーパイ・イメージャー(Raspberry Pi Imager)をダウンロードし、PCにインストールします。
https://www.raspberrypi.org/software/



パソコンにmicro SDカードを挿入します。
そして、Raspberry Pi Imagerを起動し、“CHOOSE OS”をクリックします。


Raspberry Pi OSを選択します。


“CHOOSE SD CARD”で、Raspberry Piで使うmicroSD cardを選択します。


“WRITE”をクリックし、“YES”をクリックします。


書き込みが始まるのでしばらくお待ち下さい。


書き込みが終わるとチェックが始まりますので、これが終わるまでしばらくお待ち下さい。


下の画面になったらインストール終了です。



初期設定

Raspberry Pi OSがインストールされたmicroSD cardをRaspberry Pi 4 Model Bに入れ、電源を入れます。

下の画面が現れるので“Next”をクリックして下さい。

Countryで「Japan」を選択して下さい。Raspberry Piはイギリスの財団が作っているのでデフォルト設定はイギリスになっています。


下のようになったら、“Next”をクリックして下さい。


パスワードの設定です。お好きなパスワードを入れていただいて構いません。下の画面では、デフォルトのパスワードである“raspberry”を入れています。

上下の欄に同じパスワードを入れたら“Next”をクリックして下さい。

ディスプレイをよく見て下さい。画面外周に黒色のスペースがある場合はチェックを入れて下さい。ディスプレイ一杯に画像が映っている場合は、チェックは入れません。

“Next”をクリックして下さい。

Wi-Fiを使えるようにします。ご自分のWi-Fiを選んで下さい。

選んだら、“Next”をクリックして下さい。

Wi-Fiのパスワードを入力して下さい。

入力したら、“Next”をクリックして下さい。

OSを最新の状態にします。“Next”をクリックして下さい。


下のような画面になるのでしばらくお待ち下さい。


ダウンロード中です。


インストール中です。


OSのアップデートが終了したので、“OK”をクリックして下さい。


最後に再起動します。“Restart”をクリックして下さい。


これで、Raspberry Piが使えるようになりました。
次は、ソフトウェアのインストールです。


uhubctlのインストール

この温熱治療の冷却システムは、上にある温かい空気を下に送り、あるいは下の冷たい空気を上に送り温度が上がりすぎないようにする仕組みです。この空気の移動は冷却ファンが行っています。冷却ファンはUSBから電気を得ているので、USBへの給電を任意に止めたり入れたりできる必要があります。

そのUSBへの通電の制御を行うことができるのが、"uhubctl"です。

"uhubctl"とは、Vadim MikhailovがGNU General Public License version 2で公開しているUSBの電源管理ツールです。これをビルドすればよいのです。

そうするにあたり、ターミナルを開き、以下のコマンドを順に入力します。

----
$ sudo apt install libusb-dev
$ sudo git clone https://github.com/mvp/uhubctl
$ sudo apt install libusb-1.0
$ cd uhubctl
$ sudo make
$ sudo make install
----

画面左上をよく見て下さい。黒色長方形で「>_」と書かれたアイコンがあります。これがターミナルというアプリです。


そのアイコンをクリックすると下の画面が現れます。これがターミナルです。


sudo apt install libusb-dev
と入力しエンターキーを押して下さい。


すると、ドライバがインストールされて下の画面のようになるはずです。


次に
sudo git clone https://github.com/mvp/uhubctl
と入力しエンターキーを押して下さい。
githubというリポジトリーから“uhubctl”というUSBの電気を操作できるアプリがダウンロードされます。


さらに
sudo apt install libusb-1.0
と入力しエンターキーを押して下さい。“uhubctl”に必要なドライバがインストールされます。


まず、
cd uhubctl
と入力しエンターキーを押して下さい。
現在のディレクトリがuhubctlに移動します。
次に、
sudo make
と入力しエンターキーを押して下さい。
さらに、
sudo make install
と入力しエンターキーを押して下さい。
“uhubctl”がビルドされます。


以上で、USBの電気がコントロールできるようになります。
少し先取りすると、
sudo uhubctl -l 1-1 -a off
で、USBの給電を落とすことができるようになります。
sudo uhubctl -l 1-1 -a on
で給電が再開するようになります。


bluepyのインストール

Raspberry Pi で温度を把握する方法としては、GPIOピン(生け花の剣山のようになっている端子)に温湿度センサーをつなげるのがオーソドックスですが、抜けやすい問題があるため、現代農業の画像とは異なり、Switchbot社の温湿度計を使用します。その温湿度計は温度などの値をBluetoothで拾えるよう放送(ブロードキャスト)しているので、それを拾えるようにします。

そのためにbluepyというアプリをインストールする必要があります。
ターミナルを開き、以下の順で入力します。

--
$ sudo apt install python3-pip
$ sudo apt install git
$ sudo apt install python-pexpect
$ sudo apt install libusb-dev libdbus-1-dev libglib2.0-dev
$ sudo apt install libudev-dev libical-dev libreadline-dev
$ sudo pip3 install bluepy
$ cd /usr/local/lib/python3.7/dist-packages/bluepy
$ sudo setcap'cap_net_raw,cap_net_admin + eip 'bluepy-helper
--

まず、
sudo apt install python3-pip
sudo apt install git
sudo apt install python-pexpect
と入力しエンターキーを押して下さい。
以下のようになるはずです。

次に、
sudo apt install libusb-dev libdbus-1-dev libglib2.0-dev
sudo apt install libudev-dev libical-dev libreadline-dev
と入力しエンターキーを押して下さい。
以下のようになるはずです。

上はbluepyに必要なドライバのインストールでしたが、いよいよbluepyのインストールと権限賦与です。

sudo pip3 install bluepy
cd /usr/local/lib/python3.7/dist-packages/bluepy
sudo setcap'cap_net_raw,cap_net_admin + eip 'bluepy-helper
と入力しエンターキーを押して下さい。


以上で、Switchbotの温湿度計が発する温度をRaspberry Pi で拾えるようになりました。


Thonnyを使いPythonで書いたスクリプトの作成

温室の温度が分かり、USBの給電を制御できるようになってもまだ用をなしません。プログラムを書く必要があります。

プログラムはパイソンで書きます。パイソンは非常に簡単なインタープリタ式のスクリプト言語です。簡単ですし情報も豊富にあるので応用が効きます。しかし今回は得にそれを習得する必要はありません。コード(プログラム)をコピーして貼り付けて保存するだけです。

まず、Thonnyというパイソンの開発プログラムを起動します。
画面左上のラズベリーのアイコンをクリックしプルダウンメニューを出し、「プログラミング」から「Thonny」を選択します。


以下のプログラムをコピーし貼り付けます。
--
from bluepy import btle
import struct

class SwitchDelegate(btle.DefaultDelegate):
    def __init__(self, macaddr):
        btle.DefaultDelegate.__init__(self)
        self.sensorValue = None
        self.macaddr = macaddr

    def handleDiscovery(self, dev, isNewDev, isNewData):
        if dev.addr == self.macaddr:
            for (adtype, desc, value) in dev.getScanData():  
                if desc == '16b Service Data':
                    self._decodeSensorData(value)

    def _decodeSensorData(self, valueStr):
        valueBinary = bytes.fromhex(valueStr[4:])
        isTemperatureAboveFreezing = valueBinary[4] & 0b10000000
        temp = ( valueBinary[3] & 0b00001111 ) / 10 + ( valueBinary[4] & 0b01111111 )
        if not isTemperatureAboveFreezing:
            temp = -temp
        self.sensorValue = temp
--

「Save」を押して、名前を“switch”として「OK」を押し、“switch.py”というファイルを作ります。


次に、
新規作成(New)し、以下のプログラムをコピーして貼り付けて下さい。
--
from bluepy import btle
from switch import SwitchDelegate
import time
import subprocess

while True:
       scanner = btle.Scanner().withDelegate(SwitchDelegate('e4:07:6d:a3:3d:a0'))
       scanner.scan(5.0)
       tmp = scanner.delegate.sensorValue
       print(tmp)
       if tmp is not None:
          if tmp >= 43.2:
              subprocess.call("sudo uhubctl -l 1-1 -a on", shell=True)
          else:
              subprocess.call("sudo uhubctl -l 1-1 -a off", shell=True)
       time.sleep(1)
--

なお、プログラム中の'e4:07:6d:a3:3d:a0'は、Switchbotの温湿度計の識別情報です。ひとつずつ異なっているので、ご自分の温湿度計の識別情報を入れて下さい。調べ方は、後述します。

“43.2”というのは、冷却ファンが回転を始める温度です。これは自由に変更することができます。
また、温度判定に入る前に、“tmp”が“not none”であることを調べていますが、これは時々温度情報が取れないことがあるからです。これを挟まずに温度判定を行うと、温度情報がない場合はエラーが出て止まってしまいます。


「Save」を押して、「名前」を“bot”とし、“bot.py”というファイルを作ります。




Switchbotの識別情報の調べ方

SwitchBotの温湿度計を使うには、以下からアプリをインストールして下さい。
メールアドレスとパスワードを設定すると使えるようになります。

通常は以上の手続きで十分ですが、Raspberry Piで使えるようにするためには、個体の識別情報を調べる必要があります。

まず、温湿度計をタップして下さい。通常ひとつしか表示されません。わたしは、ふたつ持っているので2個並んでいます。
次に、右上の歯車のアイコンをタップして下さい。
さらに、右上の三点リーダー(・・・)をタップして下さい。
赤色で囲まれたアドレスが識別情報です。
プログラムの該当箇所に入れて下さい。


自動起動の設定


以上で、プログラムを走らせれば43.2℃以上でファンが回り、未満ならファンが止まるようになります。
しかし、野外で使う場合はモニターがありませんから、モバイルバッテリーをつないだら自動でプログラムが動くようにする必要があります。

以下、自動起動の設定です。

まず、ターミナルを起動し
sudo vi /etc/rc.local
と入力します。


“exit”の上に
sleep 10
sudo python3 /home/pi/bot.py &
の2文追加します。

上の"sleep 10"は必ずしも要りませんが、rc.localの読み込みが早過ぎて他の準備が間に合わずに自動実行されない場合には有効です。



:w
と押して保存します。変な保存方法ですが、まず「:」を押して、次に「w」を押し、エンターキーを押します。


以上で完成です。
お疲れさまでした。

運用に先立って正常に動作するか、必ずテストするようにしてください。


温熱治療の実践


温熱治療は晴れの日に行います。薄曇りでもできなくはありませんが、快晴の方が望ましいです。
養蜂箱は2段にします。最上段に蜂児枠を置きます。

巣枠の上にRaspberry Piなどをつないで置きます。
空冷ファンは回転を始めますが、20秒くらいで止まります。

蓋をします。蓋は種類によっては閉まらないこともあります。わたしは、別の蓋の側面を上下につないでいます。

ポリエチレンやポリプロピレンの黒いシートで全体を覆います。

それにビニール温室を被せます。あとは内部が加熱されるのを待つだけです。

なお、巣門付近は蜂が出入りできるように開けておきます。


また、帰巣した蜂がビニール温室の方に入って出られなくなることがありますが、そのまま放置していると熱で死んでしまいます。定期的に外に出してやって下さい。


これは治療実施時の温度の推移です。43.2℃でファンが回転するよう設定したところ、目論見通りに動作しました。

【追記】ここまで読んで下さりありがとうございます。このRaspberry piが温熱療法の普及の妨げになることを、ずっと悩ましく思っていました。そこで逆転の発想で、「機械にできることを人がやる」ということで、Raspberry piなしの温熱療法を確立しました。詳しくは、「現代農業2021年9月号」をご覧ください。