管理員
統計數據
原文網址 石小川 2020-02-26 10:00:41
光騰書齋三月份課程開始報名 持續招生中...........,隨時歡迎報名! 課程: Python CNC軸控軟/硬體設計班 課程內容: *CNC 軸控平台基本知識 *CNC 軸控平台電路、電機組裝 *Python 軸控軟體開發平台建立 *Python呼叫動態連結庫(DLL)控制步進馬達 及 I/O Port *剖析motion.py程式如何控制CNC雷射機台 此次開課目的是想引導有Python(或C#)基礎的朋友進入軟/硬體設計有趣的領域,學習後學員可自行用Python控制運動卡, 開發自動控制相關應用程式APP或CNC機台, 學員學習期間對軟/硬體設計方面有問題也可用Messenger或Email 聯繫我, 可線上指導。 此次開課也是採用遠距指導教學,上課方式以講義內容為主,採用一個月彈性遠距師徒制一對一教學,主要以messenger通信軟體互相聯繫,會按照進度傳指導教學資料給學員,學員不受時間限制,隨時可發問,老師會撥空回答問題。 p.s. 前一梯次沒上過的同學請把握這一次了。 開始上課日期: 2020/3/5(星期四) 註 . 確定要來上課的朋友請在此留言報名(B+),會用messenger主動聯絡您匯款,金額酌收NT$3500,並傳Quantum講義及程式給您。 Python人工智慧圖控 - 研習交流廳 : https://www.facebook.com/groups/523498395047153/?ref=bookmarks
Robert Chen 2020-02-26 12:06:49
教授,請問會組硬體嗎?
Robert Chen 2020-02-26 15:36:52
請問教授,會開G code転cnc程式及飛刀課?
Wilson Kao 2020-02-26 15:59:13
有人有紡織業瑕疵檢測紡織的經驗嗎? 謝謝
Robert Chen 2020-02-26 18:18:29
感謝教授
Claude Hsu 2020-02-27 17:27:48
請問要報名是留(B+)嗎?謝謝
Mini Lai 2020-02-27 18:59:03
B+
郭耀中 2020-03-02 11:31:47
Cian Cheng 2020-03-03 09:05:23
帳號多少?可以利用晚上嗎?
Cian Cheng 2020-03-03 13:11:05
+1
原文網址 石小川 2019-12-22 10:53:57
光學相位陣列雷達的好處是使用光的干涉原理研製, 不用機械掃描, 只用固態光電模組發射接收(T/R), 響應時間極短, 理論上超級電腦上線, 可同時追蹤並擊落空中256架飛行物游刃有餘, 在火炮射控及自動駕駛或機器人方面非常有潛力, 因為要讓光干涉轉大角度,有一些技術門檻需要克服, 目前各大公司將它視為機密積極研發相關技術.
我喜歡用簡單的東西加上演算法兜出功能複雜的產品, 我這裡是用現成的近紅外光(不可見光, 波長1550nm, 功率5mW)的半導體雷射陣列研製, 每個發射接收就是一個T/R模組, 模組可示任務需要增減, 此次總共用256個T/R模組組成陣列.
圖中的架構是我這次要實驗的外觀, 構造並不複雜, 主要是將OPA雷達的訊號透過WIFI傳輸到1公里外的電腦自動判讀及控制, 因為裡面是吃鋰電, 可傳很久...... 我希望商用規格的價格能down到NT$3000 - NT$6000, 這是我要努力的目標!
張傑富 2019-12-22 11:15:45
請問,光學相位陣列雷達主要是偵測什麼?有什麼應用? 謝謝。
原文網址 石小川 2019-12-06 13:12:42
今天看到其他社團在討論陀螺儀磁性干擾的問題,本來已經入定在寫程式了,終究手癢還是撩下去談談雷射陀螺儀。現代太空梭、戰鬥機甚至飛彈都早已經用這種裝置在輔助飛行,我嘗試用淺顯易懂的方式解說這個用途廣泛的光電裝置。 雷射陀螺儀是一種光的干涉原理製成的裝置,如圖所示。 簡要解釋一下原理: 雷射陀螺儀在轉一個角度時, 相同雷射光沿著順時針、逆時針的光行程差會產生干涉條紋( 建設性干涉、破壞性干涉與波長有關), 由辨識到的干涉條紋影像用單晶片電腦(MCU) 或數位信號處理器(DSP)套用公式就可計算出方位角(azimuth)、仰角(elevation)等有用的飛行姿態。 公式推導可參考一下。由干涉條紋的位移可反推目前飛機角速度和速度而且極其精準,邁克生干涉儀(Michelson interferometer)也是應用相同的原理製成。目前雷射頭和Sensor都很便宜了, 雷射陀螺儀完全沒有動的元件,對於光電有興趣的朋友也可自已研究一下,至於干涉條紋的辨識也是機器視覺的一部分,技術好壞牽涉到精準度。 符號說明: c : 光速 λ: 光的波長 v : 陀螺儀移動線速度 ω: 陀螺儀移動角速度 Δt: 光繞著ABCD所花費的總時間 ΔN: 干涉條紋位移 公式推導: @光沿著AB路徑行走所花費的時間是: tAB = √2R /(v/√2 + c) ------------(1) 因為v = Rω, 所以上式整理一下 tAB = 2R/(ωR+√2c) ------------(2) @光沿著AD路徑行走所花費的時間是: tAD = 2R/(√2c – ωR) ------------(3) @光沿著ABCD順時針、逆時針所花費的時間分別是: t逆時針 = 8R/(√2c -ωR) ------------(4) t順時針 = 8R/(√2c+ωR) ------------(5) @因此光繞著ABCD所花費的總時間Δt Δt = t順時針 – t逆時針 ------------(6) @使用二項式級數展開可得: Δt = 8R²ω/c² ------------(7) @因為正方形面積a = 2R², 所以可表示為: Δt = 4aω/c² ------------(8) @假設雷射光的週期 τ = λ/c, 則干涉條紋位移ΔN ΔN = Δt/τ ------------(9) ΔN = 4aω/c λ ------------(10)
原文網址 石小川 2019-11-29 14:25:02
@光騰書齋十二月份第一梯次軸控班課程表 課程: Python 軸控班 課程三小時內容: *軸控平台基本知識 *Python 軸控軟體開發平台建立 *Python 呼叫動態連結庫(DLL)控制步進馬達 及 I/O Port *剖析motion.py 程式實例如何控制雷射機台 此次開課目的是想引導有Python基礎的朋友進入智慧型機器有趣的領域,學習後學員可自行用Python控制運動卡,開發相關應用程式或智慧型機器。 學員學習後對軟硬體方面有問題也可用Messenger或Email 聯繫我, 可線上指導。 此次課程3小時,含講義,酌收費用NT$3500。 日期: 2019/12/7(星期六) A班. 下午 2:00 – 5:00 (適合對智慧型機器軟硬體開發有興趣者) @光騰書齋十二月份第一梯次硬體班課程表 課程: 軸控機電系統硬體班 課程內容: * 認識軸控零組件 * 機台設計 * 電控接線及設定 * 軟體驅動測試 * 機台調校 此次開課目的是 – 想引導對AI智慧型的機器開發有興趣的朋友,進入無人關燈工廠有趣的領域,學習課程結束後可自行設計機台及自組的能力,希望學員回去後可使用自已的平台,用Python軟體驗證成果。 學員學習後對軟硬體方面有問題也可用Messenger或Email 聯繫我, 可線上指導。 此次課程4小時,含講義,酌收費用NT$4000。 日期: 2019/12/8(星期日) B班. 下午 2:00 – 6:00 [註]. 確定要來上課的朋友看您選哪一班次(A/B),並在下面留言A/B, 我會主動用Messenger連絡您再通知匯款,並傳Quantum講義給您。 上課地點: 基隆
吳水豚 2019-12-03 13:16:38
大大強大~~~想報名大大課程...但基礎能力不夠,我應該預先看那些書或者資訊先來增強呢?
原文網址 石小川 2019-11-27 11:09:22
窮忙一陣子後今天終於可偷閒寫一下文章跟大家分享一下上回談的G-Code產生器了. 我用最簡單的CNC圓形切割來圖文解釋一下, 相信應該可以很快了解其中運作原理.
先解釋一下Entity名詞, Entity在CAD工程上是實體的意思, AutoCAD出圖後的元件我們稱為Entity, 如圓弧, 直線, 雲行線等皆是實體. 上回提過由DWG/DXF檔案 經過程式剖析分解後產生一連串Entity的資料, 如圖一, 是圓的Entity, 將它送入GCodeCircle(Entity) 函式就可很快地產生切圓的G-Code, 下面是GCodeCircle(Entity) C#版程式範例:
//------------------------------------------------------------------------- public string GCodeCircle(EntityRecord entityrecord) { string gCode = ""; Point3D center = new Point3D(entityrecord.Circle.Center.X, entityrecord.Circle.Center.Y, entityrecord.Circle.Center.Z); double radius = entityrecord.Circle.Radius; Point3D point = new Point3D(0, 0, 0); point.X = center.X + radius; point.Y = center.Y; gCode += "G00 X" + (point.X - center.X).ToString("#0.0000") + " " + "Y"+ (point.Y - center.Y).ToString("#0.0000") + " " + "Z5.0000"+ "\n"; //此段是為了說明已經簡化許多參數 gCode += "G01" + " " + "Z-1.0000"+ " " + "F200"+ "\n"; gCode += "G02" + " " + "I-"+ radius.ToString("#0.0000"); return gCode; }
圖二是產生的G-Code, 可直接送去機器做切割一個100mm的正圓.
另外之前有位朋友問我5軸聯動切向跟隨實作問題, 我列出部分程式碼給您參考一下, 基本上我大部分實作都是圓弧直線插補ArcLine()就可完成.
//--------------------------------------------------------------------------- //圓弧直線跟隨插補 //pos : Z軸直線運動位置 //axisNum = 3, 圓弧+直線運動軸數 X Y Z public boolArcLine(int startx, intstarty, int endx, intendy, int cx, intcy, int[] pos, int[] axis, int dir = 0, intaxisNum = 3, double acc = 10, doubletgvel = 100, double endvel = 0, doublefeedRate = 1.0, int wait = 1, intfifo = (int)FIFO_SEL.SEL_PFIFO1, boolbAbs = true) { int st; if(axisNum < 2 || axisNum > MAX_NAXIS) return false; //清空PFIFO st = IMC_Pkg.PKG_IMC_PFIFOclear(gHandle, fifo); if(st == 0) return false; //設置加速度和進給率 if(SetPFIFO(acc, feedRate, fifo) == false) return false; //映射軸 st = IMC_Pkg.PKG_IMC_AxisMap(gHandle, axis, axisNum, fifo); if(st == 0) return false; double dx,dy; dx = startx - cx; dy = starty - cy; double r1 = Math.Sqrt(dx * dx + dy * dy); dx = endx - cx; dy = endy - cy; double r2 = Math.Sqrt(dx * dx + dy * dy); //判斷, 如果起點到圓心距離r1 != 終點到圓心距離r2 表示圓弧軌跡不正確, 跳出不執行 if(r1 != r2) return false; //由當前位置移動到指定位置 if(bAbs) //絕對位置 st = IMC_Pkg.PKG_IMC_ArcLine_Pos(gHandle, endx, endy, cx, cy, dir, pos, axisNum - 2, tgvel, endvel, wait, fifo); //絕對位置 else st = IMC_Pkg.PKG_IMC_ArcLine_Dist(gHandle, endx, endy, cx, cy, dir, pos, axisNum - 2, tgvel, endvel, wait, fifo); //相對位置 if(st == 0) return false; return true; }
圖三是我執行雷射切割的機台, 雷射頭是5.5W藍光雷射, 下回再分享此G-Code雷射切割成果.
p.s. 在我的APP程式直接畫圖我是直接呼叫運動卡驅動CNC, 沒有經過G-Code產生器這道手續, 加快CNC處理速度, 除非是匯入DWG/DXF檔案才會呼叫G-Code 產生器。
鍾小生 2019-11-27 12:24:32
小聲問,那套App有試用版嗎?
原文網址 石小川 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-27 10:39:11
雙眼攝影機測距 I – 設備實體製作(像蛙鏡,就稱蛙鏡好了)
其實這個就是光學雷達(Lidar)的一種。在機器人視覺中模擬人眼雙目測距是最基本功夫,而且設備簡單只要兩個攝像頭加上演算法即可實現測距,沒有雷射輔助的話10公尺的誤差在1公分以內, 算是可接受範圍,精準度要看個人調校技巧了,加上雷射光或其他結構光輔助更可進一步將RGB影像加上深度資訊,換句話說就是上回談到的點雲圖了,這對機器人視覺來說太有用了。
在研讀聚合物(Polymer)時,對於壓克力的物理化學特性就深受其吸引,所以做產品或實驗時常拿壓克力練功。 因為壓克力有易碎特性,此次用CNC銑時參數調慢些, 轉速S6000, 進給F300, 每層下切0.5mm,成果還不錯只是慢了些花了兩個鐘頭,下次實驗再調快否則有點大材小用,對不起這台專門銑不銹鋼模具的機器。
圖示是實作的設備,兩個攝像頭(Camera x 2) + 一個雷射頭(Laser x 1),外加演算法,就這麼簡單! 至於雙眼測距原理就是上童軍課的三角測距法,下回 “雙眼攝影機測距 I I – 原理解析” 再來聊聊了^^
原文網址 石小川 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
川哥 滿足我對知識的渴望
原文網址 石小川 2019-11-26 11:24:33
(之前在其他社團分享過C#版本, 現在改用Python分享給社團好友。) 這個羅技飛行搖桿本來是用在一個從頭城出發要去一個遙遠地方的大台UAV,看到挑戰國內法令的罰款可能會罰到脫褲子, 所以只能收手不玩了, 天空不能玩了, 就換地上及海上囉, 於是把程式移植到CNC, 運作起來還蠻順手的, 像是 夾娃娃機, 其實不管是CNC軸控、太空船、飛機或機器人, Joystick程式是一樣的。 以前玩Apple-II時曾經用6502組合語言改寫地球保衛戰的電玩, 大意是太空衛星發射雷射光射向入侵地球的飛碟, 但不可以射到底下建築物否則扣分, 這個CNC Demo頗有幾分神似呢, 特別是雷射扳機打開發射時, 感覺還蠻爽的^^ 下面是控制搖桿程式庫TJoystick, 分享給社團好友參考一下, 須自行想辦法最佳化, 可很容易地加入自已的機台或UAV。 因為主程式很長, 所以只列出TJoystick程式庫, 主程式就不po了, 有興趣再私下討論了。 當然, 眾所皆知, Python在資料處理方面的確非常方便, 對科學家來說可以省下很多Coding 時間, 有機會再分享Python 在光學雷達(Lidar)及數位訊號處裡(DSP)的應用實例和程式碼。 p.s. Python在將來關燈工廠會佔有一席之地, 事實上在我專案計畫裡有個1024顆Xilinx FPGA迷你超級電腦是用Python當介面。 如果對Python自動控制有興趣的朋友可上我臉書或私訊我, 我有開些課程, 參考看看是否有幫助, 光騰臉書 : https://www.facebook.com/qmlab/ 。 #須先pip install pygame #引用搖桿模組 import pygame #------------------------------------------------------------------------------ #列舉搖桿的手柄動作型態 #------------------------------------------------------------------------------ class __JoystickDirectionType(): Center = 0 zUp = 1 zDown = 2 Up = 3 Right = 4 Down = 5 Left = 6 JoystickDirectionType = __JoystickDirectionType() #------------------------------------------------------------------------------ #搖桿控制類別 #------------------------------------------------------------------------------ class TJoystick: #------------------------------------------------------------------------ def __init__(self): self.joystickCount = 0 #搖桿數目 ,接了幾支搖桿。 self.numberButtons = 0 #按鍵數目 #串列 [ ] ,用來儲存搜尋到的搖桿名稱,一隻就一個名稱。 self.joysticks = [] self.pjoystick = None #指向選用的搖桿位址 #字典型態 { },用來儲存搖桿手柄三軸及按鍵的目前狀態。 self.Controls = { 'Trigger' : 0, # Button_0 'Axis-X' : 0, 'Axis-Y' : 0, 'Axis-Z' : 0, 'Hat-X' : 0, 'Hat-Y' : 0, 'Slider' : 0, 'Button-0' : 0, 'Button-1' : 0, 'Button-2' : 0, 'Button-3' : 0, 'Button-4' : 0, 'Button-5' : 0, 'Button-6' : 0, 'Button-7' : 0, 'Button-8' : 0, 'Button-9' : 0, 'Button-10' : 0, 'Button-11' : 0, 'Button-12' : 0 } #------------------------------------------------------------------------ #開啟搖桿設備 def Open(self): #顯示初始化設定 , 沒使用到, 但必須有這一項, 否則無法正常執行 #Console : error: video system not initialized訊息不用理會 pygame.display.init() #搖桿初始化設定 pygame.joystick.init() #取得幾隻搖桿 self.joystickCount = pygame.joystick.get_count() #print (self.joystickCount) #串列 [pointer, name, nameaxes, numbuttons, umhats], 用來暫存一個搖桿資訊。 joystick = [] #找到的搖桿名稱就放進joystick for i in range(self.joystickCount): pjoystick = pygame.joystick.Joystick(i) pjoystick.init() pygame.joystick.init() #暫存取得的一個搖桿資訊 [pointer, name, nameaxes, numbuttons, umhats] joystick.append(pjoystick) #pointer [0] joystick.append(pjoystick.get_name()) #name [1] joystick.append(pjoystick.get_numaxes()) #numaxes [2] joystick.append(pjoystick.get_numbuttons()) #numbuttons [3] joystick.append(pjoystick.get_numhats()) #numhats [4] #[pointer, name, nameaxes, numbuttons, umhats] self.joysticks.append(joystick) #指向第一個Joystick (因為只接一個搖桿) self.pjoystick = self.joysticks[0][0] self.numberButtons = pjoystick.get_numbuttons(); #取得按鍵數目 #假如沒接搖桿則傳回False if(self.joystickCount == 0): return False #正確傳回True return True #------------------------------------------------------------------------ #關閉搖桿設備 def Close(self): pygame.quit() #------------------------------------------------------------------------ #取得搖桿資訊 def JoystickInfo(self): return self.joysticks #------------------------------------------------------------------------ #取得搖桿目前所有狀態 def ControlsInfo(self): return self.Controls #------------------------------------------------------------------------ #取得搖桿目前Trigger鍵狀態 (同Button-0), 所有Button 壓下去 = 1, 放掉 = 0 def getTrigger(self): return self.Controls['Trigger'] #------------------------------------------------------------------------ #取得搖桿目前Button -0鍵狀態(同Trigger) def getButton0(self): return self.Controls['Button-0'] #------------------------------------------------------------------------ #取得搖桿目前Button -1鍵狀態 def getButton1(self): return self.Controls['Button-1'] #------------------------------------------------------------------------ #取得搖桿目前Button -2鍵狀態 def getButton2(self): return self.Controls['Button-2'] #------------------------------------------------------------------------ #取得搖桿目前Button -3鍵狀態 def getButton3(self): return self.Controls['Button-3'] #------------------------------------------------------------------------ #取得搖桿目前Button -4鍵狀態 def getButton4(self): return self.Controls['Button-4'] #------------------------------------------------------------------------ #取得搖桿目前Button -5鍵狀態 def getButton5(self): return self.Controls['Button-5'] #------------------------------------------------------------------------ #取得搖桿目前Button -6鍵狀態 def getButton6(self): return self.Controls['Button-6'] #------------------------------------------------------------------------ #取得搖桿目前Button -7鍵狀態 def getButton7(self): return self.Controls['Button-7'] #------------------------------------------------------------------------ #取得搖桿目前Button -8鍵狀態 def getButton8(self): return self.Controls['Button-8'] #------------------------------------------------------------------------ #取得搖桿目前Button -9鍵狀態 def getButton9(self): return self.Controls['Button-9'] #------------------------------------------------------------------------ #取得搖桿目前Button -10鍵狀態 def getButton10(self): return self.Controls['Button-10'] #------------------------------------------------------------------------ #取得搖桿目前Button -11鍵狀態 def getButton11(self): return self.Controls['Button-11'] #------------------------------------------------------------------------ #取得搖桿目前Button -12鍵狀態 def getButton12(self): return self.Controls['Button-12'] #------------------------------------------------------------------------ #取得搖桿目前Axis -X軸值 def getAxisX(self): return self.Controls['Axis-X'] #------------------------------------------------------------------------ #取得搖桿目前Axis -Y軸值 def getAxisY(self): return self.Controls['Axis-Y'] #------------------------------------------------------------------------ #取得搖桿目前Axis -Z軸值 def getAxisZ(self): return self.Controls['Axis-Z'] #------------------------------------------------------------------------ #取得搖桿目前Slider軸值 def getSlider(self): return self.Controls['Slider'] #------------------------------------------------------------------------ #取得搖桿目前Hat -X軸狀態 def getHatX(self): return self.Controls['Hat-X'] #------------------------------------------------------------------------ #取得搖桿目前Hat -Y軸值 def getHatY(self): return self.Controls['Hat-Y'] #------------------------------------------------------------------------ #同時取得搖桿目前Hat -X軸, Hat-Y軸值 def getHatXY(self): return self.Controls['Hat-X'], self.Controls['Hat-Y'] #------------------------------------------------------------------------ #輪循監聽搖桿所有狀態 , 此函數應該放在執行緒中執行 def poll(self): #取得搖桿事件並放入事件堆疊中 , 此函數必須放置此處 pygame.event.pump() #將偵測到的搖桿狀態儲存至字典self .Controls for i in range(self.numberButtons): self.Controls['Button-'+str(i)] = self.pjoystick.get_button(i) self.Controls['Axis-X'] = self.pjoystick.get_axis(0) self.Controls['Axis-Y'] = self.pjoystick.get_axis(1) self.Controls['Slider'] = self.pjoystick.get_axis(2) self.Controls['Axis-Z'] = self.pjoystick.get_axis(3) self.Controls['Hat-X'] = self.pjoystick.get_hat(0)[0] self.Controls['Hat-Y'] = self.pjoystick.get_hat(0)[1] self.Controls['Trigger'] = self.pjoystick.get_button(0)
Grass Lin 2019-11-26 13:20:29
原文網址 石小川 2019-11-25 15:35:25
前幾期上課同學請注意, 為了簡化教學, 老師不小心將下列粗黑體字程式刪除導致雷射無法正常開關, 請自行補上, 謝謝了^^ #------------------------------------------------------------------------ # In/out Process (輸入/輸出函數) #------------------------------------------------------------------------ #對輸出端口進行控制 #port :1-48 #data :1 ON, 0 OFF def Output(self, port, data): #訂正 ,前面版本沒有加上 #清空PFIFO st = IMC_Pkg.PFIFOclear(self.gHandle, self.FIFO) if(st == 0): return False #失敗回傳False #設置加速度和進給率 st = self.SetPFIFO(self.Acceleration, self.FeedRate, self.FIFO) if(st == False): return False st = IMC_Pkg.SetOut(self.gHandle, port, data, self.FIFO) if(st == 0): return False #失敗回傳False return True; #成功回傳True #------------------------------------------------------------------------ #開 /關雷射頭, bEnable: True ON, False OFF def Laser0(self, bEnable): port = 5 if(bEnable == True): #st = self.Output(5, 1) st = self.Output(port, 1) else: #st = self.Output(5, 0) st = self.Output(port, 0) return st #回傳狀態 翻譯年糕
全不選 發文排行