Raspberry Pi へのアナログ入力

初版作成  2016.10
最終修正  2023.7

Raspberry Pi はデジタル入出力はできるのですが、 アナログ入力ができません。ラズベリーパイにアナログ電圧を 入力する方法について、調べてみました。


AD 変換用 IC を使う

AD 変換用 IC はいろいろとあるようですが、 私は MCP3002 (2ch 10 bit SPI接続) という % IC を愛用しています。 ここ の 「AD コンバータの使用」の項で 使い方を紹介しています。


マイコンを AD 変換用に使う

普段、使い慣れているマイコンがある場合、 それを使うという方法があります。接続が シンプルです。

Arduino を使う

ラズパイと Arduino はシリアル接続します。 シリアル接続の方法は 2 通りあります。 一つは USB ケーブルを使う方法。もう一つは 2 本の線でラズパイの Tx Rx 端子と Arduino の Tx Rx 端子を それぞれ結ぶ方法です。 USBケーブルを使うと Arduino への電源供給も同時にできるので 便利です。ここでは USB ケーブルを使う方法を紹介します。

シリアル接続して使う場合のプログラムを以下に示します。

Arduino 側プログラム
Raspberry Pi 側サンプルプログラム

シリアル通信をする場合に、ややこしいのが行末のデリミタ です。改行記号を表すコードはシステムによって CR (0x0d), LF (0x0a), CR + LF と 3 種類あります。 送信側と受信側で不一致があると、 うまく動作しない恐れがあります。

自分だけが使うシステムの場合、私は CR や LF のような 目に見えない文字は使わず、デリミタ(行末を表す文字)として「$」の ような目に見える文字を使っています。 以下のような感じです。

Arduino 側プログラム
Raspberry Pi 側サンプルプログラム

なお Arduino とラズパイを「I2C 接続」する方法も あるようです。 このサイト で 紹介されています。

PIC マイコンを使う

以下のように接続します。

Pi Tx −−−−−−−−−−> PIC Rx

       +−−−− PIC Tx
       |
       10k
       |
Pi Rx <−−−−+
       |           
        20k
       |           
Pi Gnd −−−−+−−−− PIC Gnd
PIC (5V系) の出力を Raspberry Pi (3.3V系) に 入力すると、ラズパイが壊れる可能性が高いので、 抵抗で分圧しています。ラズパイの Rx 端子は 50k の プルアップ抵抗が入っているので、分圧用 抵抗は上記の値以上に大きくすると、 信号がうまく伝達されない可能性が高いです。 100k と 200k ではダメです。

ラズベリーパイ 3 で Tx, Rx 端子 を使うには

/boot/config.txt

の末尾に

dtoverlay=pi3-miniuart-bt

と付加する必要があります。

ラズパイ側のサンプルプログラムは これ です。

PIC マイコン用に私が作ったプログラムが以下です。 アナログ入力以外に、デジタルの入出力機能も持っています。

16F873A 用のアセンブラ版は、安価な C コンパイラの 存在を知らなかった 2009.10 に作ったものです。 今となっては「16F873A を持っていて、このコードを無修正ですぐ動かしたい」 場合以外は価値はありません。

16F886 用 C 言語版は安価なコンパイラである ソースブースト社のコンパイラを 購入した 2009.12 に作りました。 今は MPLAB-X に無償の C コンパイラが付属しています。 MPLAB-X でコンパイルするには、 以下の点を変更する必要があります。