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

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

原文網址 石小川
2020-03-11 22:20:43

會用樹莓派直接控制四軸飛行器的飛控板理由是 : 你可以用一台筆電 + ROS(機器人作業系統)的資料鏈串連起來,就可指揮上百台無人飛行器做空中分列式,或幾百台水上無人艦艇跳芭蕾舞、、等等,當然前提是你要會寫些程式才行。 連接方式很簡單, 如圖綠色圈起來的就是Pixhawk通訊埠: 將飛控板Pixhawk上的Telem2接口四根線引出(其實就是UART): Telem2的5V接Pi的5V Telem2的TX接Pi的RX Telem2的RX接Pi的TX Telem2的GND接Pi的GND 這樣子筆電就可以和多個樹莓派通訊進而控制多個飛行器,當然中間還是有一言難盡的技術,再擇期說明。 軟體設定可參考下面教學,我就不重複了。 https://blog.csdn.net/liberatetheus/article/details/77968424 https://blog.csdn.net/Lin_QC/article/details/90373992?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task https://blog.csdn.net/weixin_42704669/article/details/83791117?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

林永仁
2020-03-14 21:46:38


原文網址 石小川
2020-03-07 18:57:10

當相同類型的程式時常使用或必須重複呼叫時,這時就是考慮將副程式加進程式庫的時候,我習慣將功能相同的函式放在一起製作專用的程式庫,例如處裡影像副程式放在TImage.dll、處裡語音副程式放在
TSpeech.dll、處裡神經網路程式放在TNeuron.dll、處裡光達程式放在TLidar.dll等等 , 一旦你的程式庫累計的夠多的話,將來設計APP應用程式就會如同貼圖一樣方便,只要呼叫程式庫就好,主程式變少了。 接下來Demo一個動態程式庫TSystem.dll,裡面函式是負責儲存使用者最後操作各個視窗元件位置及大小的資訊, 請一步步看圖解。 step1. 建立新的專案。 圖1 ? step2. 選 C#類別庫, 按下一步。 圖2 ? step3. 設定新的專案, 並按建立。 圖3 ? step4. 設計程式碼TSystem.cs。
//----------------------------------------------------------------------
//動態程式庫 TSystem.dll 範例
//---------------------------------------------------------------------- using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Drawing; namespaceTSystem
{
public class WindowPosition
{
//---------------------------------------------------------------------
public void WriteSystemInfo(string FileName, Point position)
{
BinaryWriter WriteFile = new BinaryWriter(File.Open(FileName,
FileMode.Create));
WriteFile.Write(position.X);
WriteFile.Write(position.Y);
WriteFile.Close();
} //------------------------------------------------------------------------
public Point ReadSystemInfo(string FileName)
{
if(!File.Exists(FileName))
return new Point(-1, -1);

BinaryReader ReadFile = new BinaryReader(File.Open(FileName,
FileMode.Open));
Point position = new Point(ReadFile.ReadInt32(),
ReadFile.ReadInt32());
ReadFile.Close();

return position;
} } //public class WindowPosition //-------------------------------------------------------------------------
public class WindowhSize
{
//---------------------------------------------------------------------
public void WriteSystemInfo(string FileName, Size size)
{
BinaryWriter WriteFile = new BinaryWriter(File.Open(FileName,
FileMode.Create)); //main form size
WriteFile.Write(size.Width);
WriteFile.Write(size.Height);
WriteFile.Close();
}

//------------------------------------------------------------------------
public Size ReadSystemInfo(string FileName)
{
if(!File.Exists(FileName))
return new Size(-1, -1);

BinaryReader ReadFile = new BinaryReader(File.Open(FileName,
FileMode.Open));
Size size = new Size(ReadFile.ReadInt32(), ReadFile.ReadInt32());
ReadFile.Close();

return size;
} } //public class WindowSize
} //namespace TSystem step5. 建置方案, 產生TSystem.dll。 圖4 ? step6. 產生的TSystem.dll的檔案及路徑。 圖5 ? step7. 主程式呼叫TSystem.dll, 需將產生的TSystem.dll加入參考。 圖6 ? step8. 主程式呼叫TSystem.dll( 關注//Note的地方即可 )。
//----------------------------------------------------------------------
//C# 主程式呼叫動態程式庫 TSystem.dll 範例
//----------------------------------------------------------------------
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using Emgu.Util;
using Emgu.CV.UI;
using Emgu.CV.BgSegm;
using Emgu.CV.VideoSurveillance; //Note
using TSystem;
using TCamera; //-----------------------------------------------------------------------------
namespace VT
{
public partial class MainForm : Form
{
//---------------------------------------------------------------------
public ToolboxForm CreateToolboxForm(Form parent, string text,
bool bshow = true)
{
ToolboxForm toolboxForm;
toolboxForm = new ToolboxForm();
toolboxForm.MdiParent = parent;
toolboxForm.Text = text; if(bshow)
toolboxForm.Show();

return toolboxForm;
}

//---------------------------------------------------------------------
public ImageXYForm CreateImageXYForm(Form parent, int number,
stringtext, bool bshow = true)
{
ImageXYForm imageForm;
imageForm = new ImageXYForm(number);
imageForm.MdiParent = parent;
imageForm.Text = text;

if(bshow)
imageForm.Show();

return imageForm;
}

//---------------------------------------------------------------------
public static MainForm _gmainForm = null;
public static ToolboxForm _gtoolboxForm = null;
public static ImageXYForm _gimageXYForm = null;

//Note
public WindowhSize _winSize = null;

//---------------------------------------------------------------------
//Main Program
//---------------------------------------------------------------------
public MainForm()
{
InitializeComponent();
}

//---------------------------------------------------------------------
private void MainForm_Load(objectsender, EventArgs e)
{
_gmainForm = this;

//Note
//讀取系統設定檔
_winSize = new WindowhSize();
Size size = _winSize.ReadSystemInfo(@"..\..\system\mainform.inf");
if(size.Width == -1 && size.Height == -1)
this.ClientSize = new Size(1200, 700);
else
this.ClientSize = new Size(size.Width, size.Height);

//修改mdi窗体背景色--------------------------------------------------------
MdiClient ctlMDI;

// Loop through all of the form's controls looking
foreach(Control ctl in this.Controls)
{
try
{
// Attempt to cast the control to type MdiClient.
ctlMDI = (MdiClient) ctl;

// Set the BackColor of the MdiClient control.
ctlMDI.BackColor = Color.LightGray; //this.BackColor; //Color.Blue;
}
catch(InvalidCastException)
{
// Catch and ignore the error if casting failed.
}
}

_gtoolboxForm = CreateToolboxForm(this, "工具箱");
_gimageXYForm = CreateImageXYForm(this, 0, "XY軸攝影機");
} //private void MainForm_Load(object sender, EventArgs e)

//--------------------------------------------------------------------- private void MainForm_FormClosed(object sender,
FormClosedEventArgs e)
{
//Note
_winSize.WriteSystemInfo(@"....\system\mainform.inf",
new Size(this.ClientSize.Width, this.ClientSize.Height));
}
} //public partial class MainForm : Form
} //namespace VT step9. 執行主程式成功。
圖7 ?


原文網址 石小川
2020-03-03 10:52:38

上課學員對 Visual Studio 2019 產生視窗程式不熟悉時可參考以下步驟,這套工具很實用也簡單,足夠你發展強大的應用程式,值得同學花時間駕馭它。 步驟1 如圖1, 建立新的專案。 步驟2 如圖2, 選Windows Forms App(.NET Framework) 項目,並按下一步鍵。 步驟3 如圖3, 設定新的專案,並按建立鍵。 步驟4 拖拉元件寫程式,請參考 使用Visual Studio 2019 產生一個視窗程式的簡單教學 - II 投影片說明(VS2019產生一個App.mht)。 圖4是程式WindowsFormsApp1執行的樣子。 Form1.cs 程式如下, 大部份程式碼是VS自動產生的, 我只寫兩行。 usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; usingSystem.Windows.Forms; namespaceWindowsFormsApp1 { public partial class Form1: Form { public Form1() { InitializeComponent(); } private voidbutton1_Click(objectsender, EventArgs e) { richTextBox1.Text = "OK"; //自已加上 } private voidbutton2_Click(objectsender, EventArgs e) { Close(); //自已加上 } } }


原文網址 石小川
2020-02-22 21:15:58

DM542 採用共陽接法, 如圖。

其中加了ULM2003達靈頓是因為Pi4輸出準位是3.3V, 無法推動DM542驅動器,故須加上當作緩衝器,一來調整準位至+5V, 另外為加大推動電流, 很多朋友沒成功就是這個原因。

測試程式是用Python寫的, 有兩種方式, 提供給朋友參考 :

Program 1是 Time sleep方式。

Program 2是PWM方式。

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

# Program 1: StepMotor_TIME.py

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

from time import sleep

import RPi.GPIO as gpio

PUL = 11

DIR = 12

ENA = 13

CW = 1

CCW = 0

gpio.setmode(gpio.BOARD)

gpio.setup(PUL, gpio.OUT)

gpio.setup(DIR, gpio.OUT)

gpio.setup(ENA, gpio.OUT)

gpio.output(ENA, gpio.HIGH)

# Main body of code

try:

gpio.output(ENA, gpio.LOW)

while True:

sleep(2)

gpio.output(DIR, CW)

for x in range(51200):

gpio.output(PUL, gpio.LOW)

sleep(0.00001)

gpio.output(PUL, gpio.HIGH)

sleep(0.00001)

sleep(2)

gpio.output(DIR,CCW)

for x in range(51200):

gpio.output(PUL, gpio.LOW)

sleep(0.00001)

gpio.output(PUL, gpio.HIGH)

sleep(0.00001)

except KeyboardInterrupt: # If there is a KeyboardInterrupt (when you press ctrl+c), exit the program and cleanup

print("Cleaning up!")

gpio.cleanup()

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

#Program 2: StepMotor_PWM.py

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

from time import sleep

import RPi.GPIO as gpio

PUL = 11

DIR = 12

ENA = 13

CW = 1

CCW = 0

gpio.setmode(gpio.BOARD)

gpio.setup(PUL, gpio.OUT)

gpio.setup(DIR, gpio.OUT)

gpio.setup(ENA, gpio.OUT)

gpio.output(ENA, gpio.HIGH)

pwm = gpio.PWM(PUL, 100000)

bDir = False

# Main body of code

try:

gpio.output(ENA, gpio.LOW)

pwm.start(50)

while True:

if bDir == True:

gpio.output(DIR, CW)

bDir = False

sleep(5)

else:

gpio.output(DIR, CCW)

bDir = True

sleep(5)

except KeyboardInterrupt: # If there is a KeyboardInterrupt (when you press ctrl+c), exit the program and cleanup

print("Cleaning up!")

gpio.cleanup()

DM542 採用共陽接法, 如圖。

其中加了ULM2003達靈頓是因為Pi4輸出準位是3.3V, 無法推動DM542驅動器,故須加上當作緩衝器,一來調整準位至+5V, 另外為加大推動電流, 很多朋友沒成功就是這個原因。

測試程式是用Python寫的, 有兩種方式, 提供給朋友參考 :

Program 1是 Time sleep方式。

Program 2是PWM方式。

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

# 程式1 : stepmotor _ time. Py

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

從時間進口睡眠

匯入rpi. Gpio作為gpio

泳池= 11

Dir = 12

ENA = 13

Cw = 1

Ccw = 0

Gpio. 設定模式(gpio). 年十二月()

Gpio. 設定(pul, gpio). 出局

Gpio. 設定(你, gpio). 出局

Gpio. 設定(ena, gpio). 出局

Gpio. 輸出(ena, gpio). 高(高)

# 主要程式碼

嘗試:

Gpio. 輸出(ena, gpio). 低)

雖然事實:

睡眠(2)

Gpio. 輸出(dir, cw)

X在範圍(51200):

Gpio. 輸出(pul, gpio). 低)

睡眠(0.00001)

Gpio. 輸出(pul, gpio). 高(高)

睡眠(0.00001)

睡眠(2)

Gpio. 輸出(dir, ccw)

X在範圍(51200):

Gpio. 輸出(pul, gpio). 低)

睡眠(0.00001)

Gpio. 輸出(pul, gpio). 高(高)

睡眠(0.00001)

除了鍵盤中斷如果有鍵盤中斷(當你按下ctrl+c), 退出程式並清理

列印("清理!")

Gpio. 清理()

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

# 項目2 : stepmotor _ pwm. Py

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

從時間進口睡眠

匯入rpi. Gpio作為gpio

泳池= 11

Dir = 12

ENA = 13

Cw = 1

Ccw = 0

Gpio. 設定模式(gpio). 年十二月()

Gpio. 設定(pul, gpio). 出局

Gpio. 設定(你, gpio). 出局

Gpio. 設定(ena, gpio). 出局

Gpio. 輸出(ena, gpio). 高(高)

Pwm = gpio. Pwm (pul, 100000)

Bdir =假

# 主要程式碼

嘗試:

Gpio. 輸出(ena, gpio). 低)

Pwm. 開始(50)

雖然事實:

如果bdir ==真的:

Gpio. 輸出(dir, cw)

Bdir =假

睡眠(5)

其他:

Gpio. 輸出(dir, ccw)

Bdir =真實

睡眠(5)

除了鍵盤中斷如果有鍵盤中斷(當你按下ctrl+c), 退出程式並清理

列印("清理!")

Gpio. 清理()

· 查看原文 · 為此翻譯評分


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

第三章 電控接線及設定
3. 1 電控元件佈局 將3個步進馬達驅動器及兩個電源供應器安裝在一個基板上(最好是鋁板或銅板 ,可接地抗雜訊),大小應符合4U工業機箱尺寸,圖3-1。 ?
3. 2 驅動器與步進馬達接法 如圖是步進馬達兩相四線接法。 p.s. 步進馬達2相4線,如果銘版沒說明 A+、A-、B+、B- 顏色,可用電表檢查一 歐姆值下即可判定,圖3-2。 ?
3. 3 DM542驅動器設定 每個不同型號的驅動器都有附上細分表,圖3-3所示 : ?
舉個例子,機台螺桿都是1605, 如果選128細分的話,如下計算 : @峰值電流設定4.2A即可: 所以指撥開關SW1 = off,SW2 = off,SW3 = off @ SW4是模式設定,一般設定off。 SW4 = off, Half current SW4 = on , Full current @馬達解析度= 1.8度 馬達轉一圈 = 360/1.8 = 200 步 假如128細分的話, 128 x 200 = 25600 Pulse/rev 所以指撥開關 SW5 = off,SW6 = off,SW7 = off,SW8 = on。 整理如下: SW1,SW2,SW3,SW4,SW5,SW6,SW7,SW8 off,off,off,off,off,off,off,on
3. 4 iMC3xx2E運動控制卡與驅動器差分接法 ,如圖3-4。 ?
其中運動卡A座信號是以一般常見的RJ45網路線連接驅動器,如圖3-5注意腳位。 ?
如圖3-6。 ?
RJ45腳位對映關係 : 1(橘白) -> 2 2 (橘) -> 1 3 (藍白)-> 4 4 (藍) -> x 5 (綠白)-> 6 6 (綠) -> 3 7 (棕白)-> 5 8 (棕) -> x
3. 5 iMC3xx2E運動控制卡連接電源和電腦網路線接法 GOut1 或 GOut2 接 24V IN, SGND(選任一組接線柱即可),圖3-7。 ?
3. 6 繼電器腳位說明 圖示RM16HLE-24V 繼電器外觀及腳位,圖3-8。 ? RM16HLE-24V 繼電器(Relay)模組工作電壓是24V, 常開接口最大負載是 AC : 250V/10A,DC : 30V/10A。 腳位說明如下: @模組控制端有19線接口。 (1) DC+ : +24V。 (2) DC- : GND。 (3) 光電隔離控制端參考地線。 If Hi 控制, XCOM 接 GND Lo 控制,XCOM 接 +24V 25 (4) X 1- X16 :繼電器控制接口。 如圖3-9。 If XCOM 接 GND,Xn : Hi/Low ,相應繼電器 On/Off XCOM 接 +24V,Xn : Low/Hi ,相應繼電器 On/Off @繼電器輸出端:有48線接口。 (1) NO1 - NO16:繼電器常開接口(NO)。 (2) COM1 - COM16:繼電器公用接口(COM)。 (3) NC1 - NC16:繼電器常閉接口(NC)。
? 3. 7 iMC3xx2E運動控制卡連接繼電器接法 如圖3-10。 繼電器 DC+、DC-分別接在電源供應器的+24C、GND。 運動卡GOUT1/XOut0 接繼電器 X1。 XCOM 接運動卡SGND。 ?


原文網址 石小川
2019-12-15 18:14:44

[開發機器人工具箱- G9 Toolkit v2.0]

這個板子是我設計用來開發機器人運算核心 - G9模組的開發板, G9模組採用的是ADI公司的高速DSP晶片, 多顆G9模組陣列可平行運算, 適合跑類神經網路演算法, 目前也用在AI產品上, 希望很快能跟大家見面, 介紹給大家^^

[G9 Module (G9 類神經網路晶片模組)]
CPU: ADI 高速DSP
size: 3.2cm x 3.2cm

這顆是我設計的第三代類神經網路晶片模組, 既是單晶片IO控制電腦, 也是高速數位訊號處理DSP電腦, 代號我取名G9, 內部有一顆高速DSP內核, 外部輸入電壓是DC5V,DSP內核工作電壓為DC3.3V,目前設定DSP工作頻率為400MHz。可實現語音、影像、類神經網路等演算法Real time的需求。現在我的專案是把它拿來Run自動導航及光學雷達, 機器人視覺聽覺等深度學習演算法用。

主要功能是語音/影像辨識及馬達控制, 開發軟體是C語言, 可跑類神經網路(ANN)及平行處裡運算, 目前只提供員工內部教育訓練及開發產品上, 將來開發手冊完備後再Release G9 Toolkit v2.0給有興趣研發的人士.

圖1. G9 Toolkit v2.0.
圖2. G9 Module.
圖3. G9 Module可接CMOS Sensor做影像辨識.

Eric Yang
2019-12-15 20:52:56

加一


原文網址 石小川
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-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 15:30:33

現今開發應用程式已經很少不用視窗當作人機介面(HMI)了,同樣的,如果沒有用圖控方式操作自動化設備的話,相信機器應該也很難賣得出去,就是因為圖控是很重要的一環,所以我特別在這一章節簡潔的介紹一個開發圖控介面不錯的工具 – PyQt5給讀者參考,慎選好的開發工具的確可以讓你省下不少寶貴的時間。 這裡會用一個實例讓讀者了解Python結合圖形視窗的設計流程,熟悉之後在設計儀表控制、機器自動控制等介面將不在是難事, 有興趣的讀者還可改成流行的拖放( drag and drop )圖控應用程式,投資自已學習這門工具是值得的,下面就一步步來實現。 3. 1 安裝 PyQt5 前面如果沒有安裝,現在趕快安裝,方法如下:
在Anaconda Prompt 視窗(Windows 命令提示字元)下先後輸入 pip install PyQt5
pip install PyQt5-tools 安裝完成後最好重開機,在路徑資料夾Anaconda3\Library\bin內會有個執行
檔案designer.exe,請拉到桌面方便使用(注意你的路徑及資料夾可能跟我的是不一樣),至此安裝結束, 接下來可以打開designer設計圖控介面了,如圖3-1所示,我們會用它來設計一個簡單的圖控介面,並展示如何用Python程式引用這個介面的相關知識。 3. 2 認識QT Designer
認識一下圖3-1 QT Designer視窗中4個紅字標註區域。 區域1是元件盒,裡面提供很多的元件控制項,每個項目的功能不同
,例如常用到的按鈕(Push Button)、單選紐(Radio Button)、及 標籤(Label)
、文字方塊(TextEdit)等,可以直接拖放到區域2主視窗中擺放,在區域3物件
指示器(Object Inspector)中可索引切換擺放在主視窗中不同的元件,利用屬性編輯器(Property Editor)對選中的元件編輯如寬度、高度、佈局、字型等屬性。 區域4是信號/信號槽編輯器,這是PyQt5非常重要的核心機制,當按紐按下後就會發射一個信號(signal),信號槽(slot)接收到這個對應的信號後就會處理這個事件。 Qt Designer 這一個視覺化的GUI設計工具,對程式設計師來說真的是一大福音,便利了許多, 有一點要提想讀者的是PyQt5在GPL協議是可以完全免費使用,但如果不打算開源準備應用於商業活動還是得付費。當然啦,熟悉了Designer UI設計後,一大票相似免費軟體等著你,不怕被綁架! 如果讀者想更深入了解Qt5及程式設計,可至Qt官網下載資料好好研究。
Qt 官網 : https://www.qt.io/download-qt-installer 3. 3 使用QT Designer 設計一個UI介面 步驟 1. 點擊下拉選單[檔案]新增一個新表單(圖3-2)。 圖 3-2 新建一個新表單。 步驟2. 選Widget 表單(圖3-3)。 圖 3-3 Widget表單。 步驟3. 拖放元件到表單(圖3-4)。 從元件盒拖放一個Label 及Push Button 到表單(Form)上(圖 3-4)。 可在物件指示器及屬性編輯器上修改元件名稱、屬性。 在此為了簡化問題,我就維持不變,讀者熟悉後可自已動手試試。 圖 3-4 設計表單。 步驟4. 編輯信號與信號槽。 要讓按鈕按下有作用,還需要將信號和槽關聯起來, 如圖3-5點擊工具列[編輯信號與信號槽] 圖 3-5 編輯信號與信號槽 步驟5. 關聯信號與信號槽。 滑鼠游標移到表單(Form)的元件按鈕(PushButton)處,左鍵按著不放移動到
表單可看到一個接地線,之後放開左鍵會彈跳出一個設定連線的視窗(圖3-6)。 圖3-6 關聯信號與信號槽 步驟6. 編輯信號槽事件函數。 選定 pushButton 發射信號是clicked(),之後點擊右邊Form下的編輯按鈕 (圖3-7)和(圖3-8)。 圖3-7 pushButton -> clicked() 步驟7. 新增信號槽事件函數。 按+新增一個自訂pushButton_click()事件函數()(圖3-8), 按OK鍵離開。 圖3-8 編輯信號槽 步驟8. UI設計完成。 自動跳回主視窗後可看到自建的UI成形了,不要忘記存檔,例如檔名myUI.ui (副檔名ui),要增加或修正UI也可開啟舊檔編輯,不需要從無到有再搞一 次,是不是挺方便的。 圖3-9 UI 步驟9. ui轉檔py。 Qt Designer 儲存的是.ui檔,結構類似XML格式,因為我們期望是要給Python引用,所以我們必須想辦法將.ui檔轉換成.py檔才行。 PyQt5提供一個命令列工具pyuic5可以很輕鬆地完成轉換工作,使用方式如下 :
pyuic5 source.ui -o destination.py 其中
-o : 是輸出参数,表示要產生一個文件 destination.py : 要產生.py格式的文件 source.ui : 由Qt Designer設計UI的.ui原始文件 舉個例子, 假設你設計出來的UI檔名是 myUI.ui,想轉檔成myUI.py格式
可以照著圖3-10這樣做,在相同路徑下會自動產生myUI.py檔。 如果你常用pyuic5,且對Python語法熟悉的話,建議可自已寫個簡單腳本,將上述命令列改成自動化執行,這個就留給讀者自已練習了。 圖3-10 透過pyuic5將.ui 轉換成.py 上述步驟雖多其實並不複雜,讀者還是要實際操作一次才會真正了解其中的奧義,UI美不美觀端看個人造詣,但設計的方法都是一樣的,多練習了。 緊接著下個單元會舉一個實例說明Python引用myUI.py的方法。 3. 4 Python 引用UI介面 新建一個程式碼myApp.py並繼承介面檔(myUI)的Ui_Form類別即可(打開
myUI.py 檔就可看到類別class Ui_Form)。 其中myUI.py介面檔必須放在myApp相同資料夾內,否則會錯誤。 程式碼執行如圖3-11,按一下PushButton會show出 "Hi this is my first
coding !!!",結果正如預期完全正確。myApp.py可當作一個樣板程式,讀者可慢慢擴增一些新功能,建議每加入一個功能最好就執行一次,沒問題了再增加,以免欲速則不達,將來花更多的時間debug,會抓到瘋,畢竟最複雜的程式也是從最基本的一磚一瓦造出來的,除非讀者寫程式功力深厚以及擁有的程式庫經過多年考驗沒問題,否則還是聽我的準沒錯。 myApp.py程式碼如下: - - coding: utf-8 - - import sys from PyQt5.QtWidgets import QMainWindow, Qapplication from myUI import Ui_Form #------------------------------------------------------------------------------ class MyWindow(QMainWindow, Ui_Form): def init (self, parent=None): super(MyWindow, self). init (parent) self.setupUi(self) #------------------------------------------------------------------------- def pushButton_click(self): self.label.setText("Hi this is my first coding !!!") #------------------------------------------------------------------------------ def main(): app = QApplication(sys.argv) myWin = MyWindow() myWin.show() sys.exit(app.exec_()) if name == ' main ': main() 圖3-11 myApp 程式碼及執行結果

陳必凱
2019-11-27 15:40:03

曾彥禮
2019-11-27 16:24:58

曾希哲
2019-11-27 19:40:06

有designer 寫起來跟Visual basic 一樣方便

林志強
2019-11-27 22:08:29

周英男
2019-11-27 23:22:18

好想學


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


 

全不選 發文排行