RaspberryPi
紫外線をはかる

  紫外線の浴び すぎは、日焼け、しわ、シミ等の原因となるだけでなく、長年紫外線を浴び 続けていると、時には良性、悪性の腫瘍や白内障等を引き起こすことがあ るといいます。気象庁では紫外線の計測、データの公開を行っています。しかしながら最近その観測態勢が縮小され、「つくば」のみに集約され、あとの地点はコンピュータによる、解析値のみとなりました。
 紫外線は刻々と変化するので、リアルタイムにその値を知るにはコンピュータ解析ではなく、実測に勝るものはありません。最近半導体による紫外線センサーが安価に手にはいるようになりました。ここでは、VEML6070という半導体センサーを用いて計測器を自作・計測しています。(2018/06/22更新)

  ML8511センサーを用いた方式はこちら
 
紫外線には3種類
有害紫外線ネットワークによる

  紫外線は生物体に及ぼす影響の相違から、波長315nm〜400nmのA領域紫外線(UV-A)、波長280〜315nmのB領域紫外線( UV-B)、および波長280nm以下のC領域紫外線(UV-C)に分類されます。
 人体への影響は波長の短い紫外線の方が大きいですが、紫外線(UV-C)は空気中の酸素分子とオゾン層で完全にさえぎられて地表には届きません。B領域紫外線(UV-B)は、オゾン層などにさえぎられて地表に届く量が減りますが、人体にとって有害であることから、「有害紫外線」と呼ばれることもあります。また、A領域紫外線(UV-A)は、UV-BやUV-Cに比べて影響は小さいですが、その多くが地表に届くため、長い時間あたると肌などに影響があることが懸念されています。
 紫外線は、太陽光(日射)の一部であり、基本的な性質は可視光線と同じですが、大気中での散乱も相当に大きく、薄い雲では80%は透過し、太陽から直接届く紫外線量と、散乱し届く紫外線量はほぼ同量であることがわかっています。
 このように紫外線は波長によって強度が大きく異なるため、紫外線の強さをわかりやすく表現するには工夫が必要です。このための指標がUVインデックスです。

UVインデックスの求め方
 UVインデックスの求め方は少々やっかいで、波長別紫外線強度(Eλ 下のグラフの青線)を波長毎の人体への影響の大きさ(Ser グラフの赤線)で重み付けし、250〜400nmの波長で積分することにより得られます。日常生活で使いやすい簡単な数値とするために、25mW/uで割って指標化したものがUVインデックスです(左に定義式を示します)。



Icie は紅斑紫外線量(mW/u)、Eλは波長別紫外線強度[mW/(u・nm)]、Serは波長毎の人体への影響、IuvはUVインデックスを示す。
気象庁のホームページ
"UV Spectral Irradiances & Erythemal Action Spectrum". NOAA. 2006.

半導体によるUVセンサー
 気象庁で紫外線の計測はブリューワー分光光度計が用いられています。これは、回折格子を用いて太陽光を分光し0.5nm毎の紫外線強度を測定する大変複雑な測定器です。また、市販されている紫外線放射計は干渉フィルタ、蛍光体、カットフィルタによって、太陽光から紫外放射のみを取り出してその強さを測定しておりこれも高価です。(たとえば英弘精機株式会社
 一方、半導体(フォトダイオード)による紫外線センサーが開発され、アマチュアが紫外線計測器を簡単に自作することができます。デバイス自体は一辺が4mm程度の極く小さいもので、手作業で半田付けは不可能です。ハンダ付けが可能なブレイクアウト基板がいくつか市販されており、検索すると次のような製品がヒットします。(いずれも1000円程度)

型番 半導体メーカ ブレイクアウト基板 波長に対する出力特性(データシートより) インターフェース
VEML6070 Vishay ストロベリー・リナックス

I2C
ML8511 Lapis SparkFun

スイッチサイエンス


アナログ

 VEML6070はUV-Aのみに感度があり、ML8511はUV-AとUV-Bの領域に感度があります。2018年3月からML8511を用い紫外線センサーを動かしていましたが、2018年6月、故障したため、VEML6070センサーによるものに変更しました。

VEML6070による紫外線センサー
 ML8511によるセンサーは3か月もたたないうちに、故障してしまいました。雨対策がわるく、センサーとADコンバータが水没し、電源回路がショートしていました。このため、VEML6070を用いた紫外線センサーをあらたに作りました。VEML6070はチップの中にADコンバータを内蔵し、I2CインターフェースでRaspberryPiと接続できますから、回路は単純になります。
ストロベリー・リナックスのサイトから入手できます。

工作
 構成はシンプルに
 VEML6070(I2Cインターフェース)>RaspberryPi(LAN接続)>WindowsPC
となります。

 VEML6070ブレークアウトはRaspberryPiとI2Cインターフェースで接続します。ケーブルとしては雷センサーと同様にLANケーブルを用います。I2Cインターフェースは長延な伝送には適さず、接続の静電容量は400pF以下とされています。一般的なCAT5のLANケーブルは1mあたり50pFで優秀です。実験の結果3mほど離してもデフォルトの速度でエラー無く動作しました。LANケーブルは4対のより線で構成されていますので、対の片方をGround線としなければ性能が出ません。SDA、SCL、VDDそれぞれにGround線と共に1対を割り当てました。(決まりはありませんが、とりあえず下の表のように)

 LANケーブル        I2Cインターフェース 
 1   Ground 
 2   空き
 3   Ground 
 4   SDA 
 5   Ground 
 6   SCL
 7   Ground
 8   VDD



 これをケースにいれて屋外に設置します。
 問題はケースは紫外線領域を透過する材料を用いる必要があるということです。通常の透明なアクリル板は紫外線を通さず、ACRYLITE #000 という材料をもちいるのがよいとデータシートにかかれています。手に入りませんでしたので、次善の策として紫外線の透過率が高いガラスしとして、ホウケイ酸ガラスがあります。顕微鏡観察のため用いるプレパラートのカバーグラスがホウケイ酸ガラス製です。極薄いものが安価に手にはいります。サイズ18×18mm 厚さ0.12〜0.17mm(松浪硝子)が、アマゾンで100枚単位で売られていました。これほどの量は不要ですが、500円以下ですので、がまんします。
 雨対策で失敗しましたので今回は塩ビのパイプをスカート状にかぶせました。

      
塩ビのパイプのキャップを雨よけケースとして使う
センサー用の10mmの穴をあけ、そこにホウケイ酸ガラス製のカバーグラスを接着剤で固定する。ゆびを切らないように注意
実験のため、余計な穴がある

塩ビキャップにセンサーを取り付ける。LANケーブルで、RaspberryPiにつなぐ。

キャップ上面を水平に、一日中日陰にならない場所に設置。
塩ビのパイプでスカート。これでセンサーに雨水は届かない。密閉する手もありますが、意外と温室効果で高温(80℃以上)になりますので、下部は開放形としました。


VEML60701の出力からUVインデックスを計算する
付属するVEML6070モジュール説明書あるいはデータシートアプリケーションノートを参考にRaspberryPiで動くUVインデックスを計算するプログラムを作ります。(RaspberryPiでI2Cインターフェースを使えるようにしておきます。RaspberryPiのOSバージョンによってことなりますので、こちらを参照。)

VEML6070のI2Cアドレスは 0x38( 0b0111000)と 0x39( 0b111001)で固定です。0x38アドレスにコマンドを書き込み、0x39アドレスから読み込む手順となります。コマンドフォーマットは次のとおりです。

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
0 0 ACK THD IT1 IT2 1 SD

ACKとTHDは使いませんので、"0"でいいようです。SDはshutdown mode setting ですがこれも"0"でよろしい。
ITはIntegration time settingで、1/2T(56.25ms), 1T(112.5ms), 2T(225ms), 4T(450ms)が選択可能で、長くすると積分時間が長くなるので感度が高くなりますが、その分強い紫外線にはすぐに振り切れて飽和します。逆に短くすると強い紫外線の測定ができますが、分解能は粗くなります。ストロベリーリナックスのブレークアウトの場合は112.5msを推奨していますので、bit3=0 bit2=1とします。
ストロベリーリナックスの説明書には明示されていませんが、VEML6070チップの外部抵抗RSETは270kΩが使われています。
読み込みは、はじめに0x39から上位の1バイト(MSB) を読み、つぎに0x38から下位の1バイト(LSB)を読みます。生出力は
VEML6070_Raw = VEML6070_MSB * 256 + VEML6070_LSB

となります。
1ステップ当たりの感度はデータシートにより
SENSITIVITY =0.05 W/(m*m)/step
ですから、紫外線の強さは
VEML6070_Intensity = SENSITIVITY * VEML6070_Raw W/(m*m)
つぎにこの値から、UVインデックスを求めます。アプリケーションノートによれば、RSET=270kΩ、IT=112.5msの場合、VEML6070_Raw が2055のときUVインデックスは11で、直線的に変化します。これをmapfloat関数で表現しています。

次のようなプログラムとなります。

 VEML6070によるUVインデックス計測プログラム  UVveml6070.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 2018/02/25 (C)Dr.Ishikawa 


import time
import datetime
import smbus

I2C = smbus.SMBus(1)

# VEML6070 constants
IT = 0x01 #Integration time  0x01:112.5ms 
SD = 0x00 #Shutdown mode disabled
ADD_LOW = 0x38 # VEML6070 low address 0b0111000
ADD_HIGH = 0x39 # VEML6070 high address 0b111001
SENSITIVITY = 0.05  #W/(m*m)/step
command = (IT<<2) + 0x02 + SD

def mapfloat( x,  in_min,  in_max,  out_min,  out_max):
	return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

while True:
	try:
		I2C.write_byte(ADD_LOW, command)
		time.sleep(1.0)
		VEML6070_MSB = I2C.read_byte(ADD_HIGH) #UV Data MSB
		VEML6070_LSB = I2C.read_byte(ADD_LOW) #UV Data LSB
		
		VEML6070_Raw = VEML6070_MSB * 256 + VEML6070_LSB
		VEML6070_Intensity =  SENSITIVITY * VEML6070_Raw #W/(m*m)
		VEML6070_Index = mapfloat(VEML6070_Raw, 0.0, 2055.0, 0.0, 11.0)

		# Output data 
		now = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S") 
		data = now + ","  + str(VEML6070_Intensity) + "," + str(VEML6070_Index)  + "\n"
		filename = 'UV_data/' + datetime.datetime.now().strftime("%Y%m") + 'UV_data.txt'
		file_data = open(filename , "a" )
		file_data.write(data)
		print (data)
		file_data.close() 
		time.sleep(59)
	except Exception as e:#エラーでもメッセージをだして処理続行
		print str(e)
		time.sleep(59)

4.起動はつぎのように
sudo python UVveml6070.py

1分に1回計測し、UVindex値をカンマ区切りファイルを出力します。Excelなどで処理することができます。

WindowsPCでの処理
 WindowsPCでは次のような処理をおこなっています。適宜変更してください。
1.1分に1行出力されるカンマ区切りファイルを、10分に一度読み、UVインデックスの10分の移動平均値をもとめる(Java)
2.UVインデックスのその日の最大値をもとめる。(Java)
2.1時間ごとの棒グラフと、リアルタイム値をGNUPLOTでグラフ描画する。
3.ホームページに、移動平均値、最大値、グラフをFTPでアップロード。


補足
 ホームページでは、グラフを表示するほか、UVインデックス値(四捨五入)に対応する、UVインデックスロゴ、紫外線対策メッセージを次のように表示しています。


これは、WHO(世界保険機構)のUVインデックス値に対するつぎ情報によるものです。

UVIのロゴ、色づかいもWHOで標準化されており、当ホームページではこれに従っています。

 WHOに対応し環境省は紫外線環境保健マニュアルを公開し、対策メッセージを次のように定めています。この対策文をUVインデックス値に応じ表示しています。


 気象庁データのほか、環境省の有害紫外線ネットワークと比較し、正確性を確認しています。
 思ったより簡単に作れましたので、もっと使われても良いと思います。
 VEML6070はUV-Aのみしか計測できていません。VEML6070の改良版として、VEML6075が販売されています。A領域紫外線( UV-A)のみならずB領域紫外線( UV-B)も計測できるようで、いずれ評価してみようと思います。