• 3D列印服務
  • #maker+t=market
  • COSPLAY 3D 建模
  • 1
  • 2
  • 3

DIY CNC Machine.Taipei 造訪社團 » 功能

原文網址 石小川
2019-10-03 19:28:13

使用Python語言做自動控制的方法 - I 軟體篇

[語法簡單明瞭]

Python語法簡單易學,最重要的是還有大量功能強大的免費模組可下載,其強大的應用層面已經發展到令人不可忽視的重要地位,甚至NASA也拿來當作航太人機介面的控制語言。早期接的專案我都是用Assembly、C、C++、C#等設計自動控制系統,這幾年我很多是改用Python來撰寫,好處是取得系統傳回的資料後,可很容易且快速的結合各種海量模組演算法發展出很專業的人工智慧機器。

[Python是跨平台語言]

Python本身沒有支援特定硬體控制的功能,也正因為如此它才能夠跨平台,但這不是原罪,相反的卻是它的優點,換句話說,在x86、Arm、Arduino、PC、手機或平板等不同的作業系統環境下,相同的程式皆可以很容易互相移植過去正常執行,這 print('免費資源 + 免費的模組 + 簡單易學') 根本是一場世界革命,能不紅嗎!

綜合以上講了一大堆,無非就是要說服工程師們是該改變自已接受世界脈動的時候了,我也不例外,以此共勉之!

[軟體開發]

接下來進入主題談論如何用Python開發一個多軸的CNC平台,會舉這個CNC專題當作例子是因為在我眼裡,CNC其實就是一個機器人,我的經驗是~只要搞懂CNC軟硬體知識後,無論是自駕車、四軸無人機或是工具機皆是囊中物,至於想要用它做些甚麼,端看你無限的想像力而定!

因為Python沒有直接存取硬體的介面,我的方法是用Python當作主程式,將底層存取硬體的API程式(動態連結程式庫 DLL)封裝成Python可調用的格式即可,如此一來多年使用C++/C#寫的程式庫都可引用了。因為程式很長, 為免洗板我簡略敘說過程如下:

(A). 封裝DLL程式庫成PyCNC.py 模組,其中 class __IMC_Pkg()就是封裝成類別的名稱, 將來Python與機器溝通的介面就是依靠這項。

#---------------------------------------------------------------------------

# 這是被呼叫的模組 : PyCNC.py

#---------------------------------------------------------------------------

# 需引用ctypes

import ctypes

import ctypes.wintypes

#------------------------------------------------------------------------------

class __IMC_Pkg():

def __init__(self):

self.ptr = ctypes.WinDLL('IMC_Pkg.dll') # _stdcall

#---------------------------------------------------------------------------

def Open(self, netcardId, imcId):

self.ptr.PKG_IMC_Open.argtypes = (ctypes.c_int, ctypes.c_int)

self.ptr.PKG_IMC_Open.restype = ctypes.POINTER(ctypes.c_voidp)

return self.ptr.PKG_IMC_Open(netcardId, imcId) #---------------------------------------------------------------------------

def Close(self, handle):

self.ptr.PKG_IMC_Close.argtypes = (ctypes.POINTER(ctypes.c_voidp), )

self.ptr.PKG_IMC_Close.restype = ctypes.c_int

return self.ptr.PKG_IMC_Close(handle)

#---------------------------------------------------------------------------

def MoveAbs(self, handle, pos, startvel, tgvel, wait, axis):

self.ptr.PKG_IMC_MoveAbs.argtypes = (ctypes.POINTER(ctypes.c_voidp), ctypes.c_int, ctypes.c_double, ctypes.c_double, ctypes.c_int, ctypes.c_int) self.ptr.PKG_IMC_MoveAbs.restype = ctypes.c_int

return self.ptr.PKG_IMC_MoveAbs(handle, pos, startvel, tgvel, wait, axis)

#---------------------------------------------------------------------------

def MoveAbs_P(self, handle, pos, startvel, tgvel, wait, axis): # P 輔助座標

self.ptr.PKG_IMC_MoveAbs_P.argtypes = (ctypes.POINTER(ctypes.c_voidp), ctypes.c_int, ctypes.c_double, ctypes.c_double, ctypes.c_int, ctypes.c_int) self.ptr.PKG_IMC_MoveAbs_P.restype = ctypes.c_int

return self.ptr.PKG_IMC_MoveAbs_P(handle, pos, startvel, tgvel, wait, axis)

.

.

(B). 主程式motion.py 要引用也很簡單, 只要加上PyCNC.py模組,就可以調用IMC_Pkg所有的功能

#---------------------------------------------------------------------------

# 這是主程式 : motion.py

#---------------------------------------------------------------------------

from CNC import PyCNC

IMC_Pkg = PyCNC.__IMC_Pkg()

#---------------------------------------------------------------------------

if(self.gHandle != None):

IMC_Pkg.Close(self.gHandle)

self.gHandle = IMC_Pkg.Open(netcardId, imcId)

if(self.gHandle != None): #//if(IsOpen())

if(IMC_Pkg.InitCfg(self.gHandle) != 0):

self.nAxis = IMC_Pkg.GetNaxis(self.gHandle) # 取得設備支援軸數

p, self.Position = self.GetPosition(3)

(C). 建議開發環境安裝Anaconda開發包, 在設計Python程式時可少走很多冤枉路,為了相容以前DLL程式庫,我是下載Anaconda3 - 32bit - Python3.7.3版本。

p.s. (1). IMC3xx/IMC4xx系列運動控制卡所有函數(IMC_Pkg.dll)我都有封裝成PyCNC.py以方便Python呼叫,有興趣的朋友可加入我臉書討論。

((2). 圖-1. 八軸運動+I/O+AD/DA控制卡應用圖例

圖-2. motion.py 主程式的視窗介面

影片-1. 使用motion.py 展示CNC軸控,也順便Demo飛行搖桿控制3軸及發射雷射

影片-2. 電腦執行motion.py情形

影片-3. 使用motion.py 執行G-Code,用雷射雕刻一個正圓

(3). 下回有機會再補上 : "使用Python語言做自動控制的方法 - I I 硬體篇"及 "使用Python語言做自動控制的方法 - I I I 通信篇" (UART、USB、TCP/IP)兩篇才算完整,並且教導大家如何組裝一台三軸運動控制平台的知識(機械結構及控制電路的接法),對於想創業設計自已機器的朋友不要錯過了。在臉書不適合長篇大論所以只能簡單敘述,總感覺見樹不見林,當然我也有開相關的指導課程,有興趣的朋友可上我臉書或私訊我。

Wei-Hsiung Huang
2019-10-03 19:48:42

Nice..

便宜十塊錢
2019-10-03 19:49:49

Python好用+1
我幫公司做一個簡易Web資訊看板
用一台PLC+乙太模組做收集各產線資訊
(我很懶得拓樸一大堆通訊線,跑RS485 To Zigbee)
由乙太模組把資訊先推到ModbusTCP層
再由Python讀ModbusTCP把讀到的值推到前端Web上
簡易的產能看板
跨平台真的好用

吳小東
2019-10-03 22:16:58

深深認同

石小川
2019-10-03 23:30:37

good job! 這是很好的應用, 以前接工廠資料收集器專案, 通信用RS232, 十台一大捆線, 現在看太不可思議了, 哈哈^^

便宜十塊錢
2019-10-03 23:57:01

石小川 我收集的PLC有做類心跳封包,只對有開機的機台通訊,不然Timeout會拖慢速度,越多台沒開越慢,所有的數值都在各機台PLC處理好,再收集
另外還有外加自動紀錄(5天)+控制各站自動歸零(各站開機時規零)

便宜十塊錢
2019-10-04 00:08:16

這個是第一個有線通訊(4台)
現在在做的無線(9台)快好了
規劃排點位跟處理問題較麻煩 ?

石小川
2019-10-04 12:12:53

感謝分享, 在關燈無人工廠掘起後, 機台間的通信越來越重要了, 大大的技術應該很有潛力, 我還停留在十幾年前TCP/IP抓封包技術, 有機會再請教您^^


原文網址 李派克
2019-10-01 21:10:18

這個suspend功能不錯⋯⋯

林志強
2019-10-01 21:11:47

李派克
2019-10-01 22:42:16

但是不實用。跑內孔可能會撞

David Chuang
2019-10-01 23:17:35

看不出來 你的suspend 定義是?

C.a. Tsai
2019-10-02 07:31:01

這叫正CE功能,白話說就是有安全開關。
不然使用者出事,代理商跟製造廠會被告到脫褲子。


原文網址 石小川
2019-08-17 16:45:50

G-Code雷射切割成果

趁假日趕快補上回未完的下集!

在設計CNC刀路軟體時, 如果能掌握多軸聯動及圓弧直線插補演算法技巧, 那差不多成功一半了, 有心要走設計機器手定位的人一定要熟悉。DWG/DXF轉CNC程式內部採用Double雙倍浮點運算,至少抓小數點第四位,如果機器校準正確的話精度應沒問題。

此次臨時組裝一個雷射機台做軟體測試,使用一顆5.5W藍光半導體雷射頭做工件雕刻, 圖中皆是用上回介紹的圓弧插補演算法用雷射刻出直徑50mm的全圓, 刀路頭尾都準確接合, 真圓度也高,已符合一般業界需求了。

圖一是製作飛機用的巴沙木。(表面雕刻, 雷射頭停留久時可切斷、貫穿)

圖二是厚皮革。(表面雕刻, 雷射頭停留久時可切斷、貫穿)

圖三是一般影印紙。(切斷)

p.s. 如果要切斷材料功能,可用程式設定進給將G-Code Fxxxx調慢些, 或換功率更大的雷射頭。


原文網址 石小川
2019-07-11 17:28:35

DWG/DXF to CNC 工程 I - DWG/DXF圖檔解析篇

對於想用CNC製作一些零組件的朋友來說,要學會AutoCAD、SolidWork、uG、Fusion360、ARTCAM、PowerMill、 MasterCAM、Mach3等,我相信會嚇跑一票人的熱血。其實CAD/CAM套裝軟體很強但有很多功能幾百年也用不到,只是浪費錢而已,在接工廠自動控制客製化軟體方面絕大部分作動都很單純,我這裡是將所有功能精簡成 : /檔案/機器/刀具/G-Code sender,只要讀檔或在螢幕寫字、繪圖後自動產生G-Code直接送至CNC銑床或雷射加工,盡量能由機器代勞的就盡量隱藏在程式裏面,操作介面就只有一個螢幕面板Panel。

要做到這點須先解析DWG檔案結構,後續追加功能才有辦法走下去,AutoCAD DWG檔案簡直就是一個複雜的巨型圖層資料庫而且每兩年改版一次,建議還是用DXF圖檔相容性較高,有機會再談談DXF檔結構。這裡先分享一下DWG解析方法給有興趣研發的好友參考一 下。

基本上程式要解析其中的資料結構如下,有點長刪減一些函數但原理不變。

讀取DWG檔後打開資料庫取實體EntityName的字串名稱(約50個標籤名稱)一層層解析後繪圖即可原圖重現,看你要加圖、刪圖或送去產生G-Code等,另外如果用不著的功能就略過,沒必要全部實作,有興趣可一起討論,下回再討論G-Code產生器。

//-------------------------------------------------------------------

public void Draw(List<CadParse> cadparselist)

{

foreach(CadParse cadParse in cadparselist)

{

switch(cadParse.EntityName)

{

case "AcDbAlignedDimension":

break;

case "AcDbArc":

break;

case "AcDbArcDimension":

break;

case "AcDbBlockReference":

break;

case "AcDbBody":

break;

case "AcDbCircle":

DrawCircle(cadParse);

break;

case "AcDbPoint":

break;

case "AcDbDiametricDimension":

break;

case "AcDbViewport":

break;

case "AcDbEllipse":

DrawEllipse (cadParse);

break;

case "AcDbFace":

break;

case "AcDbHatch":

break;

case "AcDbLeader":

break;

case "AcDbLine":

DrawLine(cadParse);

break;

case "AcDb2LineAngularDimension":

break;

case "AcDbMInsertBlock":

break;

case "AcDbMline":

break;

case "AcDbMText":

break;

case "AcDbOle2Frame":

break;

case "AcDbOrdinateDimension":

break;

case "AcDb3PointAngularDimension":

break;

case "AcDbPolyFaceMesh":

break;

case "AcDbPolygonMesh":

break;

case "AcDbPolyline":

DrawPolyLine(cadParse);

break;

case "AcDb2dPolyline":

break;

case "AcDb3dPolyline":

break;

case "AcDbProxyEntity":

break;

case "AcDbRadialDimension":

break;

case "AcDbRasterImage":

break;

case "AcDbRay":

break;

case "AcDbRegion":

break;

case "AcDbRotatedDimension":

break;

case "AcDbShape":

break;

case "AcDbSolid":

break;

case "AcDb3dSolid":

break;

case "AcDbSpline":

break;

case "AcDbTable":

break;

case "AcDbTrace":

break;

case "AcDbWipeout":

break;

case "AcDbXline":

break;

case "AcDbPdfReference":

break;

case "AcDbDwfReference":

break;

case "AcDbDgnReference":

break;

} //end switch(cadParse.EntityName)

} //end foreach(CadParse cadParse in _cadParseList)

} //end public void Draw()


原文網址 石小川
2019-05-17 19:40:20

應用攝影機對CNC自動對刀程式的設計

對於非侵入性的偵測來說,我首推影像辨識技術,因為攝像頭價格越來越便宜,如果善用一些數位演算法的話,其實在CNC機台上可以做很多事,活用的話甚至可媲美幾百萬的進口機器。 我寫的這套VT軟體是結合了C++/C#/Qt + Mach3 + OpenCV和一些演算法來完成Z軸影像自動對刀功能,我是利用雷射來定位工件,其中攝像頭畸變須要校準才能量測準確,精密度我抓小數點第三位(單位mm)。 其它像工件尺寸量測、3D工件掃描建模直接出圖、或是機台要做手機拆解機器…等原理皆一樣,如果要做到物件直間掃描再CNC複製, 應該可挑戰一下,這就留給有興趣的人想想實作了, 先寫到這裡,祝各位好友假日愉快^^

林志強
2019-05-17 19:56:00

宜震陳
2019-05-17 20:00:39

已跪

辛育全
2019-05-17 22:20:29

哥 鏡頭可以考慮換焦段大一點的變異比較小,當然鏡頭品牌品質有差,且焦段大也不用看太多其他地方,可以增加你的解析,規格選一下可以不用校正就不要校正,然後改成背光,因為用環境光你需要限制客戶背景!


原文網址 石小川
2019-05-10 16:49:04

介紹一款CNC運動控制卡給喜歡自已寫控制程式的人參考

通常我不在社團內介紹商品以免有廣告之嫌, 不過這個運動卡我用過好幾個專案, 可控制自由度高, 一年了也沒出問題, 所以決定分享給社團好友參考.

如圖所示 IMC3xx2E 運動卡簡介: 我用的的是八軸及六軸聯動運動卡, 介面是採用RJ45網路線傳輸控制碼到機台, 以八軸卡來說內有80個輸入/ 48個輸出, 足夠一般機器使用, 在PC也是用ethernet 與運動卡通訊, 好處是防雜訊比USB好很多, 而且網路線可拉很長很長, 只要你網路可通的話!

我的重點是廠商有提共完整的API函數庫(VB, VC++, VC#, QT)讓你控制CNC所有功能, 包括網卡搜尋, 八軸運動, I/O狀態, 圓弧直線插補, 族繁不及備載, 該有的應該都有了, 端看你要如何應用, 我打算用跑Linux 的ARM板做脫機, 我這裡有一些相關pdf資料, 如果有興趣的人可mail我.

程式控制很簡單, 以C#為例:

(1)專案加入IMC_PKG.cs

(2)程式前面加上 using imcpkg;

//---------------------------------------------------------------------

//單軸連續移動(continue)

private void MachineMove(int axis, bool bDirection)

{

double acc = 10;

double startvel = 100;

double tgvel = 100;

IMC_Pkg.PKG_IMC_SetAccel(Global.gHandle,

acc, acc, axis);

if(bDirection)

IMC_Pkg.PKG_IMC_MoveVel(Global.gHandle,

startvel, tgvel, axis);

else

IMC_Pkg.PKG_IMC_MoveVel(Global.gHandle,

-startvel, -tgvel, axis);

}

//---------------------------------------------------------------------

//單軸移動至指定位置(step)

private void MachineMove(float pos, int axis)

{

double acc = 10;

double startvel = 100;

double tgvel = 100;

int pulse_per_mm = 5120; //steps_per=pulse/mm

int dist = (int)(pos * pulse_per_mm);

IMC_Pkg.PKG_IMC_SetAccel(Global.gHandle,

acc, acc, axis);

IMC_Pkg.PKG_IMC_MoveDist(Global.gHandle,

dist, startvel, tgvel, 0, axis);

}

//---------------------------------------------------------------------

David Chuang
2019-05-10 16:58:12

我有興趣

Allen Chang
2019-05-10 16:58:29

宜震陳
2019-05-10 17:00:32

? ?

蔣益民
2019-05-10 17:17:22

您可以將檔案分享到社團的檔案區

石小川
2019-05-10 17:28:31

ok! 已分享乙太網運動卡兩個檔案至社團檔案區, 有需要的可參考看, 軟硬體有問題可互相討論!

Don Si
2019-05-10 17:41:53

感謝分享

黃小法
2019-05-10 18:01:49

不好意思,小弟愚拙,這個該怎麼應用到CNC上??介面要自己搞??

Cheng Chris
2019-05-10 18:49:02

請教一下如果是大機台的那種可以嗎

辛育全
2019-05-10 19:33:52

哥價格落在哪?

盧人菖
2019-05-10 22:02:48

林錫義
2019-05-10 22:54:33

可以控制伺服馬達?

陳竑吾
2019-05-11 01:07:41

謝謝推薦!很實用的資訊

吳忠哲
2019-05-11 11:17:22

用這個來做CNC的話,可以享受自己搞一個Mach3的樂趣是嗎?


原文網址 石小川
2019-04-30 12:34:34

C#程式控制Mach3運動卡的方法(二)

上回寫的程式版本是透過USB HID介面直接控制Mach3, 這次版本是透過Mach3橋接, 用它提供的API做控制, 好處是幾乎所有Mach3功能皆可實作, 壞處是Mach3必須先執行, 這樣做有甚麼好處呢? 主要是二次開發用, 會自已寫程式的人(C# , C++, VB)可加入演算法提升CNC的功能, 例如可在CNC加入OpenCV做影像辨識或做3D工件掃描建模功能, 或者加入類神經網路做深度學習….等等, 下次有機會我們再詳細討論這部份. 本章重點是簡單介紹開發步驟, 以C#程式語言為例(其實任何語言皆可, 只是呼叫方式略有不同而已)如下:

(1)正常機碼必須有下列註冊檔, 否則程式無法呼叫API(有個補救方法, 下載Mach3Registry.reg, 執行可產生).

xxxxxxxxxx : 每套機碼不一樣. [HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxxxx}] @="Mach4.Document"

[HKEY_CLASSES_ROOT\CLSID\{ xxxxxxxxxxx] @="ole32.dll"

[HKEY_CLASSES_ROOT\CLSID\{ xxxxxxxxxxx }\LocalServer32] @="C:\\Mach3\\Mach3.exe"

[HKEY_CLASSES_ROOT\CLSID\{ xxxxxxxxxxx }\ProgID] @="Mach4.Document"

[HKEY_CLASSES_ROOT\Mach4.Document] @="Mach4.Document"

[HKEY_CLASSES_ROOT\Mach4.Document\CLSID] @="{ xxxxxxxxxxx }"

(2)在C# /專案/加入參考/ 將Mach3.exe 加入參考,

並在程式前面加入

using System.Runtime.InteropServices;

using Mach4;

(3)主要操作就是這項, 一旦取得Mach3的handle(mInst), 就可長驅直入使用其提供的所有功能(功能可參考Mach3 Version3.x Macro Programmers Reference Manual.pdf) .

IMyScriptObject mInst = null;

try

{

Mach4 mach = (Mach4.IMach4)

Marshal.GetActiveObject("Mach4.Document");

mInst = (Mach4.IMyScriptObject)

mach.GetScriptDispatch();

}

catch

{

}

(4)程式有點長, 為避免洗版, 只好摘錄部分程式如下(有疑問或有興趣找我研發的也歡迎私訊我!):

//---------------------------------------------------------------------

//Mach3 Control Process

//---------------------------------------------------------------------

private IMyScriptObject GetMachInstance()

{

IMyScriptObject mInst = null;

try

{

IMach4 mach = (Mach4.IMach4)

Marshal.GetActiveObject("Mach4.Document");

mInst = (Mach4.IMyScriptObject)

mach.GetScriptDispatch();

}

catch

{

}

return mInst;

}

//---------------------------------------------------------------------

private bool DoEmButton(short number)

{

if(_mInst != null)

{

_mInst . DoOEMButton(number);

return true;

}

return false;

}

//---------------------------------------------------------------------

private void DoGCode(string code)

{

if(_mInst != null)

_mInst.Code(code);

}

//---------------------------------------------------------------------

private void sendMDI()

{

if(textBoxMDI.Text.Trim() != null)

{

DoGCode(textBoxMDI.Text.Trim());

}

}

//---------------------------------------------------------------------

private double[] UpdateDRO()

{

double[] dro = new double[3];

if(_mInst != null)

{

dro[0] = _mInst.GetOEMDRO(800);

dro[1] = _mInst.GetOEMDRO(801);

dro[2] = _mInst.GetOEMDRO(802);

}

return dro;

}

//---------------------------------------------------------------------

//dir = 0 to + direction, dir = 1 to - direction

private void xJogStart(DirectionType dir)

{

if(_mInst != null)

_mInst.JogOn((short)AxisType.X, (short)dir);

}

//---------------------------------------------------------------------

private void xJogStop()

{

if(_mInst != null)

_mInst.JogOff((short)AxisType.X);

}

//---------------------------------------------------------------------

private void yJogStart(DirectionType dir)

{

if(_mInst != null)

_mInst.JogOn((short)AxisType.Y, (short)dir);

}

//---------------------------------------------------------------------

private void yJogStop()

{

if(_mInst != null)

_mInst.JogOff((short)AxisType.Y);

}

//---------------------------------------------------------------------

private void zJogStart(DirectionType dir)

{

if(_mInst != null)

_mInst.JogOn((short)AxisType.Z, (short)dir);

}

//---------------------------------------------------------------------

private void zJogStop()

{

if(_mInst != null)

_mInst.JogOff((short)AxisType.Z);

}

//---------------------------------------------------------------------

private void buttonStart_Click(object sender, EventArgs e)

{

DoEmButton(1000); //start

}

//---------------------------------------------------------------------

private void buttonFeedhold_Click(object sender, EventArgs e)

{

DoEmButton(1001); //Feedhold

}

//---------------------------------------------------------------------

private void buttonStop_Click(object sender, EventArgs e)

{

DoEmButton(1003); //Stop

}

//---------------------------------------------------------------------

private void buttonMDI_Click(object sender, EventArgs e)

{

if(_mInst != null && textBoxMDI.Text.Trim() != null)

_mInst.Code(textBoxMDI.Text.Trim()); //senMDI

}

//---------------------------------------------------------------------

private void timerUpdateDRO_Tick(object sender, EventArgs e)

{

double[] dro = UpdateDRO();

textBoxX.Text = dro[0].ToString("#0.0000");

textBoxY.Text = dro[1].ToString("#0.0000");

textBoxZ.Text = dro[2].ToString("#0.0000");

}

//---------------------------------------------------------------------

private void buttonPX_MouseDown(object sender, MouseEventArgs e)

{

xJogStart(DirectionType.Positive);

}

//---------------------------------------------------------------------

private void buttonPX_MouseUp(object sender, MouseEventArgs e)

{

xJogStop();

}

//---------------------------------------------------------------------

private void buttonNX_MouseDown(object sender,

MouseEventArgs e)

{

xJogStart(DirectionType.Negtive);

}

//---------------------------------------------------------------------

private void buttonNX_MouseUp(object sender,

MouseEventArgs e)

{

xJogStop();

}

//---------------------------------------------------------------------

p.s. 一手操作一手攝影, 非專業攝影, 影片有些抖動請見諒!

辛育全
2019-04-30 12:37:03

Steve Wu
2019-04-30 13:01:22

張益晟
2019-04-30 18:27:16

?

Chihfu Huang
2019-04-30 19:13:38

沈宗麟
2019-04-30 21:32:50

厲害

徐豪宏
2019-05-01 00:33:13

Yu Tseng
2019-05-01 10:28:23

林志強
2019-05-01 17:14:23

好強

吳治彥
2019-05-04 22:53:05

石小川
2019-05-05 16:23:49

謝謝! 感謝以上兄弟們熱烈回應!
我是有些野人獻曝, 班門弄斧之感, 所幸大家善良. 在本社團內臥虎藏龍, 有經驗的CNC實務高手很多, 不結合一起做出好產品實在可惜, 畢竟要會玩也要會養家糊口, 哈哈哈! 想借此版拋磚引玉一下, 是否可腦力激盪, 集思廣益一下, 大家提出CNC專案或其他智慧機器由有興趣有能力的成員加入一起完成, 至於專案成立, 負責出資, 材料, 利潤分紅等細節我再想想, 會尊重此版規定, 跟管理員商討是公開或私訊方式. 以上是我初步構想, 看是否有正反意見皆可提出!


原文網址 石小川
2019-02-01 20:22:47

Q2光學自動檢測控制機台組裝完成

先簡單分享一下PC base機台硬體如下, 過完年後再分享一些機台如何結合AI應用篇。(ARM base 機台年後也會產出)

PC控制器採用8軸聯動(目前只用4軸, 其餘留給機械手臂), 80個輸入/ 48個輸出, 用TCP/IP RJ45網路線傳輸控制碼控制機台, 工業相機是採用1400萬像素, 及附加一個觸控螢幕. 所有功能可用C++或C#程式自由控制, 應該足夠一般工廠自動化機台使用了!

p.s. 有需要瞭解或組裝的好友可私密我! 祝大家新年快樂囉 ^^

Kenny Plus
2019-02-01 20:29:08

請私,謝謝

Eric Lin
2019-02-01 23:07:11

厲害

周英男
2019-02-02 16:45:57

請問用的是什麼控制卡?

曾鈺憲
2019-02-03 08:50:18

辛育全
2019-03-03 00:03:05

"機台如何結合AI應用篇"???
看不懂後面預計做的目標是...???


原文網址 石小川
2018-11-27 16:28:55

機器視覺應用在CNC介紹

機器視覺在工業4.0的應用非常廣泛,例如樣本比對、良率偵測、工件大小量測、微生物標定…..等,如果結合人工智慧資料分析就是一套很完整的專家系統了。

圖中軟體是我將紅血球/白血球辨識及標定的核心程式改寫成簡單的CNC自動對刀及工件偵測系統,理論上量測精度可控制在1um(10^-6m)以內,不過我的CNC機台螺桿可沒這麼精密,所以我把它控制在浮點數第3位即可,整體而言精密度與攝像頭、機台、都有關係,端看應用者的要求而調整軟硬體。

自動對刀是用演算法找出工件中心點,而自動對焦是採用Z軸移動加上演算法達成,另外比例尺可配合3軸移動及像素自動求得,一旦中心點座標找出來就很容易結合Mach3或PLC將主軸定位在工件上。值得一提的是打光技術在影像辨識也非常重要,打光打得好辨識率就很好,演算法就可精簡些,其餘利用影像偵測工作臺大小及影像多軸限位開關技巧和Z軸單鏡頭工件深度偵測技巧,這些功能我就留在下回再演示了(因為前陣子瘋選舉我還沒寫好Demo程式, 哈哈… 抱歉了 ^^”)。

黃小法
2018-11-27 17:19:17

比例是手動拿尺先抓出比例嗎?立體的東西高度不同如何量測?這是不是中心點跟滑鼠之間針對每個像素點分析抓出分際點?

李派克
2018-11-28 15:41:40

其實我也是是用CCD來對刀吔,只是因為CCD不防水所以常拆,每次都要改變OFFSET就沒做圖形偵測了⋯⋯不過你的CCD也太威了,我還只用WEBCAM而已,我是掛在raspberry pi上,就直接可以做成自己機子的HMI了

Allen Chang
2018-12-02 12:32:06

之前在工業手臂組裝工件做過類似功能,
治具安裝+-10mm即可完成治具架設
https://www.youtube.com/watch?v=Drkw6hwD-iE

Allen Chang
2018-12-02 12:34:19


原文網址 張峻銘
2018-05-28 15:35:50

artCam中可以將圖片輸入後,以降色階方式,找出圖形的輪廓,那麼在Fusion有此功能嗎?

陳建仲
2018-05-28 17:54:50

據我所知,沒有,通常都是先轉好輪廓檔案,再匯入。