David Lin

David Lin

一個軟體工程師的隨意筆記

01 Jul 2021

Hello, Raspberry Pi 1B+

開箱

這次從 Adafruit 官網買了八個初代 Raspberry Pi 1B+, 想說可以當成記憶體比較多的 microcontroller (Pi-Zero 表示…), 而且也可以模擬老電腦(ex: PDP-11)。

把這些紙盒排在一起感覺蠻壯觀的…

IMG_5163

IMG_5162

IMG_5104

IMG_5105

硬體規格

維基百科歸納出硬體規格如下:

PropertyValue
SoCBroadcom BCM2835
ISAARMv6Z (32-bit)
FPUVFPv2; no NEON
CPU1x ARM1176JZF-S @ 700 MHz
GPUBroadcom VideoCore IV @ 250 MHz
RAM512 MB

暫時不看 GPIO 的規格,只就系統架構的部分來看,可以知道這個樹莓派使用了 ARMv6 32位元指令集,有支援浮點數但沒有 NEON SIMD 指令集。

ARMv6,也就是ARM11, 它支援的指令集除了 ARM 32-bit ISA 以外,還支援了 Thumb-1 與 Thumb-2。 我再看看能不能用它複習一下大學的組合語言 ARM 作業 XD。

準備系統

如果沒有 OS,這個樹莓派就只是一個名片大小的電路板而已。XD

我在 Raspberry 的官網下載 Raspberry Pi OS Lite。

我選擇 Lite 的原因是不要先有 X11 圖形介面,不然開機會超慢到想死(對,我有試過,長達 6 分鐘)。畢竟這個初代樹莓派搭載的 Broadcom BCM2835 SoC 只有 700 MHz 之時脈,而且記憶體僅有 512 MB。 所以我會盡量在 Linux Console 上操作,減少系統資源負擔。

下載完 Raspberry Pi OS Lite 的映像檔案(副檔名為 .img.xz)之後, 可以丟給 Raspberry Pi Imager 工具把映像檔案(不用解壓縮)燒錄到 SD 卡上。

如果想要用純 UNIX 作法,可以使用 dd 指令:

sudo dd bs=16m if=2021-05-07-raspios-buster-armhf-lite.img of=/dev/disk2

其中 /dev/disk2 要換成正確的裝置代號,如果出事了我不負責喔 >.^

順便一提,上面的指令是在 Mac OS X 下使用的,在 Linux 下會有不同:

  • bs=16m 要改成大寫 bs=16M
  • USB 儲存裝置代號為 /dev/sdX,建議用 lsblk 去查看看有哪些裝置代號。

初步設定

插上 SD 卡,接上螢幕與鍵盤,然後啟動電源,就很快進入 Linux 系統了。

以預設帳號 pi 與密碼 raspberry 登入進入 bash 介面,就可以開始做以下系統設定。

1. 更換 Linux Console 的字體

預設的 text mode 字體大小只有 8x16,在 Hi-DPI 螢幕上看顯得太小很傷眼,所以需要更換一下字體護眼。

sudo dpkg-reconfigure console-setup

會進入文字選單介面,只要依序選一些選項,就可以換好字體了

  1. Encoding 選 UTF-8
  2. Charset 選 Latin-1
  3. Font 選 TerminusBold
  4. Font Size 選 16x32 (Framebuffer Only)

接下來系統就會自動處理與設定,下次開機也會保留這個字體設定。

2. 設定 Locale 與 Keyboard

由於 Raspberry Pi 官方是英國來的,所以預設的系統環境是以英國區為主。 而我目前所使用的電腦系統都是美國區規格為基礎,尤其是鍵盤的配置完全不同。

直接進入文字版 Raspberry Pi Config:

sudo raspi-config

然後選擇 Localisation Options,去設定 LocaleKeyboard

  1. Locale: 找一下 en_US.UTF-8,並且勾選之,讓系統生成 locale 相關檔案,並且把系統開機預設為 en_US.UTF-8
  2. Keyboard:
  • Model: Generic 105-key PC (intl.)
  • Layout: English (US)
  • No compose key
  • 其他的統統為預設就好

3. 設定 Wifi 網路 (wpa_supplicant)

因為我家沒有 Ethernet 有線網路,所以需要設定一下 WiFi。

但是…Raspberry Pi 1B+ 沒有內建 WiFi!!!!(崩潰)

後來我參考了 elinux.org 上的 USB Wi-Fi Adapters 上的相容裝置清單,買了 ASUS USB-N10 Nano 網路卡。

插上去開機看看,且用 rfkill 確認系統有沒有抓到這個網路卡:

pi@raspberrypi:~ $ rfkill
ID TYPE DEVICE      SOFT      HARD
 0 wlan phy0   unblocked unblocked

看起來是有抓到,那就設定一下 WiFi 連線。

sudo wpa_cli

進入互動介面之後:

  1. > scan (掃描 WiFi APs)
  2. > scan_results (列出找到的 APs)
  3. > add_network (宣告一個新的網路,完成之後會顯示新的網路代號,在這裡是 0)
  4. > set_network 0 ssid "AP之SSID" (設定SSID,注意雙引號要加上)
  5. > set_network 0 psk "AP之密碼" (設定密碼,注意雙引號要加上)
  6. > enable_network 0 (啟用網路,系統會把網路連上去,就會顯示連線成功)
  7. > save_config (儲存設定)
  8. > exit (離開設定互動介面)

4. 更新系統

因為 Raspberry Pi OS 其實是 Debian,所以用 APT 套件系統管理套件。

sudo apt update
sudo apt full-upgrade

就可以把系統更新到最新了,然後可以把系統重開機了。

5. 設定 Wifi 網路 (connman)

雖說 wpa_supplicant 是最基本的 WiFi 控制, 但感覺上還是需要有一個高階的介面可以設定有線與無線網路。

我一開始用 Network Manager,但發現它太肥大而且找不到 WiFi 裝置。 所以改用了 connman,一個專門為嵌入式裝置設計的連線管理程式, 裡面 WiFi 還是用 wpa_supplicant 管理。

用 apt 安裝一下:

sudo apt install connman

使用 connman 之前還需要先關掉一些 services,不然會衝突導致連線失敗:

sudo systemctl disable dhcpcd.service
sudo systemctl disable networking.service

然後在 wpa_cli 中輸入 remove_network 0 把原先設定的 network 刪掉。

最後打 connmanctl 進入互動設定模式:

  1. > technologies (查看網路裝置的狀態)
  2. > disable wifi (關閉 wifi,原因是有時候網路卡沒有啟動)
  3. > enable wifi (打開 wifi)
  4. > scan wifi (掃描 wifi APs)
  5. > services (列出找到的 APs)
  6. > agent on (啟動 agent)
  7. > connect wifi_XXXXX (嘗試連上 wifi AP)
  8. > quit (離開互動介面)

詳細資料可以參考 ArchWiki 網站 (懶)

總結

雖然 Raspberry Pi 1B+ 搭載的 ARMv6 (ARM11) 以現在眼光來看很過時了, 但是它有一個優勢:沒有過熱問題,不需要風扇與散熱片,我用手直接摸 SoC 的外殼根本感覺不到熱。 反觀現在的電腦與 Raspberry Pi 4B 會有過熱問題,需要搭配散熱系統才能工作。 所以 Pi 1B+ 本身還保有 ARM Cortex 之前的樣子(咦),是貨真價實的嵌入式電腦。

拿掉圖形介面之後,只有文字介面操作對我而言還蠻順手的,不常有反應過慢的問題。 而且它也可以設定與控制 GPIO,當作一個功能較強的 microcontroller 用。

總而言之,它是一個不錯的 single board computer,之後的實驗也會常常用到它。

參考資料

comments powered by Disqus