RaspberryとArduinoのi2c通信(その2)


RapberryとArduinoのi2c通信は色々なところで紹介されていますので、私が改めて紹介することもありませんが、
忘備(自分のため)にまとめておきます。
今回はレジスターアドレスを指定して、1文字のデータをやりとりするサンプルです。

Arduinoにはレベルシフトが不要な3.3V駆動のProMiniを使いました。
Arduino側のスケッチはこちらを参考 にさせていただきました。
Raspberryからi2c経由で2バイト受け取ります。
1バイト目がレジスターアドレスで、2バイト目がレジスターの値です。
//
// ATmega I2Cスレーブ sample
//

#include <Wire.h>
#define SLAVE_ADDRESS 0x08

volatile uint8_t i2c_regs[14];

volatile byte reg_position;
const byte reg_size = sizeof(i2c_regs);

void setup() {
  for (int i=0;i<14;i++) {
    pinMode(i,OUTPUT);
    digitalWrite(i,LOW);
    i2c_regs[i]=LOW;
  }

  // initialize i2c as slave
  Wire.begin(SLAVE_ADDRESS);

  // define callbacks for i2c communication
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
}

void loop() {
  for (int i=0;i<14;i++) {
    digitalWrite(i,i2c_regs[i]);
  }
  delay(100);
}

// callback for received data
void receiveEvent(int howMany){
  reg_position = Wire.read();
  howMany--;

  while(howMany--) {
    reg_position %= reg_size;
    i2c_regs[reg_position] = Wire.read();
    reg_position++;
  }

}

// callback for sending data
void requestEvent(){
  reg_position %= reg_size;
  Wire.write(i2c_regs[reg_position]);
  reg_position++;
}

Raspberry側のプログラムは以下の通りです。

#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

/*
cc -o test2 test2.c -lwiringPi
*/

int main (void)
{
    int fd;
    int regad;
    int sdata;
    int Val;

    if ((fd = wiringPiI2CSetup(0x08)) < 0)
    {
        printf("wiringPiI2CSetup failed:\n");
    }

    while(1) {
      printf("Enter i2c register address=");
      scanf("%d",&regad);
      if (regad < 0) break;
      printf("Enter i2c send data=");
      scanf("%d",&sdata);
      if (sdata < 0) break;
      wiringPiI2CWriteReg8(fd,regad,sdata);
      Val = wiringPiI2CReadReg8(fd,regad);
      printf("Val=%d\n",Val);
    }
}

i2c-toolsを使えばコマンドラインからも操作することができます。
$ sudo apt-get install i2c-tools
$ i2cget -y 1 0x08 0x00
0x00
$ i2cset -y 1 0x08 0x00 0x01
$ i2cget -y 1 0x08 0x00
0x01
$ i2cget -y 1 0x08 0x01
0x00
$ i2cset -y 1 0x08 0x01 0x01
$ i2cget -y 1 0x08 0x01
0x01


次回
はRaspberryとATtinyのi2c通信を紹介します。