今回は、Arduinoでアナログ入力を読み、ラズパイにデータを渡すプログラムの紹介。

Raspberry Piは素の状態だと、アナログ入力に対応できません
ADコンバータを使用する必要があります。

しかし、ここでArduinoを使用する手もあるのです。
安いArduinoでも、アナログ入力は6本、デジタル入出力は12本、その内6本は精度の高いPWM出力ができるのでサーボを動かせます。

今回はADコンバータとして働いてもらう

回路

キャプチャ
SDA - SDA
SCL - SCL 
5V - 5V
GND - GND
でつなぎます。

Arduino


Serial.begin()やSerial.println()などは通信確認用に使っています。

ラズパイからbus.write_byte(SLAVE_ADDRESS, cmd)でコマンドを受け取ると、Wire.onReceive(receiveAnalogReading)が呼び出され、アナログピンの入力を読みます。
ここでは読むだけで、ラズパイへの返答はなし。

ラズパイからbus.read_byte(SLAVE_ADDRESS)で、Wire.onRequest(sendData)が呼び出される。
これで、先ほど読んだアナログピンの数値を送ります。

Raspberry Pi


メインループのwhile True:…では、ユーザーからのコマンド入力待ちをし、
入力されたコマンドによって、読むアナログピンを選択しています。 

2つの関数を作りました。
ラズパイからArduinoへコマンドを送信する、writeCommand関数
Arduinoからラズパイへ数値を送信してもらう、readValue関数

プログラムの大まかな流れとしては、
メインループのコマンド入力で、"r0"と入力されたら、
writeCommand関数でArduinoへ"0"を送り、A0ピンの数値を読ませます。
readValue関数で読ませた数値を、Arduinoから送ってもらい、Shellに数値を表示させる。

ところで、Pythonってswitch文ないんですね…。
あと、今回のプログラムをPython3系で動かそうとしたら、smbusライブラリが使用できませんでした。
なので2.X系でやるしかなさそう。

実際やってみた画面
IMG_3842
ラズパイでr0と入力すると、Arduinoへ0を送信する。
すると、A0の数値が返ってくる。
IMG_3843
Arduinoのほうも、きちんと0を受け取り、
A0の数値を送信している。


一応続きがあります。
Raspberry Pi ArduinoをADコンバータとして使う(I2C)その2


Arduino Nano v3.0 compatible (ATMEGA328P) ピンヘッダ実装済み - Amazon