初版作成 2016.10
最終修正 2023.7
Raspberry Pi はデジタル入出力はできるのですが、 アナログ入力ができません。ラズベリーパイにアナログ電圧を 入力する方法について、調べてみました。
AD 変換用 IC はいろいろとあるようですが、 私は MCP3002 (2ch 10 bit SPI接続) という % IC を愛用しています。 ここ の 「AD コンバータの使用」の項で 使い方を紹介しています。
普段、使い慣れているマイコンがある場合、 それを使うという方法があります。接続が シンプルです。
ラズパイと 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 接続」する方法も あるようです。 このサイト で 紹介されています。
以下のように接続します。
Pi Tx −−−−−−−−−−> PIC Rx +−−−− PIC Tx | 10k | Pi Rx <−−−−+ | 20k | Pi Gnd −−−−+−−−− PIC GndPIC (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 でコンパイルするには、 以下の点を変更する必要があります。