Blinkaを使ってMCP2221のA-Dコンバータを動かす

MCP2221はI2C・UARTとGPIO4本が備わったUSB接続のプロトコルコンバータで、Blinkaを噛ませることでPCからCircuitPython互換APIで回路の制御が出来るようになる。

MCP2221のGPIOはアナログ対応でADC(A-Dコンバータ)が使え、基準電圧も持っている。しかし、BlinkaのデフォルトではADCの基準電圧として折角の内臓基準電圧を使わずにVDDを使う勿体無い設定になっており、そのうえADCの設定方法がドキュメントのどこにも書かれていない。

そこでBlinkaのソースを辿ったり試行錯誤でMCP2221内蔵ADCの設定方法を突き止めたので簡単にまとめる。

スポンサーリンク

ADC読み出しのための基本のPythonコード

AnalogInオブジェクトを初期化し、メンバ変数valueを読み出せばOK。以下のコードでGP2端子のアナログ値が取得出来る。

import board
from analogio import AnalogIn

adc = AnalogIn(board.G2)

raw = adc.value

電圧の相対値の取得で良ければこのコードで事足りるのだが、
電圧の絶対値が必要な場合はMCP2221の設定が必要だ。

データシートでMCP2221のADCモード設定を調べる

下はMCP2221のデータシートからADC設定方法の表を抜粋した物で、内臓の基準電圧を使ってADCで電圧測定したい場合は、この情報に従って設定する。設定用の8bitレジスタの最下位ビットに1を立て、次の2ビットを使って1.024V、2.048V、4.096Vの3つのうちどの基準電圧を使うか選べば良く、計3ビットの設定を行えればOK。

MCP2221のADC設定仕様

詳しいことは省くが、この3ビット設定を行うためのBlinka内部関数が用意されており、以下のようなPythonコードを実行すればMCP2221のADCは4.096Vの基準電圧を使う設定になる。

import board
board.pin.mcp2221.adc_configure(0b111)

電圧値を測定するためのPythonコード

オブジェクトの初期化

基本の初期化コードの後に基準電圧の設定を行う必要がある。実行順序が重要で、オブジェクトの初期化前に基準電圧の設定を行っても無効になってしまうので注意。

import board
from analogio import AnalogIn

adc = AnalogIn(board.G2)
board.pin.mcp2221.adc_configure(0b111) # <-- オブジェクトの初期化後に実行!

ADCの読み出しと電圧の絶対値への変換

一度設定を行ったら後は普通に読み出せばOK。MCP2221内蔵ADCの分解能は10bitなのだが、Blinkaシステムによって16bitへと変換されており、電圧へ変換は以下のようなコードで行う。(4.096Vの基準電圧を使う設定の場合)

voltage = (adc.value * 4.096) / 65536

電圧計を制作した例

MCP2221を使ってPCをCircuitPython化する方法をまとめた記事に、電圧を測定してI2C接続のディスプレイに表示するプログラムをサンプルとして掲載している。ADCの精度もなかなか良さそうな感触。

MCP2221でCircuitPythonのプログラムをPCから直接動かす
FT232HというICでPCをCircuitPython化する方法を記事にしたが、ほぼ同じ事がMCP2221というICを使っても出来る。やってみた。仕組みと用意するべきものMCP2221はUSB接続のプロトコルコンバータで、I2C、UART...

まとめ

MCP2221のADCで内蔵基準電圧を有効化する方法を紹介した。せっかく正確な電圧測定が出来るポテンシャルを持っているのに、Blinkaのデフォルト設定では宝の持ち腐れ。Blinkaとしては裏技的な方法っぽいが、活用していきたいと思う。

コメント