ラズパイ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 Channel (ch) parameters can be set for each enabled channel. |
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: |
実行中の様子です。A0の電圧が下がっていく様子がわかります。
◆コンフィグ・レジスタのアンプの利得設定部分
|
上記の結果のように、入力電圧は約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です。正しく電圧を読んでいるようです。