部品屋根性(75) MCP3421、ADCのラズパイI2C接続、Pythonで制御の続き

Joseph Halfmoon

前回、ΔΣ型の18bit ADコンバータ、MCP3421をRaspberry Pi 3 model B+にI2C接続。しかしPythonで動作テストをする際に「デーモン呼び出し」ていました。今回はPythonのI2Cモジュールを更新し「デーモン呼び出さずに」MCP3421を制御できるようにしてみた「続報」です。

※「部品屋根性」投稿順Indexはこちら

前回は「とりあえず」16ビットモードでMCP3421を動作させ、電圧が読み取れているらしいことを確認しました。その際の問題を整理すると以下のようです。

    1. 従前から、Raspberry Pi 3/4 のI2Cバスを制御するのにPython3を使用
    2. その際、定番 Python – smbus モジュールを使用
    3. しかし上記smbusモジュールではMCP3421のI2Cバス読み出しシーケンスに対応できない模様
    4. そこで 古くからある pigpio という別なモジュールでI2Cバスを制御、動作OK
    5. ただし pigpio は動作時に自身のデーモンを起動しておく必要があり、デーモン起動すると他のプログラムに動かなくなるものがある

デーモン起動しておかなくても制御できるPythonモジュールでMCP3421が制御できれば良い、ということであります。さて結論です。ありました。以下です。

smbus2

なあんだ、定番 smbus モジュールと「互換性」のある新バージョンを使えばよかったのでした。なんだかな~。

MCP3421からの読み出しテストスクリプト

以下はsmbus2モジュールを使って書き直した、MCP3421(多分MCP3425も読めるんじゃないかと想像)のAD変換値読み取りテストスクリプトです。なお、前回はMCP3421を16bitモードに入れてましたが、今回は初期化忘れたので、デフォルトの12bitモード動作です。

from smbus2 import SMBus, i2c_msg
import time

device = 0x68

cnt = 20
while (cnt > 0):
    with SMBus(1) as bus:
        msg = i2c_msg.read(device, 3)
        bus.i2c_rdwr(msg)
        data = list(msg)
        if len(data)==3:
            print("Data:", data[0]*256+data[1])
            print("Control:", data[2])
    cnt -= 1
動作確認

動作確認結果が以下に。+入力端子の先につけてあるボリュームを回したら+側に振り切れたのかな(2047。)

results

なんということもなかったです。smbus を smbus2 に取り換えて、i2c_msg経由で読みとれば良かったと。smbus2使えばまず何でも制御できそう?知らんけど。

部品屋根性(74) MCP3421、18bitΔΣADCをRaspberry Piに接続 へ戻る

部品屋根性(76) AHT21B、I2C温湿度センサをラズパイPythonで動作確認 へ進む