[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

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月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年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年2月4日日曜日

パルワールドの鯖をLinuxで立てて落ちたら自動で再起動。

 最近友人とパルワールドをプレイしてるんだけど、Linux鯖で鯖を立てていても地味に落ちていて自分がいないときにみんながプレイできなくなるパターンがあったので自動で再起動するようにしてみた。
ダンジョンに入った瞬間に落ちたりすることが多いかも。

パルワールドの鯖の建て方は公式に載っているので割愛するけど、SteamCMDをHomeディレクトリに入れておいて、Homeディレクトリ内のpalworldディレクトリから起動するようにしている。

./steamcmd.sh +force_install_dir palworld +login anonymous +app_update 2394010 validate +quit

鯖のインストールもアップグレードもとりあえずはこの1行で行っている。

設定ファイルはこの場合で言う、palworld直下のDefaultPalWorldSettings.iniにデフォルトの設定が保存されるので、このファイルの中身をコピーして、./Pal/Saved/Config/LinuxServer/PalWorldSettings.iniの中身に貼り付けて必要な設定を変更する。とりあえずServerNameとServerPasswordだけ変更した。

そんでもってPalServer.shを起動すれば鯖が立ち上がるんだけど、4人ぐらいでプレイしていても2時間置きぐらいにセグったりして落ちているので、自分が先に寝たりすると友人が入れなかったりで(地味に夜通しでやってるやつも居るし)ということで対策してみた。

まえにどこかで見た手法何だけど、とりあえずいちばん簡単なシェルスクリプトでwhileを使って実装してみた。

#!/bin/bash
cd palworld
count=0
start_time=$(date +%s)
while :
do
  ./PalServer.sh
  echo "Server Down"
  end_time=$(date +%s)
  run_time=$(((end_time - start_time) / 60))
  count=$(expr $count + 1)
  echo $count
  echo $run_time
  sleep 10s
done

とりあえずこんな感じでhomeディレクトリにpal.shとかで保存して実行権限を与えれてScreenで実行してる。落ちた回数と稼働時間もコメントするようにしてあるけど、実際はwhileの中でPalServer.shを呼んでいるだけ。落ちると10秒待って何度でも実行される。

一応こんな感じで簡単に実装したんだけど今のところちゃんと動いてる。1日に5回ぐらい落ちてるけど…。

アップグレードが来たら自動で更新できるようにしたいなぁ

2023年4月2日日曜日

DD-WRTでクライアントにNTP鯖を強制的にリダイレクトしてみた。

 WiFiにつながるデバイスが増える中でRTCを持たずにNTPサーバから時計を取ってくるデバイスが増えてると思うんだけども、NTPサーバを強制的に変更できないか試してみた。

微妙に時間がズレてるのとか気になるし。中華デバイスとかだと鯖も中華とかなのかな。

方法としてはNTP鯖が特定できればルータのhostsとかdnsmasqで飛ばせたりするんだろうけども、今回はiptablesでNTPポートの123を特定のNTP鯖に飛ばすようにしてみた。

iptables -t nat -A PREROUTING -p udp -m udp --dport 123 -j DNAT --to-destination 162.159.200.1:123
iptables -t nat -A POSTROUTING -p udp --sport 123 -j SNAT --to-source 162.159.200.1:123

DD-WRT化したルータなのでiptablesがそのまま使えるのでWebアクセスでSSHを有効にしてSSHからこの2行のコマンドを実行した。NTP鯖はCloudflare Time Servicesを使わせてもらった。これでこのルータに繋がっているデバイスからNTPのポート123にアクセスする場合は全部指定したIPアドレス(162.159.200.1)の鯖につながるようになる。

ためしにコントロールパネルの日付と時刻から適当な鯖にインターネット時刻設定するとうまく同期できるようになってる。でも適当なアドレスではだめっぽい。DNSでIPが返ってくるような存在するアドレスであればうまく設定される。

ちなみにこの設定、ルーターを再起動するとリセットされてしまうので、常に有効にしたい場合はAdministration→CommandsでStartupに入れておくといいかも。削除したい場合は

iptables -t nat -L --line-numbers

でリストを表示してから

iptables -t nat -D [リストの項目] [番号]

で削除できる。(デフォルト状態からの追加だと、iptables -t nat -D PREROUTING 3とiptables -t nat -D POSTROUTING 6だった)

ローカル環境でRTCを持たないデバイスにRTCを持つデバイスからNTPしたい場合にも使えるかも。

2021年11月17日水曜日

TOKAIZ TWA-001をLinuxで使ってみた。

  OrangePi PC用に11acのUSB WiFiアダプタを探していたらTOKAIZのTWA-001が安かったのでなんのチップが載っているのか調べてみた。技適にも対応してるみたいだし。Linuxで使う場合はチップがわかっていればドライバモジュールを探して使えたりするので。
しかしTOKAIZのTWA-001、日本向けっぽくて情報がない。ということで技適の番号210-138110で調べてみるとどうやら中身はCOMFASTのCF-811ACだということが判明。形状は全く同じで刻印が違う感じ。そんでもってCF-811ACはRealtekのRTL8811CUが乗ってるらしい。

そしてドライバモジュールも存在することがわかった。
Realtek RTL8811CU/RTL8821CU USB Wi-Fi adapter driver for Linux

この手のドングル、見た目は同じっぽいけど別なチップが乗っていたりするので難しい。たとえばTP-LinkのArcher T2U Nanoも同じぐらいの価格で、同じようなサイズだけど、RealtekのRTL8812AUが載っていて、RTL8811CUとは品番が似てるけどドライバモジュールに互換性がなかったり。

RTL8811AUとRTL8812CUの違いはちょっと調べたぐらいでは公開されているドライバモジュールではMonitor Modeの対応の違いがありそう。RTL8812AUだとaircrack-ngから出ているドライバモジュールでMonitor modeでairmon-ngが使える。RTL8811CUだとiwしか使えない。
というぐらいしか見つからなかったので特殊な使い方をしなければどちらでも良さそう…

どちらもhostapdは使えそうなので、APモードも問題なさそう。

とりあえずTP-LinkのArcher T2U NanoよりTOKAIZのTWA-001が安かったので早速ポチってみた。

USBに接続すると出っ張り具合はこんな感じ。10cmぐらいのフレキシブル延長ケーブルでOrange Pi PCから離すと電波強度が良くなる。

早速ドライバモジュールをビルドしようと思ったんだけど、試しにifconfigしてみたら普通に認識していた…
lsmodするとちゃんと8821cu(rtl8821cuとrtl8811cuはドライバが共通っぽい)が読み込まれていた。
ちなみにOSはArmbian 21.08 bullseye
インターフェース名がwlxのあとにmacアドレスになっててすごく覚えにくいけど。
Armbianのフォーラムを見る限り、上で貼ったドライバモジュールがマージされてそうな感じだった。sudo iw listをしてみるとAPモードも使えそう。
"interface combinations are not supported"となっているので2.4GHzと5GHzは同時使用できないっぽい。

しかもArmbianにはhostapdも最初から入っていたので設定ファイルさえ作ればAPモードでもすぐに使用可能だった。とりあえず簡易的な設定でAPモードにして繋いでみたら普通につながったのでapmodeも対応しているモジュールが入っているっぽい。brctlも入ってて至れり尽くせり。

hostapdで11ac(5Ghz)で飛ばして1mぐらいの距離でiPhoneからスピードテストしてみたところ上下95Mbpsぐらい出たんだけど、Orange Pi PCのLANが100Mbpsなのでそこがボトルネックになってる。11n(2.4Ghz)だと35~40Mbpsだった。

11acもビルド無しでデフォルトで使えるのは便利だな~
Orange Piシリーズだと技適の問題とかがあるのでどうせ内部接続USBのWiFiを積むならOrange Pi PCみたいにWiFi無しタイプも取り扱ってほしいな。(もしくはヒートガンで剥がすしか無いのか…
Armbianでそのまま11ac使えるようにしてくれてるし。

あとから気がついたんだけどEDUPのEP-AC1689だと技適対応(レビューに技適シール写ってた)でUSB3.0で1300Mbps(5GHz:867Mbps+2.4Ghz:400Mbps)で値段も100円しか違わなかった…
ちなみにEP-AC1689に乗ってるICはRTL8812BUで、Linux用のドライバモジュールもあるみたい。
USB2.0でつかったときの速度はどうなるかわからないけど…(理論上の帯域は足りてないけど。

Realtek RTL8812BU/RTL8822BU USB Wi-Fi adapter driver for Linux
ちなみにArmbianの/lib/modulesの中を覗いてみたらこれも対応してそう。
(rtl88x2buとrtl8812auとrtl8811cuがもうすでに入っていた。)

しかし11acなRealtekのICは種類がおおいな…そして性能的な違いがよくわからない…(ドライバモジュールが対応してないだけで機能的にはついていたり)

ちなみにTWA-001をRaspberry Pi 3Bに繋いでみたけどRaspberry Pi OSにはドライバモジュールが入っていないようだった。でもラズパイ向けの情報はたくさんあるのでビルドすれば普通に使えそうな気がしている。

追記:カーネルモジュールをビルドしたらRaspberry Pi 3BでTWA-001を使用できました。

2021年11月14日日曜日

Orange Pi PCでRTC-8564NBを使ってみた

 Armbianを入れたOrange Pi PCにi2c接続のRTCをつけてオフラインでも時間を保持するようにしてみた。今回も秋月のRTC-8564NBモジュールを使用してみた。Raspberry Pi OSにもともと入っているモジュールでpcf8563として使えたのでArmbianでもそのまま使えるんじゃないかな…

まずはsudo armbian-configで設定画面を開いて
System→Hardwareでi2c0を有効にしておく。
sudo i2cdetect -y 0
でRTCが認識されてるかどうか確認した。

ラズパイの場合はDevicetree Overlayで簡単にRTCの設定ができたので、Orange Pi PCのArmbian上ではどうなんだろうと思って調べてみたら自分でDTSファイルを作成してuser_overlayで読み込ませればデバイスツリーでもRTCが使えるみたい。

Device Tree overlays for sunxi devicesにds1307を使用したサンプルがあったのでRTC-8564NB用に少し変更して使ってみた。i2cバスのレジスタさえ合わせれば他のArmbianなデバイスでも同じように設定できるかも。

/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun4i-a10", "allwinner,sun7i-a20", "allwinner,sun8i-h3", "allwinner,sun50i-a64", "allwinner,sun50i-h5";

	fragment@0 {
		target-path = "/aliases";
		__overlay__ {
			rtc0 = "/soc/i2c@01c2ac00/pcf8563@51";
		};
	};

	fragment@1 {
		target = <&i2c0>;
		__overlay__ {
			#address-cells = <1>;
			#size-cells = <0>;
			pcf8563@51 {
				compatible = "nxp,pcf8563";
				reg = <0x51>;
				status = "okay";
			};
		};
	};
};

これをpcf8563.dtsとかにして保存したあとに

sudo armbian-add-overlay pcf8563.dts

を実行すると自動でコンパイルされて、/boot/armbianEnv.txtに追記してコンパイル済みのdtboが読み込まれるようにしてくれる。
あとは再起動してtimedatectlを実行してみるとRTCが認識されてるはずなので

ls /dev
してみる。

するとAllwinner H3自体にRTCが内蔵されているため、Orange Pi PCではrtc0とrtc1としてRTCが2つ認識されてしまった。どっちがRTC-8564NBなのかは時間を読み込んで見ればわかるので
timedatectl
を実行してみる。そうするとrtc0はCPU内蔵のRTCで、rtc1がRTC-8564NBになっていた。

rtc0が優先されるっぽいのでrtc1がある場合にはrtcへのシンボリックリンクをrtc1にするスクリプトを起動時に実行されるようにする。

sudo nano /etc/rc.local
でexit0の前辺りに

if [ -e /etc/rtc1 ]; then
  ln -f -s /dev/rtc1 /dev/rtc
  hwclock -f /dev/rtc1 -s
fi

と追記して保存。これで起動時にrtc1がデバイスツリーで追加された場合はrtcへのシンボリックリンクをrtc1に変更した後にrtc1の時刻を読み込んでくれる。

今回は時計バックアップ用バッテリに秋月で売っていたMSリチウム二次電池のMS621FEをバックアップ電源に使ってみた。3.3Vからダイオードと抵抗だけで充電できるし良いんじゃないかなと。一緒に低Vfのダイオード買っておけばよかった…最初電池で行こうとしていたので低リークな1SS380しか買ってなかったので、とりあえずこれと1kオーム入れてみたら2.88Vぐらいまでしかチャージされなかった。
秋月だと1SS154あたりが低Vfっぽいので良さそうなので次回買ってみようかな。用途違うけど… 

2021年9月19日日曜日

Orange Pi PCでSPI接続のLCDを使ってみた。

 Orange Pi PCでSPI接続のTFT液晶が使えるかどうか試してみることに。使用したLCDは4年前ぐらいに838円でeBayで購入したILI9341っていうLCDコントローラICを搭載した2.8インチのもの。解像度は320x240だった。おそらく秋月でも売っているMSP2807と互換かな?刻印が違うけど見た目ほぼ同じだし。

Orange Pi PCの方にはArmbian 21.08 BullseyeのCLI版を入れてある。SPI接続のTFT液晶をLinuxで使えるようにする場合、PythonとかでSPIを直接叩いてLCDに表示する方法もあるみたいなんだけど、今回はFBTFTを使用して普通のディスプレイを繋いだときと同じように使えるようにしてみた。小型TFTディスプレイ用のディスプレイドライバ的な感じなので、ドライバが読み込まれた時点からディスプレイに起動時のメッセージを表示したりもできる。

早速試してみようと思ったらなんとfbtft_deviceモジュールが入っていない…
調べてみるとfbtftは2015年から更新されておらず、GPIOの実装が変わったことにより使えなくなるので、Linux Kernel 5.4以降では削除されたらしい。

しかしながらDevice Tree Overlay経由では使えるらしい。Device Tree Overlayには最初から用意されているoverlaysとユーザーが自分で作成して使用できるuser_overlayがあるようで、今回はOrange Pi Zeroで動作確認されていたuser_overlayを改良してOrange Pi Zeroようにしてみた。

device tree overlay for small lcd
こちらのOrange Pi Zero用のdtsファイルを参考にさせてもらった。というかGPIOピンの設定とSPIの設定だけ変更するだけだった。Orange Pi ZeroはSPI1しか出てないけど、Orange Pi PCはSPI0が使えるのし。

まずはOrange Pi PCのSPIを有効にする。

sudo nano /boot/armbianEnv.txt

でArmbianの設定ファイルを開いて

overlays=spi-spidev
param_spidev_spi_bus=0

を追加する。ちなみにもうすでにoverlaysの行があったら後ろにスペースでspi-spidevを追加すればいい。(overlaysの行は2行あってはいけないので読み込みたいオーバーレイを列挙する)

あとは保存して一旦再起動。
再起動後にSPIが有効になってるか

ls /dev

で確認する。リストにspidev0.0が追加されていればSPIが有効になってる。最初にarmbian-configでSPIを有効にしたつもりが実は有効になってなくてハマったのでarmbianEnv.txtを直接編集するほうがいいかもしれない…

SPIが有効になったら次にuser_overrayの設定をする。

ili9341opizero.dtsをダウンロードしてきて、&spi1となっている2箇所を&spi0に変更する。
その編集したファイルのディレクトリで

sudo armbian-add-overlay ili9341opizero.dts

を実行する。するとoverlayファイルをコンパイルしてさらには/boot/armbianEnv.txtにuser_overlayの設定を追加してくれる。

設定が終わったのでとりあえずOrange Pi PCの電源を切る。
ILI9341な液晶をOrange Pi PCに接続する。

VCC→3.3V or 5.0V(LCDのジャンパで設定した方につなぐこと)
GND→GND
CS→PC3
RESET→PA10
DC→PA2
MOSI→PC0
SCK→PC2
LED→3.3V
MISO→PC1

LEDはバックライトなんだけど、
led-gpios = <&pio 0 6 0>;
でPA6に割り当ててfbtft側からオンオフできそうだった。しかしGPIOで直接駆動できるような電流じゃなさそうなので今回は電源に直結した。GPIOで制御するならFETとかロードスイッチ入れないとだめそう。

RESETピンとDCピンはdtsファイルを編集すれば他のピンにも割り当て可能。

LCDを繋いで電源を入れると

こんな感じでHDMIディスプレイを繋いだときみたいにそのまま使える。
GUI版を入れればそのままデスクトップが表示されるんだけど解像度が小さすぎる。フレームバッファを使用して描画できるアプリならそのまま動く。

SPIのクロックとか配線を調整すればもしかしたら動画もヌルヌル動いちゃうかな?
今回はできるだけ短い線を使用したけどこの状態だとクロック早くしすぎると表示が乱れそうである。

Device Tree Overlayはラズパイとかではそのまま用意されてるやつを使ったことがあったけど、コンパイルしてdtsファイルをdtboにしないといけないのを知らなかったりして結構ハマった…
armbian-add-overlayなんて便利なコマンドがあるのも知らなかったし。(コンパイルしてちゃんとしたフォルダに保存して読み込み設定までしてくれちゃう)

ちなみにタッチパネルはTSC2046互換のXPT2046がのってるっぽいんだけど、TSC2046の古いバージョンであるADS7846のドライバモジュールが使えるっぽい?

2021年6月20日日曜日

HX711をOrange Pi PCで試してみた

 HX711をOrange Pi PCのGPIO経由で使えるかどうか試してみた。ラズパイだと結構動作報告があるんだけど、Orange Piにも簡単に移植できないかなということでPythonのRPi.GPIOを使って書かれているやつを単純にOPi.GPIOに置き換えてテストしてみた。

今回はhx711pyというやつを使わせてもらった。

このライブラリはRPi.GPIOというPythonライブラリを使っていて、これをOPi.GPIOに変更するだけで行けるはず…

まずはOPi.GPIOをインストール

python3 -m pip install OPi.GPIO

あとはhx711pyをgit cloneして、hx711.pyとexample.pyのRPi.GPIOをOPi.GPIOに変更し、その前の行に

import orangepi.pc

を追加する。これを追加することによってOrange Pi PCのピン配置設定ができるようになる。
GPIO.setmode(GPIO.BCM)のところをGPIO.setmode(orangepi.pc.BOARD)に変更するとOrange Pi PCのBCMの方のピン配置を使用できる。

ピンアサインはOPi.GPIOのソースコードでorangepiのなかのpc.pyを見るとOrange Pi PCのピンアサインがわかるとおもう。(例えばBCMだとライブラリ内で26と入れるとPA20)

とりあえずPA10(DATA)とPA20(CLK)にHX711を繋いでexample.pyのピン設定をhx = HX711(19, 26)みたいに変更してpython3 example.pyを実行してみる。ちなみに今回はI2C用のレベルコンバータを使ってみた。

するとアクセス拒否…

どうやらGPIOはrootでしかアクセスできないみたい。

というわけでgpioグループを作成してユーザーをgpioグループに追加して使用できるようにする。

sudo nano /etc/udev/rules.d/99-gpio.rules

SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"

これをコピペして保存。

あとはgpioグループを作って、自分のidをそのグループに追加して再起動。

これでGPIOがroot以外でも使えるようになった。

この状態でまたpython3 example.pyを実行してみると今度は処理をしているのか、なかなか反応が帰ってこない。試しにHX711の電源を抜いてみると0が返ってくるので処理はしている感じ?しかしちゃんとした値が帰ってこない…

ためしにラズパイで実行してみるとちゃんと値が表示されるのでレベルコンバータとHX711は問題なさそう。もしかしたらAllwinner H3のGPIOの仕様がラズパイと違うのかもしれない。

まぁHX711をこういったSBCで使う場合はDFRobotのGravityみたいにHX711をI2Cで使えるようにマイコンを介してやったほうがいいのかもしれないな。

追記:
結局GPIOは諦めて、Attiny202を使った変換アダプタを作ってI2Cで接続することにしました。

2021年6月13日日曜日

recdvbのトラポン移動対応

この前MirakurunとChinachuを再セットアップしたんだけどMirakurunのLogを見てると結構エラーが出ているのが気になった。どうやらPX-BCUDが指定されたチャンネルによっては反応していない感じ?
どうやらMirakurunのgetServiceで無いチャンネル、もしくはサービスがスキャン中のチャンネルから見つからない場合のエラーのようなので、recdvbの周波数変換テーブルを更新してみた。トランスポンダ移動のたびにやらないといけないらしい…

というわけで2021/06/01時点でのトラポン移動対応のpt1_dev.hを作ってみた。これをdogeel版recdvbのやつに上書きしてビルドすればおっけー。ビルドの方法は前回書いたのでスキップ。

あとはMirakurun側のchannels.ymlも更新する必要がある。これとpt1_dev.h内の周波数変換テーブルがあっていないとgetServiceでエラーが出てそのチャンネルがChinachuやBonDriver_Mirakurunから見えなくなる…


使用するチャンネルだけMirakurunのWebUIから追加した。

これでとりあえずエラーは出なくなったようなので良かった…

2021年4月17日土曜日

MJPG-Streamerの代替としてµStreamerを試してみた。

 前にMJPG-StreamerでWiFiなFPVカメラにすると遅延がどのぐらい出るのかを試してみたんだけど、そのときは解像度320x240の15FPSで行けそうなぐらいだった。
µStreamerを使うとカメラのハードウェアエンコード機能を使えたりするらしいので、この機能でどのぐらい低遅延になるのかを試してみた。

µStreamerはラズパイに最適化されていてラズパイカメラでもMJPG-Streamerより性能が出るらしいんだけど今回は前回試したときと同じBeagleBone BlueとUVC対応Webカメラで試してみた。

まずはBBBlueのOSのアップデート。だいぶ放置していたので今回はeMMCのOSをまるごとアップデートすることに。OSはこちらからダウンロードした。
今回はeMMCのOSをまるごと入れ替えたかったので、consoleフォルダの中のbone-eMMC-flasherから始まるイメージファイルを使用した。ダウンロード後に解凍するとimgファイルができるのでラズパイ用の書込ツールでimgファイルを適当なSDカードに書き込んだ。

あとはBeagleBone Blueに差し込んでSDボタンを押しながら電源を入れるだけ。LEDが5分ぐらい流れたあとに全点灯して少しするとLEDが消えるので、LEDが全部消えたら(ACアダプタ使用時は緑色だけついた状態)電源を抜いてmicroSDカードを抜いて完成。

電源を入れるとeMMCから新しいOSが起動する。

次に本題のμStreamerをビルドする。MJPG-Streamerのようにapt-getだけでは入れられなかったのでGithubの手順通りにビルドした。手順と一緒にMJPG-streamerとの比較が乗ってるので置き換えを狙っていそうな感じ?確かにMJPG-streamerはラズパイではよく使用例があるんだけどあんまり更新されてなさそうだし…

まずは必要なパッケージをインストール

sudo apt-get update
sudo apt-get install build-essential libevent-dev libjpeg-dev libbsd-dev make usbutils

ustreamer本体をダウンロードしてビルド

git clone --depth=1 https://github.com/pikvm/ustreamer
cd ustreamer
make

ビルドに2分ぐらいかかった。

Webカメラを繋げて起動してみる。BeagleBone BlueにACアダプタ接続するの忘れずに(ACアダプタかバッテリがないとUSBポートの電圧が不安定でカメラがうまく起動できない)
今回は前回と同じくC270を使用した。これも一応MJPEGのハードウェアエンコード対応しているらしい。

./ustreamer -m MJPEG -c HW -f 15 -s 0.0.0.0 -p 8080

これでUSBとBeagleBoneをPCに繋いでる場合はhttp://192.168.7.2:8080にアクセスするとµStreamerのページが表示されるはず。
/streamをクリックすると映像が見れる。

デフォルトの640x480でも結構レスポンスが良さそうなので前回同様測定してみた。

解像度640x480の15FPSでも0.25秒だった。ちなみに1280x720でも0.23秒だったのでハードウェアエンコードが効いている感じがある。さらにはFPSを30に上げてみても0.25秒だったので、ハードウェアエンコードができる設定であれば帯域が十分にあれば変わらなそう。(25FPSとかに設定してもC270の設定にないのでFPS30に自動で変更されている)
ちなみにCPU使用率は720Pの30FPS設定でも10%ぐらいだった。

H264のハードウェアエンコード対応のカメラだったら帯域を食わなくていいのかなぁ
でもお高い…
ちなみにSJ4000をUSBカメラモードで使うと遅延が0.31秒ぐらいの遅延だったのでカメラによっても遅延が変わるっぽい。

やっぱりFPVとかやるなら広角レンズのほうが良さそう。C270にワイドレンズつけてもそこまで広がらないからなんかいいのないかなぁ。

μStreamerの方はビルドが面倒かもしれないけどすぐビルドが終わるし、使い勝手もMJPG-streamerとあまり変わらないので置き換えアプリケーションとしてはいいかもしれない。ラズパイに最適化されているらしいので今度はラズパイカメラでh.264での遅延を試してみようかな。

2018年7月1日日曜日

BeagleBone BlueはFPVのカメラとして使えるか?

BeagleBone BlueにとりあえずWebカメラを接続してリアルタイムで映像を送れるのかためしてみた。FPVみたいなことができればいいなと。
WiFi経由で映像を送るとどうしても遅延が気になるので解像度を下げたりしてどの程度遅延が起きるのかも含めて確認してみた。

本当はH264とかで圧縮して遠くに行って帯域が細くなっても通信できればいいかなとか思ったんだけどCPUパワーを食うし遅延も大きくなるかなとか思ったのでまずは簡単なMJPG-Streamerで試してみた。

カメラはLogicoolのC270を使用した。

MJPG-Streamerのインストール。
sudo apt-get install mjpg-streamer

BeagleBone BlueはUSB給電時はUSBポートで電力消費するデバイスが不安定になるので12VのACアダプタも接続しておく。(カメラが再起動を繰り返したりする)
そんでもって
mjpg_streamer -i "input_uvc.so -d /dev/video0 -y  -r 320x240 -f 15" -o "output_http.so -p 8080 -w / usr/share/mjpg-streamer/www"
これでカメラが起動できる。
USBで接続してる場合はPCからhttp://192.168.7.2:8080に接続してStreamをクリックするとリアルタイムの映像が確認できる。

今回は320x240の15FPSで試してみたけど、このぐらいなら結構遅延もなさそう。これ以上になると明らかに遅延している…

とりあえず320x240の15FPSでの遅延を簡易的に測定してみた。
画面にストップウォッチとMJPG-Streamerを横並びに移して、その画面にカメラを向けてスクリーンショットを取る手法で遅延を測った。


この解像度だと遅延は0.17秒ぐらい。思ったよりだいぶ遅延が少ない。PCとの距離が近いからからもしれないけど。CPUの使用率は20%ぐらいだった。

WiFiで手軽にFPVカメラとして使えそう。
モータドライバとかも付いてるしこのボードだけでFPVラジコン作れそうな気がしてきた。

2018年6月23日土曜日

BeagleBone Blueで2Sのバッテリを使ってみた。

BeagleBone Blueにはバッテリ入力端子がついていて2Sのリチウムイオンバッテリを使用することができる。今回は18650タイプのリチウムイオンバッテリを2セル使ってバランス端子付きのバッテリを作って試してみた。

というわけで7.4Whって書いてあった18650のセルが余っていたのでバランス端子だけがついたBealgeBone Blue専用バッテリを作ってみた。投げ売りのノパソ用バッテリをタブを残した状態で分解したやつなのでタブにはんだ付けで組み立ててダイソーの物干し竿カバーと言う名のでかい熱収縮チューブでパックにした。コネクタは3極のXHコネクタでケーブルはAWG20を使用した。赤と黒で7.4Vバッテリなんだけど、バランス端子なので中間から白いケーブルを出してある。
BeagleBone Blue
BeagleBone Blueにはバランス端子から給電も充電もする仕様なのでこの端子だけついてるバッテリでも大丈夫。18650の2Sな電池パックを買ってきて改造するのもいいかも。

このボード、ACアダプタを繋げば充電できるのも便利。バッテリが無くなったらACアダプタ繋げばいいし、ACアダプタ抜けばバッテリ動作に切り替わる。ノートPCみたいな感じ。
ラズパイ用とかだと結構高級な追加ボードになってしまうからなぁ
ちなみに回路図を見た限りではデフォルトでは1A充電に設定されているようなので今回の2000mAhのバッテリだと充電に2時間ぐらいかかりそう。充電IC的には抵抗を変更することによって2Aまで設定できそう。

バッテリ残量LEDも付いてるんだけど、これはGPIOで実装されているようなのでアプリケーションを動かす必要があるっぽい。バッテリを指して起動すると75%のところが一瞬光るので自動で動いてるもんだと思っていた…

アプリケーションはBeagleBone BlueをWiFiなどでインターネットに繋いだ状態で
sudo apt-get update
sudo apt-get install librobotcontrol
でインストールできる。インストールが完了すると自動でLEDが有効になる。
バッテリ電圧を確認したいときは
sudo /usr/bin/rc_battery_monitor
で確認できる。確認したあとにこのアプリケーションを終了するとLEDが消えてしまうので
sudo systemctl restart rc_battery_monitor.service
で再度LEDだけを表示させることができた。

このLEDはGPIOで制御しているので自作のアプリケーションから制御したりもできそう。バッテリ駆動がデフォルトでついてるSBCなにげに便利。

2018年6月17日日曜日

BeagleBone Blueを買ってみた。

BeagleBone Blueが少し気になったので買ってみた。
BeagleBone
Linuxが動くSBCなのにロボット開発用なので入出力が少し豪華。エンコーダ入力とかモータドライバも内蔵されているっぽい。CPUはAM3358でクロックは1Ghz、メモリはDDR3の512MBを積んでいるっぽい。
BeagleBone Blue
ラズパイとかでもGPIOがついているんだけど、エンコーダ入力とかは外付けのマイコンを使わないとやりにくかったりするし、BeagleBone Blueならこれ一つで完結できるとか。
ArduPilotもサポートしているようでOSが動くながらもドローンに搭載されたりしているらしい。
BeagleBone Blue
ボード上のIOはラズパイのピンヘッダと違ってJSTのSHコネクタが採用されていて、各ペリフェラルごとにコネクタが分かれている。専用オプションとかならとても使いやすそうだけど汎用のセンサ類を繋ぐ場合は変換ケーブルを作らなければいけなさそう。
エンコーダ付きのモータを4つ動かせるようにエンコーダ入力とDCモータドライバ出力が4セットあるのがすごい…。バッテリも2Sのバランス入力対応で充電もできちゃうらしい。
インターフェースもUART、I2C、SPI、CAN-BUSなど結構盛りだくさん。9軸IMUも付いてるし。モータとバッテリさえ用意すればなにか作れそうな勢い。WiFiモジュールも一応技適マークが付いていた。
ちなみにフラックスのようにみえるのはコンフォーマルコーティングらしい。てっきりリワークされているのかと思ったけど、DCモータとかLiPoバッテリ回路部分はショートしないようにコーティングされてるみたい。
BBBlue
OSもセットアップ済みらしいので、microUSBでPCに接続すると内蔵のeMMCからOSが起動して、USBデバイスとして認識された。CDC ECMというデバイスのドライバがインストールされなかったけど、USBのネットワークデバイスとして認識するのでputtyとかから192.168.7.2にアクセスしてログオンできる。USBシリアルポートとしても認識するのでTeraTermとかを使ってそちらからアクセスすることもできる。

uname -aをしたらLinux beaglebone 4.4.59-ti-r96だった。こちらの記事を参考にWifiに接続してapt-getでアップデートしておいた。
デフォルトの状態だとラズパイと違って色々アプリケーションが入っていないので(lsusbとかkillallもつかえない…)apt-getで色々入れていかないと。

電源ボタンとか複数のLEDがついていてわかりやすいし結構使いやすいかも。電源ボタンで終了できるのは地味に便利。

Wifiルータに繋いで動かすときにもIPがわからなくなったりするのでとりあえずmDNSをインストールしておいた。
sudo apt-get install avahi-daemon libnss-mdns
これで再起動すればbeaglebone.localで接続できるようになる。

あとはサーボ用の5Vを有効にするにはGPIO80を出力モードに変更してHIGHにする必要があるっぽい。
sudo echo 80 >  /sys/class/gpio/export
sudo echo "out" > /sys/class/gpio/gpio80/direction
sudo echo 1 > /sys/class/gpio/gpio80/value
ACアダプタか、2Sのバッテリからしか給電できないけど、これでDCコンバータが有効になる。ついでにGPS端子とPower Out端子から出ている5VもUSB給電時は出力されない。
詳しくは回路図が公開されているのでそちらを見るとわかるかも。(UARTがどこに繋がってるかも書いてあるし。)

2018年4月4日水曜日

DD-WRTでSoftEther VPNを使ってみた。

iPhoneでVPNで自宅のネットワークに接続するためにDD-WRTでSoftEther VPNを有効化してL2TPで接続してみた。最近の市販ルータはPPTPぐらいには対応してるのが多いけど、せっかくDD-WRTなのでSoftEatherを使ってみた。

使用しているルータはDD-WRT化したWZR-1166DHP。NANDの容量が多いこともあって、公開されているROMでもいろんな機能が付加されている。
ServiceのVPNにはなんとOpenVPNはもちろん、SoftEther VPNの項目まであった。

ただこの項目からSoftEather VPNを有効にしても設定ファイルをコピペしたりしてもうまく動かない…
ということでSSHから手動で設定することに。

まずはSoftEatherの設定を保存するためにAdministration→ManagementでJFFS2を有効化する。

このルーターの場合は結構な容量がつかえるっぽい。

SSHからコマンドを実行したいのでServicesでSecure Shellを有効にしておいた。

SSHでルーターに接続したらとりあえずSoftEather VPNを起動してみる。

vpnserver start
でSoftEather VPNが起動する。

SoftEatherのダウンロードセンターからSoftEher VPN Server Managerをダウンロードしてきて実行する。このツールでサーバーの詳細設定をすることができる。

今回はGUIのvpnsmgr.exeを使用した。

新しい接続設定からルーターのIPアドレスを設定して、接続するとパスワードを設定するように促されるので、設定パスワードを設定し、そのままウイザード形式でVPNの設定を済ませる。このへんは普通のSoftEther VPNの設定と同様に設定できる。
とりあえず今回はL2TPを有効化しておいた。

ウイザードによる設定が完了したら、ローカルブリッジ設定を開く。

ここでは物理的な既存のLANカードとブリッジするのではなくて、新しいtapデバイスを作成した。先程L2TPを設定した仮想ハブにvpnという名前のtapデバイスを作成してローカルブリッジを設定した。
新しいtapデバイス作成時にエラーが発生する場合はシェルからmodprobe tunをすると良いかも。

ローカルブリッジを設定したら、サーバーマネージャーを終了してSSHのターミナルに戻るって下記コマンドを実行する。

mkdir /jffs/etc (もしフォルダが存在する場合は不要)
cp /tmp/var/lib/vpn_server.config /jffs/etc


これでSoftEatherの設定ファイルがjffsにコピーされて再起動しても消えなくなる。
後はWebの設定画面からAdministrationのCommandsを開いて、下記のスクリプトをスタートアップに登録する。

#!/bin/sh

modprobe tun
ln -s /jffs/etc/vpn_server.config /tmp/var/lib/vpn_server.config
/usr/libexec/softethervpn/vpnserver start
sleep 5
brctl addif br0 tap_vpn


これをCommandsのところに入力してSave Startupをクリックすればスタートアップスクリプトとして登録される。

あとはルーターを再起動すれば自動的にSoftEther VPNが起動して設定が読み込まれるはず。

最後に外部から接続できるようにNAT/QoSのPort ForwardingからL2TP用に500と4500番(UDP)を開けて完了。
ちなみにiPhoneからの場合は「L2TP-VPNサーバーが応答しませんでした。」というエラーはIPアドレスがちゃんと取得されてない場合も表示されるみたいなのでこのエラーが出た場合はポートがちゃんと開いてるかどうか以外にもブリッジ設定などによってちゃんとIPが取得できる状態になっているかどうかも確認する必要があるみたい…
(自分はこのエラーがでてポートが空いてないと思いこんでいろいろやっていたので)

とりあえずこれでDD-WRT上でL2TPが使えるようになった。L2TP以外の手段でSoftEther VPNに接続する場合はポートを開けておくのも忘れずに。