2023年4月11日 星期二

Grbl controller For ESP32

在之前的文章中Arduino應用之3D印表機改裝成繪圖機是利用 Arduino Mega2560自己去寫控制步進馬達的部分, 最近看網路文章發現有神人把Grbl(Grbl是一款針對Arduino/AVR328晶片的嵌入式G代碼編譯和運動控制器。)放進ESP32裡面, 所以就來試試!! 網路Git連結Grbl_ESP32, 詳細說明如下連結Grbl_Esp32 Wiki介紹得很清楚!!

圖一:運作流程圖

圖二:UGS 操作畫面





2023年3月28日 星期二

Rohde&Schwarz FSV Signal Analyzer control by C#

在之前文章 OTA天線測試系統中, 用到R&S的FSV Signal Analyzer. 最近又要開始OTA的場型測試所以就用C#寫一個比較容易控制的介面如下圖

圖一: SA控制介面

在設計控制儀器界面的時候, 大家必須先將其使用手冊研讀清楚. 能夠自己手動操作出結果就能夠用自動控制的方式呈現這點非常重要. 再來就必須將remote control 的指令寫入介面的控制裡面.

控制介面分為三部分: 連接, 設定儀器和讀取資料, 這樣的設計對Spectrum Analyzer 來說應該都適用

圖二: 操作示範圖
圖三: SA實際畫面

實作影片 






2023年3月16日 星期四

可編程交流電源供應器61502之C#應用

PROGRAMMABLE AC POWER SOURCE MODEL 61502 From C# GUI Application

61502 可提供強大的使用功能,如電網干擾模擬,可編程輸出阻抗,QUAN方位的測量功能,合成波形與IEC標準測試軟件。因擁有以上特點使得61500系列適合應用于一般商業產品,電力電子,航空電子設備,軍事與IEC標準測試的開發和運用,并且從實驗桌上測試到大量生產單位皆可適用。
61502 提供用戶不同容量的單相輸出產品,從 500VA到4000VA。不論是在研發設計,產品驗證或量產測試等
61502系列產品使用的脈寬調變技術,使其能輸出多達6倍最大額定電流峰值的能力,使得61502系列成為測試浪涌電流的最佳選擇。
不僅提供純交流電壓應用,AC+DC模式還擴展功能提供直流偏移電壓的應用。61502系列運用先進的數字訊號處理技術(DSP),能夠提供高精度和瞬時電壓波形測量,如電壓均方根值,電流均方根值,實功率,功率因子,電流波峰因子以及量測多達40次的電流諧波成份。

因應上述測試需求規劃測試GUI
圖一: 測試設定畫面
圖二:測試主畫面


2023年3月13日 星期一

c# ping application

Ping 是 dos cmd 網絡實用程式,將訊號透過網絡傳送至另一部電腦,然後另一部電腦再將其訊號傳回。 這種訊號以毫秒(ms) 為量度單位,讓你知悉將數據封包由電腦傳輸至互聯網伺服器後再傳回所需的時間。 此量度值是指電腦與其伺服器之間的延遲。
在這一篇文章中  WIFI RvO TEST TOOL FROM C# 用到了ping的功能去察看跟DUT_AP的連線情況
圖一: Ping Function

public bool Ping(string nameOrAddress, string timeout)
    {
        bool pingable = false;
        int pingcnt = 0;

        try
        {
            string pingrst;
            Process p = new Process();
            p.StartInfo.FileName = "C:\\Windows\\System32\\cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.StandardInput.WriteLine("ping -n 6 " + nameOrAddress + " -w " + timeout);
            p.StandardInput.WriteLine("exit");

            CommonData.pFindStr.Source = p.StandardOutput.ReadToEnd();

            if (CommonData.pFindStr.Source.IndexOf("TTL=") != -1)
            {
                pingcnt = SubstringCount(CommonData.pFindStr.Source, "TTL=");
                if (pingcnt > 2)
                {
                    CommonData.WriteMessage(CommonData.richtextbox, DateTime.Now.ToString() + CommonData.pFindStr.Source, "", Color.Blue, Color.Green);
                    pingrst = "連接";
                    CommonData.WriteMessage(CommonData.richtextbox, pingrst, pingcnt.ToString(), Color.Blue, Color.Green);
                    pingable = true;
                }
            }
            else if (CommonData.pFindStr.Source.IndexOf("Destination host unreachable.") != -1 || CommonData.pFindStr.Source.IndexOf("一般失敗") != -1)
            {
                //一般失敗
                this.GridData.WriteMessage(this.GridData._TPars.richtextbox, DateTime.Now.ToString() + CommonData.pFindStr.Source, "", Color.Blue, Color.Green);
                pingrst = "無法到達目的主機";
                this.GridData.WriteMessage(this.GridData._TPars.richtextbox, pingrst, "", Color.Blue, Color.Green);
            }
            else if (CommonData.pFindStr.Source.IndexOf("Request timed out.") != -1 || CommonData.pFindStr.Source.IndexOf("要求等候逾時") != -1)
            {
                //要求等候逾時
                this.GridData.WriteMessage(this.GridData._TPars.richtextbox, DateTime.Now.ToString() + CommonData.pFindStr.Source, "", Color.Blue, Color.Green);
                pingrst = "超時";
                this.GridData.WriteMessage(this.GridData._TPars.richtextbox, pingrst, "", Color.Blue, Color.Green);
            }
            else if (CommonData.pFindStr.Source.IndexOf("Unknown host") != -1)
            {
                this.GridData.WriteMessage(this.GridData._TPars.richtextbox, DateTime.Now.ToString() + CommonData.pFindStr.Source, "", Color.Blue, Color.Green);
                pingrst = "無法解析主機";
                this.GridData.WriteMessage(this.GridData._TPars.richtextbox, pingrst, "", Color.Blue, Color.Green);
            }
            p.Close();
        }
        catch (Exception e)
        {
            CommonData.WriteMessage(CommonData.richtextbox, e.Message, "", Color.Red, Color.Green);
        }
        return pingable;
    }