文章

顯示從 2018 起發佈的文章

[應用] USB host 轉換到 RS-232 的解決方案

圖片
        最近遇上一個問題,工業儀器設備越來越多採用USB介面取代RS-232,造成原本RS-232設備無法對接。就介面標準來看,在工業使用上 RS-232 是點對點的通訊協定,沒有主從分別的傳輸介面,傳輸距離數十公尺遠,如果再轉成 RS-485 傳輸距離更遠。相對於USB,具有主從架構的傳輸介面,因為來自電腦介面的標準,傳輸線距離僅數公尺遠。然而,坊間看到的 USB To RS232 轉換線只是 USB slave,必須接到電腦 (USB host),這種傳輸線無法直接接 USB儀器 (USB slave),所以我先要找到一個 USB host 轉換中介,再寫一個轉換程式後,才能把 USB儀器的數據轉到 RS-232 設備上。         目前找到的 USB host 開發平台有 FTDI VNC2 和 樹莓派 ...等方法,FTDI VNC2具有 USB host 接口功能,就像小型嵌入式系統,兼具體積小的特點,不過我們必須用 FTDI 專用的 IDE 來開發程式。而樹莓派本身就是一個以 Linux 為核心的操作平台,猶如一台小型電腦,可直接在上面以 C++ 語言來開發轉換程式,相較來說比較便利。底下我採用樹莓派的轉換方案,圖一是設備之間的方塊圖,中間以樹莓派系統當作轉換的中介,圖右邊的USB工業儀器接到樹莓派之後,樹莓派的操作系統便能辨識出 USB 裝置當作一個 ttyUSB 串口,我們開發一個轉換程式將從這個串口接收到的數據轉傳到圖左邊的串口。網路上有很多 ttyUSB 串口傳輸的程式,可以下載研究看看,圖三是我程式開發的流程圖。 圖一:解決方案方塊圖 圖二:實際操作的照片 圖三:程式設計的流程圖 int main(int argc, char **argv) { int i; char outBuf[32]; pthread_t threads[4]; memset( Buffer, 0 , sizeof(Buffer) ); for(i = 0; i < 4; i++) { usbPort[i] = fd[i] = -1; threads[i] = -1; idx[i] = 0; pthread_create(&

[應用] 中文語音合成+語音辨識 以百度的AI開放平台 in Python 開發

圖片
語音技術介紹         語音合成 (Text-To-Speech) 和語音辨識 (Speech Recognition) 的技術存在數十年,不過近年來將這語音的技術應用在蘋果的Siri和亞馬遜的echo設備裡。對開發者而言,語音技術最麻煩的是各種語言、不特定人的字庫辭庫訓練,光要建立這龐大且精準的訓練庫就不是短時間能完成的。最近,發現百度(Baidu)提供 中文 語音合成和語音辨識的服務,網站如下: AI開放平台 ,裡面不只有語音技術服務,還有其他技術。調用百度各項技術的SDK,建立網路連結後,連上AI開放平台,便能取得合成的結果或者辨識的結果。另外,SDK也有提供各種程式語法的範例,如:Java、C++、C#、Python、Node.js ... 等等,以滿足各類程式開發者的需求。底下我以Python語法為例,開發一個中文語音合成+語音辨識的測試程式。 合成技術的開發         在語音合成的過程,我們輸入中文字,如果調用成功,百度平台會返回一個語音binary,這時我們再儲存成wave file或者mp3格式,然後撥放這個音檔。語音辨識的使用正好相反,我們必須提供一個wave file傳給百度平台,如果成功,它會返回辨識的結果。因此,在python開發時,我們需要能錄音和播放音檔的模組,稱為pyaudio,安裝這個模組的方式如下圖所示。安裝後,還需要安裝百度的模組,透過 pip 方式安裝,"pip install baidu-aip"。 圖一:安裝 pyaudio 模組         使用百度的開放平台之前,需要註冊一個百度帳號,然後在這帳號裡創建一個應用,如圖二所示,在這應用裡面我們可自行選擇想要載入的技術。下圖的MySpeechTest是我所創建的一個語音應用,這個應用選用了百度的語音合成和語音識別。一旦創建,在這個欄位上會出現三個參數:AppID、API Key和Secret Key數值,之後調用SDK,我們需要使用這三個參數。 圖二:註冊一個百度的應用連結         圖三是以python語法所開發的語音合成和語音識別,圖的右半邊為python源代碼,圖的左半邊為合成與測試辨識的結果,我分別將上傳百度並取得合成音檔所花費的時間記錄下來,還有上傳音檔並且辨識過程需要花多少

[筆記] Raspberry Pi 樹莓派的 I/O 介面開發 in Python

圖片
         前面文章 使用C語言控制樹莓派的周邊介面,需要安裝WringPi的介面函式庫。同樣地,使用Python語言也需要一套介面函式庫,稱為 smbus 。樹莓派上的介面,如:I2C、SPI...必須借用smbus函式庫接口來控制這些通訊介面,參考底下的連結,有詳細的說明與使用。 RPi.GPIO Library Raspberry Pi 硬體控制 Using I2C LCD on Raspberry Pi         樹莓派3B+上面的操作系統已經內建smbus函式庫了,當我把I2C LCM1602模組接上後,在命令列輸入sudo i2cdetect -y 1,工具便能搜尋到模組的位址在0x27,表示smbus已經成功在系統內了。接下來,繼續用Python來開發LCM模組的控制,如下圖所示。 圖一:LCM1602 in Python

[筆記] Raspberry Pi 樹莓派的 I/O 介面開發 in C

圖片
#  TFT LCD 顯示控制 (以 Arduino 和 Raspberry Pi 為例) #  Visual Studio 2019 遠端連接到 Raspberry Pi 的執行與除錯         雖然樹莓派3.0就像一台小型電腦,已經內建USB埠口和網路通訊,但是有些感測模組需要靠專屬的通訊介面才能連接,無法直接使用USB方式通訊。我們發現樹莓派板子上有一排針腳,上面提供電源(3.3V和5V)、GPIO、UART、I2C、SPI...等常用的通訊介面,以方便開發者連接其他模組,因此樹莓派也可視為類似微控制器的電腦。         這個介面上的程式開發如前 文章 所說,我們可以用C/C++語言或者內建的Python語言來設計,不過如果採用C語法來開發,那麼必須先下載一套函式庫,稱為 WiringPi ,它提供介面函數接口,讓我們方便操作控制這周邊的通訊介面。底下的連結提供詳細的下載 、 安裝 、重新編譯和使用 說明。 樹莓派周邊介面的函式庫 Wiring Pi 使用WiringPi 控制GPIO << LCM顯示的例子>>         從GitHub上面找一些樹莓派相關的開發程式,其中LCM1602是一個以I2C為通訊介面的LCM模組。我們下載這個範例程式到自己的樹莓派板子上測試,首先打開樹莓派I/O設定視窗,如圖一所示。圖中的I2C介面要設為啟用,這樣LCM模組才能正常運行。 圖一:樹莓派I/O介面開關         接下來,在Geany IDE創建一個新專案,把程式碼放到專案目錄裡,如圖二所示。程式測試的過程打算讓LCM螢幕每隔一秒顯示計數,並且將數值加一。另外,GPIO介面控制的LED燈號也會每秒閃爍一次。執行這個程式後,影片如下。         由於介面的控制都是調用wiringPi的函式庫,在編譯時,我們必須載入相關的library,否則會編譯錯誤。在編譯的參數設定,要加入 -lwiringPi -lwiringPiDev 這兩個外部函式庫。如果沒有找到這兩個函式庫 (wiringPi和wiringPiDev),代表下載了wiringPi源代碼卻沒有在這個樹莓派板子上重編wiringPi,只要參考網路連結的說明,重編後就會產生函式庫了。 圖二:LCM1602

[筆記] Raspberry Pi 樹莓派的軟體開發

圖片
前言         本文的實驗過程是以樹莓派 3B+ 為主,Python是樹莓派板子上的操作系統所提供的程式語言,並且板子上的I/O介面控制官方建議用Python語法開發。因此,在樹莓派上寫程式的第一首選當然是Python,我們可以使用系統上內建的 Python 3 IDLE 或 Thonny Python IDE 的整合開發套件。雖然它是推薦的語法,不過樹莓派系統也可以使用 C/C++ 語言來開發程式,而且也內建一套IDE套件。底下就用簡單的程式碼來試試看這些開發套件。 C/C++開發         樹莓派官方的系統提供一套IDE軟體開發套件,稱為 Geany 。它可以編輯C/C++/Java/Python...等語法,並且編譯組建成執行檔,在樹莓派這樣的操作環境下,這已經算不錯的官方IDE套件了。         首先,打開Geany之後,先在工具列上選擇"專案",並創建一個新專案。舉例來說,我想要測試C++輸出功能,於是創建一個名為TestCpp的專案。接下來,在工具列上選擇"檔案",並創建一個"開新檔案",它會讓我們選個範本,此時選Main.cxx。系統幫我們在專案目錄下建立一個C++檔案,有main function的範本,如下圖一所示。         第二步,在這個檔案裡開始寫些簡單的code,寫個Hello World吧!順便編譯與組建一下,看看有沒有成功。不過,我的專業裏頭總不能只有一個Main檔案走遍天下吧?還是需要有些其他檔案來組建。新增一個加法函數的檔案,名為myadd.cxx,存放在專案的目錄下,這時就可以從main函數調用這個外部加法函數,試試看!一開始編譯,發現會產生編譯失敗,這是因為組建的命令沒設定妥當,預設的命令是編譯單一檔案,這會兒需要編譯一堆檔案,所以要調整命令,如圖二所示。再次編譯後,成功了,可以執行看看結果。 圖一:Geany IDE C++ 軟體開發環境 圖二:修改組建的命令 Python開發         樹莓派官方的系統內建兩套IDE軟體開發套件,一套稱為 Python 3 IDLE ,另一套為 Thonny Python 。我分別用print簡單的程式測試兩個IDE開發環境,如下圖三所示為Python

[筆記] Raspberry Pi 樹莓派的入門筆記

圖片
(一) 安裝樹莓派的作業系統         本文的實驗過程是以樹莓派 3B+ 板子為主。一拿到樹莓派開發板,它好比一台自行組裝的電腦,不像品牌電腦已經幫你安裝好所有的系統,開啟電源就能進入作業系統。因此,我們第一件事就是幫它安裝作業系統,官網提供兩種方式,一種是NOOBS快速安裝(離線或網路安裝),開機後,有個選單讓我們自己選擇安裝哪種樹莓OS。另一種是映像檔燒錄到SD,這是已經確定要安裝Raspbian OS。至於安裝這部分的說明,網路已經有不少前輩分享其寶貴的經驗,不妨參考。 樹莓派 Raspberry Pi B+ 入門教學,以 NOOBS 安裝基本 Linux 系統 樹莓派 Raspberry Pi,無頭式(無螢幕、鍵盤與滑鼠),安裝到進入作業系統桌面 學習樹莓派 Raspberry Pi (二) 遠端登錄樹莓派         Raspbian OS安裝好了之後,我們希望能從遠端來操控樹莓派,這樣就可以不需要額外準備一套鍵盤、滑鼠、螢幕了。遠端登錄分成兩種:SSH 文字模式和 VNC 全螢幕模式,一般還是使用遠端全螢幕的操控方式,不過我們必須設定成每次開機自動啟動遠端登錄功能。網路也有不少前輩分享其寶貴的經驗,參考底下的連結。 Raspberry Pi:遠端桌面連線與VNC Raspberry Pi 筆記:遠端桌面 VNC、Teamviewer 及RDP Raspberry啟動SSH連線 (三) 樹莓派桌面中文化         已經可以從遠端連上樹莓派,但是 Raspbian OS 預設系統為英文版,我們要將桌面改為中文化,同時也把WiFi的地區改為台灣才能符合當地規格。另外,還要把螢幕解析度調整到適當的大小,才不會在遠端看到一個很小的畫面。 將樹莓派Raspberry Pi系統設定為中文 把你的 Raspberry Pi 變成中文介面、安裝中文輸入法 注意 : 每次修改了樹莓派設定,要重新開機才能生效,不像Windows系統有的設定可以直接生效。比如藍芽裝置、喇叭、或者網路,設定完畢後,必須reboot才生效。 (四) 開啟瀏覽器上網         到這個步驟,我們從遠端連線,再打開Raspbian內建的瀏覽器,上網試試看效果怎樣,順便到Youtube測試影音撥放的效能。

[模組] LoRa 模組範例測試通訊距離

圖片
測試模組的傳輸距離         根據前一篇 文章 ,拿兩個Arduino MKRWAN 模組分別 接上兩顆AA電池,再外接天線,如下圖。如果沒有外接天線,接收的RSSI訊號不強,點對點的傳輸距離大概幾公尺左右。傳輸距離的測試實驗中,我們分別將LoRaSender和LoRaReciver程式碼上傳到模組上,再測試三種頻率433MHz、868MHz和915MHz,結果發現其中的433MHz接收訊號最差,915MHz的RSSI最好。         距離測試以915MHz為主,過程中LoRaSender的位置離水平面約1.5公尺高,然後LoRaReciever沿著直線距離緩慢地移動,傳輸的直線距離(無障礙物)大約是 250~300公尺 ,250公尺就會逐漸出現通訊不穩的情況,這距離似乎比想像的還短很多,疑問LoRa 不是 號稱可傳數公里遠嗎? ( 模組沒有強波設計?!)另外,測試過程使用了兩種不同的天線,如下圖所示,結果是左邊天線的接收效果比較好。 LoRa 連線測試 測試過程的兩種天線 參考資料 長距離低功耗無線通訊技術

[模組] LoRa - Arduino MKRWAN 1300 通訊模組

圖片
        最近從網上買了兩個Arduino MKRWAN,屬於LoRa開發板的一種,可以拿來研究物聯網的通訊傳輸,一個用來當發送端,另一個用來當接收端。首先瞭解開發板的架構,Arduino MKR WAN 1300開發板是由ATMEL SAMD晶片,再搭配 LoRa 模組所組成,系統方塊圖如下所示。         在下圖的左邊,ATMEL SAMD就是Arduino Zero開發板的控制器,以Cortex-M0為核心的晶片。而在下圖的右邊,LoRa模組是由Murata公司製作的通訊模組,該模組內部包含一顆STM32L系列的控制器和一顆SX1276 LoRa晶片。在市面上容易買到單獨SX1276/78晶片的LoRa模組,這種必須仔細了解SX1276內部暫存器的設定才能順利開發與運用。另外,也有一類模組還包含一顆控制器,通常這種模組是用 AT command 方式來控制 LoRa 傳輸,很多複雜的控制命令已經被封裝成 AT 指令了,對初次接觸LoRa開發的人來說會方便許多。 Arduino MKRWAN 1300 方塊圖         這塊開發板的編譯環境是用 Arduino IDE,然後再從 開發板管理員 選單中找尋相關的板卡,如下圖所示。一般我們常用的是AVR為控制器的Arduino板子,但是MKRWAN 1300是以ATMEL SAMD為核心控制器,所以要下載圖中最底下的開發套件,然後IDE自動會將套件安裝完畢。 下載Arduino SAMD的開發套件                  前面下載的說明是板子的開發套件,主要用來編譯我們設計的程式原碼。接下來,我們要從 程式庫管理員 裡面找尋LoRa相關的函式庫,如下圖所示,使用這些前人已開發的函式庫可以縮短我們摸索的時間,順便也能仔細研究其代碼怎麼設計與控制LoRa晶片。底下的函式庫列出兩個,MKRWAN開發者提供LoRaWAN的函式調用接口,如OTAA、ABP接入模式。另一個LoRa開發者提供SX1276...的函式調用接口,能讓我們設計點對點或點對多的LoRa通訊連接。上述的兩個程式碼除了這裡下載,也可以從 GitHub 取得,如果開發過程遇到問題,歡迎上 GitHub 提問。 下載 LoRa 模組的函式庫         在準

[應用] 環境品質監控系統

圖片
系統架構 由環境監測元件和運算控制元件所組成的硬體,如圖一所示,再搭配流程控制軟體組成一個完整的系統。每個環境監測元件透過無線網路的方式連接到運算控制元件,將每處環境的數值傳給運算元件,再由運算元件計算出最佳的環境狀態,進而控制電力、空調或風扇 … 等周邊系統。 圖一:環境監控系統方塊圖 圖二:環境監控系統實際架設情況 上圖二是環境監控系統實際架設的情況,分別配有不同 ID 的兩個環境監測元件,圖下方有一個配置網路的運算控制元件。因此,運算控制元件可以收到來自不同 ID 的環境監測數值,搜集道這些數值後可針對環境變化進行最佳化的運算,調整適當的電力控制或空調系統。圖三是用來監測環境的元件方塊圖,由 Arduino 控制器做為元件的核心處理器,晶片上提供常用的通訊介面,因此相當方便再搭配周邊的感測元件。 圖三:環境監測元件的內部方塊圖 下圖四是元件的實體電路,我們可以觀察 LCM 的數據, LCM 上面會顯示當時感測器量測到的溫度 ( 單位 : 攝氏 C) 、溼度 ( 單位 : %) 、照度 ( 單位 : 流明 ) 、 CO2 濃度 ( 單位 : ppm) 、空氣品質、人體移動偵測 … 等。 WiFi 連線的狀態也會顯示在上面,每個數字代表的狀態如下: 0 :指令錯誤,未收到回應。 2 :已連接到 WiFi AP ,獲得 IP 位址,但還未建立 TCP 。 3 :已建立 TCP 連線。 4 :斷開網路連線。 5 :未連接到 WiFi AP 。 圖四:環境監測元件的實體圖         下圖五是環境監控系統的主控制器內部架構圖, ARM 控制器透過 RS-485 介面與 WiFi 模組相連接,用來接收來自環境監測元件的資料。主控制器具有 ethernet 網路介面,可與外部的設備相通訊,利用工業標準 Modbus TCP 通訊協定進行資訊交換。 圖五:主控制器的系統架構圖 規格說明 主控制器的系統規格如下: a) ARM 核心運算時脈達到 120 MHz ,具有 10/100 Mbps 網路通訊   b) 支援 Modbus RTU 或 Modbus TCP 通訊,可以連接 HMI 人機介面   c) 4 秒內迅速開機,