分類彙整: Raspberry Pi

用 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。

不過,如果控制端的電腦不是 macOS (macOS 內建 mDNS 的支持),那還需要安裝一些軟體。在 Linux 上,需要安裝 avahi。Windows 則比較麻煩,以前在 Windows 上安裝 Apple 的 Bonjour Print Services 就可以開始用 mDNS,後來在某次的 Windows 10 更新後, Bonjour 就不能用了,還需要修改 Windows 登錄機碼才行,有興趣的人可以參考這裡


開始來說明控制端的 GUI app。我這個 app 是用 Rust 寫的,GUI 的部分使用 gtk-rs,WebSocket 的部分使用 tokio-tungstenite。

編譯之前需要先設定開發環境,首先,先安裝 rustup。然後需要安裝 GTK 3 的開發套件包。

在 macOS 上安裝 GTK 3 的開發套件包:

$ brew install gtk+3
$ brew install gnome-icon-theme

在 Debian / Ubuntu 上安裝 GTK 3 的開發套件包:

$ sudo apt install libgtk-3-dev build-essential

在 Windows 上安裝 GTK 3 的開發環境:請參考這篇


下載控制端 GUI app 的程式碼,並且編譯:

$ git clone https://github.com/wlelab/SpotifyPi-Control-Panel.git
$ cd SpotifyPi-Control-Panel
$ cargo build --release

編譯需要一段時間。編譯完成後,執行檔會放在 SpotifyPi-Control-Panel/target/release 目錄下。

在 Windows 上,直接執行 SpotifyPi-Control-Panel\target\release 目錄下的 spotifypi-control-panel.exe 即可,在 Linux / macOS 上,可以透過終端機執行:

$ ./target/release/spotifypi-control-panel

Windows 上的執行畫面:

Demo 影片:

用 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 專屬播放機,所以接下來就來說明如何設定吧。

閱讀全文

老 MacBook 裝 x86 Raspbian

最近把老舊的 MacBook 2010 的 RAM 加到 8GB,然後把作業系統改裝 Raspberry Pi Desktop (x86 Raspbian),有這台機器又活起來的感覺!嗯…也許是我還蠻習慣 Raspbian 的關係吧 (?

不過因為 MacBook 的螢幕太亮,而 LXDE 沒有內建調整螢幕亮度的軟體,所以需要自己手動更改螢幕亮度值,螢幕亮度的設定檔通常會放在 /sys/class/backlight/{顯卡類型之類的}/ 目錄裡面,例如我的 MacBook 2010 的螢幕亮度設定檔就放在 /sys/class/backlight/nv_backlight/ 裡,設定檔名稱通常是叫做 brightness,同個目錄下還會有一個叫做 max_brightness 的檔案,這個檔案可以看亮度最大值是多少,像我的 max_brightness 裡的數值是 100,所以我在修改 /sys/class/backlight/nv_backlight/brightness 的數值時,範圍就是 0 ~ 100。

要更改螢幕亮度時,用 nano 或是 vim 開啟設定檔,然後修改數值即可:

$ sudo nano /sys/class/backlight/nv_backlight/brightness

不過每次這樣改好像有點不直覺 (其實是我都會忘記設定檔的目錄路徑 XD),所以我寫了一個 GUI 小程式,用來調整我的 MacBook 2010 的螢幕亮度:https://github.com/kyumdbot/rpd-brightness

試玩 Coral USB Accelerator

我不久前買了 Google 出的 Edge TPU 裝置:Coral USB Accelerator 來玩玩看,覺得這玩意非常不錯,台幣兩千多元,可以跑 TensorFlow Lite 格式的模型,我個人是覺得還蠻划算的。

我先用 Raspberry Pi 3 Model B+ 來測試 Pose Detection 模型,一開始使用預設的解析度:640×480,繪製的速度不是很理想,影片如下:

然後我把解析度設定成:480×360,繪製的速度有加快,但還是不盡理想,所以後來我改用一台 2013 年買的小筆電來跑,這次繪製的速度就相當不錯了,影片如下:

這台小筆電的規格為:CPU 是 Intel Celeron(R) CPU 847 @ 1.10GHz,記憶體 4GB,作業系統是 Debian 10 (buster) amd64 版,且有 USB 3 的插孔。

Raspberry Pi 3 Model B+ 除了 CPU 速度較慢之外,也沒有 USB 3 的插孔,所以整體上慢了一大截。但是前陣子出的 Raspberry Pi 4 Model B 有 USB 3 插孔,我已經訂了一台 Pi 4,等收到貨後再測試看看繪製速度是否有提升。

# 2019 年 11月 3 日補充: 我在 Raspberry Pi 4 (4GB 記憶體版本) 上測試了 Coral PoseNet,測試結果請看以下影片,TrueFPS 維持在 20.x 以上:

然後我還有嘗試 Object detection 與 MiniGo 圍棋:

Coral 官方網站也提供了好幾個已編譯好的模型讓人下載:https://coral.withgoogle.com/models/ ,可以先從這些模型開始玩起。

感想:這種 Edge TPU 裝置可以做很多有趣的應用,而且價格不算貴,有興趣的人快去買來玩玩看!

IchigoJam BASIC RPi 初體驗

IchigoJam BASIC RPi 是一個運作在 Raspberry Pi 上的 OS,這個 OS 很有趣,開機後會顯示一個黑白畫面的 BASIC 終端機,完全沒有 GUI,直接寫 BASIC 控制 Raspberry Pi,彷彿就像是 30 多年前的個人電腦。

下方是我嘗試用 IchigoJam BASIC RPi 控制 Pin 輸出的影片:

在 Raspberry Pi 上安裝 Groovy

打開終端機,用 apt 指令安裝 OpenJDK 8 與 Groovy:

$ sudo apt install openjdk-8-jdk groovy

然後,我們試試是否可執行 groovy:

$ groovy -v
groovy: JAVA_HOME is not defined correctly, can not execute: /usr/lib/jvm/default-java/bin/java

會顯示「groovy: JAVA_HOME is not defined correctly, can not execute: /usr/lib/jvm/default-java/bin/java」這個訊息。

我們先切換到 /usr/lib/jvm 目錄下查看一下:

$ cd /usr/lib/jvm
$ ls -l
lrwxrwxrwx 1 root root   21  6月 17 02:24 java-1.11.0-openjdk-armhf -> java-11-openjdk-armhf
drwxr-xr-x 9 root root 4096  7月  8 01:20 java-11-openjdk-armhf
lrwxrwxrwx 1 root root   20  3月 29 21:54 java-1.8.0-openjdk-armhf -> java-8-openjdk-armhf
drwxr-xr-x 7 root root 4096  8月  2 13:52 java-8-openjdk-armhf
drwxr-xr-x 9 root root 4096  3月 14  2018 jdk-8-oracle-arm32-vfp-hflt

然後幫 java-8-openjdk-armhf/ 做一個名為 default-java 的 symlink:

$ sudo ln -s java-8-openjdk-armhf/ default-java
$ ls -l
lrwxrwxrwx 1 root root   21  8月  2 14:05 default-java -> java-8-openjdk-armhf/
lrwxrwxrwx 1 root root   21  6月 17 02:24 java-1.11.0-openjdk-armhf -> java-11-openjdk-armhf
drwxr-xr-x 9 root root 4096  7月  8 01:20 java-11-openjdk-armhf
lrwxrwxrwx 1 root root   20  3月 29 21:54 java-1.8.0-openjdk-armhf -> java-8-openjdk-armhf
drwxr-xr-x 7 root root 4096  8月  2 13:52 java-8-openjdk-armhf
drwxr-xr-x 9 root root 4096  3月 14  2018 jdk-8-oracle-arm32-vfp-hflt

然後再執行 groovy 試試看:

$ groovy -v
Groovy Version: 2.4.16 JVM: 1.8.0_212 Vendor: Oracle Corporation OS: Linux

寫個程式測試看看:

$ cd ~
$ vim hello.groovy
def hello(name) {
    println("Hi, " + name)
} 
hello("Pi")

執行程式:

$ groovy hello.groovy
Hi, Pi