(u_u)

mbedとArduinoでI2C通信

Categories: [blog]
Tags: [Arduino], [Mbed], [F401RE], [Nucleo], [STM32], [Uno], [usbhostshield], [bluetooth], [Wii], [I2C]

こちらのページを参考にしました。Arduino(Master)とmbed(Slave)でI2C通信する - how to code something
ArduinoUnoに接続されたUsbHostShieldでWiiの信号を拾い、Mbedに送信したかったのでmasterとslaveの関係を逆にしました。

mbed Nucleo STM32F401RE (master)

#include "mbed.h"

#define SDA D5
#define SCL D7

const int ArduinoAddress7bit = 0x08;
const int ArduinoAddress8bit = ArduinoAddress7bit << 1;

I2C master(SDA, SCL);
Serial pc(SERIAL_TX, SERIAL_RX);

int main() {
    char buff[2] = {1,1};
    while(1) {
        master.read(ArduinoAddress8bit,buff,2);        
        pc.printf("%d, ",buff[0]);
        pc.printf("%d \n",buff[1]);        
    }
}

Arduino Uno (slave)

//SDA = A4 , F401RE:D5
//SCL = A5 , F401RE:D7

#include <Arduino.h>
#include <Wire.h>
#define THIS_ADDRESS 0x08
void requestEvent();

char bytes[2] = {0x1,0x10};
void setup() {
  Wire.begin(THIS_ADDRESS);                // join i2c bus with address #8
  Wire.onRequest(requestEvent); // register event
  Serial.begin(9600);
}

void loop() {
  delay(100);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
    Wire.write(bytes[0]);
    Wire.write(bytes[1]); // respond with message of 6 bytes
    bytes[0]++;
    bytes[1]++;
  // as expected by master
}

MasterとSlaveを逆にする時のやり方はわからなかった。mbedのI2CSlaveライブラリどうやって使うんだろう。