2021年12月13日月曜日

RP-PB186を買ってみた。

 最近ぼちぼち電車で出張に行く機会があるのだけれども、iPhone 12 miniだと結構使いまくると帰りのバッテリ残量が怪しい。電子マネーも切符もスマホだからバッテリなくなったらやばいよなぁ。ということでモバイルバッテリを買ってみた。

超久しぶりにモバイルバッテリを購入したわけだけど、とりあえず最近流行りのPD対応でお安くて安心できそうなやつということで、ちょうどRavPowerのRP-186のリニューアル版が安かったので買ってみた。10000mAhで1699円。
Amazonに締め出し食らったようでRavPowerとは言っていない状態だったけど…

パッケージはやっぱりRavPower。品番もPB186っていう表記だったけどね…
ちゃんと両端Type Cのケーブルも付属していた。Amazonの製品画像ではRavPowerロゴ消されていたけど実物にはちゃんと入ってる。
Type Cのモバイルバッテリって充電も放電も同じ端子で行けるのがべんりねぇ。一応Type Aもついてる。Type Aからも9V2A出せるって何の規格なんだろ…
PDは12Vまで出せるとか。
18Wだと思って購入したんだけど、実はiPhoneの20Wに対応してそうな感じ。
USB Type C→Lightningケーブルも買っておけばよかったなぁ。

LEDランプはめっちゃ暗い。だがそれがいい。寝てる間に充電しても眩しくない仕様かな。
充電中はバッテリー残量が点滅する仕様。0から25%だったら一個目のLEDだけ点滅するし、75から99%だったら4個目のLEDだけ点滅する。わかりやすくていい感じ。
充電していないときはボタンを押すとバッテリ残量が確認できる仕様。
4つ目のランプが点滅し始めてしばらくするといきなりコイルが泣き始める…
そしていつの間にか治ってる。まぁほぼ気にならないからいいか。
充電が完了すると全部点灯したままになるっぽい。

まぁセルもLG製とかちゃんと書いてあるし、怪しいメーカーのやつよりはいいかなぁ
やすいし。
12Vまで出力できるからUSB PDデコイとか使って遊べるかなぁ。

2021年12月4日土曜日

Edifier TWS330 NBを買ってみた。

 Aliexpressのセールで安くなったりクーポン配ってたりしていたのでEdifier TWS330 NBを買ってみた。レビューも良さげだった。換算レートが微妙なので3,466円だったけど。
Edifierって昔ドスパラでスピーカーが売っていて結構良さそうだったので聞き覚えがあるメーカーということでこいつにしてみた。一応38dBのアクティブノイキャンがついているのにこの価格は安いし。

今回は箱潰れがひどい。まぁこの箱薄いし…
ちゃんと裏面には日本語も書いてある。まぁAmazonでも売ってるから大丈夫かなということで。
まぁここはあえて白を選択してみたけど、BeatsとAirPods Proの中間ぐらいの丸み。結構丸い。
イヤーピースがたくさんついてる。本体にも装着されているので5セット分。あとはTypeCケーブルが付いてくる。
フィルム剥がしたら静電気でめっちゃゴミが付いてしまったけど、表面はテカテカしてるし質感も良い。
技適マークもちゃんとついてる。蓋の裏側に色々プリントしてあるのはAirPods Proみたいな感じ。
イヤホン本体は結構大きく感じる。
一応アプリからノイキャンと外部取り込みモードが切り替えられる。アプリ自体はBLEで接続してるっぽい。なるほどなぁ

PCとつなぐとアプリが使えないので左のイヤホンをダブルタップでノイキャンと外部取り込みモードとノーマルモードを切り替えられる。
対応コーデックはAACとSBCのみなのでiPhoneやMacなどのApple製品系ではAACで使用できるけどWindows 10だとSBCになってしまう。Windows 11ではAAC対応したみたいなんだけどなぁ。
試しにMacBook ProにつないでみたらちゃんとAACで接続されていた。

ちなみにイヤホン本体は1時間の充電で4時間(ノイキャンオフで5時間)持つらしい。ケースは1.5時間の充電で3回イヤホンを充電できるらしい。
意外と充電早いなぁ。

この価格でANCついてて、ちゃんとしたメーカー製で技適も付いてるし、TWS入門機としてはなかなかいいかもしれない。


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にはドライバモジュールが入っていないようだった。でもラズパイ向けの情報はたくさんあるのでビルドすれば普通に使えそうな気がしている。

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

Raspberry Pi Zero専用USBハブを作ってみた。

 AliexpressでUSB2.0の3ポートハブが1.75ドルで売っていたのを見かけたので改造してラズパイZero用にしてみた。

USB3.0のタイプも同じ値段だったんだけど、ラズパイZeroで使うときはUSBホスト機能がUSB2.0までの対応なのでとりあえずUSB2.0対応品を。そもそもUSB3.0のタイプ、1ポートだけUSB3.0で2ポートがUSB2.0なんだけど、USB2.0の信号だけハブを通してUSB3.0の信号は直結っぽい。それでいいのか…
ストラップもUSBのキャップも付属してきている。
品番とかスペック表記はなにもない…
形状はタイムリーのBLOCK3-BKにそっくり。

早速分解。
隙間にデザインナイフを入れてこじるとかんたんにオープンできた。接着とかもされていないっぽい。ICはSL2.1Aだった。BLOCK3-BKはGL850Gだと思っていたのでやっぱり別物なのかな。値段も違うし。ちなみにVID:PIDは1a40:0101
端子構成はこんな感じ。中にスペースが少し有るようだったので早速ラズパイZero用に改造。
基板と干渉しないようなところにmicroUSB端子用の穴を開けてみた。1.2mmぐらいのドリルで4箇所穴を開けたあとにデザインナイフで広げていく感じ。このケース、結構サクサク切れる。そんでもってOTGの配線(IDをGNDにつないだ状態)のmicroUSBコネクタを内側から挿入してホットボンドで固定。microUSBの端子は昔買ったやつがまだ余っていたので…
USBのオス端子は浮かしながらハンダを当てていたら結構簡単に外れた。
あとはオス端子がついていたところにmicroUSB端子からのケーブルをハンダしてカプトンテープを貼って絶縁しただけ。蓋を閉めれば完成。
これでRaspberry Pi Zero WでUSBポートが3つ使えるようになった!電源のmicroUSB端子とも干渉しない。miniHDMIは使わないので実質OK。
USBホストケーブルにUSBハブを付けて作業していたけどこっちのほうが断然スマートで良いなぁ。

2021年10月22日金曜日

EliteDesk 800 G3 DMにM.2 SSDを増設してみた。

 知り合いが小さいデスクトップPCを探していたのでQualitで売っていたHP EliteDesk 800 G3 DMを勧めたところ、SSDにアップグレードしてほしいと言われたのでやってみた。

もともとSSDモデルもあったようなんだけど、見たときには500GBのHDDモデルしかなかったらしい。でもクーポンで27000円ぐらいで購入できた。

SSDは2.5インチの適当なやつを入れようと思っていたんだけど、分解してみたらM.2スロットが空いていたのでM.2タイプのSSDを入れてみることに。

SSDは安いのでいいって言われたので、ADATAのSWORDFISHの250GBが3980円だったのでとりあえずこれにした。M.2用のネジが無かったのでAINEXから出ていたネジを購入。ホムセンのほうが安いかも。あとはディスプレイポートしか無いので変換ケーブル。

まずは純正の状態でBIOSを更新して、TPMのバージョンも確認しておいた。最初から2.0になっていた。Win7で使ってたやつとかだと1.2になってるかもしれないのでWindows 11を入れるのであれば2.0にしておいたほうがいいかも?今回はWindows 11を入れるつもりだったので2.0がほしかった。

ASWORDFISH-250G-C
このSSD、いっちょ前にヒートシンクが付いてるけどだいぶ薄い。
250GBだと部品点数も少ないな。

早速EliteDesk 800 G3 DMを分解。後ろのロックを外して前の方に上のカバーをスライド
あとは上に引っ張れば外れる。
結構コンパクトにまとまってるなぁ
HDDを外すときはHDDの上のレバーを引くだけ。
HDDがを外すとM.2スロットのカバーが見える。このネジを2つ外す。
ちゃんとWiFi用のアンテナまで用意されている。とりあえずアンテナが邪魔だったので少しずらして、M.2 SSDを入れる。ネジは付属していないのでM.2用って売っているミリネジが必要。汎用のネジを使うのであれば低頭のM2の2~3mmでいけそう。ホムセンに売ってるPC用小ねじだとM2x4mmしかなかったのでちょっと長いかなぁ?今回使用したAINEXのやつはM2x2mmだった。
SSD換装
ヒートシンクに透明の保護シールが張ってあるので剥がすのを忘れずに。
あとはもとに戻すだけ。
HDDは使わないので取り外しておいた。

Windows 11を新規インストールしてみたけど普通にドライバも全部はいる感じだった。グラフィックドライバもIntelからWindows 11対応が出ているのでそれだけは手動で更新しておいた。

最後に色々セットアップが完了してから速度を測ってみた。シーケンシャルは2.5インチのSATAのSSDに比べて2倍ぐらい出ている。ランダムは同じぐらいかもしれないけどそれでも同価格帯の2.5インチSSDに比べたら結構早いほうかも。
一番安いM.2 SSDを積んでみたけどM.2が使えるならコスパは断然高そう。
このぐらいの速度なので温度も読み書き時で40度付近で安定してて安心して使える。

2021年10月18日月曜日

Microsoft Bluetooth Mouse RJNを買ってみた。

 AmazonでセールしていたのでマイクロソフトのBluetoothマウスを買ってみた。RJNシリーズのピンクだけ安かったので…

ピンクと言ってもサーモンピンクのような感じのピンク色。
まぁ半額の1300円ぐらいだったので別に色はどうでもいいやという感じで。
電池は1年もつらしい。
表面は結構テカテカ。黒だけマットな感じだったような?傷が付くとどんな感じになるのかな…と慎重になってしまう。モバイル用だから傷だらけになりそう。

光学式で赤色LEDっぽい?ペアリングのときはボタンを長押すると点滅する。電源のオンオフはペアリングと同じボタンを1秒押し。使用中は赤色LEDが点灯しているんだけど、カーソルを止めてると電池セーブのために高速で点滅するよくある仕様だった。

最近ワイヤレスマウスを買うことがなかったので知らなかったけど、このBluetoothマウスはペアリングしたPCからバッテリ容量が確認できるみたい。Bluetoothイヤホンとかだと最近は一般的な機能だと思っていたけど、マウスまでこういう機能が付いてるとは(なんせBluetoothマウス買うのは7年ぶり

クリックのスイッチはKailhのマイクロスイッチが入っているらしいんだけどオムロンのより硬い印象。まぁモバイル用なのでこれも静音化してしまおうかなぁ。


2021年10月17日日曜日

CCS811をRaspberry Piで試してみた。

 CCS811がやすかったので試しに購入してみた。アリエクスプレスで3週間前に注文したんだけど、送料合わせて4.64ドルだった。CJMCU-811っていうブレークアウト基板になっているやつ。

最近CJMCUの紫基板はプルアップ抵抗まで抵抗アレイになっている事が多いかも。ADS1115のブレークアウト基板もそうだったし。前回は抵抗アレイを外してI2Cのプルアップ以外を1005の抵抗に付け替えたけど今回は面倒なのでそのまま試してみることに。
裏面は基板の品番が乗ってるだけ。

とりあえずラズパイにつないで見る。
CSS811は3.3V駆動らしい。あとWAKピンをGNDに落とさないとだめだった。(認識されなくて焦った)
i2cdetect -y 1をするとどうやらアドレスは5aらしい。

とりあえずPythonのサンプルプログラムで動かしてみた。
息を吹きかけると値が動く。
しかし結構このセンサー不安定らしくてエラーが出てサンプルプログラムもなかなか起動しなかった。何回か抜き差ししたりしていたら動いた感じ。I2Cのクロック下げても結構不安定かも?

このご時世このセンサー売れただろうなぁ…
このエラーどうにかできないかねぇ


2021年10月13日水曜日

Raspberry Pi用にKIOXIAのmicroSDを使ってみた。

 友人がRaspberry Pi Zeroでなんか作りたいようだったので初期セットアップするために借りてきた。Wじゃない方なのでCUIでセットアップする場合WiFiにつながるようにしておかないとね…

microSDカードはやすかったのでキオクシアのmicroSDにしてみた。旧東芝だから安心かなぁとおもって。並行輸入品が安くて32GBで600円しないぐらい。

中国語パケージだった。SD変換アダプタも付属してたっぽい。
台湾製

とりあえずスピードを測ってみた。
ライトが早い印象。
サムスンEvoプラスよりも早いし…
あとは耐久性がどうかですな。

2021年9月26日日曜日

ArduPilotのテレメトリにTWELITEを使ってみた。

 この前最近話題のドンキーカーをみて久しぶりにBeagleBoneを引っ張り出してきてArduPilotをインストールしてみたんだけど、WiFiのテレメトリでは距離が心もとないというか一旦切れると再接続がなかなかされなくてちょっと…カメラも付けたかったんだけどな…

テレメトリで悩むのは結局技適対応しているのがXbeeとTWELITEぐらいしかなさそうなところ。Ardupilot用に技適対応テレメトリモジュールも出ているようだけど中身Xbeeとかなんじゃないかなとか思ったり(スペック的に)。Xbeeだとプログラマブルモジュールは安く手に入りそうなんだけど、テレメトリ用途だとめっちゃ扱いにくそうだし、ノーマルタイプはちょっとお高い…

ということでTWELITE(トワイライト)を試してみることに。最近TWELITE UARTっていうUART接続に特化したボードが出たっぽい。2mWのBLUEだと地上だと飛びにくいということで10mWのTWELITE RED UARTにしてみた。

ArduPilot Pixhawk/PX4 Telemetry
アンテナ外付けタイプと内蔵タイプがあったんだけど、アンテナ外付けのほうが電波よく飛ぶかなとかいう安易な考えでアンテナ外付けタイプにしてみた。全部モノワイヤレスの純正品じゃないと技適がどうのこうのということで全部秋月で売っている純正品。
ArduPilot Telemetry
組み立てるとこんな感じ。かなりコンパクト。アンテナは防水タイプもあったんだけど高いので室内用。野外で使うときはビニール被せるか樹脂のケース内に突っ込めばいいかなとか思ったので。

TWELITE UARTは元々App_uartが入っていてそのままUART通信用に使えるので、インタラクティブモードで設定してみた。デフォルトではボーレートが115200になっていた。TWELITE UARTはBPSピンが出ていないのでボーレート変更時は注意が必要かも。せめてディップスイッチをつけてほしかったなぁ…

ArduPilotのMAVLink v2ではパケット長がTWELITEが一回に遅れる最大の80を大きく超えたりすることもある可変長なのでデフォルト設定のTWELITEでは少しきつそうだった。単純にボーレートをあわせただけだと通信が結構遅いのでいろいろ試してみた。

いろいろ試した結果
・ボーレート 115200bps → 57600bps
無入力タイムアウト 100ms → 10ms ・オプションビット 00000100 → 00014000
にすると結構いい感じ。
オプションビットはデフォルトでは区切り文字が設定されているんだけどそれを無効にして、ボーレートをBPSピンが関係ないようにしたのと(TWILITE UARTではこの方法以外でボーレート変更できない)、重複チェッカーの条件を緩くした(これは100ms以下で通信するときに設定してくださいって書いてあった)

無入力タイムアウトと重複チェッカーの条件緩和がかなり効いてそう。MissionPlannerから接続するときのパラメータ取得が純正状態より格段に早い。

設定方法はTWELITE STAGEをダウンロードしてきて実行して適当なUSB→TTL変換アダプタにTWELITEを繋いで実行する。
TWELITE Telemetry
インタラクティブモードに入ったら
"b"を押して"57600"と入力してエンター
"m"を押して"D"と入力してエンター
"k"を押して"0xfd,0,10"と入力してエンター
"o"を押して"00014000"と入力してエンター
あとは"S"を入力してセーブできたら完成。
Baudrateを57600に変更してしまったので次回インタラクティブモードに入るときは
TWELITE STAGEの設定→インタラクティブモードで
Bのボーレートを"57600"に変更しないと接続できなくなるので注意。なので2枚一気に書き換えてしまったほうが良い。

あとは片方をArduPilotに接続するだけ。今回はBeagleBoneを使用したのでUT1に接続して使用した。Serial1はデフォルトでMAVLink2の57600bpsだったのでそのまま繋がるはず。
この設定でパラメータ取得が格段に早くなった。これならWPもTWELITE経由で普通に送受信できる。あとはRCバギーに乗せてArduRoverを設定するだけかな。

2021年9月25日土曜日

Arduino環境のラズパイPicoでW5500を使ってみる。

 この前手持ちのENC28J60をRaspberry Pi Picoに搭載してLAN接続してみたんだけど、やっぱりネットワークに繋いだときにWebServerとか立ち上げるとIP調べるのが面倒なのでmDNSがほしい。
ということでUDPマルチキャストに対応しているW5500に変更してみた。Aliexpressで送料含めても600円ぐらい。

W5500 Liteっていう小さいタイプにしてみた。面実装のパルストランス内蔵LANコネクタの裏側にW5500がついていて凄くコンパクト。裏面にはLANコネクタ側に赤色の電源LEDがついていた。
LANコネクタ側には緑色のLink-Up LEDと黄色のAccess LEDがついてる。LEDの抵抗はすべて2kΩが付いてるんだけど、電源の赤色LEDはいいとしてLAN端子のLEDは結構暗い。明るくするなら510Ω~1kΩぐらいに変更するといいかも。3.3V駆動だし。

早速Raspberry Pi Picoに繋いで見る。今回はArduino環境もMbedベースの公式のじゃなくてearlephilhowerさんのC++ SDKベースのやつに変更してみた。SPIのデフォルトピンも変わるので注意。ピンアサイン変更できるんだけど、今回はデフォルトのピンに接続した。
SCK:18 MOSI:19 MISO:16 CS:17
そしてVCCは3.3V、GNDはひとつだけ繋いだ。
とりあえず準備完了。
今回の目的はmDNSを使えるようにすることだったので、まずはmDNSのテスト。ライブラリが複数存在していたんだだけど、MDNS_Genericだとライブラリのバージョン変えたりCoreのバージョン変えたりしても一向につながらなくてハマった。最終的にはArduinoMDNSライブラリを使うことで簡単に行けた…

ArduinoMDNSはライブラリマネージャから入れることができなかったので、githubからダウンロードしてきて手動でライブラリフォルダに突っ込んだ。

WebServerを立てるのにはEthernet_GenericEthernetWebServerライブラリを使用させてもらった。

とりあえずmDNSとWeb鯖の簡単なサンプルスケッチを作ってみて動作確認してみた。
//Raspberry Pi Pico
//library:
//Ethernet_Generic
//EthernetWebServer
//mDNS Generic

#include <SPI.h>
#include "Ethernet_Generic.h"
#include "EthernetUdp.h"
#include <EthernetWebServer.h>
#include <ArduinoMDNS.h>

EthernetUDP udp;
MDNS mdns(udp);

#define HTTP_PORT 80
#define CS_PIN    17
#define HOSTNAME "rp2040"
byte mac[] = { 0x52, 0x42, 0x00, 0x40, 0x30, 0x10 };

EthernetWebServer server(HTTP_PORT);

//gzip compressed arry
//https://www.mischianti.org/online-converter-file-to-cpp-gzip-byte-array-3/

//File: index.html.gz, Size: 199
#define index_html_gz_len 199
const uint8_t index_html_gz[] PROGMEM = {
  0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x55, 0x4F, 0x4D, 0x0B, 0x82, 0x40,
  0x10, 0xBD, 0x07, 0xFD, 0x87, 0xC9, 0xB3, 0xA5, 0xDE, 0xD5, 0x4B, 0x05, 0x1D, 0x8A, 0x22, 0x82,
  0x08, 0xBC, 0xAC, 0x3A, 0xE4, 0xD0, 0x7E, 0xC4, 0x3A, 0x6A, 0xFE, 0xFB, 0xD6, 0x0D, 0x0F, 0xC1,
  0xC0, 0x9B, 0x79, 0xF3, 0xDE, 0x7C, 0xA4, 0xAB, 0xDD, 0x79, 0x7B, 0x7B, 0x5C, 0xF6, 0x70, 0xB8,
  0x9D, 0x8E, 0xF9, 0x72, 0x91, 0x36, 0xAC, 0xA4, 0x47, 0x14, 0xF5, 0x84, 0x0A, 0x59, 0x80, 0x16,
  0x0A, 0x21, 0x83, 0x22, 0xE8, 0x09, 0x87, 0xB7, 0xB1, 0x5C, 0x04, 0x50, 0x19, 0xCD, 0xA8, 0xD9,
  0xD3, 0x03, 0xD5, 0xDC, 0xB8, 0xAC, 0xC6, 0x9E, 0x2A, 0x5C, 0xFB, 0x32, 0x04, 0xD2, 0xC4, 0x24,
  0xE4, 0xBA, 0xAD, 0x84, 0x9C, 0xEC, 0xC9, 0x26, 0x0E, 0x41, 0x89, 0x0F, 0xA9, 0x4E, 0xFD, 0x93,
  0x5D, 0x8B, 0xD6, 0x33, 0xA2, 0x94, 0x98, 0xC5, 0x45, 0x30, 0x6D, 0x66, 0x62, 0x89, 0xF9, 0x55,
  0xB4, 0xEF, 0x12, 0xAD, 0x1D, 0xE1, 0x42, 0x2E, 0x2A, 0x93, 0x46, 0xBF, 0x86, 0x53, 0x44, 0xF3,
  0x91, 0xA5, 0xA9, 0x47, 0x7F, 0x74, 0x92, 0xDF, 0xB1, 0x04, 0x37, 0xAD, 0x47, 0x0B, 0xD4, 0xC2,
  0x60, 0xEC, 0x8B, 0xF4, 0x73, 0xE5, 0xA4, 0x89, 0x77, 0xCC, 0xCA, 0xC8, 0xFF, 0xF9, 0x05, 0xE8,
  0xC7, 0x44, 0xA7, 0xFF, 0x00, 0x00, 0x00
};

void setup() {
  Ethernet.init (CS_PIN);
  Ethernet.setHostname(HOSTNAME);
  Ethernet.begin(mac);

  mdns.begin(Ethernet.localIP(), HOSTNAME);
  mdns.addServiceRecord("Webserver", HTTP_PORT, MDNSServiceTCP);

  server.enableCORS();
  server.on("/", handleRoot);
  server.begin();
}

void handleRoot()
{
  const char* dataType = "text/html";
  server.sendHeader(F("Content-Encoding"), F("gzip"));
  server.send_P(200, dataType, (const char*)index_html_gz, index_html_gz_len);
}

void loop() {
  mdns.run();
  server.handleClient();
}
これでhttp://rp2040.localにブラウザからアクセスできるようになるはず。一応スケッチ節約のためhtmlはgzipで圧縮してスケッチの中にそのまま貼り付けてある。変換サイト便利。

結構安定して動く感じ。websocketのライブラリとかもあったのでリアルタイムでセンサーからデータを取得したりとかもできそう。
今回はDHCPからアドレスを取得できたけど、できない場合に自動プライベートアドレスにしたりとかをやってみたい。そうすればPCと直結でIP取得できないときでもmDNSで接続できるはず。


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のドライバモジュールが使えるっぽい?