昨日試したMicroPython用のSPIクラスですが、OLEDはデータ出力しか確認できません。
手元にMCP3204というADコンバータがあったので、これでSPI経由でのデータ入力も実験してみました。
12bit 4ch ADコンバータ MCP3204-BI/P: 半導体 秋月電子通商 電子部品 ネット通販
MCP3204は、12bit(0~4095)のADコンバータを4つ搭載しています。同じタイプで、8つのADCを搭載するMCP3208というチップもあります。
Raspberry Piとの接続は、以下のように電源、クロック/MOSI/MISO、およびCS(Chip Select)です。CSはどのGPIOでもよいのですが、今回はGPIO22を使用しました。
そのほか、ADCの基準電圧(今回はVDDをそのまま使用)も接続が必要です。
MCP3204 Raspberry Pi VDD 3.3V VREF 3.3V DGND GND CLK SPI0-CLK(23) DOUT SPI0-MISO(21) DIN SPI0-MOSI(19) CS GPIO22(15)
ADCの入力は、VRを接続しました。ちなみに写真のVRはpimoroniで購入したものです。
使い方ですが、MCP3204のデータシートにある以下の図で信号が概観できます。
ホスト側から送信するデータは24bitで、そのうち実質的なデータは6bit目から10bit目までで
6bit目:スタート信号(常に1)
7bit目:データを絶対値で取る(1)か差分を取る(0)か
8~10bit目:読み取るチャンネルの番号
となっています。
MCP3204/3208は2本の入力をペアにして、その差分の値を読むことができ、7bit目はそのための指定ですが今回は使いません。
また、チャンネル指定はMCP3208(8ch)と共通の仕様のため3bitありますが、MCP3204は4chしかないので8bit目は常に0となります。
以上から、たとえばCH2の値を絶対値で読み取るには
0000 1100 10xx xxxx xxxx xxxx → 16進で 06 80 00
というデータを送信すればよいことになります。
ADCからのデータも24bit送られてきますが、下位12bitだけが有効です。
MicroPythonでのサンプルコードを以下に載せておきます。
動かすと、1秒ごとにCH0の値を12bitの整数(0~4095)でプリントします。
値は信号がGNDレベルのとき0、VDDと同じ(3.3V)のとき4095です。
コメント