2020年1月6日 星期一

Arduino Yun 與 Mega 2560 透過 I2C 的通訊

最近用 Arduino Mega2560 做了一個中控盒包含 各種sensor的偵測與 IR和喇叭的應用.
而Arduino Yun有不一樣的功能展示. 所以就想說 兩種板子 來透過I2C bus 來做連結!
Mega 2560 作為 I2C的 Master 因為之前已經有一些 I2C的功能寫在這裡!
//---------I2C Address------------------------------------------
#define DS90UB953TRHBTQ1_ADDRESS  0x18
#define LIS3MDLTD_ADDRESS 0x1E
#define CAT24C02_ADDRESS 0x50
#define LSM6DSM_ADDRESS 0x6A
#define SI7034_ADDRESS 0x70
#define BMP280_ADDRESS 0x76
#define TCA_ADDRESS 0x71
#define BMP180_ADDRESS 0x77
#define Gyro3Axis_ADDRESS 0x68
#define Gyr_address 0x68
#define SLAVE_ADDRESS 0x01

而就把 Yun 當作Slave來用 位址為 0x01.[注意 ATmega32u4 used in Yun has I2C: on 2 (SDA) and 3 (SCL)]


#include
Wire.begin(); // begin 沒帶參數就為master
//-----Arduino i2c slave

void vI2C_readTask1()
{
  Wire.requestFrom(SLAVE_ADDRESS, 6);
  Wire.beginTransmission(SLAVE_ADDRESS);
  int i = 0;
  if(Wire.available())
  {
    //Serial.print("Data returned: ");
    //Serial.print((char) Wire.read());
    while(Wire.available())
    {
      //Serial.print((char) Wire.read());
      Uart.line[i++] = Wire.read();
    }
    //Serial.println();
  }
  Wire.endTransmission();
  Uart.line[ i ] = '\0';                   // Terminate string
  processCommand(Uart.line);
  //Serial.println(Uart.line);
}
以上為接收到 slave 送回的指令處理, 目前為控制servo馬達的轉動角度

Slave端設定如下:
#define SLAVE_ADDRESS 0x01
Wire.begin(SLAVE_ADDRESS);    // join I2C bus as a slave with address 1
Wire.onReceive(receiveEvent); // register event
Wire.onRequest(requestEvent); // register event

void requestEvent()
{
  if(flag.I2C_Flag==1)
  {
    //Serial.println( Uart.line );
    Wire.write(Uart.line,6);
  }
}

//-----servo1 angle---------
  if(strstr(data, "S1_") != NULL)
  {
    for(int i=3;i    {
      Uart.ctemp[i-3]=data[i];
    }
    Uart.ctemp[ len-3 ] = '\0';
    tempDIO=atoi(Uart.ctemp);
    Serial.println(tempDIO);
    flag.I2C_Flag=1;
  }
將UART收到的 "S1_100"的格式拆解  馬達servo1 轉 100度 再轉發給 master 去控制 master的servo1 轉動100度!

將Arduino 的code 編輯完後! 就可以到 c#上的上機介面去做開發!!


沒有留言:

張貼留言