Raspberry Pi 3を使って、アナログ信号をデジタル変換して入力してみます。Raspberry Pi 3ではアナログ信号を処理するためにA/D変換モジュールが別途必要で、このために、研究開発・ビジネス用途向けに開発されたメカトラックス社のラズベリーパイ用高精度A/D変換モジュール「ADPi Pro」を今回使用します。
ADPi Proは、SPI デバイスとIIO サブシステムの二つのインタフェースを使って、アナログ電圧を入力してA/D変換できます。今回はADPi ProをSPIデバイスとして動作させ、5Vを5つの抵抗で分圧してADPi Proのターミナルブロックに接続し、メカトラックス社から提供されているPython言語で作成したサンプルスクリプトを実行して、ADPi Proに接続したアナログ電圧のA/D変換値を確認します。なお、IIO サブシステムを使用する場合のセットアップについては、IIOサブシステムを用いたラズベリーパイ用高精度A/D変換モジュール「ADPi Pro」のセットアップに示します。また、ADPi Pro の資料は、ADPi Pro(ラズベリーパイ用高精度 A/D 変換モジュール)で公開されています。
#ADPi Proについて
ADPi Proは、24bit分解能のAnalog Devices社「AD7794」のA/D変換器を使用し、温度特性に配慮した外部基準電圧発生ICの搭載し、出荷時校正データを格納した「EEPROM」により、A/D変換したデータを補正します。
- 入力電圧:0 ~ 5Vの差動入力。リファレンス電圧は基準電圧発生回路を通じて5Vを生成します。
- 分解能 :24ビットの∑∆(シグマ・デルタ)A/Dコンバータ
- 更新レート:4 ~ 470Hz
- 出力電圧:12V、各チャンネルの最大電流50mA。ラズベリーパイ電源用5Vから12Vに昇圧し、センサ用電源としてチャンネル1-4の各ターミナルブロックに割り当てます。
出力電圧「12V」は、ターミナルブロック「Vout」と「GND」間に出力されます。GPIO エキスパンダにより、チャンネル1からチャンネル4までの出力電圧のON/OFFを制御します。
なお搭載されているAnalog Devices社の「AD7794」の詳細については、AD7794のデータシートを参照してください。また、ADPi Proのハードウェアに関しては、ADPi Proのハードウェアを参照してください。
実際にADPi Proに分圧した1Vのアナログ電圧を入力して、Raspberry Pi 3でA/D変換値を取得する動作環境の様子を次に示します。
##ADPi Proの動作環境の構築
ADPi Proの40ピンコネクタCN3と、Raspberry Pi 3の40ピンコネクタJ8を重ね合わせるように接合します。これにより、Raspberry Pi 3から5Vを給電し、 SPI と I2Cの各インタフェースを使用します。ADPi Pro基板上のジャンパおよびディップスイッチJ1、J2、J3、DIPSW1は初期状態のままです。また、ADPi Proのターミナルブロック4個の差動電圧入力「Vin+」「Vin-」のそれぞれに、5Vを5個の抵抗で分圧した「1V」を次の図のように接続します。なお、抵抗は金属皮膜抵抗器、162Ω、誤差±0.1%を使用しました。
#ADPi Proのセットアップ
今回使用するraspbian「2018-04-18-raspbian-stretch」は、ラズベリーパイ公式サイトからダウンロードしました。ADPi ProをPython言語でアクセスできるSPIデバイスとするために、このraspbianに、次の手順に従いADPi Proをセットアップします。なお、SPIデバイスとしてアクセスするADPi Proのセットアップは、ADPi Proのセットアップを参照してください。
1. 次のコマンドでraspbianにリポジトリを追加します。
$ sudo bash -c 'echo "deb http://mechatrax.github.io/raspbian/ stretch main contrib non-free" > /etc/apt/sources.list.d/mechatrax.list'
$ wget http://mechatrax.github.io/raspbian/pool/main/m/mechatrax-archive-keyring/mechatrax-archive-keyring_2016.12.19.1_all.deb
$ sudo dpkg -i mechatrax-archive-keyring_2016.12.19.1_all.deb
2. 次のコマンドでADPi Pro用のSPIデバイスのパッケージをインストールします。
$ sudo apt update
$ sudo apt install python3-adpi adpi-utils-backend-spidev adpi-utils
3. パッケージのインストール後はデバイスの初期化を行うため、次のコマンドでRaspberry Pi 3を再起動します。
$ sudo shutdown -r now
#ADPi Proのセットアップ確認
次の手順に従って、ADPi Proのセットアップが正常に完了したことを確認します。
1. SPIデバイスとして使用するために、spidevが有効になっているか次のコマンドで確認します。
$ ls -la /dev/spidev*
crw-rw---- 1 root spi 153, 0 7月 29 12:12 /dev/spidev0.0
crw-rw---- 1 root spi 153, 1 7月 29 12:12 /dev/spidev0.1
2. ADPi ProのEEPROMとGPIOエキスパンダの I2Cアドレスを、次のコマンドで確認します。EEPROMのI2Cアドレスが「57」、GPIOエキスパンダのI2Cアドレスが「27」になっていることを確認します(初期設定の場合)。なお、各I2Cアドレスは、ADPi Proの基板上のDIPSW1により変更可能です。
$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
3. SPI を利用してADPi の操作を行うスクリプトファイル「adpi-utils-backend-spidev.py」が、正しくセットアップされているかを次のコマンドで確認します。
$ ls -la /usr/lib/adpi-utils-backend-spidev/adpi-utils-backend-spidev.py
-rwxr-xr-x 1 root root 3950 7月 5 12:51 /usr/lib/adpi-utils-backend-spidev/adpi-utils-backend-spidev.py
#ADPi Proのサンプルスクリプトを用いたアナログ電圧の入力
ADPi Proをセットアップすると、Python言語のサンプルスクリプト「adpi-utils-backend-spidev.py」がインストールされます。動作確認のために、サンプルスクリプト「adpi-utils-backend-spidev.py」を用いて、チャンネル1からチャンネル4までに接続されたアナログ電圧をデジタル変換してみます。表示される電圧の単位は「mv」で、各チャンネルには「1V」のアナログ電圧を接続しており、それぞれ次にように表示されます。なお、Python言語のサンプルスクリプト「adpi-utils-backend-spidev.py」については、adpi-utils-backend-spidevを参照してください。
$ python3 /usr/lib/adpi-utils-backend-spidev/adpi-utils-backend-spidev.py device=adpipro spi0.0 1-0x57 1-0x27 get voltage 1
1002.578618640
$ python3 /usr/lib/adpi-utils-backend-spidev/adpi-utils-backend-spidev.py device=adpipro spi0.0 1-0x57 1-0x27 get voltage 2
1002.551796840
$ python3 /usr/lib/adpi-utils-backend-spidev/adpi-utils-backend-spidev.py device=adpipro spi0.0 1-0x57 1-0x27 get voltage 3
1002.848028720
$ python3 /usr/lib/adpi-utils-backend-spidev/adpi-utils-backend-spidev.py device=adpipro spi0.0 1-0x57 1-0x27 get voltage 4
1002.341394720
次に「adpi-utils-backend-spidev.py」の実行時に与えるパラメータについて説明します。
- 「device=adpipro」:デバイスの名称を与えており、固定になります。
- 「spi0.0」:「.0」はCS番号を示します。「spi0」はSPIのBus番号で、固定となります。
- 「1-0x57」:「0x57」はEEPROMのI2Cアドレスを示します。「1」はEEPROMのBus番号で、固定となります。
- 「1-0x27」:「0x27」はGPIOエキスパンダのI2Cアドレスを示します。「1」はGPIOエキスパンダのBus番号で、固定となります。
- 「get voltage 1」:アナログ電圧を入力してデジタル値に変換します。最後の数値はチャンネル番号で「1」-「4」を指定します。なお「adpi-utils-backend-spidev.py」は、パラメータ「get」以外にも「set」「reset」が指定でき、設定されている電圧レンジに対応した分解能の表示/設定や、設定されている電圧レンジに対応したゲイン倍率の表示/設定などが可能です。
この他、ADPi Proのパッケージでは、SPI デバイスとIIO サブシステムの二つのインタフェースを同じパラメータで操作できる「adpictlコマンド」が提供されています。adpictl コマンドは 「/etc/adpi.conf 」の設定を元に、「/usr/lib/adpi-utils/adpi-utils-backend」に引数を付けて実行します。「adpi-utils-backend 」は、「adpi-utils-backend-spi 」をインストールした場合、「/usr/lib/adpi-utils-backend-spidev/adpi-utils-backend-spidev.py」 が使用されます。接続先チャンネルで測定した電圧を表示するには「get voltage x」を使用します。「x」はチャンネル番号「1」-「4」です。この「adpictlコマンド」を使用して、チャンネル1からチャンネル4までに接続されたアナログ電圧をデジタル変換してみます。なお、「adpictlコマンド」のほうが、与えるパラメータが少なく使いやすいのでお勧めです。
$ adpictl get voltage 1
1002.683521680
$ adpictl get voltage 2
1002.496365120
$ adpictl get voltage 3
1002.834915840
$ adpictl get voltage 4
1002.356891760
「adpictlコマンド」の詳細なパラメータの説明については、ADPi を操作するためのツール類を参照してください。
#ADPi Proに関連する記事
1. IIOサブシステムを用いたラズベリーパイ用高精度A/D変換モジュール「ADPi Pro」のセットアップ
ADPi ProをIIOサブシステムとして動作させ、作成されたサンプルシェルスクリプトを実行して、ADPi Proに接続したアナログ電圧のA/D変換値を確認します。
2. SPI /IIOサブシステムを用いたラズベリーパイ用高精度A/D変換モジュール「ADPi Pro」による計測方法
ADPi ProをSPIインタフェースやIIOサブシステムでアクセスして、接続されたアナログ電圧をA/D変換するサンプルスクリプトを作成します。