2020年3月12日 星期四

Arduino應用之3D印表機改裝成繪圖機

剛好朋友有一台3D印表機壞掉了, 就跟他要來改裝成繪圖機!!
結合之前的一些文章做個統合練習!
1. Arduino Grbl指令解碼撰寫:
    在解指令得時候要注意GCode的格式, 我現在只有 G1, G4, G92, M300
2. Motor  driver A4988 控制

下圖一為3D印表機的結構
下圖二為A4988的pin out 
下圖三為arduino與 A4988最簡單接法 
下圖四為GRBL controller 執行圖形 

如下影片為繪圖狀況

2020年2月15日 星期六

Arduino 測試治具的應用 - 抽屜式治具控制

案件需求為:
1. 兩個按鍵作為進出平台的開關 另一按鍵為平台上另一上下動作的開關
2. 完成所有動作後按任一進出按鍵就進行退出動作在退出時 蜂鳴器要發聲
3. 完成進入動作 COUNTER 要記數加一次為了控制頂針壓合次數
4. 手動跟程式控制同時可以動作



零件配置如圖:
1. Arduino 控制板
2. 8 Port Relay board
3. 3 個 push button
4. 3個氣壓控制閥
5. 1個蜂鳴器
6. 次數記數器
7. 4個磁簧開關
8. ACto12VDC變壓器



2020年2月6日 星期四

Arduino Yun 配合 C# Dropbox 的應用 - 上傳檔案篇


本來是想直接在 Arduino Yun 上安裝dropbox 的API 上傳Webcam 拍到的照片, 可是怎麼安裝就是裝不起來, 所以就用另一個方式:系統架構為
由arduino Yun 接上 PIR 感測器 偵測到物體經過 就用 webcam 拍照 然後由上機介面把存在Yun的SD card的照片抓回本機上傳到 dropbox!!
感謝從網路參考的這篇文章仙草奶綠的程式筆記本, 了解 Dropbox API 的使用方式
Yun 上的code主要是 PIR的 input pin 偵測事件
判斷有物體後 下拍照指令
p.runShellCommand("fswebcam /mnt/sda1/test.png");


上機介面用 c#所寫用到的dll有
using Renci.SshNet;
using Dropbox.Api;

抓取 Yun SD Card上的圖片
string remoteDirectory = "/mnt/sda1";
using (var sftp = new SftpClient(yun._host, yun._username, yun._password))
{
      sftp.Connect();
      var files = sftp.ListDirectory(remoteDirectory);
       using (Stream fileStream = File.Create(@"D:\temp\test.png"))
      {
           sftp.DownloadFile("/mnt/sda1/test.png", fileStream);
       }
}

上傳到 Dropbox 用到的API 為
var task = Task.Run((Func)UploadDoc);
task.Wait();

public async Task UploadDoc()
{
    string uploadname = "yun.jpg";
    using (var dbx = new DropboxClient(this.AccessToken))
    {
         var full = await dbx.Users.GetCurrentAccountAsync();
         await Upload(dbx, "/software", "test1.txt", @"D:\Test\test.txt");
    }
}
private async Task Upload(DropboxClient dbx, string folder, string file, string fileToUpload)
{
     using (var mem = new MemoryStream(File.ReadAllBytes(fileToUpload)))
     {
            var updated = await dbx.Files.UploadAsync(
                folder + "/" + file,
                Dropbox.Api.Files.WriteMode.Overwrite.Instance,
                body: mem);
            Console.WriteLine("Saved {0}/{1} rev {2}", folder, file, updated.Rev);
     }
}

這樣就完成初步的照片上傳了!! 後續可以做一些 IoT 的應用.





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