シェルスクリプトマガジン

Raspberry Piを100%活用しよう(Vol.79掲載)

著者:米田 聡

小型コンピュータボード「Raspberry Pi」(ラズパイ)向けにさまざまな拡張ボードが発売されています。その拡張ボードとラズパイを組み合わせれば、ラズパイでいろいろなことが簡単に試せます。第12回は、電流を測定するクランプメーターを搭載する拡張基板を扱います。

シェルスクリプトマガジン Vol.79は以下のリンク先でご購入できます。

図6 本連載で作成したサンプルプログラム(sample.py)

import time
import board
import math
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.ads1x15 import Mode
from adafruit_ads1x15.analog_in import AnalogIn

GAIN = 1
RATE = 860

i2c = busio.I2C(board.SCL, board.SDA, frequency=1000000)
ads = ADS.ADS1115(i2c, GAIN)
# 差動入力で初期化
in0 = AnalogIn(ads, ADS.P0, ADS.P1)

# 連続モードの設定
ads.mode = Mode.CONTINUOUS
ads.data_rate = RATE
SAMPLE_INTERVAL = 1.0 / ads.data_rate

# ADS1115のCONTINUOUSモードは初回読み取り実行後に設定が行われ
# 設定に2サンプリングクロックが必要になる
_ = in0.voltage # 設定用の空読み込み

value = 0.0
current_value = 0.0
sqrtI = 0.0

time_next_sample = time.monotonic() + SAMPLE_INTERVAL
for i in range(ads.data_rate):
    while time.monotonic() < (time_next_sample):
        pass
    # 前回と同じ値が読み取られた場合は読み飛ばす
    current_value = in0.voltage
    while current_value == value:
        current_value = in0.voltage
    value = current_value
    sqrtI += value * value

    time_next_sample = time.monotonic() + SAMPLE_INTERVAL

# 電流値(RMS)の計算
ampere = math.sqrt(sqrtI/ads.data_rate) * 20.0
print(ampere)