前回、ΔΣ型の18bit ADコンバータ、MCP3421をRaspberry Pi 3 model B+にI2C接続。しかしPythonで動作テストをする際に「デーモン呼び出し」ていました。今回はPythonのI2Cモジュールを更新し「デーモン呼び出さずに」MCP3421を制御できるようにしてみた「続報」です。
※「部品屋根性」投稿順Indexはこちら
前回は「とりあえず」16ビットモードでMCP3421を動作させ、電圧が読み取れているらしいことを確認しました。その際の問題を整理すると以下のようです。
-
- 従前から、Raspberry Pi 3/4 のI2Cバスを制御するのにPython3を使用
- その際、定番 Python – smbus モジュールを使用
- しかし上記smbusモジュールではMCP3421のI2Cバス読み出しシーケンスに対応できない模様
- そこで 古くからある pigpio という別なモジュールでI2Cバスを制御、動作OK
- ただし pigpio は動作時に自身のデーモンを起動しておく必要があり、デーモン起動すると他のプログラムに動かなくなるものがある
デーモン起動しておかなくても制御できるPythonモジュールでMCP3421が制御できれば良い、ということであります。さて結論です。ありました。以下です。
なあんだ、定番 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。)
なんということもなかったです。smbus を smbus2 に取り換えて、i2c_msg経由で読みとれば良かったと。smbus2使えばまず何でも制御できそう?知らんけど。