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

Python人工智慧圖控 - 研習交流廳 造訪社團 » USB

原文網址 石小川
2020-03-22 15:02:17

近期為了ROS(機器人作業系統)相關專案,於是想起了以前的小玩具 - ROVIO,塵封已久的路威機器人在倉庫找了許久,終於抓到這隻小烏龜了,檢查電池、發現零組件狀況不錯,可見保存很好,這個ROVIO機器人麻雀雖小卻五臟俱全,看看下面硬體規格就知道。分享給有興趣製作機器人的朋友做參考。 Rovio機器人主要特點: 內含麥克風及喇叭可以雙向語音交談 可以遙控攝影機頭上下移動 可以手機和電腦或者Pad遠程網路控制 可以自動充電 雷達偵測障礙 硬體規格: 是以三大電路板結合而成:
(1)主ARM 板
Main Processor —科宇KOI-MP802 蓋面
實際為華邦 W99702 內建mpeg壓縮 跑 WEB server ,rtsp , and 主機總控
制 "spook" media streaming server ( [Spook Live Video Streamer]
( http://www.litech.org/spook/ ) )
Clock frequency 200Mhz
Main Memory — 8MB RAM
USB ttl port 與電腦通訊 (以W99100DG實現,負責isp下載)
Audio chip WM8976
Web cam video chip OV7670
SPI FLASH(W25X16) 2MB
OS Open-source "eCos" (2)充電電路板:專用NiMH充電管理芯片LS2516,PWM恆流方式,
電流不詳,穩壓二極體用的是1N5822,估計>1A。 (3)驅動板 MCU:4路BJT H電橋,3個輪子用光柵反饋,攝像頭升降用
可變電阻反饋,紅外線訊號和主控板通過串口通訊。 自動導航電路以紅外線感應運算
充電基座會投射出紅外線導航點,車上再以紅外線感應器做幾何
定位.定位程式由專門晶片負責.再送出串口訊號回應給上位機定位訊息

海闊天
2020-03-22 15:42:03

這台夢幻超跑要賣多少錢啊?小川哥!

海闊天
2020-03-22 15:42:32

海闊天
2020-03-22 15:42:44

石小川
2020-03-22 17:31:46

2013年露天買的, 3000多台幣, 拿來解剖研究用! 哈哈!

詹俊英
2020-03-24 20:58:27


原文網址 石小川
2019-12-16 09:26:03

上回寫的程式版本是透過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); //Start
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-12-16 10:56:00


原文網址 石小川
2019-12-16 09:18:25

分享給想要了解Mach3及USB控制卡如何通訊的朋友參考,可進一步修改成Python版本。

Mach3 USB程式是以HID裝置類型通訊協定作為溝通管道, 因為現在Windows 作業系統都有內建支援HID裝置的驅動程式, 所以焦點只要設計PC應用程式即可, 省掉很多麻煩事情.

如果用抓封包工具程式(Wireshark 或 Bus Hound)觀察Mach3 USB封包可得知, HID報告描述元(Report)的每次輸入/輸出資料交易是以61個位元組(Byte)為單位送出或接收, 只要解析這些位元組即可直接控制USB Mach3 CNC運動控制卡, 不須Mach3介入, 這樣做的好處是可以自已設計一些人工智慧演算法(例如影像辨識)去直接控制CNC機台做自動光學檢測(AOI), 或改裝CNC成機器手等. 當然有些非Mach3 CNC控制卡廠商有推出API開發包, 應用程式直接呼叫API就更方便了, 這樣就不需要了解煩人的底層封包問題, 不過這篇是要分享給想設計類似Mach3程式或製作USB Mach3 CNC運動控制卡的人參考, 由於資料太多, 不想洗板, 我就列出部分範例提供參考。

我的CNC機器裝置配備是USB Mach3 CNC六軸連動控制卡, 螺桿Pitch=5mm, 步進驅動128細分.

解析後的封包資料如下:
基本上Reset , M code, G Code都要解碼.

(A)繼電器控制
M204/M205碼我是規劃成繼電器控制警示燈
M204 Code(Output 7 ON) :
public string[] Output = { "02 06 58 00 09 20 00 00 f0 f7 19 00 97 b1 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 00 00 00 00 1c f8 19 00 0c f8 19 00 10 80 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 1c f8 19 00 00" };

M205 Code(Output 7 OFF) :
public string[] Output = { "02 06 58 00 09 00 00 00 f0 f7 19 00 97 b1 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 00 00 00 00 1c f8 19 00 0c f8 19 00 10 80 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 1c f8 19 00 00" };

p.s. 標註的02 06 58 是M控制碼, 09 20/09 00 是On/Off作動參數.

(B)步進馬達控制
G0 Xn Code :
public string[][] G0X = {
//G0 X0
new string[]
{"02 0e 55 e6 ff 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 06 df 59 77 34 ef 55 77 f8 5b 38 a0 00 00 00 00 00 c0 2c 00 ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00",
"02 0e 55 b4 ff 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 06 df 59 77 34 ef 55 77 f8 5b 38 a0 00 00 00 00 00 c0 2c 00 ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00",
.
.
};

p.s. 標註的02 0e 55 是G0控制碼, e6 ff/b4 ff 是馬達脈衝參數.

另外值得一提的是Mach3步進馬達的脈衝控制是以圖中(G0 X5)所示的方式控制, 只要遵照斜率及內插數值就可組合出想要馬達移動的距離及速度了, 如果是六軸連動當然更複雜了!

沒圖沒真相, 最後簡單的寫了一個小程式Demo一下, 有興趣的朋友可參考一下囉!


原文網址 石小川
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-12-15 17:44:44

對於Linux工程師來說內嵌系統交叉編譯環境的建立較複雜, 手動編譯起來時常是一個噩夢, 其實只要資料完備不會很困難, 下面我把一些講義分享出來給有需要的好友參考一下, 期望可以少走一些冤枉路! 我PC的Linux作業系統版本是Fedora 20-i386, Embedded system 是ARM11板子的內嵌系統, 我在PC開發的程式是Qt5.4.1, opencv是3.1.0, PC開發環境下寫好的程式再移植到ARM11板子上, 可正常運作, 沒圖沒真相, 如圖程式是usb camera程式, 可顯示JPG照片及動態顯示攝影機視訊! 由於QT 及 OpenCV arm-linux交叉編譯比較冗長, 我再另闢專欄解說, 這之前我先列出交叉編譯需要用到的一些程式庫的編譯詳細步驟, 有不清楚的地方也可跟我討論一下! //-------------------------------------------------------------------------------
Linux交叉編譯環境建立 講義 交叉編譯(Cross compiler)是在一種處理器架構平台上(如PC-x86架構,此稱PC平台)編譯連結成另一個處理器架構平台(如ARM架構,此稱Target平台)所能執行程式的工具軟體。 A. PC-x86平台環境建立步驟
(1)Install Fedora 20
Download Linux OS,版本為Fedora20-i386-DVD.iso,燒寫
至光碟片,然後安裝作業系統到PC。
先更新作業系統。
yum update -y (2)Install Fedora 20相關工具軟體
yum install –y filezilla putty cmake cmake-gui gcc gcc-c++
yum install –y automake libtool tslib (3)Install arm-linux-gcc
(3-1)解壓縮arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz
執行Fedora 20>>終端機程式,輸入:
tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz –C /opt/,解壓縮將arm-linux-gcc-4.5.1安裝到/opt/FriendlyARM/toolschain/4.5.1。
p.s. 路徑一定要放在此(/opt/),不能更改,否則會錯誤。
(3-2)將arm-linux-gcc的路徑加到系統環境變數中
method 1. 修改檔案.bashrc(個人環境)
用vi 編輯 /root/.bashrc
最後一行加上:
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin
儲存後OS重新登錄User即可作用。
method 2. 修改檔案 /etc/profile(全域環境)
最後一行加上:
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin
儲存後須重新開機始可作用。
(3-3)在終端機輸入arm-linux-gcc –v,如果有gcc相關資訊顯示出來表示設定成功。 (4)交叉編譯相關程式庫
如果沒用到可選擇跳過不安裝,詳細交叉編譯方法請看附錄A。
(4-1)交叉編譯tslib
觸控面板驅動函式庫。
(4-2)交叉編譯ffmpeg
影片播放與轉檔函式庫。
(4-3)交叉編譯gtk
圖形介面開發套件。
(4-4)交叉編譯jpeg
Jpeg功能函式庫。
(4-5)交叉編譯png
Png功能函式庫。
(4-6)交叉編譯x264
X264編碼器函式庫。
(4-7)交叉編譯yasm
編譯ffmpeg時可指定用yasm指令編譯,提高編譯速度。
(4-8)交叉編譯zlib
資料壓縮函式庫。
(4-9)交叉編譯qt5.4.1
跨平台的c++應用程式開發工具。 (5)Install Qt Creator
到Qt官方網站:
https://www.qt.io/download-open-source/#section-2
選擇下載Qt Online Installer for Linux 32-bit 線上安裝Qt Creator相關程式。安裝程式會自動安裝PC平台的Qt,至於Target平台的Qt必須手動交叉編譯來安裝。
(為求系統穩定,盡量以Qt 5.4.1為開發版本。) (6)Install Opecv
到Opencv官方網站:
http://opencv.org/downloads.html
選擇下載Opencv-3.1.0.zip 附錄A
A-1. 交叉編譯tslib
功能: 觸控面板驅動函式庫。
在終端機按照步驟輸入指令如下:
(1)git clone https://github.com/kergoth/tslib
//download tslib source code
(2) cp /root/tslib /opt/ -r
//copy /root/tslib to /opt
(3)cd /opt/tslib
//change dir to /tslib
(4)./autogen.sh
//執行安裝腳本
(5) ./configure CC=arm-linux-gcc CXX=CC=arm-linux-g++ --prefix=/opt/tslib-arm --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
//配置tslib
(5) make
//產生makefile
(6) make install
//編譯完成後函示庫自動安裝到 /opt/tslib-arm A-2. 交叉編譯zlib
功能: 提共資料壓縮之用的函式庫。
在終端機按照步驟輸入指令如下:
(1) download and copy zlib-1.2.8 to /opt
(2) cd /opt/ zlib-1.2.8
(3) CC=arm-linux-gcc ./configure --prefix=/opt/zlib-arm
(4) make
(5) make install A-3. 交叉編譯jpeg
功能: jpeg函式庫。
在終端機按照步驟輸入指令如下:
(1) download and copy jpeg-9 to /opt
(2) cd /opt/ jpeg-9
(3) CC=arm-linux-gcc ./configure --prefix=/opt/jpeg9-arm -- host=arm-linux
(4) make
(5) make install A-3. 交叉編譯png
功能: png函式庫。
在終端機按照步驟輸入指令如下:
(1) download and copy libpng-1.6.23 to /opt
(2) cd /opt/ libpng-1.6.23
(3) ./configure CC=arm-linux-gcc --prefix=/opt/png-arm -- host=arm-linux
(4) make
(5) make install A-4. 交叉編譯yasm
功能: yasm指令可提高編譯ffmpeg速度。
在終端機按照步驟輸入指令如下:
(1)download and copy yasm-1.3.0 to /opt
(2)cd /opt/ yasm-1.3.0
(3)./configure CC=arm-linux-gcc --prefix=/opt/yasm-arm --host=arm-linux
(4)make
(5)make install A-5. 交叉編譯x264
功能: x264編碼器函式庫。
在終端機按照步驟輸入指令如下:
(1)download and copy x264-snapshot-20160220-2245-stable to /opt
(2)cd /opt/x264-snapshot-20160220-2245-stable
(3)./configure CC=arm-linux-gcc --enable-shared --host=arm-linux --disable-asm --prefix=/opt/x264-arm
(4)make
(5)make install A-6. 交叉編譯ffmpeg
功能: 影片播放與轉檔函式庫。
在終端機按照步驟輸入指令如下:
(1) download and copy ffmpeg-3.1.1 to /opt
(或直接下載: git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg)
(2)cd /opt/ ffmpeg-3.1.1
(3)./configure --enable-cross-compile --cc=arm-linux-gcc --arch=arm --target-os=linux --enable-shared --enable-gpl --disable-stripping --enable-pthreads --enable-small --disable-parsers --disable-optimizations --disable-yasm --disable-armv6 --disable-static --disable-amd3dnow --prefix=/opt/ffmpeg-arm
(4)make
(5)make install

Jade Yang
2019-12-15 18:43:39

林永仁
2019-12-16 09:09:29


原文網址 石小川
2019-12-05 07:55:30

接專案之餘我們也順便賣運動卡, 我們賣的是商品+知識。 現在介紹一款CNC六軸運動控制卡給喜歡自已寫控制程式的人參考。 IMC3062E 運動卡簡介: 我用的的是八軸及六軸聯動運動卡, 介面是採用RJ45網路線傳輸控制碼到機台, 以六軸卡來說內有68個輸入/ 40個輸出, 足夠一般機器使用, 在PC也是用ethernet 與運動卡通訊, 好處是防雜訊比USB好很多, 而且網路線可拉很長很長, 只要你網路可通的話! 我的重點是廠商有提供完整的API函數庫(VB, VC++, VC#, QT)讓你控制CNC所有功能, 包括網卡搜尋, 六軸運動, I/O狀態, 圓弧直線插補, 族繁不及備載, 該有的應該都有了, 端看你要如何應用, 我打算用跑Linux 的ARM板做脫機, 我這裡有一些相關pdf資料, 如果有興趣的人可提問. 程式控制很簡單, 以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);
} //--------------------------------------------------------------------- p.s. 詳細的iMC3062E規格可留言向我索取或解答, 謝謝了。
https://goods.ruten.com.tw/item/show?21925786070681


原文網址 石小川
2019-12-05 07:42:33

此種工業相機可用程式控制內部一些參數,對於機器視覺有興趣的朋友可以參考一下此套件。 技術提示 : 值得一提的是此款工業相機是可以自已寫程式控制參數的, 例如圖像尺寸(ROI)、拍照、曝光時間、GAMMA、對比差、亮度、自定義LUT、鏡頭翻轉、RGB顏色增益、飽和度、銳度、彩色轉黑白、色溫校正、反色、9組十字線位置和顏色、觸發模式、幀率控制,有附SDK及C#、C++ Builder、Delphi、labView、QT5、VB、VC等範例可參考,對於喜歡寫自動控制程式的人來說非常方便。 鏡頭及相機可拆賣, 有(A)、(B)、(C)三個套餐可選,下標後請註明套餐並自行修改金額即可, 謝謝惠顧! (A). 工業相機usb高清300萬像素 支持Halcon 工業摄像頭機器視覺相機送SDK + 高清2.8-12mm300萬像素手動光圈鏡頭無畸變可 調視覺工業檢测镜頭 - NT$4100 (B). USB高清300萬像素工業相機機器視覺相機送SDK – NT$2500 (C). 高清2.8-12mm300萬像素手動光圈鏡頭無畸變可調視覺工業檢测镜頭 – NT$1600 https://goods.ruten.com.tw/item/show?21925793582980

Wilson Kao
2020-02-26 16:05:59

這個可以用在紡織業瑕疵檢測?


原文網址 石小川
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

川哥
滿足我對知識的渴望


 

全不選 發文排行