はじめての電気とIoT (8) SPI経由でアナログ電圧測定 その1 MCP3008

ラズパイにはアナログ電圧を測定するA-Dコンバータが内蔵されていない

 センサ類はアナログ電圧で測定値を出力するデバイスがたくさんあります。最近はI2CやSPIのディジタル値で出力するセンサも増えています。アナログ電圧を測れるメリットはたくさんあります。

 電子工作に使われるArduinoはA-Dコンバータがマイコンに内蔵されています。ラズパイにはA-Dコンバータが内蔵されてないので、A-DコンバータICをGPIOに接続して利用します。A-Dコンバータ:アナログ・ツー・ディジタル・コンバータ(変換器)で、A/Dコンバータ、A-D変換器、ADCなどと呼ばれます。

 A-Dコンバータは、その性能を表す項目の一つに「ビット数」があります。

  • 10ビット  入力電圧を1024に分解。3.3Vであれば最小分解能は3.2mV
  • 12ビット  入力電圧を4096に分解。3.3Vであれば最小分解能は0.8mV
  • 16ビット  入力電圧を65536に分解。3.3Vであれば最小分解能は0.05mV

 ビット数が増えるほど細かな電圧を扱えます。変換時に基準となる電圧に電源電圧を使っているA-Dコンバータでは、電源電圧が変動すると変換した値は変わります。内蔵の安定な基準電圧が利用できるもの、外部に安定な基準電圧をつなげられるものなど、製品によって異なります。

 ブレッドボードを使った実験回路では、10~12ビット程度が正しくデータを取り込める限界かもしれません。12ビット以上のデータを扱うには、しっかりとした回路設計と実装技術が必要です。リニアテクノロジーなどでは評価用ボードが入手できます。

 実験では、ブレッドボード上で利用しますが、現実に実験データを収集するときは下記のような対応をします。

  • 微小な出力のセンサの場合は増幅器を入力の前に追加する
  • 工場のようにノイズの多い環境では、絶縁アンプを入力に追加する
  • ほかの測定器などが動いている実験部屋では、電源にノイズ対策をする

 今回のような実験でも、安定な動作を望むとき、電源の+3.3VとGNDの間に、0.1uFの積層セラミック・コンデンサを入れますが、今回、省略しています。通常、デカップリング・コンデンサと呼ばれます。できれば購入しておいてください。

SPIインターフェースに接続して使うMCP3008

 マイクロチップのMCP3008は、8チャネルの10ビットのA-Dコンバータです。シリーズ化されていて、チャネル数によって3品種があります。中身は一つのA-Dコンバータです。その入力に、切り替え回路を入れて、チャネル数を増やしています。チャネルが増えるとパッケージのピン数も多くなります。したがって、まったく同じ時間に複数のチャネルのデータを取り込むことはできません。しかし、切り替えは素早いので、同時に複数のチャネルを読むとみなせます。

  • MCP3002 2チャネル
  • MCP3004 4チャネル
  • MCP3008 8チャネル

 動作電圧は2.7~5.5Vなので、ラズパイのGPIOに直接つなげて使えます。MCP3008を利用する理由は、Noce-REDにノードがあったからです。また、アマゾンで入手できます。筆者が購入したら、在庫が切れてしまいました。なのでとんでもない価格が表示されています。販売元のスイッチサイエンスには在庫があります。540 円前後の価格です。

 SPIインターフェースはシリアル通信の規格の一つです。利用の多いI2Cより高速にデータをやり取りできます。

Node-REDにMCP3008ノードをインストール

 1-Wireの温度センサDS18B20と同様に、右上の設定メニューのManage paletteからMCP3008ノードをインストールします。検索ではMCPと入れると出てきます。

 infoの説明書きには、0~3.3Vは0~1023に変換されるとあります。10ビットA-Dコンバータですから、そのままのディジタル値が得られています。Vref端子に3.3Vをつないだとき、最小分解能1LSBは3.2mVです。

 電源電圧は約±5%変動があるかもしれないので、1LSBは3.04~3.36mVの範囲のデータになります。

 インストールしたら、左のノード・パレットには、「A/D Converter」の名前で登録されました。

ラズパイとの接続

 購入したMCP3008は、DIPというパッケージに入っているICです。上から見て、くぼみがある面を上に向け、左のピンが1番で反時計回りにピン番号が振られます。右上がピン16番です。ICの足(リード、ピン)の間隔は1/10インチ=2.54mmです。ブレッドボードの穴の間隔と同じです。

 接続は次のとおりです。

ラズパイのピン番号 MCP3008のピン番号
1番 3.3V 15、16番 Vdd
6番 GND 9、14番 GND
19番 MOSI 11番 Din
21番 MISO 12番 Dout
23番 CLK 13番 CLK
24番 CE0 10番 /CS

 MCP3008は逆向きにすると、ラズパイのGPIOとの接続が直線的になります。図では、ぐるっと迂回していますが、実際の配線はすっきりできます。

 動作を確認するために、入力CH0は3.3Vへ、CH1はGNDへ接続します。

Node-REDの設定

 MCP9008のノードであるA/D Converterを中央のワーク・スペースにドラッグ&ドロップし、ノード・アイコンをダブルクリックして設定画面を出します。

 Input pinが入力チャネルです。A0はCH0に対応します。

 Device IDがSPIのチップ・セレクトCS信号をつなぐ場所の指定です。ピン24番のCE0につないだので、デフォルトのCE0のままにします。

 injectノードをドラッグ&ドロップし、設定画面ではtimestampに変更し、1秒ごとの設定にします。

 debugノードをドラッグ&ドロップします。変更はありません。各ノードを結び、Deployします。

 debugエリアにA-D変換された値が表示されています。CH0は3.3Vへつないでいるので、最大値が読みだされています。

 A/D Converterノードをダブルクリックし、Input pinをCH1へ変更します。GNDにつないでいるので、0が読みだされています。

 functionノードをdebugノードの前に追加します。最大の電圧は3.3VでA-D変換したディジタル値は1023です。なので、リアルな電圧に変換するには、次のjavascriptを追加します。

msg.payload = ("電圧="+msg.payload*3.3/1024+"V");



 実行結果です。小数点以下の桁数がたくさん出ていますが、これはあくまでも計算値です。

msg.payload = ("電圧="+Math.round(msg.payload*3.3*1000*10/1024)/10+"mV");

 3296.8mVの表示になりました。

 DMM(keysight 34461A)で電源電圧を測ると3.2915Vでした。