2021年6月27日日曜日

Raspberry Pi 3BでRX8900を使ってみる

 ラズパイをスタンドアロンで使うときに時計が狂うのが気になる…
ということでRTCを導入してみた。ラズパイでRTCって言うとMaximのDS1307とかDS3231が有名だと思うけど今回は秋月で売っていたEPSONのRX8900にしてみた。

秋月ではいくつかEPSONのRTCを扱ってるみたいだけどRX8900はVBAT端子が付いてるから楽かも?ということで。しかしRaspberry Pi OSではデフォルトでドライバモジュールが入っていないのでDS1307とかみたいにお手軽ではないけど…
そして結局VBATがついていてもダイオード必要なのは変わらず…

というわけで今回はバッテリバックアップRTCとして使用するので、回路的にはVBATにダイオードと抵抗(100Ω)を介してCR2032を接続する形にした。ダイオードはアプリケーションノートだとショットキーバリアを使うように指示されていたけどラズパイみたいな3.3V駆動だと電池が元気なうちは3.2Vぐらい出ている事によって内蔵ダイオードとのVFのバランスで無駄に電池消耗するんじゃないかということで低リークなスイッチングダイオードにした。
ちなみに0.1uFのコンデンサ2つは秋月の基板に内蔵されている。

お次はドライバモジュールのビルド。EpsonのダウンロードページにLinux用のドライバモジュールが公開されている。使用許諾ページを経てダウンロードページへ進むと、RX8900用のLinux用ドライバソース(rx8900_k3.8-v1.0.zip)がおいてあるんだけど、カーネルバージョンが古すぎて自分の手ではうまく修正できなかった…

ということでRX8900のアプリケーションノートを見ていると、RX8804CEあたりが評価ボード同じそうだし、レジスタが共通らしい?ということで先程のダウンロードページからRX8804CE用のドライバソース(rx8804_k4.1-v1.1.zip)をダウンロードしてみた。解凍してみると、readmeにRaspberry Pi 3が載ってるし行けそう。と思ったがそのままではビルドできなかった…
こちらのソースはカーネルバージョン4.1用なのでRX8900のやつよりは新しいんだけど、今のRaspberry Pi OSが5.10だしな…
しかしエラーメッセージを頼りに少し編集したら行けたので忘れないようにメモ。

まずはカーネルヘッダーが必要なのでapt-getでインストールする。

sudo apt-get update
sudo apt-get install raspberrypi-kernel-headers

180MBくらいあるので3分ぐらいかかった。
お次はダウンロードしたドライバソースを解凍して準備

unzip rx8804_k4.1-v1.1.zip
cd RX8804

まずはMakefileがクロスコンパイル仕様になっていたので修正。
6行目、KDIRのところを

KDIR :=/lib/modules/$(shell uname -r)/build

にする
11行目、CROSS_COMPILEから始まる行をごっそり

$(MAKE) -C $(KDIR) M=$(shell pwd) modules

に書き換える。このとき先頭のタブでインデントされてるところは消さないこと。

あとはrtc-rx8804.cの中で「rtc_irq_set_state」のある行(424行目と428行目)をコメントアウト。どうやらrtc_irq_set_stateが定義されていないとかエラーが出るし、PIE使わないからいいかと…

これでmakeすると無事ビルドが通ってrtc-rx8804.koが完成した。

make
sudo cp rtc-rx8804.ko /lib/modules/$(uname -r)/
cd /lib/modules/$(uname -r)/
sudo depmod
cd

これでモジュールのインストールは完了
本当はi2c-rtc.dtboもRX8804対応にすればconfig.txtで設定できるんだろうけども今回はよくわからなかったので起動時に読み込むようにした。これによりNTPがつながらないときにRTCに適当な時間を書き込んでしまうという減少も起きなかったし…

あとはI2Cを有効にした状態で
/etc/rc.localのexit 0の前に

sh -c 'echo rx8804 0x32 > /sys/class/i2c-adapter/i2c-1/new_device'
/sbin/hwclock --hctosys

この二行を追加して保存するだけ。
これで起動時にRTCが読み込まれるようになるので
timedatectlコマンドを実行するとRTCのところがn/aだったのが時刻が表示されるようになっていた。ネットに繋がった状態で実行したので自動で時刻も調整されていた…

しかし結局カーネルのバージョンが上がるとビルドし直しなので、ラズパイでかんたんにRTC使うならデバイスツリーに対応したデバイスがいいのかも。/boot/overlays のなかのREADMEのi2c-rtcのところにリストがある。
今の所、abx80x, bq32000, ds1307, ds1339, ds1340, ds3231, m41t62, mcp7940x, mcp7941x, pcf2127, pcf2129, pcf85063, pcf85063a, pcf8523, pcf85363, pcf8563, rv1805, rv3028, sd3078, s35390aが対応しているらしい?
この他にもレジスタが互換のやつは使えるらしい。たとえば秋月で売ってるRTC-8564NBはpcf8563で使えるらしいし。RTC-8564NBにしておけばよかったー

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

録画用ラズパイにChinachuを入れてみた

 PX-BCUDとKTV-FSUSB2で地デジとBS/CS録画可能なRaspberry Pi 3B、そろそろmicroSDがヘタってきて遅いのでRaspberry Pi OSで再セットアップしてみた。
未だにRaspbianだったし…
最近nasneも売れてるみたいだしね。Chinachu+Mirakurunでnasneみたいに使えないかなとか思ったり。

Raspberry Pi OSのセットアップは簡単になってるっぽい。とりあえず公式サイトからRaspberry Pi ImagerをダウンロードしてきてRecommendedなGUI付きの32Bit版をインストールしてみた。
今回microSDにはこの前ドラレコにも購入したSandiskのHIGH ENDURANCEの64GBにした。本当はMLCなIndustrialが欲しかったんだけど高かったので…

セットアップ時は過去のブログ記事(自分用メモだし)を参考にコマンドをコピペしてセットアップすると便利なのでまずはsudo apt-get install xrdpでWindowsのリモートデスク接続できるようにしておいた。これやると右クリックメニューのコピーでテキストだけじゃなくてファイルもコピペできるので便利(ドラッグアンドドロップはできないけど)

前回はCUIのみにしていたんだけど今回は再生機としても使いたかったのでGUIに。いままでWinSCP使ってたけど意外とxrdpでのファイルのコピペも便利なのよね。

今回は録画管理にChinachuとチューナ管理にMirakurunを使用することに。

まずはPX-BCUD用にrecdvbのセットアップ。こちらは前回同様で問題なくビルドできた。
Mirakurunで使う場合はやはりrecpt1とコマンド互換なdogeel版が良さげ。

次にKTV-FSUSB2用にrecfsusb2nのセットアップ。こちらも前回同様でそのままビルドできた。しかしrecfsusb2nをCATVパススルー対応化したときにUHFに戻すのが面倒なので起動オプションで切り替えられるようにまた改造を加えてみた。--catvで周波数設定部分をCATVの計算式にしてくれるやつ。ちなみにチャンネル番号の頭にCをつけるバージョンも作ってみたんだけど、これだとMirakurunでは手動でチャンネル指定しないといけなくて面倒だったので…
ちなみに今回もBCASカードはPX-BCUDと共用にした。(どっちみちUSBポート3ポートうまるんだよな…)

ちなみにどちらもHTTPサポートはMirakurunにも付いてるので無効にしてる。

ここまでは前回のシステムと同様なんだけどここからはMirakurunとChinachuのセットアップ。

curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install nodejs
sudo npm install pm2 -g
sudo npm install mirakurun -g --unsafe --production

こんな感じでとりあえずnodejsとMirakurunをインストール。nodejsはv14にしてみた。pm2でプロセス管理されているようなので最初にpm2のインストールが必要っぽい。

- name: KTV-FSUSB2N
  types:
    - GR
  command: recfsusb2n --b25 --catv <channel> - -
  isDisabled: false

チューナー設定はこんな感じで追加した。今回はCATVパススルー環境なので勝手にCATV対応して--catvオプションつけたバージョンを使用しているのでこんな感じになってる。通常環境だと--catvオプションはないはず。これだとCATVをGRとして登録できるのでMirakurunの地デジ用のチャンネルスキャン機能が使えるのである…(便利

sudo mirakurun restart
curl -X PUT "http://localhost:40772/api/config/channels/scan"
sudo mirakurun restart

Mirakurunを一旦再起動してチューナー設定を反映させてからチャンネルスキャンをして、チャンネルスキャン終わったらもう一回Mirakurunを再起動させてチャンネル設定を反映させる。
ちなみに今回はBS/CSとCATVが混波されてる環境だったんだけど、分波器を通さないとKTV-FSUSB2の受信感度が下がってしまってうまく受信できないチャンネルもあった。fsusb2nを使う際はやはり分波器通したほうがいいかも。

お次はChinachuのインストール。

git clone git://github.com/kanreisa/Chinachu.git ~/chinachu
cd ~/chinachu/
./chinachu installer

1のAutoを選択。
めっちゃ時間がかかった…ラズパイ3Bだと3時間かかった…

cp config.sample.json config.json

これでコンフィグファイルを作成して起動準備完了である。pm2でChinachuも自動起動できるように設定しようとしたんだけど、npmのバージョンの関係かなのかうまく起動しなかったので無理やりcronで起動することに…

@reboot	/home/pi/chinachu/chinachu service wui execute
@reboot	/home/pi/chinachu/chinachu service operator execute

あとはラズパイ起動時にcronがChinachuを起動してくれるので http://raspberrypi:20772/ にブラウザからアクセスすれば予約やリアルタイム視聴が可能になる。(ホスト名変更してる場合はホスト名をあわせて
スマホでのリアルタイム視聴も可能っぽい。ラズパイ3BだとHWエンコードでもMP4トランスコードは厳しそうなんだけど、VLCのアプリ版を入れればスマホでもM2TSのすべて無変換設定でリアルタイム視聴が可能だった。


2021年6月5日土曜日

Logicool C310nとC270の分解比較

 このまえロジクールC270のレンズが交換できないか確認してみたけどカバーの形状的にC310nのほうがSマウント(M12)化しやすそうだったのでC310nを買ってみた。やすかったし。

結構小さい箱
C310nはレンズの部分が丸いのでSマウント化したときに単純に穴を大きくすればかっこよく仕上がりそう。奥行きが心配だけど。
C270との違いは画角が55°から60°になっていたり、RightLight2に対応しているぐらいかな。ちなみにC270nはRightLight2に対応しているっぽい。手持ちのC270は古いのでRightLight1なんだけど、これのせいでFPSが下がっていたりしていたので特に必要なさそう。2だと改善されているのかな?

C270とC310nを比較するとフロント以外ほぼ同じ感じ。
C270のほうは1/4インチのナットを取り付けていたんだけど、接着が取れてしまったので中の重りを取り出して1/4インチのタップで直接ネジを切ってみた。C310nにもこの改造しておこうっと。これで三脚に取り付けが簡単に。
フロントベゼルを外すとネジが出てくるんだけど、どっちも同じ位置。なんかフロントの外観以外形状は同じかも。
基板の方はC270もC310nも同じ大きさかも。マイクのゴムの高さが違うのはハウジングの形状が違うからっぽいし。センサは違うっぽいけど、レンズマウントは同じ感じだった。とりあえず樹脂のSマウントを購入して中にちょっと詰め物をしてマウント側の穴を開け直すしかないかな。

ちなみに純正状態での画角を比較してみた。

左がC270、右がC310nなんだけど画角に違いはないかも。三脚が少しズレてしまっているだけ。とりあえず樹脂製のSマウントと1/2.5型用の焦点距離1.7mmなレンズをポチってみたので届いたら交換して見ようと思う。