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を開いてキャリブレーションを行う。
とりあえず動作確認した感じだと問題なさそうなので実際に友人に使ってもらって確認してみよう。スティック部分の長さが変わるので純正品が良いと言われたのでとりあえずもともとついていた純正品に戻しておいた。