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#上的上機介面去做開發!!


2020年1月4日 星期六

Arduino Yun 與兩台 USB Camera 的 video stream

最近在玩servo 馬達時把Yun 重新拿出來研究一番!!
心血來潮接上USB HUB然後把手上兩個usb camera同時接上!

用SSH 進去 OpenWRT的 Linux operating system 
先安裝 opkg install usbutils 以便檢查 USB device
root@Arduino:~# find /dev/bus/usb

/dev/bus/usb
/dev/bus/usb/001
/dev/bus/usb/001/005
/dev/bus/usb/001/004
/dev/bus/usb/001/002
/dev/bus/usb/001/003
/dev/bus/usb/001/001

root@Arduino:/# lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-platform/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 3, If 0, Class=Hub, Driver=hub/7p, 480M
            |__ Port 2: Dev 6, If 0, Class=Video, Driver=uvcvideo, 480M
            |__ Port 2: Dev 6, If 1, Class=Video, Driver=uvcvideo, 480M
            |__ Port 2: Dev 6, If 2, Class=Audio, Driver=snd-usb-audio, 480M
            |__ Port 2: Dev 6, If 3, Class=Audio, Driver=snd-usb-audio, 480M
            |__ Port 3: Dev 5, If 0, Class=Video, Driver=uvcvideo, 480M
            |__ Port 3: Dev 5, If 1, Class=Video, Driver=uvcvideo, 480M
        |__ Port 4: Dev 4, If 0, Class=Mass Storage, Driver=usb-storage, 480M

確定有兩台 video device後 開始進行介面的開發
在openWRT 下
mjpg_streamer -i \"input_uvc.so -d /dev/video0 -r 640x480 -f 6\" -o \"output_http.so -p 8080 -w /www/webcam

mjpg_streamer -i \"input_uvc.so -d /dev/video1 -r 640x480 -f 6\" -o \"output_http.so -p 8081 -w /www/webcam

將/dev/video0 的影像stream到 port 8080
/dev/video1的影像stream到port 8081
兩台Camera 對照的stream 照片