RaspberryPi

2021年6月16日 (水)

Headless RaspberryPi(64bits)インストール方法(USB/SSD boot)

2021/6/20
「CPUクロック状況」を追加した。

2021/6/19
「32bits SSD boot」について追加した。

2021/6/16+ 初版

headless RaspberryPi 64bits,USB/SSD boot

headless RaspberryPi 64bits, USB/SSD boot

概要

Headless RaspberryPi(64bits)インストール方法(USB/SSD boot)
表示装置を接続しないでPCを運用することをheadlessというが、ここでは、最初のbootからRaspberryPiをheadlessで使う方法についてまとめた。ここでは、「headless RaspberryPiインストール方法(v2) 」の発展形として、raspberry-pi-4を64bitsモードかつUSB/SSD-bootで動かすこととする。

事前準備(ホストPC側(linux))

以下のdeamonをインストールする:

sudo apt-get update sudo apt-get install avahi-daemon

sshのポートを開くための設定:

sudo ufw allow ssh

Downloading raspbian image

以下から以下の手順で64bitsイメージをダウンロードする。

cd ~/Downloads wget https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2021-05-28/2021-05-07-raspios-buster-arm64.zip

・2021/6時点では、64bitsイメージは、上のベータ版のみである。

書き込みツール(Etcher)の準備

本ツールで使用するライブラリを以下の手順でインストールする。

suso apt update sudo apt install zenity

以下の手順でツール自身をダウンロードする:

cd ~/Downloads wget https://github.com/balena-io/etcher/releases/download/v1.5.120/balena-etcher-electron-1.5.120-linux-x64.zip #ダウンロードしたzipを解凍すると以下のディレクトリができる: $ ls balena-etcher-electron-1.5.120-linux-x64 balenaEtcher-1.5.120-x64.AppImage #このxxxx.AppImageをダブル・クリックすると書き込みツールが起動する

留意:入力ファイルは、.zipのままで良い。

参照:
LinuxにEtcherをインストールする
簡単な 3 ステップで使えるブートUSB 作成ツール!「balenaEtcher」
使用方法については上を参照のこと

M.2-SSDの初期化(PI4-CASE-ARGON-ONE-M.2使用の場合)

M.2-SSDを使用する場合、gpartedなどで、FAT32でフォーマットする必要がある。その後、書き込みツールでイメージを書き込む。

重要な注意:
ARGONのM.2-SSDは、PCで主流になっているNVMeではなく、SATAであるので注意のこと。(パソコン・ショップなどの店頭に出ているのはNVMeが多いようなので注意)

参考:
M.2 SSDの取り付け方
【2019年版】M.2 SSDとは?SATA接続とNVMe接続の違いについてもまとめました

ブートデスク(SD/USB/SSD)作成

上の書き込みツールを使って、ダウンロードしたイメージを、SD,USB/SSDに書き込む。
なお、SDは、ブートコード(rpi-eeprom)書き込み/確認用、USB/SSDは、実際に使用するブートディスクになる。

ただし、現状、書き込みツール(Etcher)で、USB3.0-SSD(M.2-SSDを含む)を書き込んだ場合、ブートデバイスにならないようだ。そのため、USB3.0-SSDをブートデバイスにする場合、SD/USBでブートした後、VNCで接続して以下の手順でブートデバイスを作成する:
(つまり、raspberry-pi自身でブートデバイスを作成する必要がある)

/************************************************************
VNCでログイン後、
(0)ブートデバイスにしたいデバイスをUSB接続し、アンマウントにする
(1)[Raspberry Menue/Accessories/SD Cord Copier]を起動する
(2)Copy From Devide:ブートしたSD/USBのデバイス名を選択する
(3)Copy TO Device:書き込むデバイス(ブートデバイスにしたいデバイス)を選択する
(4)[New Partition UUIDs]にチェックを入れる
(5)[Start]をクリックして書き込みを実行する
************************************************************/

作成したブートディスク(SD,USB/SSD)は以下に述べるようにホストPCに接続して変更を施す:
([SD Card Copier]を使う場合を除く)

boot/rootfsディレクトリのファイル追加/修正

書き込んだSD/USB/SSDをいったん取り外し、再度、挿入する。 すると、boot/rootfsディレクトリが出現する。

(1)ssh有効化
bootにsshという名前のファイルを作成する。(ファイル内容は空で良い)

(2)wireless設定
bootにwpa_supplicant.confという名前で 以下の内容のファイルを作成する:

wpa_supplicant.conf
(複数のSSIDを設定する例)

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=JP network={ ssid="<Name of your WiFi>" psk="<Password for your WiFi>" priority=1 id_str="<ID1(任意)>" } network={ ssid="<Name of your WiFi>" psk="<Password for your WiFi>" priority=2 id_str="<ID2(任意)>" }

接続するssidの方式はWAPかWPA2であること
(WEPでは接続できないようだ)

rootfsディレクトリに対して以下を行なう:
(3)hostnameを変更するために
以下の2つのファイルに記述されているhostnameを 新しいものにエディタで変更(編集)する。
(書き込み権限が必要なので「sudo」を付ける必要がある)

#「raspberrypi」を任意の名前に変更する # USERは自分の環境に合わせる sudo nano /media/USER/rootfs/etc/hostname sudo nano /media/USER/rootfs/etc/hosts

(4)該当SD/USB/SSDを取り出す boot,rootfsをアンマウントする。

(5)該当USB/SSDのext4パーティションのリサイズ
起動後、raspi-configでリサイズ可能だが、遅いという話もあるようなので、gpartedなどで、ext4パーティションをリサイズしておく。(拡張する)

SD-Boot

ここでは、ブートコード(rpi-eeprom)をアップデートするために 書き込んだSDをRaspberryPiのボードに刺し、電源をオンする。(起動する)
ボードのLEDが点滅し始めて、常灯するまで待つ。

SD-Login

ホストPCで接続を確認するために
(名前解決に時間がかかるので)
以下のコマンドを成功するまで繰り返す。
ping raspberrypi.local

出力ログ例:

$ ping raspberrypi.local PING raspberrypi.local (192.168.0.26) 56(84) bytes of data. 64 bytes from 192.168.0.26: icmp_seq=1 ttl=64 time=39.4 ms 64 bytes from 192.168.0.26: icmp_seq=2 ttl=64 time=78.2 ms 64 bytes from 192.168.0.26: icmp_seq=3 ttl=64 time=10.0 ms 64 bytes from 192.168.0.26: icmp_seq=4 ttl=64 time=9.81 ms 64 bytes from 192.168.0.26: icmp_seq=5 ttl=64 time=18.9 ms ^C --- raspberrypi.local ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4005ms rtt min/avg/max/mdev = 9.816/31.306/78.254/25.833 ms

どうしても接続確認ができないようなら「arp -a」を入力して、接続中のPCのIPアドレスを表示させて、RaspberryPiのIPアドレスを推定する。

接続確認が終わったら以下のコマンドを入力してloginする:
(デフォルトのパスワードはraspberry)

ssh pi@raspberrypi.local

SD-login後

以下のコマンドでブートコード(rpi-eeprom)をアップデートする:

sudo apt update sudo apt full-upgrade sudo reboot #ここで、いったんリブートする sudo rpi-eeprom-update sudo vcgencmd bootloader_version #-------------------------------- # 以下、出力例- $ sudo rpi-eeprom-update BOOTLOADER: up to date CURRENT: Thu Apr 29 16:11:25 UTC 2021 (1619712685) LATEST: Thu Apr 29 16:11:25 UTC 2021 (1619712685) RELEASE: stable (/lib/firmware/raspberrypi/bootloader/stable) Use raspi-config to change the release. VL805_FW: Using bootloader EEPROM VL805: up to date CURRENT: 000138a1 LATEST: 000138a1 $ sudo vcgencmd bootloader_version Apr 29 2021 17:11:25 version cf8c388c4ee37ad709ace403467d163e8dd91ce (release) timestamp 1619712685 update-time 1623061523 capabilities 0x0000001f #上の出力の場合、既に最新版になっている #最新版にする場合は以下を実行する sudo rpi-eeprom-update -d -a #-------------------------------- #ブート順序の変更 sudo raspi-config Choose 6 "Advanced Options", then click 'Enter'. Coose A6 "Boot Order", click 'Enter'. Choose B1 "SD Card Boot ..., otherwise boot from USB" or B2 "USB Boot", click 'Enter #「SDがない場合、USBブート」 か 「USBブートのみ」に設定する 

ここまで、設定したら、rpiの電源を落として、SDを取り出してブートUSBを挿して再起動する.
ここの状態でeepromがUSBからブートできる状態になっている。

VNC-serverの設定

headlessといえども、なにかを設定する際、guiのほうが設定しやすいことがあるので、VNC-serverを設定する。(直近の例では「SD Card Copier」を利用するためにVNCが必要となる)
「sudo raspi-config」を実行して 以下の値に設定する:

設定値: ・3 Boot Options B1 Desktop / CLI B4 Desktop Autologin Desktop GUI, automatically logged in as 'pi' user ・5 Interfacing Options P3 VNC ⇒ Enable  ・7 Advanced Options A5 Resolution DMT Mode 85 1280x720 60Hz 16:9    (使用しているモニターのサイズに合わせて7種類から選択する)

設定後、rebootする。 なお、上の設定でなく「Login Desktop GUI」(Autoでない)でも良い。
(raspi-configのメニューはバージョンによって変更になるので注意のこと)

VNC-severについては、以下の記事を参考した:
【解決】Raspberry Pi4 VNC接続で画面が出ない!!

なお、ホストPC側のRealVNC-viewerは以下のurlからダウンロードできる: https://www.realvnc.com/en/connect/download/viewer/linux/

ダウンロードしたファイルは実行形式なので実行属性を与えて実行する。

USB/SSD-boot後

ログインしたら開発ツールとして使用するために以下を実行する:
(既にインストール済みのものもある)

#linuxのバージョンの確認 uname -a #出力 Linux xxxx 5.10.17-v8+ #1414 SMP PREEMPT Fri Apr 30 13:23:25 BST 2021 aarch64 GNU/Linux #aarch64が表示されていれば64bitsである #RAM容量の確認 free -h #出力 total used free shared buff/cache available Mem: 7.6Gi 220Mi 7.1Gi 24Mi 299Mi 7.3Gi Swap: 99Mi 0B 99Mi #Mem:が8GB弱ならば、RAM-8GB版になる #releaseの詳細 cat /etc/os-release #出力 PRETTY_NAME="Debian GNU/Linux 10 (buster)" NAME="Debian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" #まだ、debianのままになっている #ブートコード(rpi-eeprom)の状況 cat /etc/default/rpi-eeprom-update #出力 FIRMWARE_RELEASE_STATUS="stable" #ケースとしてPI4-CASE-ARGON-ONEを使用している場合、以下を実行する: curl https://download.argon40.com/argon1.sh | bash #<------------------------------------------ #出力例: out: *************************** Argon One Setup Completed. *************************** You may need to reboot for changes to take effect Use argonone-config to configure fan Use argonone-uninstall to uninstall #>------------------------------------------ argonone-ir #<------------------------------------------ #出力例: -------------------------------- Argon One IR Configuration Tool -------------------------------- WARNING: This only supports NEC protocol only. Press Y to continue:Y Thank you. Select remote control to configure: 1. Configure Remote ON/OFF Button 2. Cancel Enter Number (1-2):1 Select remote control to configure: 1. Use Argon Remote ON/OFF Button 2. Use Custom Remote ON/OFF Button 3. Cancel Enter Number (1-3):1 Updating Device... Thank you. #>------------------------------------------ sudo apt update sudo apt install net-tools sudo apt install git curl sudo apt install gcc-arm-none-eabi build-essential sudo apt install cmake sudo apt install libusb-dev sudo apt install libusb-1.0-0-dev sudo apt install picocom sudo apt install python3-distutils sudo apt install python3-venv pip3 install pyserial #bt(bootterm)のインストール mkdir ~/tools/bt cd ~/tools/bt git clone https://github.com/wtarreau/bootterm cd bootterm make sudo make install #64bitsのライブラリのインストール sudo dpkg --add-architecture armhf sudo apt install libstdc++6-8-dbg:armhf sudo apt install libstdc++:armhf

platformioのインストール

以下の手順を実行する:

mkdir ~/pio_ws cd ~/pio_ws python3 -m venv pio_env source pio_env/bin/activate pip3 install platformio #インストール後も、このツールを使用する場合 #同じディレクトリで以下を実行する: #source pio_env/bin/activate # 「source」は、「.」でも良い #udev登録 #以下を実行して、udevのrulesを登録する: curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules sudo udevadm control --reload-rules sudo usermod -a -G dialout $USER sudo usermod -a -G plugdev $USER

platformio.iniの変更

基本的には、そのまま使用可能だが、ARM64bitsライブラリの整備状況や実行環境の違いから以下の修正が必要である:

1.ARM系コンパイラを使用する場合、最新のものが用意されていないので platformio.iniに以下を追加する:
(古いバージョンを使用する)

platform_packages = toolchain-gccarmnoneeabi @ 1.50401.1

2.シリアルポートは(rpiの場合、別のシリアルが有効になっているので)明示する必要がある。したがって以下をplatformio.iniに追加する必要がある:

upload_port = /dev/ttyACM0

3.プロジェクト・ディレクトリごと外部から持ってきた場合、以下の手順で、いったん環境を消去する必要がある:

cd proj_dir #環境の消去 rm -r .pio #必要ツールのダウンロード pio run -t clean

ブート後のディスク関連の状況(参考)

ネット情報を見ているとブートできない状況もあるようなので、ブートに成功した状況を以下に挙げる:

M.2-SSD boot時

$ lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M |__ Port 2: Dev 2, If 0, Class=Mass Storage, Driver=uas, 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M $ lsusb Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub $ cat /boot/cmdline.txt console=serial0,115200 console=tty1 root=PARTUUID=089c4630-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles $ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 458G 7.1G 427G 2% / devtmpfs 3.7G 0 3.7G 0% /dev tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 3.9G 8.6M 3.9G 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/sda1 253M 30M 223M 12% /boot tmpfs 782M 4.0K 782M 1% /run/user/1000 $ sudo dd if=/dev/zero of=./dd.tmp ibs=1M obs=1M count=1024 status=progress 920649728 bytes (921 MB, 878 MiB) copied, 4 s, 230 MB/s 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.93637 s, 155 MB/s #M.2-SSDの速度として、155 MB/sくらい出ている

USB boot時(その1)

$ dd if=/dev/zero of=./dd.tmp ibs=1M obs=1M count=1024 status=progress 939524096 bytes (940 MB, 896 MiB) copied, 4 s, 235 MB/s 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 35.7583 s, 30.0 MB/s #USBの速度として、30 MB/sくらい出ている

USB boot時(その2,別デバイス)

$ sudo dd if=/dev/zero of=./dd.tmp ibs=1M obs=1M count=1024 status=progress 1067450368 bytes (1.1 GB, 1018 MiB) copied, 68 s, 15.7 MB/s 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 73.9804 s, 14.5 MB/s #USBの速度として、14.5 MB/sくらい出ている

上のようにUSBはデバイスによって速度が大きく異なるようだ。
(乱暴な言い方だと、同じメーカでも価格が高いほうが速いようだ)

SSD boot時

$ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 458G 7.1G 427G 2% / devtmpfs 3.7G 0 3.7G 0% /dev tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 3.9G 8.6M 3.9G 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/sda1 253M 30M 223M 12% /boot tmpfs 782M 4.0K 782M 1% /run/user/1000 $ lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M |__ Port 2: Dev 2, If 0, Class=Mass Storage, Driver=uas, 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M $ lsusb Bus 002 Device 002: ID 174c:1153 ASMedia Technology Inc. ASM1153 SATA 3Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub $ cat /boot/cmdline.txt console=serial0,115200 console=tty1 root=PARTUUID=a77ed9b6-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles $ sudo dd if=/dev/zero of=./dd.tmp ibs=1M obs=1M count=1024 status=progress 921698304 bytes (922 MB, 879 MiB) copied, 4 s, 230 MB/s 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 7.47227 s, 144 MB/s #SSDの速度として、144 MB/sくらい出ている

(1)HDDアダプターとして以下を使用してブートに成功した。
USB3.0接続 2.5型 SATA SSD/HDDケース(ホワイト)
(2)以下は同じSSDを使用してもブートが失敗した。
MOBILE BOX USB3.0接続 SATA6G 2.5インチHDD/SSDケース (CMB25U3SV6G / CMB25U3GD6G / CMB25U3BK6G / CMB25U3BL6G / CMB25U3RD6G)

SSD boot時
(SSDは、そのままで、Driverをuasからusb-storageに変更した例)

$ lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M |__ Port 2: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage(←ここが変更になっている), 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M $ lsusb Bus 002 Device 002: ID 174c:1153 ASMedia Technology Inc. ASM1153 SATA 3Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub $ cat /boot/cmdline.txt usb-storage.quirks=174c:1153:u console=serial0,115200 console=tty1 root=PARTUUID=a77ed9b6-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles #↑「usb-storage.quirks=...」によって、usb-storageに切り替わっている sudo dd if=/dev/zero of=./dd.tmp ibs=1M obs=1M count=1024 status=progress 931135488 bytes (931 MB, 888 MiB) copied, 4 s, 233 MB/s 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 9.21296 s, 117 MB/s #SSDの速度として、117 MB/sくらい出ている #Driverがusb-strageになっているので若干遅くなっている?

SSD-bootを成功させるヒント(まとめ)

1.ブートディスク作成には[SD Card Copier]を使用する。
2.HDDアダプター(SATA SSD/HDDケース)にブート成功/失敗が依存する。
(つまり、ブート成功実績があるものを採用する)
3.HDDアダプターの採用チップが「ASMedia Technology Inc」製のものはブートが成功するようだ。

CPUクロック状況

以下の手順でCPUクロックの状況を知ることができる:

#ユーティリティをインストールする sudo apt install cpufrequtils #CPUガバナーを確認する sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor #出力 ondemand #CPUクロックの設定を確認する cpufreq-info | grep "hardware limits" #出力 hardware limits: 600 MHz - 1.50 GHz hardware limits: 600 MHz - 1.50 GHz hardware limits: 600 MHz - 1.50 GHz hardware limits: 600 MHz - 1.50 GHz #実作のクロックを測定する場合 vcgencmd measure_clock arm #出力 frequency(48)=600117184 #1秒毎に実作のクロックを測定する場合 watch -n 1 vcgencmd measure_clock arm #1秒ごとのクロックの変化が表示される #別のセッションで重い処理が動くとクロックが高くなるのが測定できる

参照:How to overclock Raspberry Pi 4

なお、CPUガバナーの設定には ondemand 以外にも、 performance conservativeがあり、 以下のような動作になる:

  • performance: 1.50 GHz固定
  • ondemand: 600MHz 〜 1.50 GHz可変 (負荷に応じて変動)
  • conservative: 600MHz 〜 1.50 GHz可変 (負荷に応じてゆっくりと変動)
  • powersave: 600Mhz固定

32bits SSD boot 方法(おまけ)

32bitsでSSD-bootする場合、 既にeepromが、USB/SSD-bootできる状態になっているので、32bitsのUSB-boot用USBを作り、それでブートしたあと、VNCでログインして、「SD Card Copier」で ブートしたUSBの内容を接続したSSDにコピーすると、 boot-SSDができあがる。

実際には以下の手順になる:

HostPC: 0.32bitsイメージをダウンロードする cd ~/Downloads wget https://downloads.raspberrypi.org/raspios_full_armhf/images/raspios_full_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-full.zip 1.書き込むツール(Etcher)で上でダウンロードしたイメージをUSBにコピーする 2.コピーしたUSBを上で説明した変更を施す。 rpi: 3.このUSBをrpiに挿してブートする。 4.ブート後、raspi-configで、VNCを有効にする。 5.rebootする。 6.VNCでログインする。 7.ブートSSDにしたいSSDを接続する。 8.「SD Card Copier」で、ブートしているUSBの内容を接続しているSSDにコピーする。

32bits SSD boot後の出力例:

$ uname -a Linux xxxx 5.10.17-v7l+ #1421 SMP Thu May 27 14:00:13 BST 2021 armv7l GNU/Linux $ free -h total used free shared buff/cache available Mem: 7.7Gi 151Mi 7.1Gi 30Mi 410Mi 7.3Gi Swap: 99Mi 0B 99Mi df -h Filesystem Size Used Avail Use% Mounted on /dev/root 458G 6.9G 428G 2% / devtmpfs 3.8G 0 3.8G 0% /dev tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 3.9G 8.6M 3.9G 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/sda1 253M 48M 205M 19% /boot tmpfs 788M 4.0K 788M 1% /run/user/1000 $ sudo dd if=/dev/zero of=./dd.tmp ibs=1M obs=1M count=1024 status=progress 989855744 bytes (990 MB, 944 MiB) copied, 6 s, 165 MB/s 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.5634 s, 164 MB/s #USBの速度として、164 MB/sくらい出ている #32bitesのほうが64bitsよりも若干速いようだ。

参照URL

Pi OS 64 Bit 5/27/2021 release and libstdc++ #156
arduinoフレームワーク用platformio.ini集

raspi-config
Raspberry Pi 4 bootloader configuration
USB mass storage boot
NVMe SSD Boot (BETA)(CM4 only)

PI4-CASE-ARGON-ONE-M.2
PI4-CASE-ARGON-ONE

USB起動のRaspberry PiでアクセスLEDを点滅をさせない方法
64ビット版Raspberry Pi OSベータテスト版を動かしてみました

SSD関連:
ラズパイ4 で使える外付け2.5インチケースは?
ラズパイ4をUSB接続のSSDから起動する方法(USBブート)
Raspberry Pi 4でUSB3.0接続のSSDがとても遅い

以上

続きを読む "Headless RaspberryPi(64bits)インストール方法(USB/SSD boot)"

| | コメント (0)

2021年4月 1日 (木)

Arduino-IDEでPicoを動かす

2021/4/29
earlephilhower版専用になるがMulticoreのスケッチを追加した。

2021/4/23
もう一つの実装であるarduino純正ボード・ライブラリでの使用方法を追加した。
また、書き込みでエラーになるので、その解決方法についても記述した。

2021/4/5+
Arduno-IDEのwindows版でPicoの書き込みで
エラーになる場合の対応方法を追加した。

2021/4/4
LittleFSを使用したスケッチを追加した。

2021/4/3+
動作確認したスケッチを追加した。

2021/4/1+
初版

Pico Arduino Install

Pico Arduino Install

概要

Arduino-IDEでPicoを動かす。
ホスト環境は、ubuntu20.04とする。
なお、Arduino-IDEの最新版がインストール済みのものとする。

linuxのArduino-IDEのインストールについては以下を参照のこと。
Install the Arduino Software (IDE) on Linux

本記事は、linux版Arduino-IDEについて記述したものであるが、 ほとんど、そのままwindows版でも適応可能である。

ボード情報(*.json)のインストール

Arduino-IDEを起動して以下を実行する:
1.[ファイル]/[環境設定]を選択する
2.画面の「追加のボードマネージャーのURL」に以下を入力(追加)する

https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json # 今後、このjsonを利用したものをearlephilhower版と呼ぶことにする。

3.入力後、[OK]をクリックする
4.[ツール]/[ボード]/[ボードマネージャー]を選択する
5.検索欄に「pico」と入力する
6.検索結果から「Raspberry Pi Pico/RP2040」を選び、[インストール]をクリックする
7.インストール後、[閉じる]をクリックする

8.[ツール]/[ボード]/[Raspberry RP2040 boards]/[Raspberry Pi Pico]を選択する

以上で、ボードとして[Raspberry PiPico]が選択されたことになる。

なお、これ以外に以下のボードが選択できる:

Raspberry Pi Pico Raspberry Pi Pico (Picoprobe) Adafruit Feather RP2040 Adafruit Feather RP2040 (Picoprobe) Generic PR2040 Generic PR2040 (Picoprobe)

「(Picoprobe)」付きは、書き込みにopenocd(picoprobe)を使用するものになる。

Picoprobeを使った書き込み

Picoprobeを接続した場合、Arduino-IDEでボードを「Raspberry Pi Pico (Picoprobe)」を切り替える。その後は従来どおりの操作で書き込みができる。

以下、書き込み時の出力例:

<省略> Open On-Chip Debugger 0.10.0+dev-gd58c2ef5e-dirty (2021-03-28-18:41) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : only one transport option; autoselect 'swd' Warn : Transport "swd" was already selected adapter speed: 5000 kHz Info : Hardware thread awareness created Info : Hardware thread awareness created Info : RP2040 Flash Bank Command Info : clock speed 5000 kHz Info : SWD DPIDR 0x0bc12477 Info : SWD DLPIDR 0x00000001 Info : SWD DPIDR 0x0bc12477 Info : SWD DLPIDR 0x10000001 Info : rp2040.core0: hardware has 4 breakpoints, 2 watchpoints Info : rp2040.core1: hardware has 4 breakpoints, 2 watchpoints Info : starting gdb server for rp2040.core0 on 3333 Info : Listening on port 3333 for gdb connections target halted due to debug-request, current mode: Thread xPSR: 0xf1000000 pc: 0x000000ee msp: 0x20041f00 target halted due to debug-request, current mode: Thread xPSR: 0xf1000000 pc: 0x000000ee msp: 0x20041f00 ** Programming Started ** Info : RP2040 B0 Flash Probe: 2097152 bytes @10000000, in 512 sectors target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00 ... <省略> ... target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00 target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00 ** Programming Finished ** ** Verify Started ** target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00 target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00 ** Verified OK ** ** Resetting Target ** shutdown command invoked Info : SWD DPIDR 0x0bc12477 Info : SWD DLPIDR 0x00000001

留意点:
・シリアルを使っているスケッチは、USBシリアルを前提にしているので、そのままでは動かない。
・picoprobe接続時でもシリアルが利用可能だが、USBシリアルではなく、普通のシリアルにpicobrobe経由で接続している。(したがって、picoprobe経由でシリアルを使用する場合、スケッチの「Serial」を「Serial1」に置き換えると使用できる)

サンプルスケッチ

ボード設定が完了した後は、通常のArduinoボードとして使用できる。
リセットボタンがないので、リセットボタンを押されることを前提にしているスケッチは、無限ループにするなどの工夫が必要となる。
なお、(Picoprobeを使用していない場合は)書き込み前に書き込み用ストレージ(RPI-RP2)が見える状態にする必要がある。
# ただし、ボードのUSBシリアルが有効になっている場合、
# 自動的にリセットするのでbootselボタンを押してのUSBの抜き差しは
# 不要となる

以下、実際に動かしたスケッチを挙げる:

ASCIITablePico.ino

/* ASCII table Prints out byte values in all possible formats: - as raw binary values - as ASCII-encoded decimal, hex, octal, and binary values For more on ASCII, see http://www.asciitable.com and http://en.wikipedia.org/wiki/ASCII The circuit: No external hardware needed. created 2006 by Nicholas Zambetti <http://www.zambetti.com> modified 9 Apr 2012 by Tom Igoe This example code is in the public domain. http://www.arduino.cc/en/Tutorial/ASCIITable */ void setup() { //Initialize serial and wait for port to open: //Serial.begin(9600); Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // prints title with ending line break Serial.println("ASCII Table ~ Character Map"); } // first visible ASCIIcharacter '!' is number 33: int thisByte = 33; // you can also write ASCII characters in single quotes. // for example, '!' is the same as 33, so you could also use this: // int thisByte = '!'; void loop() { // prints value unaltered, i.e. the raw binary version of the byte. // The Serial Monitor interprets all bytes as ASCII, so 33, the first number, // will show up as '!' Serial.write(thisByte); Serial.print(", dec: "); // prints value as string as an ASCII-encoded decimal (base 10). // Decimal is the default format for Serial.print() and Serial.println(), // so no modifier is needed: Serial.print(thisByte); // But you can declare the modifier for decimal if you want to. // this also works if you uncomment it: // Serial.print(thisByte, DEC); Serial.print(", hex: "); // prints value as string in hexadecimal (base 16): Serial.print(thisByte, HEX); Serial.print(", oct: "); // prints value as string in octal (base 8); Serial.print(thisByte, OCT); Serial.print(", bin: "); // prints value as string in binary (base 2) also prints ending line break: Serial.println(thisByte, BIN); // if printed last visible character '~' or 126, stop: if (thisByte == 126) { // you could also use if (thisByte == '~') { thisByte = 33-1; Serial.println("----------------------------------------------"); Serial.println(""); delay(500); /* // This loop loops forever and does nothing while (true) { continue; } */ } // go on to the next character thisByte++; }

・標準に提供されているスケッチを無限ループにしたもの。
・シリアルはUSBシリアルを使用する。

Blink.ino

/* Blink Turns an LED on for one second, then off for one second, repeatedly. Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to the correct LED pin independent of which board is used. If you want to know what pin the on-board LED is connected to on your Arduino model, check the Technical Specs of your board at: https://www.arduino.cc/en/Main/Products modified 8 May 2014 by Scott Fitzgerald modified 2 Sep 2016 by Arturo Guadalupi modified 8 Sep 2016 by Colby Newman This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Blink */ // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }

・標準に提供されているスケッチが無修正で動作する。

bootselBlink.ino
bootselボタンをLED点滅のボタンに使用したスケッチ(トグル動作)

// bootselBlink int toggle = false; void setup() { Serial.begin(115200); delay(5000); // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); //Serial.println("I dare you to hit the BOOTSEL button..."); } int c = 0; void loop() { if (toggle) digitalWrite(LED_BUILTIN, HIGH); else digitalWrite(LED_BUILTIN, LOW); if (BOOTSEL) { Serial.printf("You pressed BOOTSEL %d times!\n", ++c); toggle = !toggle; // Wait for BOOTSEL to be released while (BOOTSEL) { delay(1); } } }

temperature.ino
CPUのコア温度を測ってシリアルに出力するスケッチ

/* Released into the public domain */ void setup() { Serial.begin(115200); delay(5000); } void loop() { Serial.printf("Core temperature: %2.1fC\n", analogReadTemp()); delay(1000); }

・このスケッチはearlephilhower版専用となる。

fade.ino

/* Fade This example shows how to fade the onboard Raspberry Pi Pico LED This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Fade */ int led = LED_BUILTIN; // the PWM pin the LED is attached to int brightness = 0; // how bright the LED is int fadeAmount = 5; // how many points to fade the LED by // the setup routine runs once when you press reset: void setup() { // declare pin to be an output: pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: void loop() { // set the brightness analogWrite(led, brightness); // change the brightness for next time through the loop: brightness = brightness + fadeAmount; // reverse the direction of the fading at the ends of the fade: if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } // wait for 30 milliseconds to see the dimming effect //delay(30); delay(15); }

morse_blinky.ino
シリアルから入力した文字列をLED点滅のモールス信号で出力するスケッチ
(pico-sdkのサンプルのaruduino移植版)

// ported into Arduino platform on 2021/4/4 // modified on 2021/2/6 /** * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ /* #include <stdio.h> #include "pico/stdlib.h" #include "hardware/gpio.h" */ char str[100]; const uint LED_PIN = 25; const uint DOT_PERIOD_MS = 100; const char *morse_letters[] = { ".-", // A "-...", // B "-.-.", // C "-..", // D ".", // E "..-.", // F "--.", // G "....", // H "..", // I ".---", // J "-.-", // K ".-..", // L "--", // M "-.", // N "---", // O ".--.", // P "--.-", // Q ".-.", // R "...", // S "-", // T "..-", // U "...-", // V ".--", // W "-..-", // X "-.--", // Y "--.." // Z }; // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); //Initialize serial and wait for port to open: Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } } void put_morse_letter(const char *pattern) { for (; *pattern; ++pattern) { //gpio_put(LED_PIN, 1); digitalWrite(LED_BUILTIN, HIGH); if (*pattern == '.') //sleep_ms(DOT_PERIOD_MS); delay(DOT_PERIOD_MS); else //sleep_ms(DOT_PERIOD_MS * 3); delay(DOT_PERIOD_MS * 3); //gpio_put(LED_PIN, 0); digitalWrite(LED_BUILTIN, LOW); //sleep_ms(DOT_PERIOD_MS * 1); delay(DOT_PERIOD_MS * 1); } //sleep_ms(DOT_PERIOD_MS * 2); delay(DOT_PERIOD_MS * 2); } void put_morse_str(const char *str) { for (; *str; ++str) { if (*str >= 'A' && *str <= 'Z') { put_morse_letter(morse_letters[*str - 'A']); } else if (*str >= 'a' && *str <= 'z') { put_morse_letter(morse_letters[*str - 'a']); } else if (*str == ' ') { //sleep_ms(DOT_PERIOD_MS * 4); delay(DOT_PERIOD_MS * 4); } } } void loop() { Serial.printf("Enter String for Morse\n"); delay(1000); if (Serial.available()){ String sline = Serial.readStringUntil('\n'); sline.toCharArray(str, 100); Serial.printf("morse: %s\n", str); put_morse_str(str); } } /* int main() { stdio_init_all(); gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); while (true) { printf("Enter String for Morse\n"); fflush(stdin); scanf("%s",str); //gets(str); // does not work?? printf("morse: %s\n", str); //puts(str); //put_morse_str("Hello world"); put_morse_str(str); //sleep_ms(1000); } } */

内蔵ファイルシステム(FLASH)を使用したスケッチ

Pico用のLittleFSの書き込みツールを以下の手順でインストールする:

cd ~Downloads wget https://github.com/earlephilhower/arduino-pico-littlefs-plugin/releases/download/0.2.0/PicoLittleFS-0.2.0.zip # ダウンロードしたzipを解凍して # そのなかの picolittlefs.jar を次のディレクトリにコピーする mkdir -p ~/Arduino/tools/PicoLittleFS/tool cd ~/Arduino/tools/PicoLittleFS/tool #確認 ls picolittlefs.jar # Arduino-IDEを再起動する

スケッチのディレクトリ「FSUploadPico」にファイルシステムのデータ用の ディクトリ「data」を作り、保存したいファイルを置く。

cd FSUploadPico mkdir data cd data gedit file1.txt #任意のテキスト内容を編集する

FSUploadPico.ino

// Released to the public domain // // This sketch will read an uploaded file and increment a counter file // each time the sketch is booted. // Be sure to install the Pico LittleFS Data Upload extension for the // Arduino IDE from: // https://github.com/earlephilhower/arduino-pico-littlefs-plugin/ // The latest release is available from: // https://github.com/earlephilhower/arduino-pico-littlefs-plugin/releases // Before running: // 1) Select Tools->Flash Size->(some size with a FS/filesystem) // 2) Use the Tools->Pico Sketch Data Upload tool to transfer the contents of // the sketch data directory to the Pico #include <LittleFS.h> void setup() { Serial.begin(115200); delay(5000); LittleFS.begin(); char buff[32]; int cnt = 1; File f = LittleFS.open("counts.txt", "r"); if (f) { bzero(buff, 32); if (f.read((uint8_t *)buff, 31)) { sscanf(buff, "%d", &cnt); Serial.printf("I have been run %d times\n", cnt); } f.close(); } cnt++; sprintf(buff, "%d\n", cnt); f = LittleFS.open("counts.txt", "w"); if (f) { f.write(buff, strlen(buff)); f.close(); } Serial.println("---------------"); while(true) { File i = LittleFS.open("file1.txt", "r"); if (i) { while (i.available()) { Serial.write(i.read()); } Serial.println("---------------"); i.close(); } } // while forever } void loop() { }

・リセットボタンがないのでシリアル出力部分を無限ループに変更した。
・ボードのライブラリが最新版である必要がある。(ボードマネージャーで更新する)

書き込みと実行:
以下の手順でdata書き込みとスケッチの書き込みを行なう:
(1)Arduino-IDEで[ツール(tools)]/[Flash Size]で任意(ゼロ以外)を設定する
(2)Arduino-IDEで[ツール(tools)]/[PicoLittleFS Data Upload]を選択して dataディレクトリの内容をPicoのflashに書き込む
(3)書き込み(Upload)アイコンを押してスケッチのコンパイルと書き込みを実行する

出力例(USBシリアル):

# 以下のfile1.txtの内容を繰り返し出力する Hello! Welcome to the Raspberry Pi Pico using arduino-pico! this is LittleFS test#1. this is LittleFS test#2. this is LittleFS test#3. this is LittleFS test#4. this is LittleFS test#5. this is LittleFS test#6.

windows版Arduino-IDEでの書き込みエラーの対応方法

windows版Arduino-IDEでは、動作環境によっては、Pico書き込み時にエラーになり書き込めないことがある。

これは、windowsのドライブのボリューム名として、半角カタカナが使われている場合、 書き込みツールとして使用しているuf2conv.pyでutf8文字列変換がエラーになっていることが原因である。

この対応として、日本語のボリューム名を英語などに変更することで、エラーを回避でき、書き込みが正常に動作するようになる。

または、ボリューム名を(手動で)変更せずにwindowsのシステム言語を英語に変更することでボリューム名も英語に変更することで書き込みが可能になる。
ここでは、システム言語を変更する方法でエラーを回避する。

システム言語を英語にする方法については以下などを参照のこと:
Windows 10 表示言語を英語版にする

重要な注意:
[Windows display], [Apps & websites]のみを英語に変更すること。 他も英語にすると日本語キーボードなどが使用できなくなるなどの不都合が生じる。

参考:
日本語から英語にシステム言語を変更すると、uf2conv.pyの変数r(bytearray)の内容が以下のように変化する:(環境依存あり)

日本語の場合: b'DeviceID DriveType FileSystem VolumeName \r\r\nC: 3 NTFS Windows \r\r\nD: 3 NTFS \x83{\x83\x8a\x83\x85\x81[\x83\x80 \r\r\nE: 2 FAT RPI-RP2 \r\r\n\r\r\n' 英語の場合: b'DeviceID DriveType FileSystem VolumeName \r\r\nC: 3 NTFS Windows \r\r\nD: 3 NTFS Volume \r\r\nE: 2 FAT RPI-RP2 \r\r\n\r\r\n'

・この例ではドライブDのボリューム名が変化していることが分かる。
・「\x83{\x83\x8a\x83\x85\x81[\x83\x80」(83 7B 83 8A 83 85 81 5B 83 80)は半角カナの部分になる。

他の対応方法としては、uf2conv.pyの変数rの中の半角カナ部分をutf8変換可能な文字に置き換えるパッチが考えられる。
それには以下のように修正する:
uf2conv.py

#修正前 def to_str(b): return b.decode("utf-8") ↓ #修正後 def to_str(b): return b.decode("utf-8",errors="replace")


Multicore用スケッチ (2021/4/29)

PicoはDualCoreのCPUなので、2つのCPUをスケッチで動作させることができる。
以下のexamplesにあったものを掲載する。
examples(earlephilhower)

残念ながら自分の環境では1コア(core0)としてしか動作しなかった。
(今後のupdateでfixするものと思われる)

Multicore.ino

// Demonstrates a simple use of the setup1()/loop1() functions // for a multiprocessor run. // Will output something like, where C0 is running on core 0 and // C1 is on core 1, in parallel. // 11:23:07.507 -> C0: Blue leader standing by... // 11:23:07.507 -> C1: Red leader standing by... // 11:23:07.507 -> C1: Stay on target... // 11:23:08.008 -> C1: Stay on target... // 11:23:08.505 -> C0: Blue leader standing by... // 11:23:08.505 -> C1: Stay on target... // 11:23:09.007 -> C1: Stay on target... // 11:23:09.511 -> C0: Blue leader standing by... // 11:23:09.511 -> C1: Stay on target... // 11:23:10.015 -> C1: Stay on target... // Released to the public domain // The normal, core0 setup void setup() { Serial.begin(); delay(5000); } void loop() { Serial.printf("C0: Blue leader standing by...\n"); delay(1000); } // Running on core1 void setup1() { delay(5000); Serial.printf("C1: Red leader standing by...\n"); } void loop1() { Serial.printf("C1: Stay on target...\n"); delay(500); }

・このスケッチはearlephilhower版専用となる。

Arduino純正のボード・ライブラリを使用する(2021/4/23)

最近、Arduino純正のボード・ライブラリもサポートされたので、その使い方について述べる。
純正ライブラリなので.jsonの設定などは不要で、ボード・ライブラリのアップデートをするだけで良い。
(この版をearlephilhower版と区別するために純正版と呼ぶ)

ボード・ライブラリ設定は以下の手順で行なう:

(1)[ツール(tools)]/[ボードマネージャ]を選択する。 (2)「pico」で検索する。 (3)検索された候補のなかで[Arduino Mbed OS RP2040 Boards]を選択する。 (4)[インストール]をクリックする。 (5)[閉じる]をクリックする。

ボードを選択するためには以下の手順で行なう:

(1)[ツール(tools)]/[Arduino Mbed OS RP2040 Boards]/[Raspberry Pi Pico]を選択する。 (2)[ツール(tools)]/[シリアルポート]を選択する。

あとは、通常の方法でビルドと書き込みができる。

重要:
書き込み時にエラーになった場合、udev-ruleが登録されていない可能性があるので、
その場合、以下を実行してudev-ruleを登録する:

sudo ~/.arduino15/packages/arduino/hardware/mbed_rp2040/2.0.0/post_install.sh

書き込みが正常に動作すると以下のようなメッセージが出る:
(設定で「より詳細な情報を表示する:」で[書き込み]にチェックしている場合)

/home/xxxx/.arduino15/packages/arduino/tools/rp2040tools/1.0.2/rp2040load -v -D /tmp/arduino_build_yyyyy/zzzzz.ino.elf rp2040load 1.0.1 - compiled with go1.15.8 Loading into Flash: [==============================] 100%%

参考情報

earlephilhower版関連:
Arduino-Pico(Detailed Documentation)
examples(earlephilhower)

Pico-Arduino関連:
Arduino IDE support for RP2040 and Pico arrives
Display_Packをpico_arduinoで動かす

Arduino関連:
Arduino-Pico
Install the Arduino Software (IDE) on Linux
How to Program Raspberry Pi Pico With the Arduino IDE
pico-setup-windows installer
Arduino IDEライブラリのインストールとディレクトリ(フォルダ)構成 (Windows, Mac, Linux対応)

FS関連:
Arduino Pico LittleFS Filesystem Uploader
Filesystem
LittleFS
Arduino ESP8266 LittleFS Filesystem Uploader

OpenOCD関連:
PicoボードにPico_SDKでC言語をビルドする(Picoprobeの説明あり)
Debugging the Raspberry Pi Pico on Windows 10

Pico関連:
Raspberry Pi Pico – How to Interface (almost) Everything!

WSL2関連:
WSL2でRDPサーバーを動かす
WSL2でSSHサーバーを動かす
WSL2でのplatformioやPico-SDKの利用方法

python3関連:
How to permissively decode a UTF-8 bytearray?
bytes, bytearray/日本語エンコード名

その他:
文字コードの16進ダンプ

以上

続きを読む "Arduino-IDEでPicoを動かす"

| | コメント (0)

2020年11月23日 (月)

Headless_RaspberryPiでSambaサーバーを動かす

2020/11/23+
初版

Headless RaspberryPi Samba server

Headless RaspberryPi Samba server

概要

Headless_RaspberryPiでSambaサーバーを動かす。

インストール

sshでログインして以下の手順でインストールする:

sudo apt install samba

設定

/etc/samba/smb.conf を以下のように編集する:

# オリジナルをバックアップする sudo cp -p /etc/samba/smb.conf /etc/samba/smb.conf.org sudo nano /etc/samba/smb.conf

以下を[global]に以下を追加する:

[global] netbios name = rpizWH1

rpizWH1 は、実際に自分の環境に合わせて 変更する。
(windowsでアクセスするためのホスト名になる)

以下を末尾に追加する:

[Public] comment = RaspberryPi Zero path = /mnt/usb/Public guest ok = yes read only = no browsable = yes force user = pi [MUSICz] path = /mnt/usb/MUSICz guest ok = yes read only = no browsable = yes force user = pi [Photos] path = /mnt/usb/Photos guest ok = yes read only = no browsable = yes force user = pi

path は、共有したいディレクトリになる。
[xxxx] は、xxxxは共有名になる。
該当のディレクトリ名に合わせると分かりやすいと思う。

起動

以上の設定が完了したら 以下の手順で必要なデーモンを起動する:

sudo service smbd restart #「NetBIOS over TCP/IP」用デーモンを起動する # (windowsで使用しないなら不要) sudo service nmbd restart

動作確認

外部から共有名が見えることを以下の手順で確認する:
(外部のPCから)

sudo apt smbclient smbclient -L rpizWH1.local Enter WORKGROUP\xxxxx's password: ([改行]のみで良い) Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers Public Disk RaspberryPi Zero MUSICz Disk Photos Disk IPC$ IPC IPC Service (Samba 4.9.5-Debian) SMB1 disabled -- no workgroup available

外部からアクセス

・windowsからのアクセス
ネットワークから「¥¥ホスト名」(上の例で言うと¥¥rpizWH1)で アクセスすると上で定義した共有名が表示される。共有名をクリックすることで接続できる。

・ubuntuからのアクセス
[ファイル]の「+他の場所」をクリックして ネットワーク状況を表示すると sambaサーバーのホスト名(上の設定では「RPIZWH1」)が 表示される。 そのホスト名をクリックすると共有名が表示される。
共有名をクリックすると匿名ユーザーとして 「パスワードが必要です」と表示されるが、 そのまま、パスワード無しで[接続する(N)]をクリックすると 接続できる。

・mountしてアクセスする
以下の手順のマウントして使用する:
例:

# 必要なライブラリをインストールする sudo apt install cifs-utils # サーバーのIPアドレスを確認する ping rpizWH1.local PING rpizWH1.local (192.168.0.27) 56(84) バイトのデータ 64 バイト応答 送信元 192.168.0.27: icmp_seq=1 ttl=64 時間=8.65ミリ秒 64 バイト応答 送信元 192.168.0.27: icmp_seq=2 ttl=64 時間=18.2ミリ秒 64 バイト応答 送信元 192.168.0.27: icmp_seq=3 ttl=64 時間=8.86ミリ秒 ^C # 共有名MUSICzをマウントする sudo mount -t cifs //192.168.0.27/MUSICz ~/mnt/cifs/MUSICz # パスワードを聞かれるが、そのまま改行するとマウントできる。

参考URL

headless RaspberryPiインストール方法(v2)

USBストレージ関係:
Raspberry Pi: Mount USB Drive – Automatically

以上

続きを読む "Headless_RaspberryPiでSambaサーバーを動かす"

| | コメント (0)

2020年11月14日 (土)

Headless_RaspberryPiでPirateAudioを使用する

2020/11/18
USBストレージで日本語ディレクトリが 文字化けするのを修正するために mountのオプションを変更した。

2020/11/14
初版

Headless RaspberryPi PirateAudio

Headless RaspberryPi PirateAudio

概要

Headless_RaspberryPiで以下のPirateAudioを使用する。
これはMiniHat形式のサウンドボードで、headlessの音楽プレーヤーとしては、 Mopidyを使用しており、webブラウザーで Mopidyのhttpサーバーにアクセスすることで操作画面を実現している。
PCが起動していない場合は、スマフォのアプリ「Mopidy Mobile」で、PCのwebブラウザーと同様のことを実現しているので それを利用するとPC不要でスマフォがリモコンになって家電感覚で使用できる。

Pirate Audio: Headphone Amp for Raspberry Pi

Mopidyのインストール方法

MiniHatのボードをRaspberryPiZeroに取り付けたら起動したら sshでログインして以下の手順でインストールする:

git clone https://github.com/pimoroni/pirate-audio cd pirate-audio/mopidy sudo ./install.sh sudo reboot

再ブートしてsshでログインするとサウンドボードとして使用可能な状態に鳴る。

音楽用ストレージの接続

音楽ファイルはUSBストレージに置くことにして RaspberryPiZeroに(OTGケーブル経由で) 該当USBストレージを接続する。

再起動してもUSBストレージが自動的にマウントするように設定する。 そのために以下の手順を実行する:

# USBストレージを接続しておく # マウント・ポイントを作る。 sudo mkdir /mnt/usb # USBストレージのUUIDを確認する sudo blkid # 出力例 /dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="6284-658D" TYPE="vfat" PARTUUID="d53ecfcc-01" /dev/mmcblk0p2: LABEL="rootfs" UUID="3a324232-335f-4617-84c3-d4889840dc93" TYPE="ext4" PARTUUID="d53ecfcc-02" /dev/sda1: UUID="6208-164A" TYPE="vfat" PARTUUID="c3072e18-01" /dev/mmcblk0: PTUUID="d53ecfcc" PTTYPE="dos" # /dev/sda1のUUIDを確認し、それがUSBストレージのUUIDになる # /etc/fstabのバックアップをとる $ sudo cp /etc/fstab /etc/fstab.back # fstabにUSBストレージのUUIDを登録する sudo nano /etc/fstab

以下の内容になるように編集する:

proc /proc proc defaults 0 0 PARTUUID=d53ecfcc-01 /boot vfat defaults 0 2 PARTUUID=d53ecfcc-02 / ext4 defaults,noatime 0 1 UUID=6208-164A /mnt/usb vfat defaults,auto,users,rw,nofail,utf8,umask=000 0 0 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that

「UUID=6208-164A」のところは、自分のUSBストレージのUUIDに置き換える。
編集し終わったら再ブート(「sudo reboot」)して、sshでログインする。
以下のコマンドで自動的にマウントしていることを確認する:

ls /mnt/usb/MUSICs

ここでは、MUSICsというディレクトリがある前提だが 実際には、自分のUSBストレージのディレクトリにする。

/etc/mopidy/mopidy.confに
音楽ディレクトリを設定するために以下を実行する:

sudo nano /etc/mopidy/mopidy.conf

以下の部分を変更する:

[file] enabled = true media_dirs = /home/pi/Music 以下のように変更する: [file] enabled = true #media_dirs = /home/pi/Music media_dirs = /mnt/usb/MUSICs

「/mnt/usb/MUSICs」の部分は、自分の環境に合わせる。

webブラウザーで以下にアクセスする:
http://raspberry.local:6680/

# raspberryの部分は自分の設定したhostnameにする

表示されている画面から[iris]をクリックして画面を切り替えて Settingsの[Start local scan]をクリックする。

.confで指定したディレクトリ(/mnt/usb/MUSICs)をスキャンするので スキャン後、Browseをクリックするとディレクトリやファイルが選択できるので それを使って曲を選択する。

使い勝手は、スマフォのアプリ「Mopidy Mobile」のほうが良いので、こちらを使用することを勧める。 通常のアプリと異なり[Tracklist]に再生した曲をプールしてから再生する仕様になっているので注意のこと。(Playlistを使うときも、いったんTracklistにコピーしてから再生する)

InternetRadioを使う

インターネットラジオは、インターネットラジオのurlを登録したplaylistを作成し、それを再生時に指定する形になる。

以下、実際の登録の手順:

cd /var/lib/mopidy/m3u sudo nano radio.m3u8

以下の内容に編集する:

#EXTM3U #EXTINF:0,BBC World Service English http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-einws #EXTM3U #EXTINF:0,smoothjazz radio http://us3.internet-radio.com:8485/ #EXTM3U #EXTINF:0,Smooth Jazz Florida http://us4.internet-radio.com:8266/ #EXTM3U #EXTINF:0,Piano Letter http://222.122.178.186:1882/ #EXTM3U #EXTINF:0,DI Radio Digital Impulse - Blues http://5.39.71.159:8990/ #EXTM3U #EXTINF:0,MEGATON CAFE RADIO http://us2.internet-radio.com:8443/ #EXTM3U #EXTINF:0,Music Lake - Relaxation Music, Meditation, Focus, Chill, Nature Sounds http://104.251.118.50:8626/ #EXTM3U #EXTINF:0,RADIO ESTILO LEBLON (Easy listening) http://us4.internet-radio.com:8197/ #EXTM3U #EXTINF:0,Celtic Moon http://51.161.115.200:8096/ #EXTM3U #EXTINF:0,Asia DREAM Radio - Japan Hits http://184.75.212.82:1025/

1局が以下のような3行で表されている:

#EXTM3U #EXTINF:0,ラジオ局名 ラジオ局のURL

ラジオ局のURLの調べ方は以下を参照のこと:
headless_RaspberryPiをシンプルなinternet_radioにする

TuneInを聞く

サーバー側で以下の手順を実行する:

sudo python3 -m pip install Mopidy-TuneIn sudo reboot

再ブート後、サーバーに接続後、クライアントのBrowseやLibraryのところにTuneInのディレクトリができて、そこで再生したい放送局を選べる。

その他

他の音楽アプリでPirateAudioのDACを使う場合、(そのままだとリソースが競合してエラーになり動作しないので、いったん)sudo rebootする。

または、以下を実行してmopidyを止める:

sudo systemctl stop mopidy

参考URL

PirateAudio関係:
https://learn.pimoroni.com/tutorial/sandyj/getting-started-with-pirate-audio
https://shop.pimoroni.com/products/pirate-audio-headphone-amp
https://github.com/pimoroni/mopidy-pidi

USBストレージ関係:
Raspberry Pi: Mount USB Drive – Automatically

Mopidy関係:
Mopidy is an extensible music server written in Python.
Mopidy-Mobile

以上

続きを読む "Headless_RaspberryPiでPirateAudioを使用する"

| | コメント (0)

2020年11月 8日 (日)

Headless_RaspberryPiをVolumioをインストールする

2020/12/13
プラグインの説明を追加した。

2020/11/28
volumioのversion-up対応と トラブルシューティングupdateを 行った。

2020/11/21
volumioのAPIのurlの追加と トラブルシューティングを追加した。

2020/11/14
PirateAudioのボード使用時の 設定方法とサーバーのディレクトリ構成を追加した。

2020/11/8
初版

Headless RaspberryPi volumio

Headless RaspberryPi volumio

概要

Headless_RaspberryPiを以下のVolumioをインストールする。
これは、headlessの音楽プレーヤーで、webブラウザーで volumioのhttpサーバーにアクセスすることで操作画面を実現している。
PCが起動していない場合は、スマフォのアプリ「volumio」で、PCのwebブラウザーと同様のことを実現しているので それを利用するとPC不要でスマフォがリモコンになって家電感覚で使用できる。
また、shairport-syncを内蔵しているのでAirPlay_Receiver(server)として、 iPhoneなどからオーディオデータをWiFi経由で受信してRaspberryPiのオーディオ出力で再生できる。

volumio

インストール方法

volumioは、すでに動いているOSに何かをインストールする形ではなく 専用SDを作り、それをRaspberryPiに入れて、起動することで volumioが動く。

以下に専用SDの作成を方法を記述する:
(ホストPCとしてはubuntu20.04を使用している)

# 書き込み用SDをPCにセットする # 以下の命令で書き込みの/dev/mmcblkXを確認する lsblk -p ... ... /dev/mmcblk0 179:0 0 28.9G 1 disk # ここでは、/dev/mmcblk0 であることが分かる cd ~/Downloads wget http://updates.volumio.org/pi/volumio/2.853/volumio-2.853-2020-11-20-pi.img.zip # 以下で書き込むが、mmcblk0の部分は、自分の環境に合わせること unzip -p volumio-2.853-2020-11-20-pi.img.zip | sudo dd of=/dev/mmcblk0 bs=4M conv=fsync # この命令の実行での出力例 0+36405 レコード入力 0+36405 レコード出力 2936012800 bytes (2.9 GB, 2.7 GiB) copied, 215.227 s, 13.6 MB/s

以上で作成したSDをRspberryPiに入れて起動する。

ここでは以下のハード構成で確認した:

device#1:

RaspberryPi 2 Model B WiFi USB dongle (RaspberryPiで接続の実績があるもの) USB Audio Adoputor

device#2:

RaspberryPi 4 Model B PirateAudio(sound board)

初期設定

起動するとAP(アクセスポイント)として「volumio」という名前のSSIDが見えるので そこにWiFi接続する。(Password: volumio2)

接続したら、以下のurlをwebブラウザーでアクセスする。
http://volumio.local

すると、設定画面が表示されるので 以下のリンクの「FIRST CONNECTION TO THE WEB-UI」を参考に設定する。

https://volumio.github.io/docs/User_Manual/Quick_Start_Guide.html

SSH接続:

以下にwebブラウザーでアクセスして
http://volumio.local/dev
SSHの[Enable]をクリックする(無反応だが有効になる)

その状態で以下でSSHでログインする:

ssh volumio@volumio.local # パスワードは以下になる: パスワード:volumio rootのパスワード:volumio # タイムゾーンをJSTに変更する sudo dpkg-reconfigure tzdata # Asia/Tokyoを選択する # 時刻を確認する date # 設定画面でのネットワークの接続が完了していない場合、 # 時刻が狂っているが、この後、ネットワークの接続が # 完了すると、自動的に時刻が合うので、 # そのままでかまわない。 # kernelのバージョンの確認 uname -a Linux volumio 4.19.118-v7l+ #1311 SMP Mon Apr 27 14:26:42 BST 2020 armv7l GNU/Linux logout # この後、ホストPCの接続しているSSIDをvolumioから通常のものに変更する。

なお、volumio最新版では、RaspberryPiZero,RaspberryPi初代は、使用しているCPUをサポートしていないので 動作しない。

オーディオ出力テスト(ラジオ)

音楽データを用意しなくても、オーディオ出力のテストができるので インターネット・ラジオでオーディオ出力してみる。

操作画面の左側画面のメニューから以下を選択する:
・[ウェブラジオ]/[Volumio Selection]/[SmoothJazz Global Radio]

これでスピーカなどに音楽が出力されればOKである。
(音が出ない場合、その放送局のサービスが停止している可能性があるので、 別の局を選択してみる)

操作画面の音量スライダーで音量調整ができる。

スマフォのvolumioを起動しておくと、スマフォの音量ボリュームで 音量調整ができる。
(PCなどの操作画面の音量スライダーと連動して動く)

なお、音楽ファイルをUSBストレージに入れておき それを接続すると自動的に認識してくれるので [音楽ライブラリ]をクリックすると 接続しているUSBの内容が見えるので、 音楽ファイルを指定できる。

オーディオ出力テスト(AirPlay)

以下を参考にAirPlayで接続する。
(AirPlayデバイス名:volumio)
Headless_RaspberryPiをAirPlay_Receiverにする

スマフォのvolumioを起動しておくと、スマフォの音量ボリュームで 音量調整ができる。

PirateAudioボードを使用する

以下のボードを使用する際の設定について述べる:
Pirate Audio: Line-out for Raspberry Pi

サーバーにwebでアクセスして以下のように設定する:

設定/プレーバックオプション/ I2S DAC:ON DAC Model: HifiBerry-DAC

[保存]をクリックして「sudo reboot」する。 再度、クライアントからサーバーにアクセスする。

LineOut版は仕様として音量調整はできない。
音量調節は接続したアンプ(スピーカ)側で音量調整することになる。 Headphone版より(ヘッドフォンアンプがないので)音が良いような気がする。

ボードに付いているLCDは、サポートがないので、なにも表示しない。

なお、自分の環境は、ヒードシンク兼用のアルミケースにいれてあるが ゲタを履かせると、PirateAudioボードが問題なく刺せた。

NASサーバーの接続(マウント)

(1)[設定]の[ネットワークドライブ]を選択して、 スキャンを実行する。
(2)ネットワークにある共有名が現れるので それを指定してマウントする。
(guestでのアクセス可能に設定してあるNASサーバーであれば パスワード不要でマウントできる)

サーバーのディレクトリ構成

必要と思われるところを表示させてみる:

$ ls -l /var/lib/mpd/music/ total 0 lrwxrwxrwx 1 root root 13 Sep 25 05:42 INTERNAL -> /mnt/INTERNAL lrwxrwxrwx 1 root root 8 Sep 25 05:42 NAS -> /mnt/NAS lrwxrwxrwx 1 root root 8 Sep 25 05:42 USB -> /mnt/USB # ここにマウント・ポイントのリンクが置かれる $ ls /data INTERNAL backgrounds favourites laststates.json playlist queue albumart configuration flagfiles playerstate plugins $ ls /data/playlist/ jfolk miyuki radio # ここに作ったplaylistが置かれる $ cat /data/playlist/myuki cat: /data/playlist/myuki: No such file or directory volumio@vred:/$ cat /data/playlist/miyuki [{"service":"mpd","uri":"mnt/USB/MUSIC/MUSIC1/iTunes/iTunes Media/Music/中島みゆき/私の声が聞こえますか/12 時代.m4a","title":"時代","artist":"中島みゆき","album":"私の声が聞こえますか","albumart":"/albumart?cacheid=992&web=Miyuki%20Nakajima/%E7%A7%81%E3%81%AE%E5%A3%B0%E3%81%8C%E8%81%9E%E3%81%93%E3%81%88%E3%81%BE%E3%81%99%E3%81%8B/extralarge&path=%2Fmnt%2FUSB%2FMUSIC%2FMUSIC1%2FiTunes%2FiTunes%20Media%2FMusic%2F%E4%B8%AD%E5%B3%B6%E3%81%BF%E3%82%86%E3%81%8D%2F%E7%A7%81%E3%81%AE%E5%A3%B0%E3%81%8C%E8%81%9E%E3%81%93%E3%81%88%E3%81%BE%E3%81%99%E3%81%8B&icon=fa-tags&metadata=false"}] # ただし、上で表示したようにplain-textではなくjson形式になっている $ ls /data/favourites/ favourites radio-favourites

従来のplaylistをvolumioのjson形式に変換するツールが以下にある: https://github.com/suuuehgi/m3u2volumio
m3u2volumio - Translate .m3u files into a Volumio conform playlist. The intervention requires SSH.

まだ、動かしていないが便利そうである。

disk状況(例)

$ df -h Filesystem Size Used Avail Use% Mounted on /dev/mmcblk0p2 2.2G 811M 1.3G 39% /imgpart /dev/loop0 347M 347M 0 100% /static overlay 262M 39M 203M 16% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 2.0G 4.9M 2.0G 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup tmpfs 2.0G 32K 2.0G 1% /tmp tmpfs 2.0G 0 2.0G 0% /var/spool/cups tmpfs 20M 972K 20M 5% /var/log tmpfs 2.0G 0 2.0G 0% /var/spool/cups/tmp /dev/mmcblk0p1 61M 57M 3.4M 95% /boot /dev/sda1 115G 42G 74G 37% /media/B08A-B1E7 tmpfs 396M 0 396M 0% /run/user/1000 //RPIZWH1_WIN/MUSICz 29G 13G 16G 45% /mnt/NAS/MUSICz

/dev/sda1 は、マウントしているUSBストレージ、 //RPIZWH!_WIN/MUSICz は、マウントしているNASサーバーになる。

API for volumio

以下に、CLI、RESP_API,websocket_APIのドキュメントのリンクがある:
Command_Line_Client
REST_API
WebSocket_APIs

プラグイン

[設定]から[プラグイン/プラグインの検索]からプラグインがインストールできるが
ここでは[GPIO Buttoms][Backup&Restore Data]を紹介する。
[プラグインの検索]からプラグインをインストールした後
[プラグライン/インストール済みのプラグイン]を選択すると インストールしたプラグインの設定値を設定できる。

(1)[Backup&Restore Data]
設定画面でバックアップしたい項目をオンにして [Backup]を押すことにより、volumioの/mnt/INTERNALに volumio_data.tgzファイルとして保存される。
(プラグインの説明にはNASストレージに保存すると書いてあるが 実際には上のように保存される)

(2)[GPIO Buttons]
PirateAudioのボードを使用している場合
設定画面で以下のように設定する:
Enable Play/Pause: 5
Enable Previos: 6
設定した後、[保存]を押す。
これでボタンAがPlay/Pause、ボタンBがPreviousになる、

なお、PirateAudioのGPIOとして 16,20もあるが、設定しても動作しなかった。 (原因不明)

トラブルシューティング

(0)設定完了後もAPであるvolumioが現れる
WiFi設定しても、電波の状況などで接続が失敗すると volumioのAPが現れるようなので、その場合は、 再度、volumioに接続してWiFi設定をやり直す。
何度かして接続が成功するとAPのvolumioが現れなくなる。
そうしたら、volumio.localでwebアクセスして web-UIに入る。
(ホスト名を変更している場合、volumio.localのvolumioを変更しているホスト名にする)

(1)volumioのサーバー(mpd)が起動していない
sshログインできるがvolumioのサーバー(mpd)が起動しておらず
webブラウザーでアクセスできない状況になった。
これを解決するには、sshでログインして以下を実行する:

sudo /etc/init.d/mpd restart

webブラウザーでのユーザーインタフェースなどから
シャットダウンしないと、こうゆう状況が起きるようだ。

(2)playlistの保存が失敗に終わる
(3)NASサーバーのマウントが失敗する
真の原因が不明だがlinuxのdiskスペースが(見かけ上?)逼迫して、ファイル保存や マウントが失敗するようになる。
→ブートSDを作り直して再起動した。

参考URL

関連アプリ:
Volumio
有料(240円)のアプリになるがPCのwebブラウザーでやることをAndroidを使ってできる。
また、Androidの音量ボタンでvolumioの音量調整ができ、再生中のタイトルが表示されたりして便利である。
volumio自身がAirPlay対応しているのでAirPlayで接続して音楽再生しているときにもAndroidの音量ボタンでも音量調整ができる。
iPhone版は、以下になる:
volumio

分かりやすい紹介:
Raspberry Piをオーディオプレーヤーに!

PirateAudioのButtons関連:
https://github.com/pimoroni/mopidy-raspberry-gpio
https://www.raspberrypi.org/documentation/configuration/config-txt/gpio.md

以上

続きを読む "Headless_RaspberryPiをVolumioをインストールする"

| | コメント (0)

2020年11月 5日 (木)

Headless_RaspberryPiをAirPlay_Receiverにする

2020/11/7+
USBスピーカ(JBL Pebbles)を接続した際の 考慮すべきことを纏めて追加した。

2020/11/6
初版

Headless RaspberryPi AirPlay Receiver

Headless RaspberryPi AirPlay Receiver

概要

Headless_RaspberryPiをAirPlay_Receiverにする。
RaspberryPiをAirPlay_Receiver(server)にして、iPhoneなどからオーディオデータをWiFi経由で受信してRaspberryPiのオーディオ出力で再生する。
そのためにshairport-syncをインストールする。
(shairport-syncは、shairportの後継にあたる。なお、オリジナルのshairportは保守を停止している)

インストール方法

以下を実行する:

# 関連ライブラリやツールのインストール sudo apt update sudo apt install libshairport2 autoconf libtool libdaemon-dev sudo apt install git libpopt-dev libconfig-dev libasound2-dev libpulse-dev libavahi-client-dev libssl-dev libsoxr-dev # shairport-syncのビルド cd ~/Downloads git clone https://github.com/mikebrady/shairport-sync.git cd shairport-sync autoreconf -i -f ./configure --sysconfdir=/etc --with-alsa --with-pa --with-avahi --with-ssl=openssl --with-metadata --with-soxr --with-systemd make # ビルドしたバージョンの確認(表示) ./shairport-sync --version 3.3.7rc3-OpenSSL-Avahi-ALSA-pa-soxr-metadata-sysconfdir:/etc # 属性などの変更 sudo groupadd -r shairport-sync sudo useradd -r -M -g shairport-sync -s /usr/bin/nologin -G audio shairport-sync # インストール sudo make install # systemdへの登録状況を確認し、有効化する systemctl status shairport-sync sudo systemctl enable shairport-sync systemctl status shairport-sync # デフォルトのオーディオ出力の設定(.confの変更) cd /etc sudo cp shairport-sync.conf shairport-sync.conf.original sudo nano shairport-sync.conf #以下の内容を置き換える:

/etc/shairport-sync.conf

general = { name = "%h"; interpolation = "soxr"; } alsa = { output_device = "plughw:0"; mixer_device = "plughw:0"; }

上の内容は以下を意味する:
・AirPlayのデバイス名は、RaspberryPiのhostnameになる。
・"plughw:0"の部分は、実際にオーディオ出力するカード番号にする。

実際のカード番号を知るには以下を実行する:

$ aplay -l **** ハードウェアデバイス PLAYBACK のリスト **** カード 0: Device [USB Audio Device], デバイス 0: USB Audio [USB Audio] サブデバイス: 0/1 サブデバイス #0: subdevice #0 カード 1: b1 [bcm2835 HDMI 1], デバイス 0: bcm2835 HDMI 1 [bcm2835 HDMI 1] サブデバイス: 4/4 サブデバイス #0: subdevice #0 サブデバイス #1: subdevice #1 サブデバイス #2: subdevice #2 サブデバイス #3: subdevice #3 カード 2: Headphones [bcm2835 Headphones], デバイス 0: bcm2835 Headphones [bcm2835 Headphones] サブデバイス: 4/4 サブデバイス #0: subdevice #0 サブデバイス #1: subdevice #1 サブデバイス #2: subdevice #2 サブデバイス #3: subdevice #3

この例では、[USB Audio Device]にオーディを出力したいので、カード番号は0になり .confの設定値としては、"plughw:0"になる。

起動

起動する場合、以下を実行する:

sudo systemctl start shairport-sync # 設定(.conf)を変更した場合は以下を実行する: sudo systemctl restart shairport-sync

接続

iPhone、iPad、iPod touch から AirPlay でオーディオをストリーミングする」 を参考にして、iPhoneからRaspberryPiに接続する。上手くいけば、RaspberryPiの設定したオーディオ出力から音が出る。

トラブルシュート

・AirPlayとして接続してみて音が途切れるようなら
 .confの「interpolation = "soxr";」をコメントアウトすると改善する可能性がある。(行の先頭に「//」を付ける)
・AirPlayとして接続してみて最大音量が小さい場合、
以下の命令を実行して音量を調整する。

alsamixer

アプリの接続実績

動作したアプリ: YouTube,PrimeVideo,radiko,TVer,AmebaTV, YouTubeMusic (最初は「AirPlayのデバイス名が見えない(接続できず)」の状態だったが、そのうち接続できるようになった) 動作しないアプリ: ・Hulu 動画が止まって音だけ流れる

その他

shairport-syncを起動したらlogoutしても動いているので必要ならlogoutする。

logout

RaspberryPi起動時に自動でAirPlayサーバーを起動しておきたい場合は、
次のようにサービスに登録させておく。

sudo service shairport-sync start sudo systemctl enable shairport-sync.service

USBスピーカ(JBL Pebbles)を接続する

以下のUSBスピーカを接続した際の考慮点を纏めた:
JBL Pebbles

本スピーカは、音質は6000円くらいの価格のスピーカとしては 音質が良く評価できるが、音量調整については難がある。

以下、それについて述べる:

1.音量調整の挙動 (1)USBをPC(ubuntu20.04)に接続した場合、Pebblesの音量調整は動作する。 (Pebblesのツマミの動きに連動してPCの音量調整スライダーが動作する) ただし、調整幅が粗いので、微調整はアプリ側の音量調整を使うことになる。 [AUX IN]入力にスマフォのヘッドフォン出力などを接続すると 自動的にスマフォのヘッドフォン出力がPebbleのスピーカに流れる。 このときもPebblesの音量調整は有効で、調整可能である。 (2)USBをRaspberryPiに接続した場合、Pebblesの音量調整は動作しない。 [AUX IN]入力にスマフォのヘッドフォン出力などを接続した場合も 同様に音量調整は動作しない。 (3)USBをPC(windows10)に接続した場合、Pebblesの音量調整は動作する。 (Pebblesのツマミの動きに連動してPCの音量調整スライダーが動作する) 「(1)のPC(ubuntu20.04)」のときよりも、調整幅が細かく使いやすい、 [AUX IN]入力にスマフォのヘッドフォン出力などを接続すると 自動的にスマフォのヘッドフォン出力がPebbleのスピーカに流れる。 このときもPebblesの音量調整は有効で、調整可能である。 以上、windows10に接続して使用するときは特に問題はない。 (4)USB接続をPCでなくUSB電源アダプターにした場合、 ([AUX IN]入力を使用する場合) Pebblesの音量調整は可能で調整幅が細かくなる。 (「(3)のPC(windows10)」のときと同様の調整幅になる) 2.結論 (1)USBスピーカとして使用している場合、 (=[AUX IN]に何も接続しない場合) PC(ubuntu20.02)に接続したときは、Pebblesの音響調整は可能。 RaspberryPiに接続した場合、音量調整は不可能。 これは、UBS音量コントロールのドライバの違いのせいと考えられる。 このため、RaspberryPiでAirPlay-Receiverを動かす場合、 sshでログインしてalsamixerで音量調整する。 (2)アナログ入力のパワード・スピーカとして使用している場合、 (=[AUX IN]にアナログのオーディオ出力を接続している場合) USBには電源としてUSB電源アダプターを接続することにより Pebblesの音量調整が有効になる。

参考URL

shairport-sync README

Raspberry Piにshairport-syncをインストールする
ラズパイをAirPlayサーバーにしてオーディオ環境を快適にしてみた

ざっくりとALSAとPulseAudioの関係
UbuntuStudioTips/Setup/UbuntuSoundSystem

Pirate Audio: Headphone Amp for Raspberry Pi
USB Audio Adapter - Works with Raspberry Pi

以上

続きを読む "Headless_RaspberryPiをAirPlay_Receiverにする"

| | コメント (0)

2020年11月 3日 (火)

Headless_RaspberryPiでAudio出力のデフォルトを変更する

2020/11/2+
初版

Headless RaspberryPi Audio Out Default

Headless RaspberryPi Audio Out Default

概要

Headless_RaspberryPiでAudio出力のデフォルトを変更する。
cliでのAudio出力のデフォルトを変更する方法を試行してきたが、どんなAudioデバイスに対しても汎用的に使える方法が見つからなかった。 そのためheadlessでもdesktopのvolumeアイコンをクリックして 出力先を変更することにしたので、その方法について述べる。

デフォルト変更方法

(1)desktopのvolumeアイコンをクリックする必要があるので VNCでログインする。

(2)ログイン後、RaspberryPiのデスクトップ画面の最上行のvolumeアイコンを右クリックして 出力先の選択メニューを表示させ、デフォルトにしたいデバイスを選択する。

選択メニューには以下のようなデバイスが表示されるので デフォルトにしたいデバイスを選択する:

Analog (フォンジャックを意味する) HDMI USB Audio Device (USB Audio Adaptorを接続している場合) Bluetooth Audioのデバイス名 (bluetoothで接続しいる場合) snd_rpi_hifiberry_dac (PirateAudioのMiniHatを刺している場合)

なお、bluetoothデバイスを選択した場合、アプリの設定が以下で述べるものと異なるので注意のこと。

bluetoothの場合は「RaspberryPiでBluetoothAudio(A2DP)を使用する」を参照のこと。

変更後の音の確認

以下の命令を実行してデフォルトにしたデバイスから音が出ていることを確認する:

aplay /usr/share/sounds/alsa/Front_Center.wav omxplayer -o alsa --vol -2000 http://us3.internet-radio.com:8485/ # vlcをインストールした場合、以下を実行する cvlc http://us3.internet-radio.com:8485/

各アプリの設定

以下のアプリでデフォルトにしたデバイスで音が出ない場合、 設定を確認して以下にする:

(1)vlc オーディオ設定: ALSA audio out オーディオデバイス: default (2)audacios Output plugin: ALSA output Setting: default (3)rthythmbox 出力先の設定なし、音は出ない (もともと使用不可?) (4)audacity Device/Interface Host: ALSA デバイス: default (5)webブラウザーからのyoutube 特に設定変更なしで音が出る

デフォルトの変更ならびに使用するアプリでのオーディオ出力を確認後は、VNCでログインする必要はなく、sshでログインできる。 そのときの音量調整は以下を実行して使用する:
(ただし、bluetoothを除く)

alsamixer

音を聞きながら調整したい場合は、もう一つのsshセッションを作り、 そのなかで、alsamixerを実行する。

参考URL

raspberrypi - Audio configuration
RaspberryPiでBluetoothAudio(A2DP)を使用する

ざっくりとALSAとPulseAudioの関係
UbuntuStudioTips/Setup/UbuntuSoundSystem

Pirate Audio: Headphone Amp for Raspberry Pi
USB Audio Adapter - Works with Raspberry Pi

以上

続きを読む "Headless_RaspberryPiでAudio出力のデフォルトを変更する"

| | コメント (0)

2020年11月 1日 (日)

RaspberryPiでBluetoothAudio(A2DP)を使用する

2020/11/1
初版

RaspberryPi Bluetooth Audio(A2DP)

RaspberryPi Bluetooth Audio(A2DP)

概要

RaspberryPiでBluetoothAudio(A2DP)を使用する。
BluetoothAudio(A2DP)の接続には苦労していたが 以下のバージョンの最新版では特に問題なく接続できたので紹介する。

Linux raspberry 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux

実際に本記事で使用したのはRaspberryPi4だが、RaspberryPiZeroでも状況は同様だと思われる。

接続方法

(0)接続したbluetoothデバイスの電源を入れて ペアリングモードにする。 (1)RaspberryPiの画面の最上行のbuletoothアイコンをクリックして 接続デバイスの検索、ペアリングを行なう。 (2)RaspberryPiの画面の最上行のvolumeアイコンを右クリックして 出力先の選択メニューを表示させ、上でペアリングしたbluetoothデバイス名を選択する。 以上で、bluetoothデバイスは接続状態になる。

各アプリの設定

(1)vlc オーディオ設定: 自動(または Pulseaudio出力) オーディオデバイス: デフォルト アプリの再起動で強制的に別のものが選択されるので再度(手動で)デフォルトに戻す。 以上の設定で再生時にbluetoothで音が出るようになる。 (2)audacios [出力プラグイン]を「ALSA出力」から「PulseAudio出力」に切り替えるべきだが、切り替えられない。(切り替えた途端に強制的にALSA出力に戻る) 以上の状況なので、bluetoothでは音が出ない。 (3)rthythmbox 出力先の設定なし、音は出ない (4)audacity [Device/Interface Host:]のところでALSAしか選択できない。 この状態でデフォルトにする。 以上の状況で、bluetoothでは音が出ない。 (5)webブラウザーからのyoutube 特に設定変更なしでbluetoothで音が出る

以上の状況なので、bluetoothで使えるアプリは、vlc、youtubeの2つになる。

(PCのubuntuでの)各アプリの設定

(1)vlc オーディオ設定: 自動(または Pulseaudio出力) オーディオデバイス: デフォルト 以上の設定で再生時にbluetoothで音が出るようになる。 (2)audacios [出力プラグイン]: PulseAudio出力 (RaspberyPiと異なり切り替えができる) 以上の設定で再生時にbluetoothで音が出るようになる (3)rthythmbox 出力先の設定なし、bluetoothで音は出る (4)audacity [Device/Interface Host:]のところでALSAしか選択できない。 この状態でデフォルトにする。 以上の状況でも、bluetoothで音は出る。 (5)webブラウザーからのyoutube 特に設定変更なしでbluetoothで音が出る

言うまでもないことだが、すべてのアプリでbluetoothで音が出る。

考察

PulseAudioの実装がPCのものと比べて不完全でアプリによってはALSAにフォールバックして、その結果、bluetoothから音が出ないと推定できる。

強制的にでもPulseAudioに切り替えられるものは、実装が不完全とはいえ、bluetoothで音を出すには十分の機能をもっているので、音が出る。

今後、RaspberryPiのPulesAudioの実装が完全になることを期待したい。

参考URL

ざっくりとALSAとPulseAudioの関係
UbuntuStudioTips/Setup/UbuntuSoundSystem

以上

続きを読む "RaspberryPiでBluetoothAudio(A2DP)を使用する"

| | コメント (0)

2020年10月31日 (土)

headless_RaspberryPiにTizoniaをインストールする

2020/11/3
YouTubeのplaylistの再生例を追加した。

2020/10/31+++
初版

headless RaspberryPi Tizonia

headless RaspberryPi Tizonia

概要

headless_RaspberryPiに以下のTizoniaをインストールする。
Tizoniaは音楽ストリーング再生アプリで、ここではアカウント情報を 登録しなくても使用できるYouTube音楽再生、TuneIn再生などを行なう。

Tizonia - Cloud music from the Linux terminal

インストール

インストールするRaspberryPiは、
「sudo raspi-config」でVNCを有効にしておくこと。
その後、sshでログインして、以下を手順を実行する;

cd ~/Downloads curl -kL https://github.com/tizonia/tizonia-openmax-il/raw/master/tools/install.sh | bash

RastberryPi向けのconfの修正

~/.config/tizona/tizonia.conf
以下のように修正する:

# - OMX.Aratelia.audio_renderer.pulseaudio.pcm # - OMX.Aratelia.audio_renderer.alsa.pcm default-audio-renderer = OMX.Aratelia.audio_renderer.alsa.pcm

長いファイルなので、コメントの「「OMX.Aratelia.audio_renderer」を手がかりに修正位置を探す。(audio_rendererをpulseaudioからalsaに修正する)

参照:
https://docs.tizonia.org/manual/raspberrypi.html
Raspberry Pi / CONFIGURATION

オーディオ出力先の変更

オーディオ出力は、フォンジャックやUSBオーディオなどの選択肢があるが 出力先はVNCでログインしてボリュームアイコンを右クリックし出力先を選択する。選択後、VNCはログアウトしてかまわない。(SSHの接続は継続する)

出力先として以下のような選択肢がある:

Analog # PhoneJack USB Audio Device snd_rpi_hifiberry_dac # Pirate Audio MiniHat

以下を実行して音が出れば出力先の切り替えができていることになる:

omxplayer -o alsa --vol -2000 --loop http://us3.internet-radio.com:8485/ cvlc http://us3.internet-radio.com:8485/

音量は、以下のアプリを起動して調整する。
音を効きながら調整したい場合、もう1つのsshセッションを立ち上げ、そのなかで以下のアプリを起動する。

alsamixer

シンプルな再生例

一番簡単な再生方法は以下のようにストリーミングのurlを与えるやり方である:

tizonia http://us4.internet-radio.com:8266/

ストリーミングのurlの調べ方は以下を参照のこと:
headless_RaspberryPiをシンプルなinternet_radioにする

TuneIn再生例

tizonia --tunein-search 'radio marca' --tunein-type "stations" --tunein-keywords "tenerife" tizonia --tunein-location "Europe" --tunein-keywords "Spain" --tunein-keywords "Madrid" tizonia --tunein-local "Cambridge" --tunein-type "stations" --tunein-keywords "BBC" tizonia --tunein-music 'rock' --tunein-keywords "181.FM" --tunein-keywords "US" --tunein-type "stations" tizonia --tunein-sports "news" --tunein-type "shows" tizonia --tunein-podcasts "Classical Music" --tunein-keywords "global" tizonia --tunein-music 'Classic' --tunein-keywords "181.FM" --tunein-keywords "US" --tunein-type "stations" tizonia --tunein-music 'Blues' --tunein-keywords "181.FM" --tunein-keywords "US" --tunein-type "stations" tizonia --tunein-music 'Jazz' --tunein-keywords "US" --tunein-type "stations"

TuneIn使用時のオプションの意味などは以下を参照のこと:
https://docs.tizonia.org/manual/tunein.html

YouTube再生(実行例)

$ tizonia --youtube-audio-stream https://youtu.be/FIwYFTKIG9E <省略> [YouTube] (GdataError) : Youtube Error 403: The request cannot be completed because you have exceeded your <a href="/youtube/v3/getting-started#quota">quota</a>. # 上のようなエラーが出ているが動作に支障ないようだ YouTube] [Audio stream] : 'https://youtu.be/FIwYFTKIG9E'. [YouTube] [Stream] [#1] '【千花音コラボ】フルートとクラリネットでバトルしました【千本桜x紅蓮華】'. [YouTube] [Streams in queue] '1'. [Youtube] [Streaming] : 'https://youtu.be/FIwYFTKIG9E'. 尾崎 勇太 : 【千花音コラボ】フルートとクラリネットでバトルしました【千本桜x紅蓮華】 (1 Description : 初めてのコラボです。今回はバトルなので ばちばちやっておりますが、次は協力プ� Published : 2020-04-18 09:00:08Z View Count : 136254 YouTube Id : https://youtu.be/FIwYFTKIG9E File Format : webm Bitrate : 160k Size : 3 MiB Duration : 03m:03s Opus Stream : 2 Ch, 48000 Hz 2 Ch, 48 KHz, 16:s:l 0% 10 20 30 40 50 60 70 80 90 100% 0s |----|----|----|----|----|----|----|----|----|----| 3m:03s

tizoniaに与えるurlは、YouTubeで再生している画面を右クリックして「動画のURLのコピー」でurlをコピーして、それをtizoniaに与える。(注意:「現時点の」が付いていない方を使う)

上の例では、urlに 「https://youtu.be/」 を付けているが以下のように省略しても再生できる。

tizonia --youtube-audio-stream FIwYFTKIG9E

YouTube使用時のオプションの意味などは以下を参照のこと:
https://docs.tizonia.org/manual/youtube.html

原因不明だが、ちゃんとwebブラウザーではyoutube再生できる(上のやり方で作った)urlでも、エラーに再生できないことがある。 また。1回目がエラーになるが、2回目以降は再生できることもある。

YouTubeのplaylist再生(実行例)

以下でplaylistを再生できる:

tizonia --youtube-audio-playlist RDMMHzruMUIwUh0

YouTubeの画面で上の方法でurlを取得した際、playlist上の動画を再生したときは以下の例のように「?list=」が含まれる。

https://youtu.be/t8vB1Xfj00E?list=RDMMHzruMUIwUh0

そのとき、「?list=」以降の文字列がplaylistの情報になるので、上の再生例のように、その部分を与えて、tizoniaを実行するとplaylistの内容が再生される。
playlistの曲の情報を収集するのに時間がかかる?ようなので、辛抱強く、待つと再生が開始する。
再生中は以下のキーが利用できる:

[SPACE] pause playback [p] skip to previous file [n] skip to next file [l] print list <number> [g] go to track/station <number> in playlist. [q] quit

以下は動作していないようだ:
[+/-] [Up/Down] increase/decrease volume.
[m] mute

参照:
Keyboard Shortcuts

iHeartRadio再生例

tizonia --iheart-search "top 40" tizonia --iheart-search "kiss" tizonia --iheart-search "ny" tizonia --iheart-search "albuquerque" tizonia --iheart-search "90s" tizonia --iheart-search "rock" --iheart-keywords 'The Rocket'

iHeartRadio使用時のオプションの意味などは以下を参照のこと:
https://docs.tizonia.org/manual/iheart.html

動作実績

Tizoniaのドキュメントによると全モデルで動作するとあるが、ここでは以下のモデルで動作確認した:

・Raspberry Pi 1 Model B ・Raspberry Pi 2 Model B ・Raspberry Pi 4 Model B ・Raspberry Pi Zero WH (+ USB-Audio or Audio-MiniHat)

参照URL

Tizonia documentation
headless_RaspberryPiをシンプルなinternet_radioにする

USB Audio Adapter - Works with Raspberry Pi
Pirate Audio: Headphone Amp for Raspberry Pi

headless RaspberryPiインストール方法(v2)

以上

続きを読む "headless_RaspberryPiにTizoniaをインストールする"

| | コメント (0)

2020年10月24日 (土)

headless_RaspberryPiをシンプルなinternet_radioにする

2020/10/24+
初版

headless RaspberryPi simple internet radio

headless RaspberryPi simple internet radio

概要

headless_RaspberryPiをシンプルなinternet_radioにする。
デフォルトでインストールされているomxplayerは、ストリーミングも サポートしているので、それを使って簡単なラジオにする。

実行手順

以下を実行するとインターネット・ラジオとして音楽などが聞ける:

omxplayer -o local --vol -2000 http://us3.internet-radio.com:8485/ # 繰り返し再生する場合、「--loop」を付ける omxplayer -o local --vol -2000 --loop http://us3.internet-radio.com:8485/

フォンジャックから出力されるので、そこにスピーカなどを接続する。
また、実行中に「+」と「-」のキー入力で音量を調整できる。
オプションの意味などは「OMXPlayer: An accelerated command line media player 」を参照のこと。

ストリーミングURLの求め方

https://www.internet-radio.com/ 上のurlにwebブラウザーでアクセスして 表示画面のジャンルを選択(クリック)して、 そこにあるラジオ局の*.m3uをダウンロードして、 そのなかにあるURLを取り出す。

ストリーミングURL(例)

以下のURLをomxplayerのurlとして与えると、そこのラジオ局が再生される:

Smooth Jazz Florida http://us4.internet-radio.com:8266/ Piano Letter http://222.122.178.186:1882/ DI Radio Digital Impulse - Blues http://5.39.71.159:8990/ MEGATON CAFE RADIO http://us2.internet-radio.com:8443/ Music Lake - Relaxation Music, Meditation, Focus, Chill, Nature Sounds http://104.251.118.50:8626/ RADIO ESTILO LEBLON (Easy listening) http://us4.internet-radio.com:8197/ Celtic Moon http://51.161.115.200:8096/ Asia DREAM Radio - Japan Hits http://184.75.212.82:1025/

参照URL

OMXPlayer: An accelerated command line media player
Adjust audio volume level with CLI omxplayer - Raspberry Pi

headless RaspberryPiインストール方法(v2)

以上

続きを読む "headless_RaspberryPiをシンプルなinternet_radioにする"

| | コメント (0)