網拍上,有人便宜拍賣汰換的 Orange Pi One 單板電腦,相對便宜很多,就買了幾個回來備用。
到 Armbian - Orange Pi One 下載 image,是最新的 kernel。下載的是 xz 的壓縮檔,使用 unxz 解壓縮,unxz -k file.xz 則能保存壓縮檔。
可以使用圖形界面的燒錄程式,會檢查燒錄結果。也可以用 dd 或 dcfldd,後者較快,指令如下。
$ sudo dcfldd if=Armbian_xxx_Orangepizero3_bookworm_xxxx_minimal.img of=/dev/sde bs=10M
買的開發板,有附盒子,風扇,USB 轉圓柱頭的電源線,這些自己買,又要一百多吧。電源接頭規格 DC 4.0x1.7mm,打算買 DC-DC 的板子來將 24V 轉成 5V,給香橙派用。
WiFi使用
Orange Pi One,終究是 2016 的產品,使用上的體驗,速度遠比不上 2023 年出的 Orange Pi Zero 3。以電腦的進步來看,7年的時間,速度大約至少差 2倍。但是網拍的二手貨,很便宜,買一些來改 3D 印表機。3D 印表機改 Klipper,至少要一個上位機。只改一台,錢差一點沒差,但收集了一堆來改,改完想賣出,差幾百,就不一定有人要收,成本能省就省吧。 在成本上比較,前者,主板+WiFi+SD卡,約 400元,後者,主板+SD卡,約 600元。
安裝 armbian 的 image,版本比較新,https://www.armbian.com/orange-pi-one/ 。
即使安裝 network-manager,"apt install network-manager",執行 nmtui,顯示不正常。只好用 armbian-config 設定 WiFi。
參考 ARMBIAN OS - Networking,Armbian 使用 Netplan.io 來描述網路設定。使用 armbian-config 設定後,會將設定存在 /etc/netplan/armbian.yaml,直接修改設定,再執行 "netplan apply",即可讓設定生效。
# cat armbian.yaml
network:
version: 2
renderer: networkd
wifis:
wlx40a5ef154b5f:
# dhcp4: true
# dhcp6: true
addresses:
- 10.161.86.137/20
routes:
- to: default
via: 10.161.80.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.8.4
access-points:
"Samsung-A50-cc":
auth:
key-management: "psk"
password: "wifi-password"
"renderer: networkd",是指使用 systemd-networkd 的網路設定。但 Klipper 會安裝 NetworkManager。改用 NetworkManager,參考 Migrate Ubuntu server from NetPlan to NetworkManager without disconnection (possibly over SSH) 。
設定好 NetworkManager 後,Disable networkd and purge netplan:
$
sudo systemctl disable --now systemd-networkd.service systemd-networkd.socket networkd-dispatcher.service
$ sudo systemctl restart NetworkManager
$ sudo apt purge netplan netplan.io -y
要 disable systemd-networkd,但還是會被啟動。不過
ZSWAP 設定
參考 Armbian Documentation - Fine Tuning: Swap for experts,簡要說明如下。
By default Armbian implements ZRAM (writing nothing to ‘disk’ but compressing memory pages in RAM) but in case you often run into out of memory errors and your device has some capable storage (e.g. a securely attached NVMe or SATA SSD) you might want to use ZSWAP instead.
不太懂有什麼好,但設一下吧。修改之前,系統顯示訊息如下。
$ systemctl --type swap
UNIT LOAD ACTIVE SUB DESCRIPTION
dev-zram0.swap loaded active active /dev/zram0
$ dmesg | grep zswap
[ 1.308166] zswap: loaded using pool zstd/zbud
利用 SD 上剩下的一點空間,建立和掛載 swap,然後 Edit/uncomment /etc/default/armbian-zram-config so that it reads SWAP=false, reboot and you’re done.
修改後,系統顯示訊息如下。
$ systemctl --type swap
UNIT LOAD ACTIVE SUB DESCRIPTION
dev-disk-by\x2duuid-5f0613fb\x2d295b\x2d4587\x2d80ef\x2d54f0c1302a73.swap loaded active active /dev/disk/by-uuid/5f0613fb-295b-4587-80ef-54f0c1302a73
安裝 Klipper
依照 https://github.com/dw-0/kiauh 安裝 klipper。整個安裝過程,明顯比用 Orange Pi Zero 3 慢很多,可能要 2倍以上的時間。另外,由於記憶體較小,導致 tmpfs 的 /tmp 不足,在安裝 Moonraker 的階段,會耗盡 /tmp 的空間。因此需另建一個暫時的 tmp,步驟如下。
# Create a temp folder on a disk that has a lot of space:
sudo mkdir -p /bigtmp
# Set generous access to the temp folder:
sudo chmod 777 /bigtmp
# Change TMPDIR env to the big folder you just created:
export TMPDIR=/bigtmp
# install package
在安裝 Moonraker 時,改成用此暫時的 tmp。安裝其他的套件,則用 tmpfs,會比較快。安裝 moonraker,最多的時候,使用 /tmp 的空間約 266M。
安裝谐振测量所需的軟體
在執行到下列安裝指令時,很可能會掛掉,ssh 沒反應。
~/klippy-env/bin/pip install -v "numpy<1.26"
把僅有的 SD 空間,設成 swap,依上述 ZSWAP 設定,再儘可能把 service 停掉,擠出記憶體。
## 列出所有 active 的 service
systemctl list-units --type=service --state=active
OR
systemctl --type=service --state=active
## 把目前確定沒用的 service 都停掉
sudo systemctl stop klipper
sudo systemctl stop KlipperScreen.service
sudo systemctl stop NetworkManager.service
sudo systemctl stop moonraker.service
sudo systemctl stop nginx.service
終於安裝成功。
啟用 SPI
使用 armbian-config 啟用 sun8i-h3-spi-spidev,會在 /boot/armbianEnv.txt 中,加入一行
overlays=sun8i-h3-spi-spidev
從 console 看到載入失敗的訊息
Failed to load '/boot/dtb/overlay/sun8i-h3-sun8i-h3-spi-spidev.dtbo'
因為已加上 overlay_prefix=sun8i-h3。修改後,並加上 param 參數,成功看到 /dev/spidev0.0 的裝置。完整的 /boot/armbianEnv.txt 如下。
verbosity=1
bootlogo=false
console=both
disp_mode=1920x1080p60
overlay_prefix=sun8i-h3
rootdev=UUID=5fda7286-2a9d-4d7c-aa26-de3614b88ae6
rootfstype=ext4
overlays=spi-spidev
param_spidev_spi_bus=0
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
可以參考 /boot/dtb/overlay/README.sun8i-h3-overlays 的說明。
接線
IO 的接腳如下。

觸控屏
OPi One wiring:
Pin 23 - PC2 <--> SPI0 SCK & T_CLK
Pin 21 - PC1 <--> SPI0 SDO<MISO> & T_DO
Pin 19 - PC0 <--> SPI0 SDI<MOSI> & T_DIN
Pin 31 - PA8 <--> DC
Pin 33 - PA9 <--> RESET
Pin 29 - PA7 <--> LED
Pin 35 - PA10 <--> LCD CS
Pin 26 - PA20 <--> T_CS
Pin 28 - PA19 <--> T_IRQ
Pin 1 - 3.3V (or Pin 4 - 5V)
Pin 6 - GND
--------------
建立 /boot/overlay-user/ili9341_lcd.dts,內容如下。
/dts-v1/;
/plugin/;
/ {
compatible = "xunlong,orangepi-one", "allwinner,sun8i-h3";
fragment@0 {
target = <&spi0>;
__overlay__ {
status = "okay";
// cs-gpios = <&pio 0 10 0>; /* PA10*/
cs-gpios = <&pio 0 10 0>, <&pio 0 20 0>; /* PA10 PA20 */
ili9341: ili9341@0 {
compatible = "ilitek,ili9341";
reg = <0>; /* Chip Select 0 */
#spi-cs-high;
spi-max-frequency = <40000000>;
rotate = <90>;
bgr = <0>;
fps = <30>;
width = <240>;
height = <320>;
buswidth = <8>;
reset-gpios = <&pio 0 9 1>; /*RESET=PA9*/
dc-gpios = <&pio 0 8 0>; /*DC_RS=PA8*/
led-gpios = <&pio 0 7 0>; /*LED=PA7*/
debug = <4>;
};
ads7846: ads7846@0 {
compatible = "ti,ads7846";
reg = <1>; /* Chip Select 1 */
#spi-cs-high;
spi-max-frequency = <1000000>;
interrupt-parent = <&pio>;
/* IRQ PA19 */
interrupts = <0 19 2>; /* IRQ_TYPE_EDGE_FALLING */
pendown-gpio = <&pio 0 19 1>; /* ACTIVE_HIGH */
/* ti,swap-xy = <0x1>; */
ti,x-min = /bits/ 16 <0>;
ti,y-min = /bits/ 16 <0>;
ti,x-max = /bits/ 16 <0x0FFF>;
ti,y-max = /bits/ 16 <0x0FFF>;
ti,pressure-min = /bits/ 16 <0>;
ti,pressure-max = /bits/ 16 <0xFFFF>;
ti,x-plate-ohms = /bits/ 16 <400>;
};
};
};
};
再執行下面的指令,
沒有留言:
張貼留言