寫了一個 Serial Port Tool

最近用 Rust 寫了一個 serial port tool 給自己用,GUI 的部分使用 gtk-rs, serial port 通訊的部分使用 tokio-serial (serialport-rs 的 tokio 運行時版本),USB hotplug 的部分使用 rusb (libusb 的 Rust 包裝)。

不過,因為 libusb 不支持 Windows 上的 hotplug,所以在 Windows 上執行時,我使用一個 loop 每隔一秒列舉一次 USB 裝置,來判斷是否有 USB 裝置插入或拔出。

Serial Port Tool 的原始碼:https://github.com/riddleling/serial-tool

然後可以用 Arduino 寫一個 serial echo 程式來測試,把寫入 serial port 的字元回傳回來:

// Arduino serial echo

void setup() {
    Serial.begin(115200);
}

void loop() {    
    if (Serial.available() > 0) {
        Serial.print((char)Serial.read());
    }
}

在 Linux (Raspberry Pi OS) 上執行 serial port tool 的畫面:

在 Windows 上執行的 demo 影片 (透過 serial port 傳輸指令,打開或關閉 LED):

用 Raspberry Pi 打造一台 Spotify 播放器 – Part 2

延續上一篇的內容,要接著說明控制端的 GUI app 如何編譯執行。

在開始之前,先用 ssh 連到 Raspberry Pi,然後安裝 mDNS 的套件包與修改主機名稱。

$ ssh pi@<Raspberry Pi's IP address>
$ sudo apt -y install avahi-daemon
$ sudo raspi-config

執行 sudo raspi-config 後,會看到一個文字介面的選單,選擇 System Options => Hostname,然後把 Hostname 改成 spotifypi (或是你喜歡的名字)。改完後請重新開幾。


Raspberry Pi 開啟 mDNS 的服務後,我們就可以透過 <hostname>.local 這個網址來取代 IP 位址,例如:假設 Raspberry Pi 的 IP 位址是 192.168.1.110,那我們透過 WebSocket 去控制時的 URL 是 ws://192.168.1.110:9487,現在有了 mDNS,可以把 URL 改成 ws://spotifypi.local:9487。

閱讀全文

用 Raspberry Pi 打造一台 Spotify 播放器 – Part 1

最近把 Raspberry Pi 4B 改成 Spotify 播放器,想把製作方式記錄下來。

以前要在 Raspberry Pi OS 的 Chromium 上執行 Spotify Web Player,會因為缺少 Widevine DRM 支持的關係而無法播放。約在今年三月時,Raspberry Pi OS 正式提供了 Widevine DRM 的支持,所以現在只要在 Raspberry Pi OS 上安裝 Widevine DRM 的套件包即可用 Chromium 播放 Spotify!

在 Raspberry Pi OS 上開啟終端機,執行:

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install libwidevinecdm0
$ sudo reboot

然後用 Chromium 打開 https://open.spotify.com,就可以開始使用 Spotify 了。


不過我想把 Raspberry Pi 改成 Spotify 專屬播放機,所以接下來就來說明如何設定吧。

閱讀全文

讀書》A Tour of C++ 中文版

《A Tour of C++, 2/e》繁體中文版與簡體中文版

最近把《A Tour of C++, 2/e》中文版重讀了一次,上次讀的時候因為台灣譯本裡的一些翻譯名詞看不太懂(有些名詞既不是台灣傳統上的譯法,也不是中國那邊的譯法),所以最後也沒讀完就丟在一旁了。

最近開始想認真學習一下 Modern C++(因為想用 JUCE 寫跨平台程式 🙂),所以把《A Tour of C++, 2/e》繁體中文版又拿出來讀,並且另外買了簡體中文版,當繁體版看不懂時就翻簡體版來對照著看 XD

《A Tour of C++, 2/e》內容涵蓋了部分 C++20 特性,而且很薄(才兩百多頁),很適合拿來快速理解 Modern C++…(大誤)。嗯,對有 C++98 經驗的人來說,這本應該是不錯的現代 C++ 入門書,對沒什麼程式經驗的人來說,這本書恐怕不易消化 😅(其實我覺得 Bjarne Stroustrup 的書對新手來說都不算友善 XD,個人感想,勿戰)。

談 C++ 語言的書通常都很厚,光是看到那比磚頭還厚的厚度,就沒什麼動力讀下去,這本《A Tour of C++, 2/e》夠薄,拿來入門剛剛好。不過,我認為最好的 C++ 入門書還是《Essential C++》,薄薄一本只有兩百多頁,講述了 C++ 最基本最核心的部分,只可惜《Essential C++》是 1999 年出版的,內容對現在而言已經過時了…

說到《Essential C++》,讓我想到了 Stanley B. Lippman 在《Essential C++》前言裡提到他在迪士尼電影動畫公司工作時,有次被要求用 Perl 重寫一個工具程式,但他不懂 Perl,所以他想找一本 Perl 書籍來抱佛腳,而且那本書不能太厚,因為當時的情況需要快點讓那個 Perl 程式動起來,最後他找了《Learning Perl》(台灣譯本名為:《Perl 學習手冊》)來讀。這次的經驗讓他明白對於想立刻學會並使用 C++ 的人來說,《C++ Primer》過於龐大複雜了,因此他寫了《Essential C++》這本小書。

說到《Learning Perl》,又讓我想起我的第一份正職程式設計工作時的一件事 😅,當時我剛進去工作不到兩個禮拜,第一個任務是要把一本英文字典做成 iOS app,當時的老闆已經有寫好一支程式把字典的純文字檔轉換成他想要的特定格式,他讓我接手修改那支程式,那支程式是用 Objective-C 寫的,我當時研究了程式的內容與特定格式的結構後,發現那支程式的效果不好,因為還需要半人工的方式去修改文字檔,而且無法正確找出所有的格式問題,最後我決定重寫一支程式來處理格式的問題。

一開始我是用 Objective-C 去寫,寫了一堆 NSRegularExpression 😵,過了三個禮拜後,覺得寫 NSRegularExpression 實在太痛苦,而且寫到卡關了,所以決定改用 Perl 來處理格式問題。雖然之前有用 Perl 寫過一些小程式的經驗,但是當時有一陣子沒寫 Perl 了,已經忘光 Perl 怎麼寫,因此趕快重讀了《Perl 學習手冊》(忘記是第五版還是第六版了),用了約四、五天的時間讀了一遍《Perl 學習手冊》,然後開始寫 Perl script 來處理格式問題,後來寫了十幾支 Perl script 才終於解決完格式的問題(一支 script 處理一種格式問題),而且才花了一個多禮拜的時間 😁

雖然格式的問題解決了,但是我後來發現文字檔裡有少數的地方有亂碼(原本的字典純文字檔就有亂碼),結果最後還是得找工讀生拿紙本字典對照著文字檔找出所有的亂碼,並手動修正,噗,這樣一開始就請工讀生直接手動修改格式並修正亂碼不就得了 🙃 …… #這就是人蔘啊

好像越扯越遠了,今天先這樣囉,Bye~

發票對獎相機

延續上個月的練習,我利用 Apple Vision Framework 的文字檢測與辨識功能,寫了一個統一發票的對獎 app,目的是用來對獎傳統的統一發票

傳統的統一發票沒有 QR code,所以我採用檢測文字的方式去檢測發票號碼,然後再比對有沒有中獎。

原始碼:https://github.com/kyumdbot/TaiwanReceiptLottery

Demo 影片:

Apple Vision Framework 試玩

這個月幾乎都在玩 Apple 的 Vision Framework,並寫了幾個 Demo app,分別有:

◎ 人臉檢測與 Object 檢測(查看原始碼):

◎ 手部姿勢檢測(查看原始碼):

◎ 手寫數字檢測(查看原始碼):

我覺得電腦視覺真的太好玩了,可以做很多有趣的應用,而且 Apple 已經推出 ARM 版 CPU 的 Mac 電腦了,希望 Apple 也能出一款體積比 Mac mini 還小的 Mac nano,用 ARM Mac 搭配 Vision Framework 與 CoreML 來做應用,應該會很有競爭力吧 (? 🤔 ,而且 macOS 的 GUI 比較容易寫的說(跟 GTK 相比)…

好書推薦:《TinyML|TensorFlow Lite 機器學習》

TinyML: Machine Learning with TensorFlow Lite on Arduino and Ultra-Low-Power Microcontrollers 繁體中文版

最近終於把這本書讀完一遍了,不過還沒嘗試執行書中的範例程式,等有空時再來試試:)

這本書裡用來執行範例程式的硬體開發板有:

  • Arduino Nano 33 BLE Sense
  • SparkFun Edge
  • ST Microelectronics STM32F746G Discovery kit

不過現在 TensorFlow Lite for Microcontrollers 也支援 ESP32 了,所以沒有上述的硬體開發板也沒關係,可以用 ESP32 來試試看。

書開頭的幾章先用「Hello World」範例帶領讀者走一遍完整的開發流程(從建立與訓練模型開始,然後執行程式,再到部署至微控制器),「Hello World」範例的功能其實很簡單,就是模擬正弦 (sin) 信號而已。

之後的章節陸續講解了喚醒詞偵測 (yes/no)、人體偵測、魔杖(手勢) 等功能的程式建構與模型訓練。

最後幾章講了 TensorFlow Lite for Microcontrollers 使用上要注意的地方,還有優化、除錯、移植等相關的技巧,最後還有提到安全與隱私方面的議題。

這本書厲害的地方是:我覺得作者在概念與基礎知識的講解上算是淺顯易懂,所以蠻推薦對 TinyML 有興趣的人來讀讀看這本書。

★ 2021 年 3 月時的補充說明:Raspberry Pi 基金會在 2021 年 1 月時推出了 Raspberry Pi Pico 開發板,而《TinyML|TensorFlow Lite 機器學習》的作者之一 Pete Warden 也在稍後將 TensorFlow Lite Micro 移植到了 Pi Pico 上,Pi Pico 的價格很便宜,而且很容易購買到,所以使用 Pi Pico 來製作 TinyML 應用的原型應該也是不錯的選擇。

好書推薦:《無限的力量》

infinite powers 繁體中文版

俗話說「感情問題一律建議分手」,不,我的建議是「感情問題一律讀微積分」。

就如同 Leonard Mlodinow 在《科學大歷史》裡提到他的父親曾說想到自己跟天上的星星是同樣東西組成的,就會感到安心一樣,想到這個世界的規律能由一條條的數學定律來描述,不也令人感到釋懷了嗎?🙂

切入正題,我最近讀了《無限的力量》這本書,這本書的內容比較像是微積分的發展史,作者並沒有在書中放了一堆數學式子 (謝天謝地!),而是由古希臘開始講起,藉由一則則的歷史故事,來說明「無限」這個概念是如何一步一步的發展成為微積分這門學問,且不時穿插說明微積分在現代都運用在哪些地方,並在最後提到了微積分的未來。

像我這種一題微積分都算不出來的數學白痴,讀這本書時也能讀的津津有味呢!此書大推!