ArduinoをA/D変換などのデコーダやモータードライバとして使うために、ラズパイからArduinoに指令を出せるようにしました。


1.配線
 今回はラズパイの3B+での配線なので、パターンが違う別のボードではつなぐピンが違うので気を付けてください。
 図のように配線すると、SDA,SCL,GND同士をつなぐことができます。

arduino-raspi_ブレッドボード

2. Arduinoのプログラム
 このあいだArduino-Arduino間のI2Cをした時のプログラムと大体同じ感じになってます。
#include <Wire.h>

int add = 0x04; //I2Cのアドレスを0x04に設定
int out = 13;
int Ain = A0;

boolean toggle = false; //LEDの点灯制御用

void setup(){
  pinMode(out, OUTPUT);

//I2C接続を開始する 
  Wire.begin(add);

//Raspberry Piから何かを受け取るたび、receive関数を呼び出す 
  Wire.onReceive(receive); 

//Raspberry Piから要求された場合に、send関数を呼び出す 
  Wire.onRequest(send);
}

void loop(){
}

void receive(int n){
 char ch = Wire.read();
 if (ch == '1'){
  LED(); 
 }
}

//LEDの点灯・消灯用の関数
void LED(){
  toggle = !toggle; //trueとfalseの入れ替え
  digitalWrite(out, toggle);  
}

//Analogピンの数値を読み、Raspberry Piに送る
void send(){
  int reading = analogRead(Ain);
  Wire.write(reading >> 2); //ビットを2つ右にずらした数値を送る
}

3.Raspberry Piのプログラム
 これはとても簡単で、shellに打ち込まれた文字によってArduinoに対する出力を変えることと、Arduinoからの入力を表示することを行っています。

import smbus

import time


bus = smbus.SMBus(1)


add = 0x04


def request_reading():

   reading = int(bus.read_byte(add))

   print(reading)


while True:

   command = input("Enter command: 1-Toggle LED, r-read A0:")

   if command == '1':

       bus.write_byte(add, ord('1'))

   elif command == 'r':

       request_reading()


4.実際の動作

2018-09-18-113207_1366x704_scrot
 実際に動作させているときの画面はこのようになります。"1"と入力したときにLEDの出力が変わり、"r"と入力したときにArduinoで読み取ったセンサーの値を表示することができました。
 

 夏休みが残り一日となりましたが、今週末までには買っているけど使ってないセンサー類(GPSモジュールとか)を使えるようにして記事が書けるといいなと思います。それではまた今度。