#はじめに
センサの値を取得するために必須とされるアナログ電圧の測定をRasberry Piを使って行います。これができるようになると、RasberryPiがさまざまなアナログ系のセンサ(温度センサや超音波による距離センサなど)の値を認識できるようになるので、飛躍的に活用の幅がひろがります。ただ、そのためのいくつか方法があります。専用のIC(ADコンバータ、MCP3208やMCP3008)を使う手法があり、おそらくそれが一番手っ取り早いと思われますが、今後の拡張性を考えてArduino UNO(これも互換ボードなら、1000円以下で入手できることもあるようです)を使う方法もポピュラーなようです。すでにたくさんの立派な解説(一番下の参考に記載)が出ていて、あえて記事にする必要もないかもしれませんが、実際にやってみたので、ざっとやることを理解したい方向けに、簡単にやったことを紹介します。これをみていただければ、そこまで大変な作業でないことはご理解いただけるのではないかと思います。なお、以下の内容と実践は自己責任でお願いいたします。
#Arduinoの事前準備
まず、Arduino側でアナログ電圧の値の読み取りができるようにセッティングをします。今回は、A0とGND(接地)間の電圧値を取得することにしたいと思います。ラズパイ側からデータが要求された時に、analogRead(A0)で電圧値を取り出して、Wire.writeでI2C通信をさせてRasberry Piの方に読み取ったデータを送るようにします。
以下のプログラムをArduino IDEで作成し、コンパイルおよびボードへの書き込みを行います。
#include <Wire.h>
void setup() {
// I2Cバスにアドレス8を使うということで、設定します。
Wire.begin(0x8);
// データが要求された時にsendReading関数が呼ばれるように設定します。
Wire.onRequest(sendReading);
}
// A0ピンの値を読み、4分の1にしてI2Cバスに書き込みます
void sendReading() {
int reading = analogRead(A0);
Wire.write(reading/4);
}
void loop() {
delay(100);
}
#ラズパイ・Arduino・電子回路間の接続
次に、ラズパイ、ArduinoUNO,そして電子回路の接続を行います。ボードのピンのアサインメントをよく確認しながら、以下の通り、結線をしてください。
#Rasberry Piの設定(OSの設定)
デフォルトでは、ラズパイはI2C通信ができるようになっていないため、設定をする必要があります。Raspberry Pi OSを立ち上げて、スタートメニューから、設定 -> Raspberry Piの設定 を選択します。そうすると、設定画面が出てきますので、この画面の項目のI2Cのところを「有効」にします。
#Rasberry PiでのPythonコード(ターミナル操作)
いよいよ、Rasberry Pi側からI2C通信を使って電圧を取得する命令を出していきます。ターミナルを立ち上げて、python3を起動し、以下のコードを入力してみてください。
% python3
>> from smbus import SMBus
>> arduino = 0x8
>> i2cbus = SMBus(1)
>> i2cbus.read_byte(arduino)
そうすれば、電圧相応の値が出てくると思います。可変抵抗でつまみを回して抵抗値をかえてやると、値の変化もみられると思います。
①A0-GND間の実際の電圧値と②ここで表示される値の関係は、比例の関係にあるので、オシロスコープなどでその係数を出せば、抵抗にかかっている電圧値をラズパイだけで認識できるようになる、というわけです。
#接続イメージ
あまり綺麗なものではありませんが、一応見た目はこんな感じということで参考としてイメージをのせておきます。
#参考情報