[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

2024年12月21日土曜日

Luckfox Pico MiniでGPIOを使ってみた。

 Luckfox Pico MiniをWiFiに繋いだり、USBのカメラを使ってみたり、Linuxマシンとして使ってみたけど、せっかくGPIOがついてるのでGPIOを使用してみた。

LuckfoxのGPIOはファイルシステム上で通常のファイルのようにいじれるデバイスドライバが入っているので/sys/class/gpio/の中でcatコマンドとかechoコマンドでGPIOを操作できる。Linuxが動くSBCなら結構普通の実装かも。

とりあえずLuckfox Pico MiniにはLEDが2つついていて、片方はステータス表示用のLEDになっているけど、もう片方は未使用なのでLEDがつながってるGPIOを操作してみる。

LuckfoxのGPIOは公式Wikiで紹介されてるピンアサインを見るとわかりやすいかも。使われてない方のLEDはGPIO1_A2につながっていて、Linux上だとGPIO34になっている。図には両方書いてあるんだけど。Linux上のデバイスファイル名の算出方法も下の方に書いてあった。GPIO1_A2の場合は"バンク1 x 32 + (グループ0 x 8 + 2)"で34になってるっぽい。グループはA、B、C、Dと4つあってそれぞれ0、1、2、3。

さっそくGPIO34を操作してみる。

echo 34 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio34/direction
echo 1 > /sys/class/gpio/gpio34/value
こんな感じでGPIOを有効にして、出力に変更して、HIGHを出力するとLEDが点灯した。一旦出力に消灯する場合は
echo 0 > /sys/class/gpio/gpio34/value
とすればLEDが消灯する。
シェルスクリプト内に入れて実行すれば動作確認用LEDとして使用できるので、とりあえず起動時にudevadm triggerをするスクリプトが動いてるかどうか確認するために使用してみた。やっぱりLEDが点灯するとわかりやすいので便利。
他のピンもluckfox-configでペリフェラルに設定していなければこんな感じで普通のGPIOとして使用できる。

次は入力を試してみる。
Luckfox Pico MiniにはUSBで書き込みするためのBOOTボタンが一つ付いてるのでそれを使えないかどうか試してみた。起動時にボタンを押すと書き込みモードで起動するけど、起動したあとは何も使われていないのでもったいないし。
回路図がダウンロードできるのでLuckfox Pico Miniの回路図を確認するとBootボタンはRecoveryとして表記されていて、GPIO4_C0_z(SARADC_IN0)につながってるっぽい。先程の計算式だとGPIO4_C0は"バンク4 x 32 + (グループ2 x 8 + 0)"でGPIO144としてBuildroot上で使用できるはず…
echo 144 > /sys/class/gpio/export
cat /sys/class/gpio/gpio144/value
としてみると1が帰ってきた。確かに回路図上1.8Vにプルアップされているのでボタンを押していない状態は1になるはず。デフォルトでinだったのでdirectionは変更していない。
ボタンを押したまま、もう一度
cat /sys/class/gpio/gpio144/value
してみると0が帰ってきた。ちゃんとボタンが使えてる!

BOOTボタンをシャットダウンボタンとして使ってみた。

#!/bin/sh

GPIO_PIN=144

echo "$GPIO_PIN" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio$GPIO_PIN/direction
echo "1" > /sys/class/gpio/gpio$GPIO_PIN/active_low

while true; do
    VALUE=$(cat /sys/class/gpio/gpio$GPIO_PIN/value)
    
    if [ "$VALUE" -eq 1 ]; then
        echo "$GPIO_PIN" > /sys/class/gpio/unexport
        halt
        exit 0
    fi
  
    sleep 0.1
done

これをpower.shとして保存して"chmod 755 power.sh"して実行可能にする。とりあえず動作することを確認。自動起動させてからミスると永遠にシャットダウンするスクリプトになりかねないので注意。

自動起動させるためにこの前WiFiに繋いだときに作った/etc/init.d/S99xの中にこのシェルスクリプトのパスを追加した。
これで常時ボタンの状態をポーリングして押されたらhaltしてくれる。

とりあえずBootボタンをシャットダウンボタンとして使えるようにできた。

Pythonのほうでもperiphery使ってGPIOをポーリングでは使えたんだけど、メモリ使用量がシェルスクリプトの3倍ぐらいだったので今回はシェルスクリプトにしてみた。Eventが使えるとまた違うのかもしれないけどpollしか使えなかったので…

2024年12月15日日曜日

給電専用USB Type Cコネクタを使ってみた。

 Padavanファームを入れたWT3020が意外と便利で、USBメモリをWiFi経由で使ったり出張先で広告ブロックルータとして使ったりしていたんだけどこれだけのためにMicroUSBケーブルを持ち歩くのも嫌なので改造してみることに。USB Type CからmicroUSBの変換アダプタとかも使ってみたんだけどなんか端子に負荷がかかってそうで嫌だし…

新幹線の中でWiFiを中継したり(セキュリティーソフトでCaptive Portalが開けないPCの場合はこいつを経由してiPhoneからログオンして繋いでた)するときはモバイルバッテリとかからも給電することを考えてPDからも給電できるようにちゃんとCC1とCC2付きの端子にした。

給電専用Type Cコネクタは複数あるようで、2Pinのものは簡単で良さそうだけどUSB A→USB Type Cケーブルじゃないと電源が供給されなかったりするので今回はハンダが簡単そうな6Pタイプにした。

この6Pinタイプは真ん中の2つがCC1 CC2になっていて、外側両側がGND、あと残った2つの端子はVBUSになっている超簡単な端子。これなら基板がなくても簡単に実装できそう。

まずはMicroUSB端子を剥がす。これはスルーホールがついてるタイプだったので少し大変だった。一部パターンが剥がれたけど使わないところなのでOK。

TypeCコネクタは逆さまに取り付けることに。MicroUSBのパターンのところはVBUSとGNDしか来てなかったのでカプトンテープで絶縁しておいた。固定はスルーホールの反対側からハンダを流してハウジング自体にハンダする形にした。一応ハウジングには超薄く予備ハンダをしておいて、裏側からスルーホールに新しいハンダを流し込むと無事固定された。
あとはGNDとVBUSを配線して、CC1とCC2とハウジングのところに1005の5.1kΩ抵抗を取り付けた。写真では超見づらいけど抵抗が2つついてる。

ハウジングを少し削ったら完成。

これでUSB Type Cから給電できるようになって持ち運ぶケーブルが減らせる!PDの充電器でも無事動作した。こうやってmicroUSB給電タイプのデバイスはどんどんType Cにしていきたいな。

2024年12月10日火曜日

iwdでAPモードを使ってみた。

 LuckfoxのBuildrootでWiFiに自動で接続できるようにするためにwpa_supplicantをやめてiwdにしていたんだけど、hostapd不要でAPが建てられるらしいのでiwdだけでSoft APを試してみた。

/etc/iwd/main.confの中でEnableNetworkConfigurationがtrueになってるとDHCPでIP割当まで自動でやってくれるらしい。デフォルトでtrueになっていた。

まずはAP用の設定ファイルを作成。

/var/lib/iwdの中にapという名前のフォルダを作って、AP名のコンフィグファイルを作成する。今回はluckfoxというAP名にしたかったのでluckfox.apという名前でファイルを作った。

[General]
Channel=1
DisableHT=false

[Security]
Passphrase=12345678

[IPv4]
Address=192.168.4.1
Gateway=192.168.4.1
Netmask=255.255.255.0
DNSList=192.168.4.1

luckfox.apの中身はこんな感じ。

あとはWiFiアダプタをapモードにしてapをスタートするだけ。

iwctl device wlan0 set-property Mode ap
iwctl ap wlan0 start-profile luckfox

これでSoft APが立ち上がる。

5GhzにするにはChannelを36以上に設定すればいいらしいけど"Argument type is wrong"って出て設定できなかった。ちなみに/etc/iwd/main.confにはCountry=JPを追加してある。LuckfoxのSDKでインストールされるバージョンは2.3だった。

PCから接続してみるとLuckfox側のWiFiドングルがRTL8821CUでもRT3070でもおなじ11Mbpsで繋がるのでなにか設定があるのかな?と思って試しにAndroidのNet Analyzerで確認してみると、b11/n150で40Mhz,WPSで立ち上がっていた。
そんでもってAndroidで接続するとWiFi4で150Mbpsで接続される。ということはPC側のRZ608との相性かもしれない?試しにPCにWLI-UC-GNを繋いで接続すると150Mbpsとして確認できた。g54がないことによるかもしれない?

通常のStationモードに戻す場合は

iwctl device wlan0 set-property Mode station

でもとに戻すことができる。
手軽にAPモードを使えるのは便利。

2024年12月9日月曜日

Luckfox Pico Mini BでUSB LANを使ってみた。

 USB WiFiドングルをホットプラグ対応にして自動でWiFiにつなげるようにしたのでLANケーブルを取り外してしまったんだけど、たまーに有線LANが欲しくなるのでUSBで接続できるようにしてみた。
ピンヘッダを付けてもいいんだけど端面スルーホールに端子をつけるのは折れそうで怖いし…

USBドングルはだいぶ前に購入したUSB208B NO.:8150ってやつがあったのでとりあえずこれを動かせるようにしてみようかなと。

見るからに怪しいし、8150って書いてあるのにVID PIDは0bda:8050で中身のチップはRTL8152Bという。とりあえずチップに合わせてrtl8152のカーネルモジュールをビルドしてみる。

Ubuntu上のLuckfoxのSDKで

cd $HOME/luckfox-pico/sysdrv/source/kernel
cp ./arch/arm/configs/luckfox_rv1106_linux_defconfig .config
make ARCH=arm menuconfig

RTL8152/RTL8153を選択してSave

make ARCH=arm savedefconfig
cp defconfig ./arch/arm/configs/luckfox_rv1106_linux_defconfig
cd $HOME/luckfox-pico
./build.sh driver

そんでもって、ドライバだけをビルドする。

cd $HOME/luckfox-pico/sysdrv/out/kernel_drv_ko

の中にカーネルモジュールが出来上がるのでこの中のrtl8150.koを保存しておく。
これでUbuntu上の作業は終了。

次にLuckfox Pico Mini Bを起動して今回はWinSCPでファイルを転送することにした。

/oem/usr/ko

の中に先ほど保存したrtl8150.koを転送する。
次に

/lib/udev/rules.d

の中にある61-usbdevice.rulesを開いて下の2行を追加。

ACTION=="add", ATTR{idVendor}=="0bda", ATTR{idProduct}=="8050", RUN+="/sbin/insmod /oem/usr/ko/r8152.ko"
SUBSYSTEM=="net", ACTION=="add", ENV{INTERFACE}=="eth*", RUN+="/sbin/udhcpc -i %E{INTERFACE}"

あとは

udevadm control --reload-rules

すれば完了。

自動でeth1が上がってくるためにこうしたけどなにか間違ってるかもしれない?
たまに繋がらないことがあるのはアダプタが悪いのか設定が悪いのか…

これでWiFi関連をいじくるときにしくじってログオンできないことが無くなりそうなのでとりあえずいいかな。

2024年12月8日日曜日

Buildrootでiwdを使ってWiFiに自動で接続する。

 Luckfox Pico Mini BでRalink RT3070Realtek RTL8821CUを使ってWiFiに接続できたのは良いんだけど、起動時や途中で抜き差ししても自動で接続させたい。
カーネルモジュールの読み込みはudevでうまく動いたんだけど、ifupdown-scriptsのほうが組み込まれているためか、interfacesでallow-hotplugが使えなかったので他の手法を試してみることに。

wpa_supplicantの代替ということで、iwd (iNet Wireless Daemon)を試してみた。これはWiFiが切れたりしても自動で再接続してくれるし、hostapdいらずでAPモードも使えて便利そう。

Luckfox Pico Mini Bはフラッシュメモリが128MBなんだけど、色々入れすぎて容量がいっぱいになってしまったのでこの前入れたwpa_supplicant、iw、wireless toolsは削除して、iwdだけにしてみた。iwdはカーネルのCrypto APIの関係でカーネル側も変更が必要だった。

Ubuntu上のluckfoxのSDKで

cd $HOME/luckfox-pico/sysdrv/source/kernel
cp ./arch/arm/configs/luckfox_rv1106_linux_defconfig .config
make ARCH=arm menuconfig

メニューから選択してくのは面倒なので一旦Saveして閉じて
このディレクトリにある.configを開いて下記を全部yにする。

CONFIG_CRYPTO_USER
CONFIG_CRYPTO_USER_API_HASH
CONFIG_CRYPTO_USER_API_SKCIPHER
CONFIG_KEY_DH_OPERATIONS
CONFIG_CRYPTO_ECB
CONFIG_CRYPTO_MD5
CONFIG_CRYPTO_CBC
CONFIG_CRYPTO_SHA256
CONFIG_CRYPTO_AES
CONFIG_CRYPTO_DES
CONFIG_CRYPTO_CMAC
CONFIG_CRYPTO_HMAC
CONFIG_CRYPTO_SHA512
CONFIG_CRYPTO_SHA1
CONFIG_RFKILL

WiFi関連のためにmにしてあとから読み込んでいたのもあるんだけどinsmodしても認識されなかったのでyにして組み込んでしまった。

make ARCH=arm savedefconfig
cp defconfig ./arch/arm/configs/luckfox_rv1106_linux_defconfig

savedefconfigして次はアプリケーションの設定。

cd $HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/
make menuconfig

ここからwpa_supplicant、iw、wireless toolsのチェックを外して、iwdのチェックをいれる。

make savedefconfig
make clean
make

make cleanをしてしまったのでここで25分ぐらいかかった。make cleanしないとアプリケーションが消えないから容量が…

cd $HOME/luckfox-pico
./build.sh lunch
./build.sh

あとはビルドして書き込み。

luckfoxを起動したらluckfox側での作業。

udevでWiFiドングルが自動で読み込まれるようにまずはシェルスクリプトを編集する。
/oem/usr/koの中にinsmod_wifi.shがあったのでこれを書き換えた。ない場合は作ればいいかも。実行権限つけるの忘れずに。

#!/bin/sh
cmd=$(realpath $0)
_DIR=$(dirname $cmd)
cd $_DIR

export PATH=$PATH:/oem/usr/ko/

#RTL8821CU
if [ $1 = "8821cu" ]; then
	insmod cfg80211.ko
	insmod libarc4.ko
	insmod mac80211.ko
	insmod rtw88_core.ko 
	insmod rtw88_usb.ko 
	insmod rtw88_8821c.ko
	insmod rtw88_8821cu.ko
	insmod ctr.ko
	insmod ccm.ko
fi

if [ $1 = "r-8821cu" ]; then
	rmmod rtw88_8821cu.ko
	rmmod rtw88_8821c.ko
	rmmod rtw88_usb.ko 
	rmmod rtw88_core.ko 
fi

#RT2800USB
if [ $1 = "rt2800usb" ]; then
	insmod cfg80211.ko
	insmod libarc4.ko
	insmod mac80211.ko
	insmod rt2x00lib.ko
	insmod rt2x00usb.ko
	insmod crc-ccitt.ko
	insmod rt2800lib.ko
	insmod rt2800usb.ko
	insmod ctr.ko
	insmod ccm.ko
fi

if [ $1 = "r-rt2800usb" ]; then
	rmmod rt2800usb.ko
	rmmod rt2800lib.ko
	rmmod crc-ccitt.ko
	rmmod rt2x00usb.ko
	rmmod rt2x00lib.ko
fi

#No Wifi
/sbin/lsmod | grep -e "8821cu" -e "rt2800"
if [ $? -eq 1 ]; then
	rmmod ccm.ko
	rmmod ctr.ko
	rmmod mac80211.ko
	rmmod libarc4.ko
	rmmod cfg80211.ko
fi

この前組み込んだRTL8821CUとRT2800USBだけにして起動オプションで選べるようにしておいた。

お次はudevのruleを作成。/lib/udev/rules.dの中に99-usb-wifi.rulesを作成して

# Realtek 8211CU Wifi AC USB
ATTR{idVendor}=="0bda", ATTR{idProduct}=="1a2b", RUN+="/usr/sbin/usb_modeswitch -K -v 0bda -p 1a2b"
ATTR{idVendor}=="0bda", ATTR{idProduct}=="c811", RUN+="/oem/usr/ko/insmod_wifi.sh 8821cu"
ATTR{idVendor}=="0bda", ATTR{idProduct}=="c820", RUN+="/oem/usr/ko/insmod_wifi.sh 8821cu"
#SUBSYSTEM=="net", ACTION=="remove", ENV{ID_USB_DRIVER}=="rtw_8821cu", RUN+="/oem/usr/ko/insmod_wifi.sh r-8821cu"

# RT2800USB Wifi
ATTR{idVendor}=="0411", ATTR{idProduct}=="01ee", RUN+="/oem/usr/ko/insmod_wifi.sh rt2800usb"
ATTR{idVendor}=="0411", ATTR{idProduct}=="015d", RUN+="/oem/usr/ko/insmod_wifi.sh rt2800usb"
ATTR{idVendor}=="0411", ATTR{idProduct}=="0148", RUN+="/oem/usr/ko/insmod_wifi.sh rt2800usb"
#SUBSYSTEM=="net", ACTION=="remove", ENV{ID_USB_DRIVER}=="rt2800usb", RUN+="/oem/usr/ko/insmod_wifi.sh r-rt2800usb"

#SUBSYSTEM=="net", ACTION=="add", ENV{DEVTYPE}=="wlan", RUN+="/etc/init.d/S40iwd stop", RUN+="/etc/init.d/S40iwd start"
SUBSYSTEM=="net", ACTION=="add", ENV{DEVTYPE}=="wlan", RUN+="/etc/init.d/S40iwd start"

rt2800usbのドングルはVID PIDが色々あるのでとりあえず持っているWLI-UC-GNとWLI-UC-GNM2TとWLI-UC-G300HPのを追加しておいた。
コメントアウトしてるところはカーネルモジュールをrmmodしようとしたんだけどrt2800usbのほうがiwdでrfkillを入れたからなのか、指したときにremoveもされるのでうまく行かなくなってしまった(wlanの番号がどんどん増えてくし)
とりあえず動くのでいいか…

udevadm control --reload-rules

をやってruleを読み込んだらWiFiドングルを指してみるとip link showするとwlanが増えてるはず。

次にiwdの動作確認。/usr/libexec/iwdを実行してみてカーネルに組み込まれている暗号化モジュールが足りないって言われなければOK。

再起動してみたら今度はudevの起動順番が早すぎてusb_modeswitchは動いてるんだけどカーネルモジュールが読み込まれていない。USB WiFiを抜き差ししてみるとちゃんと繋がるんだけどね。
ということで起動時にもう一回udevadm triggerしてみる

/etc/init.d/S99xを作って

#!/bin/sh

sleep 1
/bin/udevadm trigger

としてchmod 755 /etc/init.d/S99xしておく。

これで起動時にWiFiが認識されるようになった。
最後にWiFiに接続してみる。

iwctlを実行して

wsc list
station wlan0 get-networks
station wifiカード名 connect アクセスポイント名

みたいな感じで簡単にアクセスポイントに接続できる。途中でWiFiアダプタを抜き差ししても自動で復帰してくれた。wpa_supplicantより断然楽かも。

WiFiが使えるようになったのでようやくLANケーブルを外してハンドリングが良くなった。
モバイルバッテリーに繋いでメカナムラジコンの上に乗せてustreamerでFPVもどきをやってみたけど広角レンズとか魚眼レンズ付けないと操作難しいかも。

2024年12月7日土曜日

Luckfox Picoで11ac無線LAN子機を使ってみた。

 先日購入した11acなWiFiドングルWD-4510ACをLuckfoxのbuildrootで使えるようにカーネルモジュールを組み込んでみた。最初はTOKAIZ TWA-001を使おうと思ったけどusb_modeswitchがLuckfoxのbuildrootで簡単に有効にできそうだったので、Driver FreeタイプのWiFiドングルでも大丈夫そう。どっちも同じカーネルモジュールで行けるのでWD-4510ACができればTWA-001も簡単に動きそうだし。

RTL8821CUのカーネルモジュールは何種類かあったんだけど、ラズパイ3Bに組み込んでみたやつは途中まではビルドできるんだけど、cfg80211関連のエラーが出て進まなかったのでrtw88を使ってみた。

実はrtw88はLuckfox用のカーネルの中に組み込まれているんだけどrtl8821cuが含まれていないバージョンだった。なので新しいバージョンに置き換えてビルドしてみることに。
Ubuntu上でLuckfoxのSDKの中のファイルを差し替える。

$HOME/luckfox-pico/sysdrv/source/kernel/drivers/net/wireless/realtek/

の中のrtl88を適当な名前にリネームして、最新のrtw88を持ってくる。
そんでもってKconfigとMakefileを最新のLinuxカーネルのものに差し替える。

https://github.com/torvalds/linux/raw/refs/heads/master/drivers/net/wireless/realtek/rtw88/Makefile
https://github.com/torvalds/linux/raw/refs/heads/master/drivers/net/wireless/realtek/rtw88/Kconfig

からダウンロードした。

cd $HOME/luckfox-pico/sysdrv/source/kernel
cp ./arch/arm/configs/luckfox_rv1106_linux_defconfig .config
make ARCH=arm menuconfig

menuconfigでrtw88を有効にしてrtl8821cuを有効にする。

このバージョンなら8821CUが選べる。表記は8821CUだけど8811CUも使えるようになる。
あとはWirelessのEnable LED triggersを入れておくとmac80211からステータスLEDを制御してくれる。rtw88はこれを有効にしないとLEDが点灯しないので有効にした。
Saveして終了して
make ARCH=arm savedefconfig
cp defconfig ./arch/arm/configs/luckfox_rv1106_linux_defconfig
として設定を保存する。
お次はツール関係。
cd $HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/
make menuconfig

ここからusb_modeswitchを有効にする。

wpa_supplicantとiwとwireless toolsは前回有効にしているのでそのままでOK。

make savedefconfig
make

ビルド

cd $HOME/luckfox-pico
./build.sh lunch
./build.sh

Luckfoxに書き込み。
Luckfoxを起動してUSBをhostモードにしてOTGアダプタを繋いで再起動してlsusbすると

[root@luckfox ko]# lsusb
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 015: ID 0bda:1a2b
Bus 002 Device 001: ID 1d6b:0003

となる。これはCDROMデバイスとして認識するID。

usb_modeswitch -KW -v 0bda -p 1a2b

すると

Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 016: ID 0bda:c820
Bus 002 Device 001: ID 1d6b:0003

となってRTL8821CUとして認識する。

cd /oem/usr/ko
insmod cfg80211.ko
insmod libarc4.ko
insmod mac80211.ko
insmod rtw88_core.ko 
insmod rtw88_usb.ko 
insmod rtw88_8821c.ko
insmod rtw88_8821cu.ko
insmod ctr.ko
insmod ccm.ko
insmod libaes.ko
insmod aes_generic.ko

として先程組み込んだカーネルモジュールを読み込む。

dmesgすると

[  450.921679] rtw_8821cu 1-1:1.2: Direct firmware load for rtw88/rtw8821c_fw.bin failed with error -2
[  450.921716] rtw_8821cu 1-1:1.2: failed to request firmware
[  450.929119] rtw_8821cu 1-1:1.2: failed to load firmware
[  450.929143] rtw_8821cu 1-1:1.2: failed to setup chip efuse info
[  450.929153] rtw_8821cu 1-1:1.2: failed to setup chip information
[  450.929434] rtw_8821cu: probe of 1-1:1.2 failed with error -22
[  450.929561] usbcore: registered new interface driver rtw_8821cu

ファームウェアいれるの忘れてた。

luckfoxの/lib/firmwareの中にrtw88というディレクトリを作成してrtw8821c_fw.binを入れる。firmwareはrtw88のfirmwareフォルダの中に入っている。

WiFiドングルを指し直してusb_modeswitchをやり直してやると

[  552.795533] rtw_8821cu 1-1:1.2: Firmware version 24.5.0, H2C version 12
[ 552.936411] usbcore: registered new interface driver rtw_8821cu

ip link showしてみるとwlan0が増えてる。
認識した!

あとはrt3070のときと同様wpa_supplicantの設定をやればWiFiにつながった。
ちなみにLuckfox Pico Miniと合わせて全体の消費電流は80~100mAぐらいだった。

これでrtw88の最新版を有効にすることができたので今回はRTL8821CUを使えるようにできた。流石にRT3070のUSB WiFiアダプタは今どき売ってないだろうし。RTL8812BUを有効にしてビルドすればRTL8812BUなWI-U2-866DM/Nが使えたりするかもしれない。

Bluetoothを使わないのであればTWA-001(RTL8811CU)で十分かも。ちなみにTWA-001もちゃんと使えました。usb_modeswitchがいらないので便利。

次は8821CUのBluetoothを使えるようにしてみたい。

追記:自動で接続できるようにしてみた。

2024年12月6日金曜日

Luckfox PicoでµStreamerを使ってみた。

 LuckfoxのbuildrootでUVCなWebカメラを接続してustreamerが動くのか試してみた。Webカメラ側でハードウェアでMJPEGに変換したのをそのままブラウザで表示させるぐらいならメモリ64MBでも行けそう。改造したメカナムラジコンもESP32からLuckfoxにすればカメラを見ながら操作できたりするかも?

WiFiにつながるようにしたときにUSB hostは動いていたので、OTGアダプタにUSBハブを繋いでWiFiとLogicool C270を接続してみた。まさかのUSB3.0+USB2.0ハブとして売られていたハブがUSB1.1なMW7211Aが使われていたので今回はBuffaloのUSB2.0ハブに交換した。

ちなみにUSBハブが1.1だと
v4l2-ctl -d /dev/video0 --list-formats-ext
したときに解像度が800x600までしか対応していなかった。USB2.0のハブに交換してみたら1280x720まで対応した。

USBカメラが認識したところでustreamerのインストール。
Luckfoxのbuildrootは2023.02.6なのでustreamerのパッケージが追加される前だった。なので手動で新しいバージョン用のパッケージを追加してみた。

UbuntuのSDKの環境で、
mkdir $HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/package/ustreamer
cd $HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/package/ustreamer
wget https://git.busybox.net/buildroot/plain/package/ustreamer/Config.in
wget https://git.busybox.net/buildroot/plain/package/ustreamer/ustreamer.hash
wget https://git.busybox.net/buildroot/plain/package/ustreamer/ustreamer.mk
としてustreamer用のパッケージ情報をダウンロード。
そしたら
$HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/package/
の中のConfig.inをテキストエディタで開いて
menu "Audio and video applications"の一番下に
source "package/ustreamer/Config.in"
と追加して保存。

あとは
cd $HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/
make menuconfig
で先ほど追加したustreamerをTarget packageのAudio and video applicationsの一番下で選択する。
そしたら
make savedefconfig
make
cd $HOME/luckfox-pico
./build.sh lunch

でLuckfox Pico Mini Bの内蔵フラッシュを選択したいので、2-1-0の順番で選ぶ。

./build.sh

でビルドする。

これでluckfoxに書き込みして
ustreamerって実行すれば動くはずだったんだけど
Segmentation fault (core dumped)が出てしまって起動しない。

仕方ないのでgdbで調べてみると
us_build_short_options()
で落ちてることがわかった。どうやら起動オプションのショートオプションの方の処理で落ちてるっぽい。ということでここをコメントアウトしてビルドしてみることに。

$HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/output/build/ustreamer-6.16/src/ustreamer
の中の
//	us_build_short_options(_LONG_OPTS, short_opts, 128);
をこんな感じにコメントアウトしてもう一回makeからやり直してみた。
そしたら一応セグることはなくなった。バイナリのサイズもなぜか390kbから443kbに増えてるし。uClibcだということが関係しているのかもしれない。
しかしショートオプション(-hみたいなやつ)が使えなくなったのでロングネームオプションで起動してみる。
ustreamer --device=/dev/video0 --host=0.0.0.0 --port=80 --format MJPEG --resolution 1280x720 --desired-fps 15
これでブラウザからアクセスしてみるとちゃんとカメラの映像を表示することができた!
ちなみに30FPSだと少し不安定な気がする。15FPSでも遅延が250msぐらいだったので、ラズパイZero Wと同じぐらいの遅延で行けた。
とりあえずショートオプション使えなくても問題なさそうなのでまずはこのまま使ってみようかな。Buildrootは起動がすごく早いのでROM化すれば気軽にUVCカメラをネットワークカメラにできてしまうかも。

2024年12月2日月曜日

10Gtek WD-4510ACをラズパイで使ってみた。

 ラズパイ3BでTOKAIZ TWA-001を使って100Base-TなLANよりも2倍ぐらいのスピードでデータ転送できていたので、Luckfox用にも買おうかなと思っていたらBluetooth付きのアダプタがあったのでポチってみた。10Gtek WD-4510ACってやつ。技適にも対応しているらしい。(214-118694)

本体には品番の刻印が入っているだけっぽい。技適番号が書かれたシールがパッケージに貼られていたのでラズパイPicoみたいにパッケージも取っておかないといけないかも。ドライバーフリーらしい?
BT+AC600って書いてあるけど、詳しくはBluetooth 4.2 + 11ac 433Mbps(5Ghz) or 11n 150Mbps(2.4GHz)っぽい。おそらくWiFi部分はRTL8811CUと同じなのでWiFiで2.4GHzと5GHzは同時に使えないんだろうな…

このドライバーフリー、届いてから気がついたけどLinuxで使うには結構曲者らしい。接続するとCDROMデバイスとして認識してドライバをインストールさせるタイプのデバイス…
ちなみにチップはRTL8821CUらしいので、無線LANデバイスとしてはRTL8811CUなTWA-001と同じカーネルモジュールが使用できる。RTL8811CUにBluetoothがついただけ?

USBで接続するとCD-ROMデバイスとして認識するのでEjectするとRTL8821CUになるので、

usb_modeswitchとかで自動的に切り替えたりしないといけないかなぁと思いつつTWA-001用にカーネルモジュールを組み込んだラズパイ3Bに刺してみたら自動でRTL8821CUとして認識した。
[509911.795098] usb 1-1.3: new high-speed USB device number 7 using dwc_otg
[509911.925938] usb 1-1.3: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 2.00
[509911.925963] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[509911.925971] usb 1-1.3: Product: DISK
[509911.925977] usb 1-1.3: Manufacturer: Realtek
[509911.926999] usb-storage 1-1.3:1.0: USB Mass Storage device detected
[509911.928186] scsi host0: usb-storage 1-1.3:1.0
[509913.007488] scsi 0:0:0:0: CD-ROM            Realtek  Driver Storage   1.00 PQ: 0 ANSI: 0 CCS
[509939.401813] usb 1-1.3: USB disconnect, device number 7
[509939.498534] usbcore: registered new interface driver uas
[509939.794817] usb 1-1.3: new high-speed USB device number 8 using dwc_otg
[509939.927602] usb 1-1.3: New USB device found, idVendor=0bda, idProduct=c820, bcdDevice= 2.00
[509939.927627] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[509939.927635] usb 1-1.3: Product: 802.11ac NIC
[509939.927641] usb 1-1.3: Manufacturer: Realtek
[509939.927647] usb 1-1.3: SerialNumber: 123456
[509943.674673] Bluetooth: hci1: RTL: examining hci_ver=08 hci_rev=000c lmp_ver=08 lmp_subver=8821
[509943.674933] usbcore: registered new interface driver btusb
[509943.676880] Bluetooth: hci1: RTL: rom_version status=0 version=1
[509943.676946] Bluetooth: hci1: RTL: loading rtl_bt/rtl8821c_fw.bin
[509944.208529] Bluetooth: hci1: RTL: loading rtl_bt/rtl8821c_config.bin
[509944.344123] Bluetooth: hci1: RTL: cfg_sz 10, total sz 34926
[509946.052897] Bluetooth: hci1: RTL: fw version 0x75b8f098
[509949.472147] IPv6: ADDRCONF(NETDEV_CHANGE): wlan2: link becomes ready
[509949.644846] Bluetooth: hci1: Opcode 0x c23 failed: -110
[509949.644865] Bluetooth: hci1: command 0x0c23 tx timeout
[509951.241321] Bluetooth: hci1: unexpected event for opcode 0x0c23
[509951.270304] Bluetooth: hci1: RTL: examining hci_ver=08 hci_rev=75b8 lmp_ver=08 lmp_subver=f098
[509952.342776] Bluetooth: hci1: RTL: examining hci_ver=08 hci_rev=000c lmp_ver=08 lmp_subver=8821
[509952.511430] Bluetooth: hci1: RTL: rom_version status=0 version=1
[509952.511457] Bluetooth: hci1: RTL: loading rtl_bt/rtl8821c_fw.bin
[509952.511682] Bluetooth: hci1: RTL: loading rtl_bt/rtl8821c_config.bin
[509952.511862] Bluetooth: hci1: RTL: cfg_sz 10, total sz 34926

mesgすると一回CD-ROMデバイスとして認識されているのでカーネルモジュールの方で対策されてるのかな?とりあえずTWA-001のときのようにカーネルモジュールをインストールしておけばラズパイでも普通に使えることがわかった。
接続されると青色LEDがアクティビティーインジケーターになってるようだ。

ちなみに8821cu自体はConcurrent Modeに対応しているのでカーネルモジュールが対応していればSTAとAPモードを同時に使えたりするらしい。しかしデフォルトで組み込まれてるカーネルモジュールだと"valid interface combinations"が出てこなかったので無効になってるっぽい。

luckfoxに差し込んだ状態だとCDROMデバイスのカーネルモジュールすら組み込まれていないので0bda:1a2bなデバイスとしてしか認識できなかった。ラズパイと同じカーネルモジュールを組み込めば勝手にやってくれるのかなぁ?

とりあえずラズパイ用に使用してluckfoxのbuildrootでTWA-001を動かせないか頑張ってみようかな。
追記:動きました。

2024年12月1日日曜日

Luckfox Pico Mini B用にOTGアダプタを買ってみた。

 LuckfoxでUSB host機能を使うために給電対応のOTGアダプタを買ってみた。さすがにICテストクリップで給電するのも危ないような気がしたし…
ついでにUSBハブも購入してみた。

USBハブとOTGアダプタでLuckfox Pico Miniより大きくなってしまうけど。

装着すると明らかにハブ+OTGアダプタの方がでかいけど、給電はテストプローブから比べるとすごく安心感がある。書き込みのときは差し替えすればいいだけだし。ケーブルタイプと一体型で迷ったけど意外と一体型もありかもしれない。

取り合えずこれでUSB Type CケーブルでUSBデバイスもLuckfox本体も同時に給電できているのでUSBハブにいろいろUSBデバイスを繋いでお試しできそう。

カーネルモジュールでEnableにできるデバイスはWiFiみたいに簡単に追加できるので色々試してみたいな。今までテストプローブ外してUSBで書き込みが面倒だったのでこれで少しはSDKでいじるのが楽になりそう。

ちなみにUSBハブの方はラズパイZero W用に買って改造したやつと同じ形状をしているけど、USB3.0が1ポートついていたり、VIDとPIDが違うし(0a05:7211)別物っぽい?

開けてみるとICにはMW7211Aって書いてあるので調べてみるとUSB1.1じゃん…だめじゃん…

2024年11月30日土曜日

Luckfox Pico Mini BでmDNSを使ってみた。

 LuckfoxでWiFiを使えるようにしたのはいいんだけど、いちいちIPアドレスをルーターの設定画面で調べるのが面倒なのでmDNSを使えるようにしてみた。WiFiだとUSBドングル側のMACアドレスなのでIPアドレスは毎回同じのが割り振られているんだけど、LANとNDISはビルドするたびにMACアドレスが変変わるのでIPアドレスも変わるんだよね…

mDNSはavahi-daemonというパッケージを追加すれば使えそうだったので追加してみる。

前回同様Ubuntu上のSDKでの作業になる。

cd $HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/
make menuconfig

Target packageのNetworking applicationsでavahiを有効にする。
avahiを有効にしたらIPv4LLとmDNSを有効にする。IPv4LLはWindowsで言う自動プライベートアドレスを使えるようにできる(DHCPでアドレス割り振られないとき)のでついでに有効にしておいた。

あとはいつもどおりSaveして、

make savedefconfig
make
cd $HOME/luckfox-pico
./build.sh lunch

でLuckfox Pico Mini Bの内蔵フラッシュを選択したいので、2-1-0の順番で選ぶ。

./build.sh

でビルドする。

あとはWinSCPでWindows側にファームウェアを転送して書き込むだけ。

このままLANに接続するとデフォルトでhostnameがluckfoxになっているのでluckfox.localで接続することができる。
ためしにコマンドプロンプトからssh root@luckfox.localするとログオンすることができた。
しかしビルドするたびにssh-keygen -R luckfox.localしないといけないけど…

とりあえずこれでWiFiで接続しても、LANで接続してもいちいちルーターの設定画面でIPアドレスを探さなくても良くなったので便利。

2024年11月23日土曜日

Luckfox Pico Mini BをWiFiに繋いでみる。

 前回Luckfox PicoにLANケーブルを直結してとりあえずLANで接続できるようになったので、USBホスト機能でUSBデバイスを使ってみることに。

電源はLuckfox Pico MiniのVBUSとGNDのピンヘッダを使って5Vを入力した。USBはダイソーのType C OTGアダプタを使用。ピンヘッダのVBUSに5Vを入れるとUSB側にも5Vが流れるのでデバイスにもそのまま電源を供給できる。

USBの切り替えはbuildrootを起動してluckfox-configコマンドから設定できる。

LAN経由でLuckfoxにSSH接続してluckfox-configと実行。USBでのNDISが使えなくなるので、シリアルコンソールかLANから設定を変更したほうが良い。USBの設定をhostに変更して再起動すればUSBのモードがホストに変更される。
ちなみにPWMとかのデバイスもこのluckfox-configから有効化できるっぽい。デフォルトではGPIO以外無効になっているので使うデバイスは有効にするといいかも。デバイスファイルが結構消えたなとか思ったら自分でビルドしたbuildrootでは全部オフになってた。

早速USBデバイスを指してみる。USB WiFiが使えないかな?ということでrt3070なUSBドングル(Buffalo WLI-UC-GNM2T)があったので早速指してみた。
lsusbしてみる

[root@luckfox ko]# lsusb
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 007: ID 0411:01ee
Bus 002 Device 001: ID 1d6b:0003

一応0411:01eeとして認識しているけどdmesgではWiFiモジュールがロードされてない感じ。

ということでカーネルモジュールを追加してみることに。ここからは前回同様にVM上のUbuntuマシンでの作業になる。

カーネルの設定は公式ページを参考にしてカーネルのmenuconfigからrt2800usbを有効にしてカーネルをビルドし直す。

cd $HOME/luckfox-pico/sysdrv/source/kernel
cp ./arch/arm/configs/luckfox_rv1106_linux_defconfig .config
make ARCH=arm menuconfig

Device Drivers > Network device support > Wireless LANのRalink devicesでスペースキーを押して有効に。そして下のRalink driver supportもスペースキーを押してMに。
Rockchip Wireless LAN supportもデフォルトでMになっていた。これでCFG80211とMAC80211が有効になってるっぽい。

あとはsaveでファイル名そのままで保存する。

make ARCH=arm savedefconfig
cp defconfig ./arch/arm/configs/luckfox_rv1106_linux_defconfig

これでカーネルのビルドの設定が終わったのでお次はWiFi関連のツールとRalink rt3070用のfirmwareを有効にする。

cd $HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/
make menuconfig

でTarget packagesのNetworking applicationsからwpa_supplicantとiwとwireless toolsを有効にする。
さらにTarget packages→ Hardware handling→ Firmware→ WiFi firmwareでRalink rt27xx/rt28xx/rt30xxを有効にする。そしたらSaveして画面を閉じる。

make savedefconfig
make

でアプリケーションをクロスコンパイル。

あとは

cd $HOME/luckfox-pico
./build.sh lunch

でLuckfox Pico Mini Bの内蔵フラッシュを選択したいので、2-1-0の順番で選ぶ。

./build.sh

でビルドする。ビルドが終わったら前回同様にluckfoxに書き込む。これでUbuntu側での作業は終了。
LuckfoxにLANからSSHに接続して、USBの設定がデフォルトに戻っているのでhostに設定して再起動。

またLuckfoxにSSHで接続して、下記のコマンドをLuckfox側で実行。

cd /oem/usr/ko
insmod cfg80211.ko
insmod libarc4.ko
insmod mac80211.ko
insmod rt2x00lib.ko
insmod rt2x00usb.ko
insmod crc-ccitt.ko
insmod rt2800lib.ko
insmod rt2800usb.ko
insmod ctr.ko
insmod ccm.ko
insmod libaes.ko
insmod aes_generic.ko

このようにWiFiに必要なモジュールとrt2800usbモジュールを読み込んでおく。カーネルモジュールによっては必要なモジュールを最初に読み込んでおかないといけないので順番に注意。順番バラバラに読み込んでいたら"unknown symbol in module, or unknown parameter"っていうエラーが出て困った…
更に下の4つはWiFiのセキュリティー認証とかで必要なモジュールで、これがないとAPに繋がっても一瞬でdeauthenticatingされてしまって(Reason: 1=UNSPECIFIED)ってなんだよ!ってなる。

これでdmesgをすると

[   20.604498] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[   20.633333] cfg80211: Problem loading in-kernel X.509 certificate (-22)
[   20.637840] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[   20.637873] cfg80211: failed to load regulatory.db
[   45.084413] usb 1-1: reset high-speed USB device number 2 using xhci-hcd
[   45.273651] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 3070, rev 0201 detected
[   45.289515] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 0005 detected
[   45.289882] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[   45.292707] usbcore: registered new interface driver rt2800usb

rt3070チップセットを認識して、rt2800usbがロードされてる!
WiFiのネットワークデバイス名を知るために
ip link show
をしてみたらwlan0が増えていた。

次にwpa_supplicantの設定。

nano /etc/wpa_supplicant.conf

で設定ファイルを開いて、network=のところを修正。

network={
        ssid="WiFiのSSID名"
        psk="WiFiのパスワード"
        key_mgmt=WPA-PSK
}

SSIDとパスワードはルーターの設定に合わせる。pskを直打ちが気になるようならwpa_supplicantのビルド設定をしたときに、wpa_passphraseも選んでおいて変換するといいかも。

wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
udhcpc -i wlan0

dmesgしてもちゃんとファームウェア(rt2870.bin)がロードされてそう。
これでifconfigをしてみると…

WiFiにつながってる!
とりあえず今回はrt2800usbを使って昔Xlink Kai向けに500円で投げ売りされていたrt3070なWifiドングルでWifiに繋いでみた。今購入するならrtlwifiが使えるっぽいのでrtl8192cuが搭載されているWDC-300SU2SBKとかなら行けるかも?
追記:WD-4510ACが動きました。

ちなみにLuckfox Pico MiniとWLI-UC-GNM2T(RT chipset 3070, rev 0200)の組み合わせでWiFiに繋いだ状態での消費電力は200mAぐらい。WLI-UC-GN(RT chipset 3070, rev 0201)とだと130mA。WLI-UC-G300HP(RT chipset 2872, rev 0202)だと300Mbpsでハイパワーということもあり260mAぐらいだった。

あとは自動でカーネルモジュールを読み込めるようにしないとな。

追記:自動で接続できるようにしてみた。

2024年11月17日日曜日

Luckfox Pico Mini BをLANに繋いでみた。

 昨日、Luckfox Pico Mini Bの動作確認ができたので今回は早速内蔵のEthernetを使用してLANに繋いでみた。本当は純正のオプションのようにパルスコイル内蔵のRJ45コネクタを使わないといけないんだけどそのまま繋いでもとりあえずつながるらしいので試してみた。純正オプションだとHR911105Aを使ってるっぽい。保護用のダイオードとかも入ってそう。

前にRaspberry Pi Zeroで監視カメラを作ったときにカットしたLANケーブルが残っていたのでこれを使ってみることに。

rv1103に内蔵されてるEthernet PHYは100BASE-Tなので使用するのは4本。

TXP、TXN、RXP、RXNにそれぞれケーブルをつなぐんだけど、TXがオレンジの対、RXが緑色の対になってて、PがPositiveで白線が入ってるほう、NがNegativeでそれぞれの色のほうを接続する。
まぁ今回はとりあえずお試しなので直結

LANケーブルがハンダできたら今度はLANポートを有効にしたバージョンのbuildrootを自分でビルドしないといけないのでビルド環境を作ってみた。
Oracle VMの中にUbuntu 22.04をインストールして公式の手順に従いながらビルド環境を整える。あと日本語で詳しく説明されている方もいたのでこちらもすごく参考になった。

./build.shを実行する直前にdtsファイルを弄ってEthernet PHYを有効にする必要がある。これを実行すると結構時間がかかるので実行する前にやった方が良い。
Ethernet PHYを有効にする方法はこちらの公式Wikiを参考にした。
開発環境のフォルダの中で
luckfox-pico/sysdrv/source/kernel/arch/arm/boot/dts
の中にある
rv1103g-luckfox-pico-mini.dts
の中で
gmacのところのstatusをdisabledからokayに書き換えて保存する。
あとは./build.shを実行してLuckfox Pico Mini B用のSPI NAND用イメージをビルドした。
36分かかった…
output/imageフォルダをWinSCPでWindowsに持ってきて昨日アップデートしたように書き込んで完成。

起動してみると…
無事インターネットに繋ぐことができた!
とりあえずLANポートも動くことが確認できたので100BASE-T用のパルスコイル搭載のRJ45ポートを買ってこないとなぁ

LANにつながったので、USBポートをUSB HOSTとして使えるようにしてみたい。

2024年11月16日土曜日

Luckfox Pico Mini Bを買ってみた。

 AliexpressのセールでLuckfox Picoが安くなっていたのでポチってみた。rv1103搭載で128MB FLASHがついてるLuckfox Pico Mini Bで1075円だった。Choiceを使って他にも部品を購入して1500円ぐらいに調整したので送料は無料だったのに5日で届くとは…速い!

Rockchip rv1103側にはmicroSDカードスロットが搭載されている。
こちらの面には128MBのFlashと書き込みボタンとカメラ用のCFIインターフェースがついてる。このサイズでLinuxが動くとはすごいな…
ちなみにRAMは64MB。

とりあえずフラッシュ付きを購入したのでUSBに指してみた。USBの隣の赤色LEDが点滅して起動している感じ。PC側はRemote NDIS based Internet Sharing Deviceとして認識される。あとはADB Interfaceも追加されていたのでADBでもデバッグできそう。

チュートリアルによるとSSHで接続できるらしいので、PC側のNDISインターフェースのIPアドレスを172.32.0.100に固定して、172.32.0.93にSSHで接続しようとしても接続できない…
ということでUARTで繋いでみることに。

UARTのピンアサインは公式サイトを参照してUART2に接続。Baudrateは115200bps。
初期で入っているbuildrootのカーネルバージョンは5.10.110だった。

どうやらsshdが動いていない感じ?ということでとりあえずアップデートしてみることに。
公式のFlash書き換え手順を参照して最新のLuckfox_Pico_Mini_Flash.zipの中身に書き換えてみた。
するとカーネルバージョンは5.10.160にアップデートされてる。
SSH接続を試してみるととりあえずつながった。
ちなみにshutdownじゃなくてhaltコマンドで電源を切ることができるみたい。ぶつ切りしてもいいのかな?ROM化しないとだめかな?

今回はとりあえず動作確認。一応イーサーネットポートも付いていて、オプションでLAN用パルストランス内蔵のRJ45ポートのアダプタも売っているよう。ということはパルストランス内蔵のRJ45ポートさえ買ってきて繋げばLANに繋げられる?

そしてLuckfoxのチュートリアルは結構充実していて公式ページを見ると一通りは使えそうな感じ。buildrootのビルドとかもやってみたいな。

2024年11月1日金曜日

DualSenseをホールエフェクトセンサ化してみた。

 友人のPS5のコントローラにドリフト現象が出てきたらしく、とりあえず掃除して接点復活剤を塗って使っていたらしいんだけど実はホールエフェクトセンサを入手していたらしいので交換してみた。

本当はホットエアとかあるといいんだけど、今回はハンダゴテとハンダ吸い取り器だけでやってみた。はんだごてはFX600C2の先端をつけてある。吸い取り器は手動タイプだけど大容量タイプのやつを使っている。

まずは分解。黒いカバーとR1、L1ボタンを外すとネジが出てくるので4箇所取り外す。
手前側に爪がある。トリガーに引っかかり気味だけど結構簡単にカバーが空いた。
バッテリーを取り外して、下にあるネジを外しつつ、フラットケーブルを抜いてく。
振動モーターのケーブルはハンダで取り外す。
基板はゴムの部分で結構しっかり固定されていたのでどっかにネジが有るのか不安になった。
アナログスティックの可変抵抗部分を起こして一個ずつ外していくことに。
可変抵抗は足が3本なのでハンダを盛りながら三本全部を素早く順番に温めていくと外れる。結構基板に熱が逃げるのではんだごての設定温度はMAXで作業した。
とりあえず可変抵抗部分が2つとも外れたら間にマイナスドライバーを入れつつ、スティック本体の4本と押し込みのスイッチの4本の足を先程のように何度も順番に加熱しながら少しずつ隙間を開けてゆく。
結構ここが面倒だったけど取り外したらこんな感じ。あとは裏からはんだごてを当てながら表からハンダ吸い取り器でハンダを吸い取る。
ハンダゴテだけでスティックを取り外すためのジグも売っているらしい。
ちゃんとハンダを吸い取っておかないとスティックがぴったりなので入りにくくなるので注意かも。吸い取ったあとはパーツクリーナーを綿棒につけて掃除しておいた。

今回取り付けるホールエフェクトセンサー搭載のスティックはGuliKit PS5 TMR Electromagnetic Joystick
ホールエフェクトセンサー搭載のスティックは色々種類があるけど物によってはジッターが酷かったりするみたいなので選択が難しそう。これはジッターも少ないらしい。
DualSenseはUSBで接続してキャリブレーションが可能なので、キャリブレーションボード(レギュレータ)は不要らしい。DualSense Edgeはキャリブレーションボードが必要っぽい。
スティックもついてて純正より少し長め。摺動部がメタルになっているのでスムーズに動きそう。
先ほどスティックを外した基板に搭載してはんだ付けする。温度設定は420℃がちょうどよかった。
はんだ付けが終わったら組み付けて完成。

とりあえず動作確認してみるとセンターでもプルプルしない。さすがジッターが少ないと言われているだけある。

最後にキャリブレーションを行う。
USBでPCに接続してGoogle ChromeからDualShock Calibration GUIを開いてキャリブレーションを行う。
とりあえず動作確認した感じだと問題なさそうなので実際に友人に使ってもらって確認してみよう。スティック部分の長さが変わるので純正品が良いと言われたのでとりあえずもともとついていた純正品に戻しておいた。

2024年10月24日木曜日

YSP-2200がARCで繋がらないのでケーブルを変えてみた。

 この前テレビをSONYのKJ-65X80WKに買い替えたんだけど、今まで使っていたYAMAHAのYSP-2200をARCポートに接続しても認識するけど音が出ないという問題が発生した。ARC対応のHDMIポート(このテレビの場合はHDMI3)に接続すると外部スピーカーモードになってテレビ側のスピーカーがオフになるのに、YSP-2200からは全く音が出ていないという状況。

そしてさらにはYSP-2200に接続していたBDプレーヤーから映像を出そうとするとYSP-2200のLCDのHDMIマークが点滅して映像がテレビに送信されていない。

別なHDMIケーブルに変更してみるとYSP-2200のHDMIインプットに接続したデバイスからの映像はテレビに送られるけど、テレビ側からの音声が送られない。おそらくこのケーブルはARCに対応していないからかな?

ということでHDMIケーブルを新調してみた。ARC対応って書いてあったのでAmazonベーシックのHDMIケーブルを購入。テレビ側はeARCとかHDMI2.1対応だけどスピーカ側が古いので大丈夫かなと言うことで、お安いHDMI2.0だけどARC対応のケーブル。

早速差し替えてみるとあっさり動いた。指した瞬間にデバイス認識してスピーカーの電源が入って音がなるし、テレビ側から音量調整とかもできる。電源も一緒に切れるし便利。
前のテレビでは電源連動がなかったんだけど、映画を見るとき以外はテレビの内蔵スピーカーを使っていたので設定から自動で電源をいれる機能はオフにした。

YSP-2200の電源をいれるとテレビ側のスピーカーがオフになってYSP-2200から音が出るし、YSP-2200の電源を切るとテレビ側のスピーカーに切り替わる。

eARCに対応していないスピーカーだけどテレビ側が新しい規格に対応したらケーブルも最新にしておくべきなんだなぁ。

2024年10月20日日曜日

Amazonの設置・回収サービスを利用してみた。

 ちょうどセールで65インチのSONYのテレビが安かったのでAmazonの設置回収サービスも無料キャンペーン期間なので買い替えてみた。無料と言ってもリサイクル料は別で、シャープの52インチからの買い替えなのでもとのテレビを回収してもらうのに2970円は現金で支払う必要があったけど。

木曜日の夜にポチって日曜日には設置回収までしてくれた。前日の夕方ぐらいに日程の確認の電話が来たんだけど、業者はクロネコヤマトだった。

15:00~18:00の間と言われていたんだけど15:00ちょっと前に電話がかかってきて15:00ピッタリぐらいに到着。

ちょうど古いテレビは配線を外していたところだったのでそのままヤマトの人に回収してもらって、新しいテレビを開封してる間にテレビ台を掃除する感じでギリギリ掃除が間に合った。あとはテレビ台の上においてもらって配線も設定もやってくれそうだったけど今回はテレビ台に配線を隠したかったので自分でやることにした。

箱とかも全部回収してくれた。

スマートテレビ意外と便利だなぁ
WiFiもなかなか繋がりが良かったので今回はWiFiで接続して使っている。有線はFireTV StickにつながってるけどしばらくFireTV Stick使われないかも。

ホームシアターは前のテレビで使っていたヤマハのYSP-2200で4KのHDMIに対応していないので、ARCポートに接続して他のデバイスはテレビのHDMIに直接指すことに。
しかしうまく動かなかったのでケーブルを変えてみようということでケーブル待ち。

2024年10月19日土曜日

Dnsmasqでデバイス毎にDNSサーバを設定してみた。

 DD-WRTを入れたルータでDNS広告ブロックスクリプトを動かしてると、スマートデバイスとかで不具合が出ることがあるのでDnsmasqで特定のデバイスだけ除外できるように設定してみた。TVerみたいに広告消したい場合はコツコツホワイトリストに入れていかないと行けないけど、スマートリモコンとかだと特にその必要もなさそうだし。

どうやって特定のデバイスだけDNS広告ブロックを無効にするか考えてみたんだけど、DNS広告ブロックはルータがDNSサーバとなっているので、デバイス側が直接外部のDNS(プロバイダから供給されてるのでも良いし、1.1.1.1とかでもよい)にアクセスしてしまえばよい。
まぁこの場合手動でIPアドレスを設定してDNSまで指定してやっても問題ないんだけどそもそもスマートデバイスは画面がなかったり、リモコンで設定するのも面倒。

ということでDnsmasqで特定のMACアドレスのデバイスにだけ個別に設定を送ってやろうと思う。

DnsmasqでDNSの設定をする場合はdhcp-optionを使うんだけども、tag機能を使うことによってtagを設定されている特定のデバイスだけにoptionを適応することができるっぽい。optionの6がDNSサーバの設定で、DHCPでIPを割り振る際にDNSサーバまで指定することができる。

dhcp-host=30:03:c8:01:02:03,set:noblock
dhcp-option=tag:noblock,6,1.1.1.2,8.8.8.8

まずは1行目で、MACアドレスに対してタグを設定する。タグの名前は何でも良いけど今回は「noblock」にした。複数のデバイスを指定したい場合はこの行を増やしてMACアドレスだけ変えれば良い。
そんでもって2行目で特定のタグにだけdhcp-optionを適応する。6はDNSサーバの設定のOption番号で、その後ろにカンマ区切りでDNSサーバーのIPアドレスを指定する(複数指定可能)今回はCloudflareのマルウェアブロックの1.1.1.2と念の為セカンダリにGoogle DNSの8.8.8.8を指定した。

DD-WRTの場合はServiceタブからDnsmasqの設定ができる。

とりあえずPCの有線LANと無線LANでテストしてみると、無線LANのMACアドレスにだけ別なDNSが設定された。これでMACアドレスが分かればDD-WRTの設定画面から自由にDNS広告ブロッカーを無効にしたりできるので便利。

応用すればFireTVStickにSmartDNS ProxyとかのDNS設定するときにも使えそう。

2024年10月5日土曜日

Nature Remo mini 2を修理してみた。

 知り合いがNature Remo mini 2が動かなくなったので見てほしいというので借りてきた。もしかしたら落としたからかも?と聞いたのでコネクタ部の断線かな?

結構小さい。電源コネクタはminiUSBっぽいのでもしかしたらコネクタかも…
Remo-2W2というモデルナンバーになるらしい。ESP32-WROOM-32Dが入っていそうな感じ。
早速分解。ネジとかはなくて爪でハマってるだけみたいなので、ちょっと歪ませて隙間を作ったらあとはギターピックで一周すれば傷つけることなく開けることができた。

表面にはESP32と赤外線受光部、IR LEDとI2C接続の温度センサーが。

裏面にはDCコンバータとコネクタが。
コネクタのところを見る限り問題なさそうだけど…
一応はんだごてを当ててみた
すると起動した!

やっぱりmicroUSBはちょっと弱い気がする。
結構簡単な構造をしているので電源が付かなくなったパターンだと電源回路か断線のパターンが多そうな感じがする。