管理員
統計數據
原文網址 石小川 2019-12-15 18:02:53
繼上回介紹自製相容ARM9處理器核心後, 現在再推薦一款新的計算機架構, 而且是免費開源IP(矽智財)的CPU架構給有興趣的好友多一項參考設計, 這是目前國內外晶片廠最火紅的RISC-V(發音risk-five), 只要你願意可上RISC-V基金會官方網站下載相關開發工具及資源, 根據自已的需求設計32位元或64位元CPU(其實也有已經設計好的RISC-V核心提供下載), 然後以Verilog 燒寫在FPGA上即可完成自已的CPU架構, 值得一提的是雖然RISC-V它是免費的, 但是它的CPU效能相對於x86 及ARM來說毫不遜色, 2016年終於出現一個可以抗衡x86及ARM年代, 值得推薦! 另外 "手把手教你設計CPU-RISC-V處理器篇"這本書也很適合初學者入門, 對於有興趣設計AI或CPU晶片的好友可參考看看. 不過感傷的是這幾年很多科技技術書籍是簡體字, 國內寫書的人似乎逐漸凋零了, 這是國家競爭力的一項指標, 唉! 你懂我意思的^^" p.s. RISC-V(發音為「risk-five」)是基於已建立的精簡指令集(RISC)原則的一個開源指令集架構(ISA)。 與大多數指令集相比,RISC-V指令集可以自由地用於任何目的,允許任何人設計、製造和銷售RISC-V晶片和軟體, 請參考下列維基百科: https://zh.wikipedia.org/zh-tw/RISC-V
曾希哲 2019-12-15 18:47:33
真該買本好好讀一讀
林永仁 2019-12-16 08:28:13
哥借分享
原文網址 石小川 2019-12-15 18:00:41
想要自已設計屬於自已規格的CPU其實沒有想像中的難, 介紹一本書給有興趣創業或當IC設計工程師的好友參考一下 - 書名: 嵌入式系統設計 Verilog-ARM, 實作是以FPGA及Verilog語言設計相容於ARM9核心CPU, ARM是精簡指令(RISC)實作簡單, 可跑Linux, 對於有計算機結構基礎的人應該游刃有餘, 書中提到的管線(pipe line)結構是我比較不滿意的部分, 有些複雜, 由於真正的ARM9是採用五級管線取指令, 而書中是模擬3.5級管線, 進階的話可自行修改自已發明有效率的方法. 搞懂理論及實作可自已設計SoC(System on Chip, 系統單晶片), 將 DSP, USB及類神經網路晶片(NPU)或視覺辨識設計在系統裡面成為單晶片, 我的FPGA開發平台是採用Altera CYCLONE III EP3Cxxxx系列, 如圖所示. p.s. 用FPGA的好處是在開發初期可不需要找台積電就可生產少量IC, 省很多開發費用, 缺點是單價較貴! https://code.google.com/archive/p/risclite/
原文網址 石小川 2019-11-27 10:57:00
對於想用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產生器。
p.s. 下列範例是C#版本,有興趣的朋友歡迎自行改成Python版本。
//------------------------------------------------------------------- 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-11-26 12:36:22
[語法簡單明瞭] 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)兩篇才算完整,並且教導大家如何組裝一台三軸運動控制平台的知識(機械結構及控制電路的接法),對於想創業設計自已機器的朋友不要錯過了。在臉書不適合長篇大論所以只能簡單敘述,總感覺見樹不見林,當然我也有開相關的指導課程,有興趣的朋友可上我臉書或私訊我。
Grass Lin 2019-11-26 13:12:09
感謝
Pizfinfin Albert 2019-11-26 18:32:35
我也深深有感;程式語言是積木;是工具;怎麼用工具變出創意及藝術那就是真的需要天份+努力.
林志強 2019-11-27 10:55:44
川哥 滿足我對知識的渴望
全不選 發文排行