ブログ

κυσο βλογ

BeagleV-Fire に USB-Serial 変換器をつなごうとして少し困った

BeagleV-Fire に USB-Serial 変換器が必要な場合

正常動作中の BeagleV-Fire を使うだけなら、外付けの USB-Serial 変換器は必要ない。 しかし、ブートプロセスを確認したり、新しいOSイメージをフラッシュするには外付けの USB-Serial 変換器をつなぐ必要がある。

BeagleV-Fire につなぐ USB-Serial 変換器の選定

BeagleV-Fireのシリアルポート端子は、信号入出力電圧が 3.3V なので、これがUSB-Serial 変換器を選定する制約条件になる。 さらに、個人的な好みで、USB側の端子はUSB-Cであることをもう一つの制約条件とした。microB端子はもげやすいし、ケーブルもUSB-Cに統一したいのがその理由である。

条件に見合う製品たち

FTDI USBシリアル変換アダプター Type-C版 (3.3/2.5/1.8V対応)www.switch-science.com

Switch SCIENCE の製品で、ジャンパ設定によって信号入出力電圧を1.8V, 2.5V, 3.3Vの三種類から選べる。5Vに対応しなくなったのは、マイコンの低電圧化の流れを考慮した結果だろう。機能的に優れているが価格がちょっと高い。

www.sengoku.co.jp

SparkFunの製品で、デフォルトで3.3Vロジック、ジャンパ設定で5Vにも対応できる。ジャンパ設定はパターンの切断とハンダによるブリッジが必要なのでちょっと面倒である。3.3Vで使う分には問題ない。そこそこ安いのでこちらを選定した。

そのままでは刺さらなかった

SparkFun Serial Basic Breakout - CH340C and USB-C を入手して BeagleV-Fire に刺そうとしたら、Cape Expansion Header と Breakoutのボード面が干渉して刺さらなかった。逆向きにすれば刺さるには刺さるが、信号線が対応しないので無意味である。

なお、SWITCH SCIENCE の製品の方も同様の構成なので直接は刺さらないと考えられる。

仕方なく、ジャンパー線を購入することにした。

入手したジャンパー線

Amazon | DiyStudio 10CM ジャンパー線多色デュポンワイヤー120pcs、用28AWGケーブル ブレッドボード・ジャンパーワイヤー、オス-メス・オス-オス・メス-メスピッチ2.54mm * 40Pin【2021人気限定】 | ジャンプワイヤ | 産業・研究開発用品 通販

たぶんこのリンクはすぐ機能しなくなるだろうから、画像を以下に示す。

ジャンパー線

こういう、リボン状にまとまったジャンパー線が便利である。

結線

BeagleV-Fire (シリアル端子) ↔ ジャンパー線 ↔ SparkFun Serial Basic Breakout ↔ USBケーブル ↔ WindowsPC

の順でつないだ。ジャンパー線は6本分を切り離して使ったが、ちょうどワイヤーの色が黒から緑の配列になっており、Breakoutボードのシルク印刷のBLKとGRNに対応していた。

この接続では、USBC ケーブルに力がかかっても、ジャンパー線がその力をいなしてボードに力が掛からなくできるという利点がある。

バイスマネージャーで見ると以下のように表示された。

バイスマネージャーに現れた SparkFun Serial Basic Breakout - CH340C and USB-C

windows10では、このボードのドライバは自動的に適用された。

リブートプロセスが見えた

$ sudo reboot
[sudo] password for beagle:

Broadcast message from root@BeagleV on pts/0 (Sun 2024-03-10 15:59:57 UTC):

The system will reboot now!

beagle@BeagleV:~
         Stopping session-1.scope - Session 1 of User beagle...
         Stopping session-3.scope - Session 3 of User beagle...
[  OK  ] Removed slice system-cockp…/cockpit-wsinstance-https-factory.
[  OK  ] Removed slice system-modpr…lice - Slice /system/modprobe.
[  OK  ] Stopped target graphical.target - Graphical Interface.
[  OK  ] Stopped target multi-user.target - Multi-User System.
[  OK  ] Stopped target getty.target - Login Prompts.
[  OK  ] Stopped target timers.target - Timer Units.
[  OK  ] Stopped dpkg-db-backup.tim… Daily dpkg database backup timer.
[  OK  ] Stopped e2scrub_all.timer▒▒etadata Check for All Filesystems.
[  OK  ] Stopped fstrim.timer - Discard unused blocks once a week.
[  OK  ] Stopped logrotate.timer - Daily rotation of log files.
[  OK  ] Stopped motd-news.timer - Message of the Day.
[  OK  ] Stopped plocate-updatedb.t…Update the plocate database daily.
[  OK  ] Stopped systemd-tmpfiles-c… Cleanup of Temporary Directories.
[  OK  ] Stopped target time-set.target - System Time Set.
[  OK  ] Stopped target usb-gadget.…m - Hardware activated USB gadget.
[  OK  ] Closed systemd-rfkill.sock…l Switch Status /dev/rfkill Watch.
         Stopping avahi-daemon.serv…e - Avahi mDNS/DNS-SD Stack...
         Stopping cockpit-wsinstanc…7ae41e4649b934ca495991b7852b855...
         Stopping cockpit.service - Cockpit Web Service...
         Stopping cron.service …round program processing daemon...

こんな感じで見えるようになった。

ブートが80%で止まる

リブートするとほぼ毎回、ブートプロセスが80%で止まってしまう。

HSS: decompressing from eNVM to L2 Scratch ... Passed
DDR training ...
   80% [                                        ..........]

どうもこれは既知の問題のようである。

正常にブートできるときのパターンは以下の通りである。

HSS: decompressing from eNVM to L2 Scratch ... Passed
DDR training ... Passed ( 5969 ms)

---------------------------------
--        BeagleV-Fire         --
---------------------------------

[6.32354] PolarFire(R) SoC Hart Software Services (HSS) - version 0.99.36-BVF-0.3.0
MPFS HAL version 2.2.104 / DDR Driver version 0.4.023 / Mi-V IHC version 0.1.1 / BOARD=bvf
(c) Copyright 2017-2022 Microchip FPGA Embedded Systems Solutions.

incorporating OpenSBI - version 1.2
(c) Copyright 2019-2022 Western Digital Corporation.

[6.63254] Build ID: 13e69d23781e38eff4e9d2aa52db92d1f0352ac1
[6.70025] Built with the following tools:
 - riscv64-unknown-elf-gcc (xPack GNU RISC-V Embedded GCC (Microsemi SoftConsole build), 64-bit) 8.3.0

まとめ

  • BeagleV-Fire を使い倒すためには、外付けの USB-Serial 変換器が必要である。
  • 変換器によっては、そのままでは刺さらないものもある。その場合はジャンパー線で中継すれば良い。
  • ジャンパー線で中継すると、USBケーブルの動きによる力が BeagleV-Fire に直接かからなくなる利点がある。

BeagleV-FireにWindowsからログインできた(Virtualboxは不要でSerialとSSHの両方成功)

前回からの更新点

前回はWindows上のVirtualboxの中のLinuxとBeagleV-Fireをつなぐという、やや面倒な方法を取っていたが、色々試してVirtualboxが不要な接続方法が以下の2つ見つかったのでメモとして残す。

  • シリアルポートで接続する方法
  • USB NETWORK DRIVER をインストールする方法

シリアルポートで接続する方法

簡単なのでおすすめの方法だが、ファイル転送がデフォルトではできないという欠点がある。

Windowsのデバイスマネージャーを表示させてからBeagleV-FireをUSBケーブルで接続して少し待つと、COMポートが現れるのがわかる。

Windows上に現れたBeagleV-FireのUSBシリアルポート

USBシリアルデバイスと表示されているものがBeagleV-Fireのものである。もう一つのほうはマザーボードのシリアルポートであり今回は無関係である。

前回まではこれが現れることに全く気づかずに色々やってしまったが、実はこんなに簡単に接続ポートが用意される。これさえ分かればあとは簡単で、MobaXtermを立ち上げ、シリアルポートへ接続すればつながる。

Session→Serialを選択し、以下のようにポートと速度を選ぶ。

MobaXtermでBeagleV-Fireのシリアルポートに接続する

OKを押すとあっけなくつながる。

シリアルポートでの接続に成功

ttyGS0でつながる

USB-serial変換器を用意する必要はなく簡単につながる。これをBeagleV-FireのQuick Startに書いておいた方が良いと思うのだが・・・。

USB NETWORK DRIVER をインストールする方法

ちょっとだけ面倒な作業が生じるが、SSHで接続できるようになってファイル転送もできるようになるのでこちらもおすすめの方法と言える。

Windowsのデバイスマネージャーを表示させてからBeagleV-FireをUSBケーブルで接続して少し待つと、CDC NCMデバイスが現れるのがわかる。

CDC NCM デバイスとして現れたBeagleV-Fire

CDC NCMはCommunication Device Class / Network Control Model protocolの略だそうである。

色々調べて試したところ、Windowsが持っているドライバを当てればこのデバイスを有効化できることがわかった。

バイスマネージャーのCDC NCMを右クリックして「ドライバーの更新」をクリックする。

ドライバーの更新を選ぶ

「コンピューターを参照してドライバーを検索」をクリックする。

コンピューターを参照してドライバーを検索

「コンピューター上の利用可能なドライバーの一覧から選択します」をクリックする。

コンピューター上の利用可能なドライバーの一覧から選択

「すべてのデバイスを表示」をダブルクリックして少し待つ。

すべてのデバイスを表示

  • 製造元:Microsoft
  • モデル:UsbNcm Host Device

を選択して「次へ」をクリックする。

MicrosoftのUsbNcm Host Deviceを選ぶ

警告ウィンドウが出るが知るかボケと言いながら「はい」を押す。

警告ウィンドウ

ドライバーが正常に更新された。

ドライバー正常更新完了

バイスマネージャーのネットワークアダプター内にUsbNcm Host Deviceが現れた。

UsbNcm Host Device

コントロール パネル→ネットワークとインターネット→ネットワークと共有センター→アダプターの設定の変更でBeagleV-Fireを確認できる。

ネットワークアダプターとして現れたBeagleV-Fire

残念ながらIPアドレスまでは自動設定されないので以下の手順で固定IPアドレスを割り当てる。

上図のBeagleV-Fireのネットワークアダプターを右クリックしてプロパティをクリックし、インターネットプロトコルバージョン4をダブルクリックする。

IPv4設定

以下のように

を指定する。

固定IPアドレス設定

MobaXtermを開き、Session→SSHから192.168.7.2を指定して接続する。

SSH接続

SSHで接続完了。

SSH接続完了

左のディレクトリペインでファイルの入出力もできる。

これもBeagleV-FireのQuick Startに書いておいた方が良いと思うのだが・・・。

BeagleV-Fire にwindowsからやっとログインできた(ただしVirtualboxが必要)

本記事よりも良い接続方法がわかったので以下の記事にまとめた。

xx-prime.hatenablog.com

BeagleV-Fireとは

一言でいうと、RISC-VのCPUとFPGAが載った素敵シングルボードコンピュータ。未来しか感じない。

クイックスタートを見てみる

docs.beagle.cc

これまでのBeagleboneシリーズと同様に、PCとUSBで接続するだけでOKなように見える。が、実はそれはウソだ。

WindowsにBeagleV-FireをUSBで接続してみる

まず、十分な電力を供給できるUSBポートに、BeagleV-FIreを接続すると、Windowsの設定→デバイス→その他のデバイスにBeagleV-Fireが現れる。

BeagleV-Fire はその他のデバイスに現れるが、ドライバーは使用できませんと表示される

しかし、「ドライバーは使用できません」と出ている。 BeagleV-Fireのサイトを探してみたが、これ用のUSBドライバは今のところ見つからない。 これまでのBeagleboneシリーズだと、USBドライバが当たるとネットワークデバイスwindows上に生成されるのが普通だったが、BeagleV-Fireはドライバがないためネットワークデバイスは生成されない。 ここで一旦あきらめて1ヶ月ほど放置した。

webサーチ

webサーチをしたところ、windows上でvirtualbox内にlinuxホストを動作させてBeagleV-Fireと通信できたという書き込みを見つけた。メモってなかったのでリンクは貼れない。無念。

VirtualboxUbuntuにBeagleV-Fireをつないでみる

WindowsPCにBeagleV-Fireをつなぎ、その他のデバイスのBeagleV-Fireが出ている状態でVirtualboxUbuntuを立ち上げ、USB接続の選択肢の中からBeagleboneを選ぶ。

Virtualboxに現れたUSB下のBeagleV-Fire

[0404]のがそれ。

USB接続を tail -f /var/log/syslog で見てみる

Virtualbox内のLinuxでsyslogをtailしながら上記のUSB接続を行った結果が以下。

2024-03-06T22:26:20.043974+09:00 dirac kernel: [  208.789837] usb 2-1: new high-speed USB device number 2 using ehci-pci
2024-03-06T22:26:20.543991+09:00 dirac kernel: [  209.291739] usb 2-1: New USB device found, idVendor=1d6b, idProduct=0104, bcdDevice= 4.04
2024-03-06T22:26:20.544023+09:00 dirac kernel: [  209.291749] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
2024-03-06T22:26:20.544027+09:00 dirac kernel: [  209.291753] usb 2-1: Product: BeagleBone
2024-03-06T22:26:20.544030+09:00 dirac kernel: [  209.291756] usb 2-1: Manufacturer: BeagleBoard.org
2024-03-06T22:26:20.544032+09:00 dirac kernel: [  209.291762] usb 2-1: SerialNumber: 1234BBBK5678
2024-03-06T22:26:20.590730+09:00 dirac mtp-probe: checking bus 2, device 2: "/sys/devices/pci0000:00/0000:00:1f.5/usb2/2-1"
2024-03-06T22:26:20.592633+09:00 dirac mtp-probe: bus: 2, device: 2 was not an MTP device
2024-03-06T22:26:20.704368+09:00 dirac kernel: [  209.441959] cdc_acm 2-1:1.2: ttyACM0: USB ACM device
2024-03-06T22:26:20.704396+09:00 dirac kernel: [  209.450089] usbcore: registered new interface driver cdc_acm
2024-03-06T22:26:20.704400+09:00 dirac kernel: [  209.450098] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
2024-03-06T22:26:20.725160+09:00 dirac kernel: [  209.471220] usbcore: registered new interface driver cdc_ether
2024-03-06T22:26:20.802902+09:00 dirac kernel: [  209.547430] cdc_ncm 2-1:1.0: MAC-Address: 00:04:a3:e5:99:39
2024-03-06T22:26:20.802924+09:00 dirac kernel: [  209.548189] cdc_ncm 2-1:1.0 eth0: register 'cdc_ncm' at usb-0000:00:1f.5-1, CDC NCM (NO ZLP), 00:04:a3:e5:99:39
2024-03-06T22:26:20.802927+09:00 dirac kernel: [  209.551873] usbcore: registered new interface driver cdc_ncm
2024-03-06T22:26:20.818423+09:00 dirac NetworkManager[564]: <info>  [1709731580.7993] manager: (eth0): new Ethernet device (/org/freedesktop/NetworkManager/Devices/3)
2024-03-06T22:26:20.828452+09:00 dirac kernel: [  209.574797] usbcore: registered new interface driver cdc_wdm
2024-03-06T22:26:20.838001+09:00 dirac kernel: [  209.586804] usbcore: registered new interface driver cdc_mbim
2024-03-06T22:26:20.861940+09:00 dirac mtp-probe: checking bus 2, device 2: "/sys/devices/pci0000:00/0000:00:1f.5/usb2/2-1"
2024-03-06T22:26:20.863692+09:00 dirac mtp-probe: bus: 2, device: 2 was not an MTP device
2024-03-06T22:26:20.875373+09:00 dirac (udev-worker)[3931]: 2-1: Process '/usr/lib/snapd/snap-device-helper bind snap_cups_cupsd /devices/pci0000:00/0000:00:1f.5/usb2/2-1 189:129' failed with exit code 1.
2024-03-06T22:26:20.883280+09:00 dirac (udev-worker)[3931]: 2-1: Process '/usr/lib/snapd/snap-device-helper bind snap_cups_ippeveprinter /devices/pci0000:00/0000:00:1f.5/usb2/2-1 189:129' failed with exit code 1.
2024-03-06T22:26:20.904128+09:00 dirac (udev-worker)[3934]: 2-1:1.1: Process '/usr/lib/snapd/snap-device-helper bind snap_cups_cupsd /devices/pci0000:00/0000:00:1f.5/usb2/2-1/2-1:1.1 0:0' failed with exit code 1.
2024-03-06T22:26:20.916853+09:00 dirac kernel: [  209.664338] cdc_ncm 2-1:1.0 enx0004a3e59939: renamed from eth0
2024-03-06T22:26:20.933606+09:00 dirac (udev-worker)[3931]: 2-1:1.3: Process '/usr/lib/snapd/snap-device-helper bind snap_cups_cupsd /devices/pci0000:00/0000:00:1f.5/usb2/2-1/2-1:1.3 0:0' failed with exit code 1.
2024-03-06T22:26:20.935609+09:00 dirac (udev-worker)[3934]: 2-1:1.1: Process '/usr/lib/snapd/snap-device-helper bind snap_cups_ippeveprinter /devices/pci0000:00/0000:00:1f.5/usb2/2-1/2-1:1.1 0:0' failed with exit code 1.
2024-03-06T22:26:20.946584+09:00 dirac NetworkManager[564]: <info>  [1709731580.9461] device (eth0): interface index 3 renamed iface from 'eth0' to 'enx0004a3e59939'
2024-03-06T22:26:20.965150+09:00 dirac snapd[530]: hotplug.go:200: hotplug device add event ignored, enable experimental.hotplug
2024-03-06T22:26:20.974193+09:00 dirac (udev-worker)[3931]: 2-1:1.3: Process '/usr/lib/snapd/snap-device-helper bind snap_cups_ippeveprinter /devices/pci0000:00/0000:00:1f.5/usb2/2-1/2-1:1.3 0:0' failed with exit code 1.
2024-03-06T22:26:20.997747+09:00 dirac (udev-worker)[3933]: 2-1:1.2: Process '/usr/lib/snapd/snap-device-helper bind snap_cups_cupsd /devices/pci0000:00/0000:00:1f.5/usb2/2-1/2-1:1.2 0:0' failed with exit code 1.
2024-03-06T22:26:21.036539+09:00 dirac NetworkManager[564]: <info>  [1709731581.0118] device (enx0004a3e59939): state change: unmanaged -> unavailable (reason 'managed', sys-iface-state: 'external')
2024-03-06T22:26:21.036755+09:00 dirac NetworkManager[564]: <info>  [1709731581.0204] settings: (enx0004a3e59939): created default wired connection '有線接続 1'
2024-03-06T22:26:21.058522+09:00 dirac (udev-worker)[3933]: 2-1:1.2: Process '/usr/lib/snapd/snap-device-helper bind snap_cups_ippeveprinter /devices/pci0000:00/0000:00:1f.5/usb2/2-1/2-1:1.2 0:0' failed with exit code 1.
2024-03-06T22:26:21.088057+09:00 dirac (udev-worker)[3931]: 2-1:1.0: Process '/usr/lib/snapd/snap-device-helper bind snap_cups_cupsd /devices/pci0000:00/0000:00:1f.5/usb2/2-1/2-1:1.0 0:0' failed with exit code 1.
2024-03-06T22:26:21.094902+09:00 dirac (udev-worker)[3931]: 2-1:1.0: Process '/usr/lib/snapd/snap-device-helper bind snap_cups_ippeveprinter /devices/pci0000:00/0000:00:1f.5/usb2/2-1/2-1:1.0 0:0' failed with exit code 1.
2024-03-06T22:26:21.182449+09:00 dirac NetworkManager[564]: <info>  [1709731581.1790] device (enx0004a3e59939): carrier: link connected
2024-03-06T22:26:21.186478+09:00 dirac NetworkManager[564]: <info>  [1709731581.1850] device (enx0004a3e59939): state change: unavailable -> disconnected (reason 'carrier-changed', sys-iface-state: 'managed')
2024-03-06T22:26:21.219134+09:00 dirac NetworkManager[564]: <info>  [1709731581.2048] policy: auto-activating connection '有線接続 1' (134244d1-ebd4-3a8a-b6ee-b7e7b8c02e44)
2024-03-06T22:26:21.222714+09:00 dirac NetworkManager[564]: <info>  [1709731581.2225] device (enx0004a3e59939): Activation: starting connection '有線接続 1' (134244d1-ebd4-3a8a-b6ee-b7e7b8c02e44)
2024-03-06T22:26:21.224111+09:00 dirac NetworkManager[564]: <info>  [1709731581.2237] device (enx0004a3e59939): state change: disconnected -> prepare (reason 'none', sys-iface-state: 'managed')
2024-03-06T22:26:21.229626+09:00 dirac NetworkManager[564]: <info>  [1709731581.2294] device (enx0004a3e59939): state change: prepare -> config (reason 'none', sys-iface-state: 'managed')
2024-03-06T22:26:21.239209+09:00 dirac NetworkManager[564]: <info>  [1709731581.2390] device (enx0004a3e59939): state change: config -> ip-config (reason 'none', sys-iface-state: 'managed')
2024-03-06T22:26:21.252312+09:00 dirac NetworkManager[564]: <info>  [1709731581.2521] dhcp4 (enx0004a3e59939): activation: beginning transaction (timeout in 45 seconds)
2024-03-06T22:26:21.301247+09:00 dirac NetworkManager[564]: <info>  [1709731581.3011] dhcp4 (enx0004a3e59939): state changed new lease, address=192.168.7.1
2024-03-06T22:26:21.303763+09:00 dirac avahi-daemon[511]: Joining mDNS multicast group on interface enx0004a3e59939.IPv4 with address 192.168.7.1.
2024-03-06T22:26:21.306995+09:00 dirac avahi-daemon[511]: New relevant interface enx0004a3e59939.IPv4 for mDNS.
2024-03-06T22:26:21.307190+09:00 dirac avahi-daemon[511]: Registering new address record for 192.168.7.1 on enx0004a3e59939.IPv4.
2024-03-06T22:26:21.312555+09:00 dirac avahi-daemon[511]: Joining mDNS multicast group on interface enx0004a3e59939.IPv6 with address fe80::1683:8e58:dec3:f0c4.
2024-03-06T22:26:21.312749+09:00 dirac avahi-daemon[511]: New relevant interface enx0004a3e59939.IPv6 for mDNS.
2024-03-06T22:26:21.312860+09:00 dirac avahi-daemon[511]: Registering new address record for fe80::1683:8e58:dec3:f0c4 on enx0004a3e59939.*.
2024-03-06T22:26:21.403252+09:00 dirac dbus-daemon[512]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service' requested by ':1.10' (uid=0 pid=564 comm="/usr/sbin/NetworkManager --no-daemon" label="unconfined")
2024-03-06T22:26:21.403448+09:00 dirac NetworkManager[564]: <info>  [1709731581.3962] device (enx0004a3e59939): state change: ip-config -> ip-check (reason 'none', sys-iface-state: 'managed')
2024-03-06T22:26:21.404002+09:00 dirac systemd[1]: Starting NetworkManager-dispatcher.service - Network Manager Script Dispatcher Service...
2024-03-06T22:26:21.546342+09:00 dirac dbus-daemon[512]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
2024-03-06T22:26:21.546732+09:00 dirac systemd[1]: Started NetworkManager-dispatcher.service - Network Manager Script Dispatcher Service.
2024-03-06T22:26:21.568892+09:00 dirac NetworkManager[564]: <info>  [1709731581.5664] device (enx0004a3e59939): state change: ip-check -> secondaries (reason 'none', sys-iface-state: 'managed')
2024-03-06T22:26:21.581231+09:00 dirac NetworkManager[564]: <info>  [1709731581.5667] device (enx0004a3e59939): state change: secondaries -> activated (reason 'none', sys-iface-state: 'managed')
2024-03-06T22:26:21.581386+09:00 dirac NetworkManager[564]: <info>  [1709731581.5676] device (enx0004a3e59939): Activation: successful, device activated.
2024-03-06T22:26:31.973542+09:00 dirac systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully.

ちょっとこのコードブロックの貼り付けかたには改善が必要だ。

なんかよくわからんがUSB接続のネットワークデバイスが生成されたように見える。

ip a でVirtualboxLinuxホストのネットワークデバイスを見てみる

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:79:aa:df brd ff:ff:ff:ff:ff:ff
    inet 172.17.29.58/24 brd 172.17.29.255 scope global dynamic noprefixroute enp0s3
       valid_lft 6753sec preferred_lft 6753sec
    inet6 fe80::a00:27ff:fe79:aadf/64 scope link
       valid_lft forever preferred_lft forever
3: enx0004a3e59939: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:04:a3:e5:99:39 brd ff:ff:ff:ff:ff:ff
    inet 192.168.7.1/24 brd 192.168.7.255 scope global dynamic noprefixroute enx0004a3e59939
       valid_lft 949sec preferred_lft 949sec
    inet6 fe80::1683:8e58:dec3:f0c4/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

無事に192.168.7.1のネットワークデバイスが生成された。これでBeagleV-Fireの192.168.7.2にsshでログインできる。

VirtualboxLinuxホストからBeagleV-Fireにsshでログイン

$ ssh 192.168.7.2 -l beagle
Ubuntu 23.04

BeagleBoard.org Ubuntu 23.04 Console Image 2023-10-16
Support: https://bbb.io/debian
default username:password is [beagle:temppwd]

beagle@192.168.7.2's password:
Last login: Thu Oct 26 02:58:41 2023 from 192.168.7.1
beagle@BeagleV:~$

ようやく入れた!見ての通り、ユーザ名はbeagleでパスワードはtemppwdである。Ubuntu Linux 23.04が動いとる。RISC-Vで普通にUbuntuが動くなんて素敵すぎる。

BeagleV-Fireのネットワークデバイスを見てみる

beagle@BeagleV:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 00:04:a3:e5:99:37 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:04:a3:e5:99:36 brd ff:ff:ff:ff:ff:ff
    altname end0
4: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
    link/tunnel6 :: brd :: permaddr 6ed6:9f50:72e2::
5: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:04:a3:e5:99:3a brd ff:ff:ff:ff:ff:ff
    inet 192.168.7.2/24 brd 192.168.7.255 scope global usb0
       valid_lft forever preferred_lft forever
    inet6 fe80::204:a3ff:fee5:993a/64 scope link
       valid_lft forever preferred_lft forever
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:1e:54:73:cc brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

なんじゃこりゃー。なんかdockerが蠢いてるようだ。usb0が、今回のssh通信で使われているネットワークデバイスである。

しかし購入してからログインするまで1ヶ月かかるとはさすが俺としか言いようがない。

あのsyslogを丹念に見れば、windowsに当てるべきusb driverがわかるかもしれない。

夜も更けてきたのでここまでにしよう。

本記事よりも良い接続方法がわかったので以下の記事にまとめた。

xx-prime.hatenablog.com

Epiphone les paul modern の abr-1 ブリッジを nashvilleタイプ (GOTOH GE103B-T Nickel) に無加工で換装できた

Epiphone les paul modern の唯一の不満点がabr-1タイプのブリッジ

Epiphone の les paul modern は les paul を現代的なテクノロジーで刷新したらどうなるかを具現化したもので、演奏性が向上し、 出音のバリエーションが増えているなど素晴らしいギターである。 が、不満点が一つだけあり、古い設計のabr-1タイプのブリッジが搭載されている。

les paul タイプのギターには、abr-1タイプという古いタイプのブリッジと、nashvilleタイプという新しいタイプのブリッジの二種類のうちどちらかが搭載されている。 abr-1は古いブリッジで、サドルの可動範囲が狭いという欠点があり、特にG弦でサドルが十分にブリッジ側に移動できないという問題がある。 abr-1のG弦サドルの向きを逆にすることでこの問題を解決できるが、あくまでもwork around的な方法である。 また、abr-1にはサドルの脱落を防ぐためのワイヤーがあり、これが無駄な共振を生むことがあるというのも問題点として挙げられる。 これらのabr-1の問題点を解決したのが nashville ブリッジで、サドルの可動範囲の拡大と、サドル固定ワイヤーの除去が主な改善点である。

Epiphone の les paul modern に搭載されているabr-1タイプのブリッジを、nashvilleタイプに換装すれば唯一の欠点が解消される。なお、gibsonのles paul modernでは当然のことながらnashvilleタイプのブリッジが搭載されている。

どのnashville ブリッジが Epiphone les paul modern に合うのか?

信頼と実績のあるGOTOHのブリッジの中から換装候補を選定した。 まず、les paul に合うタイプ(TOMタイプ)でGOTOH製のnashvilleタイプのブリッジはスタッドの構造の違いで二種類ある。

  1. GE-103B  スタッドを直接ボディにねじ込むタイプ
  2. GE-103B-T  アンカーをボディに打ち込んで、そこにスタッドをねじ込むタイプ

Epiphoneのles paul modernは、アンカーがボディに打ち込んであるタイプなので、適合するのはGE-103B-Tの方である。

また、GE103B-Tは表面のメッキ塗装の違いでさらに5種類のタイプがある。

Epiphoneのles paul modernは、ハードウェア塗装がニッケルなので、最終的に選定されたのは

GE103B-T Nickel

であった。間違ってChromeを選んでしまうと、ブリッジ部分だけ白っぽい色味になってしまうので注意が必要である。

換装作業

  1. 弦を緩める
  2. テイルピースのねじを緩めて除去する
  3. ブリッジを抜き取る
  4. スタッドボルト2本を緩めて抜き取る
  5. 新しいスタッドボルト2本をねじ込む
  6. 新しいブリッジをはめ込む
  7. テイルピースを取り付ける
  8. 弦をチューニングする

換装前と換装後の写真は以下の通り。

換装前 Epiphone LockTone™ Tune-O-Matic™

オクターブチューニングを済ませた後。1~3弦のサドルの向きを反対にしてある。3弦と6弦のサドルの位置がかなりギリギリ。

換装前 Epiphone Epiphone LockTone™ Tune-O-Matic™

換装後 GOTOH GE103B-T Nickel

オクターブチューニングを済ませた後。全サドルの位置にまだまだ余裕がある。

換装後 GOTOH GE103B-T Nickel

なお、テイルピース部分にガウスぼかしをかけているのは、俺のイケメンフェイスが映り込んでいるから。

10分もかからず無加工で換装は完了した。古い弦を外して捨ててしまう場合はテイルピースの除去と取り付け作業は省略可能。また、スタッドボルトも換装せずそのまま流用できるが、ねじ径とピッチがピッタリ合ったので新しいほうを使うことにした。

サドル調整ネジの方向は、abr-1がネック側、nashvilleがブリッジ側を向くのが正しいようなのでそれに従った。この方向の違いによるオクターブ調整のやりやすさの違いについては、nashvilleのほうが優れている。

換装結果

オクターブチューニングのサドル位置に余裕があり、様々な弦に対応できるようになった。また、サドル固定ワイヤーが無くなったので、無駄な共振の可能性も除去できた。オクターブチューニングもやりやすくなって、換装は成功と判断できる。総合的な機能性を求める場合はnashville一択と言って良いだろう。

一点だけ考慮点があり、ブリッジのガタツキの有無は、換装前のEpiphone のabr-1のほうが優れていた。Epiphoneのabr-1はガタツキ防止のためのバネ機構が内蔵されていて、ブリッジのバネがスタッドを噛み込むような構造になっていたため、ガタツキが全くなかった。が、GOTOHのGE103B-Tにはそのような機構がないので、スタッドとブリッジ穴の間に若干の余裕があって、弦を張らない状態でのガタツキはあり、簡単に抜け落ちる。この点だけは換装後に機能低下したと言える。とはいえ、これが演奏時や弦交換時に問題になるかと言えば全くそんなことはない。なお、このガタツキの程度は換装前のスタッドをそのまま使った時と、GE-103B-Tに同梱の新しいスタッドを使った時で差はなかった。

本記事の執筆時のweb上の情報では、nashvilleタイプをabr-1タイプに換装するというものしか見つからず、 逆の換装に関する情報が見つからなかったので、この記事がweb上の情報空間の拡張に少しは寄与すると思われる。

Epiphone へのお願い

LockToneと同様のスタッドロック機構を持ったnashvilleタイプのブリッジを作って下さい。

GOTOHへのお願い

スタッドを噛み込んで固定するバネ機構をGE103B-Tに追加してください。

Amazonを騙るスパムメールがひどすぎるのでthunderbirdのカスタムフィルタで即spamフォルダ行きにする

ここ数日ひどすぎる

【重要なお知らせ】Amazonから情報を確認をお願いします

という件名のスパムメールが数日前から一日に10通以上届くようになって不愉快極まりない。 これらクソメールのヘッダを確認してみると

Received: by VM-0-7-centos.localdomain (Postfix, from userid 0)

とか

Received: by VM-4-14-centos.localdomain (Postfix, from userid 0)

とかいう感じで、同パターンの仮想っぽいホストから来ているのがわかる。

"-centos.localdomain" が共通しているので、これらクソスパム用クソ仮想クソホスト群からのクソメール群はクソ問答無用でクソ迷惑メールクソフォルダ行きにするクソ。

thunderbirdのフィルタ設定

thunderbirdハンバーガーメニューから、ツール→メッセージフィルターを選択する。

新規をクリックする。

フィルター名に適切な名称を入れて、件名タブからカスタムヘッダーを選択する。

Receivedを入力して追加をクリックする。

「に次を含む」、の右に -centos.localdomain を入力する。メッセージを移動する、に適切なフォルダを選択する。

こんな感じになってればOK。

これで、クソスパムメールを見ずに済む。

きっと、そのうち別のホストから同じようなクソスパムメールが届くようになるだろうけど、同様にReceivedに共通パターンがあるだろうから対処できよう。

SwitchBot API v1.1 を node-red から叩く

この文書の目的

switchbot の Web API は現時点(2023年3月)から6ヶ月前に version 1.1 が公開され、旧バージョンの 1.0 は今後新製品への対応がなされないと告知された。

blog.switchbot.jp

注意事項

APIご利用の際は以下の点にご注意ください

  1. 開発者はv1.0 APIインターフェースを引き続き使用することが可能。

  2. API v1.1の検証に必要なシークレットキーを取得するために、開発者はアプリをV6.14以降にアップデートする必要があります。

  3. v1.0は、新製品への対応を停止します。例えば、ロック・キーパッドキーパッドタッチの新機能を使用する場合、v1.1にアップデートする必要があります。

  4. このアップデートはカスタマイズユーザー用APIであり、ビジネスユーザー用カスタムAPIにへの影響はありません。

今後はv1.1の利用が標準となるようだが、現時点で、node-redから switchbot の Web API v1.1 を叩く方法を解説した文書がweb上に無いようである。

そのような状態でいろいろ試して失敗しながら数時間にわたって 401 Unauthorized エラーに悩まされ続けた末に成功した。

同じようなことをやろうとする人が費やすことになる無駄な時間を無くすためにこれを書いた。

実行環境

OS: windows 10 64bit 22H2

node.js: v18.15.0

node-red: v3.0.2

モジュールの準備

switchbot API v1.1 のリクエストヘッダを構成するには crypto モジュールを使う必要がある。

色々と試した現在の環境では、npm で crypto モジュールをインストールする必要は無いように見えるが、環境によってはインストールする必要があるかもしれない。

フロー配置

フロー配置

上図のように、inject -> function -> http request -> debug をシリーズでつなぐ。

inject (開始トリガ)

デフォルトのままでOK。

inject

function (リクエストヘッダ生成)

まず設定タブを開き、

設定タブ

追加 をクリックして

追加

crypto モジュールを追加する。GUIでモジュール追加ができるようになっていたのは知らなかった。

crypto

次に コード タブを開き、以下のようにコードを追加する。

code

const token = "switchbotアプリで取得できる トークン をここに記入";
const secret = "switchbotアプリで取得できる クライアントシークレットをここに記入";
const t = Date.now();

const N = 16;
const nonce = crypto.randomBytes(N).toString('base64').substring(0, N);

// const nonce = ""; //でも問題ない。

const data = token + t + nonce;
const signTerm = crypto.createHmac('sha256', secret)
    .update(Buffer.from(data, 'utf-8'))
    .digest();
const sign = signTerm.toString("base64");

// header情報をmsgに入れて次の http request ノードに送信
msg.token = token;
msg.sign = sign;
msg.t = t;
msg.nonce = nonce;

http request

下図のように構成する。なお、URLの v1.1 を v1.0 に変更しても問題なく動作する。今回はデバイスのリストを見たいだけなのでメソッドにGET、URLの最後に devices を指定する。

http request

debug

出力を全部見たいので下図のように構成する。

debug

実行

デプロイをクリックして

デプロイ

inject(タイムスタンプ)ノードの□ボタンを押すと

inject

debugノードの statusCode が 100 に変わって成功したことが分かる。

debug

http リクエストに失敗すると、statusCode が 100 以外のエラーになって悲しい。

画面右のdebugタブを開くと

debug

msg オブジェクトの概略が表示されており、これをクリックすると

msg 詳細

様々なデバイスのIDなどが確認できる。このIDを使って、適切にPOSTリクエストを構成すればデバイスの操作などを行うことができる。ここまで成功していれば失敗する要因はほぼ無い。

nonce についての補足

ここから先は読まなくて良い蛇足である。

function ノードの nonce は定数や固定文字列でも問題ないようである。公式のAPIの説明でも

const nonce = "requestID";

と固定文字列が指定されている。

語源は何なのか

nonce とは何なのか日本語のwikipediaで調べてみて、意味はわかったが語源はわからなかった。

英語のwikipediaに語源を含めた答えがあった。

en.wikipedia.org

a nonce is an arbitrary Number that can be used just ONCE in a cryptographic communication.

(NとONCEのキャピタル化は筆者による)

日本語に訳すと:

「nonceとは、暗号通信で一度だけ使用できる任意の数値のことです。」

というわけで、せっかく node-red で crypto モジュールを使えるようにしたので、nonce の意味ないし目的に従って毎回ランダムに変化する文字列を指定するようにしたのが今回のサンプルコードである。

matter 対応には関係するか?

知らない。

いろいろな業種で様々な規格が乱立している。

switchbot が関連するであろう「スマートホーム」のコンテクストの中で、 matter と称される団体の標準化活動がある。

csa-iot.org

switchbot もその標準化活動の一員として名を連ねているようだ。

Web API も標準化されていくのだろうか?

まとめ

switchbotのAPIのドキュメントと、node-redのドキュメントはよく書けていて、賢い人間が見れば何の問題もなくアプリを書けるようにはなっていると思う。

しかし、俺のようなアホはこれらを見ても数時間の試行錯誤を要するのが現状である。

このへんは AI がなんとかするのかもしれないが、AIが今よりもう少しだけ賢くなってしまったら、そもそも俺のようなアホがコードを書くという行為が必要無くなるのかもしれない。

August Burns Red - Standing In The Storm (Official Music Video)

www.youtube.com

短調長調と破壊と創造と喜びと絶望とがゴチャ混ぜになって押し寄せてくる。すごい。 PUI PUI モルカーを見てストップモーションアニメに反応しやすい状態でこれを見て脳内が凄いことになってる。