TOPに戻る

ラズパイ5 pythonの仮想環境 ⑨ 12ビットA-DコンバータADS1015<その2>

 前回は、smbus2ライブラリを利用して、ADS1015でアナログ電圧を読み取りました。ここでは、デバイス・ドライバを利用します。

環境

  • ハードウェア Raspberry Pi 5(4GBモデル)
  • OS Raspberry Pi OS (64ビット)、リリース日December 5th 2023
  • Windows10 22H2にて、ssh(OpenSSH_9.2p1 Debian-2+deb12u2, OpenSSL 3.0.11 19 Sep 2023)および、VNC Viewerを動作させている

 /boot/firmware/config.txt

 /boot/overlaysのREADMEの中を見ます。

Name:   ads1015
Info:   Overlay for activation of Texas Instruments ADS1015 ADC over I2C
Load:   dtoverlay=ads1015,<param>=<val>
Params: addr                    I2C bus address of device. Set based on how the
                                addr pin is wired. (default=0x48 assumes addr
                                is pulled to GND)
        cha_enable              Enable virtual channel a. (default=true)
        cha_cfg                 Set the configuration for virtual channel a.
                                (default=4 configures this channel for the
                                voltage at A0 with respect to GND)
        cha_datarate            Set the datarate (samples/sec) for this channel.
                                (default=4 sets 1600 sps)
        cha_gain                Set the gain of the Programmable Gain
                                Amplifier for this channel. (default=2 sets the
                                full scale of the channel to 2.048 Volts)

        Channel (ch) parameters can be set for each enabled channel.
        A maximum of 4 channels can be enabled (letters a thru d).
        For more information refer to the device datasheet at:
        http://www.ti.com/lit/ds/symlink/ads1015.pdf

 2017年の記事

  5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (6) A-Dコンバータの利用3 ADS1015

とまったく同じです。

 sudo nano /boot/firmware/config.txtを立ち上げ、最後の行に、次の1行を追加します。

dtoverlay=ads1015

 CTRL-Oで上書き保存をし、CTRL-Xでnanoを抜けます。rebootします。

 リブート後システムが立ち上がったら、I2Cバスにつながっているセンサを表示します。

 0x44はSHT45、0x70と0x71は7セグメントLED、ADS1015の0x48にはUUと表示され、デバイス・ドライバが組み込まれたことを示しています。

 /sys/bus/i2c/devices/1-0048/iio:device0フォルダを見ます(古い記事とは場所が異なっている)。

 in_voltage0_rawファイルを開きます。テキスト・ファイルです。

  A0-GNDには、TL431の電源がつながっているので、2047を千で割って2.047Vだと思われます。ほかの端子には何もつながっていませんが、in_voltage1_raw、in_voltage2_raw、in_voltage3_rawを読み出すと、202、201、201でした。

 シングル・エンドの接続設定のようです。近くにあるファイルを開いてみたのですが、差動入力モードに変更する場所は見つけられませんでした。

 シングル・エンドの4端子の電圧を読み出します。A0-GNDには、TL431の電源がつながっていて、途中で電池を抜きました。A1、A2、A3端子には何もつながっていません。

import time

while 1:
    f = open('/sys/bus/i2c/devices/1-0048/iio:device0/in_voltage0_raw')
    voltageA0 = round(int(f.read()) / 1000.0, 3)
    f.close
    f = open('/sys/bus/i2c/devices/1-0048/iio:device0/in_voltage1_raw')
    voltageA1 = round(int(f.read()) / 1000.0, 3)
    f.close
    f = open('/sys/bus/i2c/devices/1-0048/iio:device0/in_voltage2_raw')
    voltageA2 = round(int(f.read()) / 1000.0, 3)
    f.close
    f = open('/sys/bus/i2c/devices/1-0048/iio:device0/in_voltage3_raw')
    voltageA3 = round(int(f.read()) / 1000.0, 3)
    f.close
    print('\nA0={:.3f}V A1={:.3f}V A2={:.3f}V A3={:.3f}V '.format(voltageA0,voltageA1,voltageA2,voltageA3,))
    time.sleep(2)

 実行中の様子です。A0の電圧が下がっていく様子がわかります。

コンフィグ・レジスタのアンプの利得設定部分

  • bit11、bit10、bit9 PGA。
    000 : FSR = ±6.144 V
    001 : FSR = ±4.096 V
    010 : FSR = ±2.048 V (デフォルト)
    011 : FSR = ±1.024 V
    100 : FSR = ±0.512 V
    101 : FSR = ±0.256 V
    110 : FSR = ±0.256 V
    111 : FSR = ±0.256 V

 上記の結果のように、入力電圧は約2.5Vなのに、2.047Vと表示されています。これはデフォルトが010 : FSR = ±2.048 Vになっているためです。

 /boot/firmware/config.txtの最後の行を次のように変更し、rebootします。

dtoverlay=ads1015,cha_gain=1

 実行します。A0の電圧が1.246Vです。半分の電圧のようです。

 プログラムのほうで、読み出した電圧を倍にしました。約2.5Vなので、A0-GNDにつながっている電圧源の電圧を正しく読み取れました。

 つぎに、A1-GNDのA1端子をVin(3.3V)につなぎました。2.202Vと正しくありません。

 /boot/firmware/config.txtの最後の行を次のように変更し、rebootします。

dtoverlay=ads1015,cha_gain=1,cha_cfg=5

 プログラムでは、読み取った電圧を2倍してます。

print('\nA0={:.3f}V A1={:.3f}V A2={:.3f}V A3={:.3f}V '.format(voltageA0*2,voltageA1*2,voltageA2,voltageA3))

 3.302Vなので、正しい結果になっていますが、今度は、A0端子の電圧が正しくありません。

 /boot/firmware/config.txtの最後の行を次のように変更し(5行になった)、rebootします。

  (参考)Raspberry Pi ADS1015 Device Tree Overlay

dtoverlay=ads1015
dtparam=cha_enable=true
dtparam=cha_cfg=4,cha_gain=1
dtparam=chb_enable=true
dtparam=chb_cfg=5,chb_gain=1

  プログラムの中では、A0とA1の電圧を2倍します。

    print('\nA0={:.3f}V A1={:.3f}V A2={:.3f}V A3={:.3f}V '.format(voltageA0*2,voltageA1*2,voltageA2,voltageA3))

 実行結果です。A0、A1ともに正しい電圧になりました。

 ここまでの実行画面は仮想環境ではありませんでした。envadcの仮想環境に入って実行します。途中でTL431の電源を入れています。問題なく動いています。

 この後、A2、A3端子の設定を行いました。

 /boot/firmware/config.txtの修正です。rebootします。

dtoverlay=ads1015
dtparam=cha_enable=true
dtparam=cha_cfg=4,cha_gain=1
dtparam=chb_enable=true
dtparam=chb_cfg=5,chb_gain=1
dtparam=chc_enable=true
dtparam=chc_cfg=6,chc_gain=1
dtparam=chd_enable=true
dtparam=chd_cfg=7,chd_gain=1

 読み出しのプログラムの修正です。

    print('\nA0={:.3f}V A1={:.3f}V A2={:.3f}V A3={:.3f}V '.format(voltageA0*2,voltageA1*2,voltageA2*2,voltageA3*2))

 実行例です。A0、A2はTL431の電源へ、A1は解放、A3はVinです。正しく電圧を読んでいるようです。

-