NOAAの画像受信をアンテナ直下に設置したいと考えていたので無線LANが実装されているラズパイ(サイズ,性能的にZERO2)を使いたかったのだが入手困難なため断念してPINE64を利用することにし通信はUSBの小型無線LANを接続して対応することにした
PINE64
PINE64を選択した理由は低価格でラズパイ3と同等性能そして低消費電力だったからである
しかし使ってみるとArmbianにて以下の様な事態が発生,PINE64は癖があり正常に利用できるまで時間を費やしてしまった
- 最初の起動でPanicとなる → 2,3回再起動すると起動するようになる
- メモリ異常でPanicとなる → 発熱だと思われる → (ArmbianがPINE64 LTS用だからかもしれない → メモリが異なるとWikiにはある)
- 64GBマイクロSDカードではRWが遅い → 32GBで解決した
2台購入して2台とも同じ現象なので製品の不良ではない
上記のPanicはヒートシンク,後にFANを追加して何度か再起動すると正常に起動するようになった → CPU温度を監視していると60℃以下にしておかないと異常となることが多いようだ
(他の問題点)
- オーディオジャックから音が出力されない
- マイクロSDカードスロットのロックが貧弱でカードが外れる
受信機
以下の3つ案で専用の受信機を考えていたが,システムをコマンド制御できることが判ったのでSDRドングルを使用
- RTL2832SDR(ドングル)をRTL-SDRで使用
- 一般のFM受信機モジュール+ダウンコンバータで137MHzを受信 → 途中で断念
- 専用受信機を作製(MC3362使用予定)
OS
Armbian22.08 jammy(22.04LTS)を使用する(xfce desktop込みでも良いが必要としない余計なパッケージも入る)→ 後日debianで構築してみる予定
Armbianサイトから「Armbian_22.08.1_Pine64_jammy_current_5.15.63.img」をDLしてマイクロSDカードに書き込む
何度も再起動しないとならない場合もあるが,起動したらrootパスワードと管理用ユーザを登録してシステムの更新
$ sudo apt update
$ sudo apt upgrade
updateで以下のメッセージが出ることがある
$ sudo apt update
以下の署名が無効です: BADSIG 871920D1991BC93C Ubuntu Archive Automatic Signing Key (2018) <ftpmaster@ubuntu.com>
(キーの登録で解決)
$ sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 871920D1991BC93C
実装メモリが1GBなので2GB程度のswapを設定する(メンテ用にWindow systemを使う場合もあるため2GB)
$ free
total used free shared buff/cache available
Mem: 1008672 142808 466932 3316 398932 791800
Swap: 504332 0 504332
$ sudo dd if=/dev/zero of=/var/swapfile bs=1024 count=2M
2097152+0 records in
2097152+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 177.331 s, 12.1 MB/s
$ sudo chmod 0600 /var/swapfile
$ sudo mkswap /var/swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=9d6199a7-3543-4c5f-84d1-48f71ec37168
$ sudo swapon /var/swapfile
$ free
total used free shared buff/cache available
Mem: 1008672 133352 57284 3288 818036 791476
Swap: 2601480 256 2601224
$ sudo vi /etc/fstab
(編集)
$ cat /etc/fstab
UUID=62257c95-7e41-446c-83e7-cd8f8a7fb768 / ext4 defaults,noatime,commit=600,errors=remount-ro 0 1
tmpfs /tmp tmpfs defaults,nosuid 0 0
/var/swapfile swap swap defaults 0 0
$
共有フォルダーの設定(例)
$ sudo apt install nfs-common
$ sudo mkdir /srv/share
$ sudo chmod 777 /srv/share
手動の場合
$ sudo mount -t nfs <node-name>:/srv/share /srv/share
自動マウント
$ sudo apt install autofs
$ sudo vi /etc/auto.master
/- /etc/auto.nfs ← 追加行(ファイル名は自由)
$ sudo vi /etc/auto.nfs
/srv/share -fstype=nfs,rw <node-name>:/srv/share
$ sudo chmod 644 /etc/auto.nfs
$ sudo systemctl restart autofs.service
CPU温度表示
$ sudo apt install lm-sensors
$ sudo sensors-detect
$ sensors
axp813_adc-isa-0000
Adapter: ISA adapter
temp1: +23.7°C
gpu1_thermal-virtual-0
Adapter: Virtual device
temp1: +46.5°C
cpu0_thermal-virtual-0
Adapter: Virtual device
temp1: +54.3°C (crit = +90.0°C)
axp20x_battery-isa-0000
Adapter: ISA adapter
in0: 0.00 V
curr1: 0.00 A
axp813_ac-isa-0000
Adapter: ISA adapter
in0: N/A (min = +4.00 V)
gpu0_thermal-virtual-0
Adapter: Virtual device
temp1: +47.4°C
$
繰り返し表示する
$ watch sensors
温度は以下で読まれているようだ
$ cat /sys/class/hwmon/hwmon?/temp1_input
CPU制御
$ sudo apt install cpufrequtils
$ cpufreq-info
cpufrequtilsサービスを再起動
$ sudo service cpufrequtils restart
すぐに止めるときは
$ sudo service cpufreqd stop
OS起動時に自動起動しないようにするには
$ sudo systemctl disable cpufreqd
設定ファイル
$ cat /etc/default/cpufrequtils
ENABLE=true
MIN_SPEED=480000
MAX_SPEED=1010000
GOVERNOR=performance
→
ENABLE=true
MIN_SPEED=648000
MAX_SPEED=1152000
GOVERNOR=ondemand
Window system (X server)(無くても良い)
$ sudo apt install ubuntu-desktop
日本語関連のパッケージをインストール
$ sudo apt install language-pack-ja-base language-pack-ja ibus-kkc
$ sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
$ cat /etc/default/locale
$ sudo source /etc/default/locale
VNC server(Window systemがないなら必要なし)
Ubuntu 22.04 は、デフォルトのディスプレイサーバーが「Wayland」となっている
「Wayland」では x11vnc は動かすことができないので、ディスプレイサーバーを「Xorg(X11)」にする
「/etc/gdm3/custom.conf」をエディタで開いて、「#WaylandEnable=false」のコメントアウトを解除
「x11vnc」のセットアップ
$ sudo apt install x11vnc
接続のパスワード設定
$ sudo x11vnc -storepasswd /etc/x11vnc.passwd
設定ファイルの作成
$ sudo vi /etc/systemd/system/x11vnc.service
--
[Unit]
Description=Start x11vnc at startup.
After=multi-user.target
[Service]
Type=simple
ExecStart=x11vnc -auth /run/user/1000/gdm/Xauthority -display :0 -forever -loop -noxdamage -repeat -rfbauth /etc/x11vnc.passwd
-rfbport 5900 -shared -noshm -o /var/log/x11vnc_mainscreen.log
[Install]
WantedBy=multi-user.target
--
再起動
$ sudo systemctl daemon-reload
$ sudo systemctl enable x11vnc.service
Created symlink /etc/systemd/system/multi-user.target.wants/x11vnc.service → /etc/systemd/system/x11vnc.service.
$ sudo systemctl start x11vnc
注意点としてログイン画面にアクセスするサービスと,ログイン中画面にアクセスするサービスの2つのサービスを登録する必要があること
なぜ2つのサービスが必要かというと,Xディスプレイの接続に必要な認証ファイル「Xauthority」の場所がログイン画面とログイン中画面で異なるため,ログイン画面とログイン後それぞれにx11vncで接続できるように設定する
自動ログインにしておくとログイン後のみで済ませられるのでお勧め
UbuntuのGUI(デスクトップ)をオフにする
GUI をオフ
$ sudo systemctl set-default multi-user.target
GUI を戻す(オン)
$ sudo systemctl set-default graphical.target
VNCを止める
$ sudo systemctl enable x11vnc.service
$ sudo systemctl start x11vnc
$ sudo systemctl stop x11vnc
$ sudo systemctl disable x11vnc.service
wxtoimg
$ sudo dpkg -i wxtoimg-armhf-2.11.2-beta.deb
(参考)衛星軌道ファイルの更新(wxtoimgでスケジュールしないので必要ない)
$ sudo cp weather_celestrak.txt /usr/local/lib/wx/tle/weather.txt
起動しても動作しない
$ xwxtoimg
bash: /usr/local/bin/xwxtoimg: No such file or directory
64bit環境では動作しないので32bitの環境を以下の手順でセットアップ(共存可能)
arm32bit用のライブラリのインストール
$ sudo dpkg --add-architecture armhf
$ sudo apt update
$ sudo apt install libc6:armhf
これで以下のようになる
$ xwxtoimg
xwxtoimg: error while loading shared libraries: libX11.so.6: cannot open shared object file: No such file or directory
無いライブラリのパッケージを検索して不足ライブラリをインストール
$ dpkg -S libX11.so.6
$ sudo apt install libx11-6:armhf
$ sudo apt install libxext6:armhf
$ dpkg -S libXft.so.2
libxft2:arm64: /usr/lib/aarch64-linux-gnu/libXft.so.2.3.4
libxft2:arm64: /usr/lib/aarch64-linux-gnu/libXft.so.2
$ sudo apt install libxft2:armhf
$ sudo apt install libasound2:armhf
RTL-SDR
$ sudo apt install rtl-sdr
$ sudo vi /etc/udev/rules.d/20-rtlsdr.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2832", GROUP="adm", MODE="0666", SYMLINK+="rtl_sdr"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2838", GROUP="adm", MODE="0666", SYMLINK+="rtl_sdr"
$
もしくは(AMD64などでは)
$ sudo vi /etc/modprobe.d/no-rtl.conf
blacklist dvb_usb_rtl28xxu
blacklist rtl2832
blacklist rtl2830
$
ここでセットアップされるrtl_fmは(現時点では)bugありで使えない
rtl_fmからsoxへパイプで繋げて受信したオーディオのビットレートを整え格納しようとしても次のエラーが出る
「sox FAIL formats: can't open input `-': WAVE: RIFF header not found」
最新版を使用すれば解決する旨の情報を海外から得たので最新のrtl-sdrを入手
$ sudo apt install libusb-1.0
$ sudo apt install cmake
$ git clone https://github.com/keenerd/rtl-sdr.git
$ cd rtl-sdr
$ mkdir build
$ cd build
$ cmake ../ -DINSTALL_UDEV_RULES=ON
$ make
$ sudo make install
$ sudo ldconfig
$ cd
$ sudo cp ./rtl-sdr/rtl-sdr.rules /etc/udev/rules.d/
$ sudo shutdown -r now
で,作成されるはずが・・・cmakeでエラー
CMake Error at CMakeLists.txt:70 (message):
LibUSB 1.0 required to compile rtl-sdr
前にも似たようなことがあって
$ apt install libglib2.0-dev
で,解決する予定が
dpkg: 依存関係の問題により libglib2.0-dev:arm64 の設定ができません:
libglib2.0-dev:arm64 は以下に依存 (depends) します: libglib2.0-dev-bin (= 2.72.1-1) ...しかし:
パッケージ libglib2.0-dev-bin はまだ設定されていません。
dpkg: パッケージ libglib2.0-dev:arm64 の処理中にエラーが発生しました (--configure):
依存関係の問題 - 設定を見送ります
で,インストールできず(どうも最新が無いようで)断念
そこで最新のSDRをNanoPiでmakeして/usr/local/binにコピーした(NanoPiのArmbianでは環境が揃う)
NOAA画像受信
FANを追加して冷却性能をアップ(メモリも冷却対象)したところ安定稼働するようになる
NOAA画像受信は「Raspberry Pi NOAA Weather Satellite Receiver」を参考に改良しながら構築
(STEP1)(STEP2)(STEP3)ハードウェアは異なるが同じArmbianなので同じような設定になる
ドングルで受信したオーディオ ストリームを操作するには sox オーディオ ツールキットが必要
$ sudo apt install sox
atスケジューラー
$ sudo apt install at
人工衛星がいつ頭上を通過するかを知るアプリケーションをセットアップ
$ sudo apt install predict
→ 最新のパッケージに無いので古いのをDL(predict_2.2.3-4_arm64.deb)
http://ports.ubuntu.com/ubuntu-ports/pool/universe/p/predict/
$ sudo dpkg -i predict_2.2.3-4_arm64.deb
エラー発生,以下をインストールして解決
$ sudo apt install libtinfo5
起動して位置を入力(北緯,西経が+なのに注意)
$ predict
wxtoimgrcの設定ファイルにも位置を設定(北緯,東経が+となる)
$ vi ~/.wxtoimgrc
Latitude: 33.93
Longitude: 133.34
Altitude: 97
$
(STEP4)
ディレクトリは独自となり/srv配下に構築
$ cd /srv
$ mkdir predict
$ cd predict
$ mkdir weather
スケジューリング用スクリプト①(schedule_all.sh)
#!/bin/bash
#
# 公開用ディレクトリ
NOAADIR=/srv/NOAA
# 衛星の位置情報
wget -qr https://www.celestrak.com/NORAD/elements/weather.txt -O /srv/predict/weather.txt
grep "NOAA 15" /srv/predict/weather.txt -A 2 > /srv/predict/weather.tle
grep "NOAA 18" /srv/predict/weather.txt -A 2 >> /srv/predict/weather.tle
grep "NOAA 19" /srv/predict/weather.txt -A 2 >> /srv/predict/weather.tle
# 日別にバックアップしておく
cp /srv/predict/weather.tle /srv/predict/weather/`date +%Y%m%d`-weather.tle
# 再登録するので現在登録済のスケジュールを全削除
for i in `atq | awk '{print $1}'`;do atrm $i;done
# 衛星情報リストの初期化(公開用に使用)
OUTDIR=${NOAADIR}/`date +%Y-%m-%d`
if [ ! -e $OUTDIR ]
then
mkdir $OUTDIR
chmod 777 $OUTDIR
> ${OUTDIR}/schedule.list
chmod 777 ${OUTDIR}/schedule.list
fi
# 衛星別にスケジュールを作る
/srv/predict/schedule_satellite.sh "NOAA 19" 137.1000 $OUTDIR
/srv/predict/schedule_satellite.sh "NOAA 18" 137.9125 $OUTDIR
/srv/predict/schedule_satellite.sh "NOAA 15" 137.6200 $OUTDIR
スケジューリング用スクリプト②(schedule_satellite.sh)
#!/bin/bash
#
# $1 = NOAA [15|18|19]
# $2 = 周波数
# $3 = 出力ディレクトリ
#
# 00:00:00から最初の接近時刻の仰角0~最大~0までのリストから最初と最後を取り出す
PREDICTION_START=`/usr/bin/predict -t /srv/predict/weather.tle -p "${1}" | head -1`
PREDICTION_END=`/usr/bin/predict -t /srv/predict/weather.tle -p "${1}" | tail -1`
# 最後の時刻(var2)
var2=`echo $PREDICTION_END | cut -d " " -f 1`
# 最大仰角度(MAXELEV)
MAXELEV=`/usr/bin/predict -t /srv/predict/weather.tle -p "${1}" | awk -v max=0 '{if($5>max){max=$5}}END{print max}'`
# 現地時間で終了が本日
while [ `date --date="TZ=\"UTC\" @${var2}" +%D` = `date +%D` ]
do
if [ $MAXELEV -gt 19 ]
then
# 最初の時刻
START_TIME=`echo $PREDICTION_START | cut -d " " -f 3-4`
# 最初の時刻(var1)
var1=`echo $PREDICTION_START | cut -d " " -f 1`
# 全体時間(秒)
TIMER=`expr $var2 - $var1`
# 日時でファイル名を作成(日付-時刻)
OUTDATE=`date --date="TZ=\"UTC\" $START_TIME" +%Y%m%d-%H%M%S`
# 衛星情報リスト(公開用に使用)
# Satellite-Name begin-time end-time maxelev file-name var1
echo ${1//" "} `date --date="TZ=\"UTC\" @${var1}" +%H:%M:%S` `date --date="TZ=\"UTC\" @${var2}" +%H:%M:%S` $MAXELEV $OUTDATE $var1 >> ${3}/schedule.list
# atに登録
echo "/srv/predict/receive_and_process_satellite.sh \"${1}\" $2 /srv/predict/weather/${OUTDATE}-${1//" "} /srv/predict/weather.tle $var1 $TIMER $3" | at `date --date="TZ=\"UTC\" $START_TIME" +"%H:%M %D"`
fi
# 前回最後の時刻に+1分後以降のリスト(つまり次の接近)
nextpredict=`expr $var2 + 60`
PREDICTION_START=`/usr/bin/predict -t /srv/predict/weather.tle -p "${1}" $nextpredict | head -1`
PREDICTION_END=`/usr/bin/predict -t /srv/predict/weather.tle -p "${1}" $nextpredict | tail -1`
MAXELEV=`/usr/bin/predict -t /srv/predict/weather.tle -p "${1}" $nextpredict | awk -v max=0 '{if($5>max){max=$5}}END{print max}'`
var2=`echo $PREDICTION_END | cut -d " " -f 1`
done
(参考)「/usr/bin/predict -t /srv/predict/weather.tle -p "NOAA 18"」で以下のような出力が得られる
1665797288 Sat 15Oct22 01:28:08 0 16 86 60 211 3433 89695 *
1665797389 Sat 15Oct22 01:29:49 7 18 90 55 215 2768 89695 *
1665797490 Sat 15Oct22 01:31:30 16 21 94 49 218 2121 89695 *
1665797589 Sat 15Oct22 01:33:09 29 27 98 43 220 1533 89695 *
1665797679 Sat 15Oct22 01:34:39 49 42 102 38 222 1099 89695 *
1665797747 Sat 15Oct22 01:35:47 66 84 105 34 223 933 89695 *
1665797789 Sat 15Oct22 01:36:29 64 132 107 32 224 945 89695 *
1665797835 Sat 15Oct22 01:37:15 52 159 109 29 225 1057 89695 *
1665797899 Sat 15Oct22 01:38:19 36 173 111 25 226 1333 89695 *
1665797982 Sat 15Oct22 01:39:42 22 181 115 21 227 1799 89695 *
1665798077 Sat 15Oct22 01:41:17 11 184 119 15 228 2390 89695 *
1665798177 Sat 15Oct22 01:42:57 4 187 123 9 230 3038 89695 *
1665798235 Sat 15Oct22 01:43:55 0 188 125 6 230 3422 89695 *
スケジュールされた受信用スクリプト(receive_and_process_satellite.sh)
#!/bin/bash
# $1 = Satellite Name
# $2 = Frequency
# $3 = FileName base
# $4 = TLE File
# $5 = EPOC start time
# $6 = Time to capture
# $7 = Output directory
# 衛星からの受信オーディオを格納
timeout $6 /usr/local/bin/rtl_fm -f ${2}M -s 160k -g 48 -p 55 -E wav -E deemp -F 9 - | sox -t wav - $3.wav rate 11025
PassStart=`expr $5 + 90`
if [ -e $3.wav ]
then
# MAPを作る
/usr/local/bin/wxmap -T "${1}" -H $4 -p 0 -l 0 -o $PassStart ${3}-map.png
# 受信オーディオから各種画像作成
/usr/local/bin/wxtoimg -A -n -c -m ${3}-map.png -e MCIR $3.wav ${3}-MCIR.png
/usr/local/bin/wxtoimg -A -n -c -m ${3}-map.png -e MSA $3.wav ${3}-MSA.png
/usr/local/bin/wxtoimg -A -n -c -m ${3}-map.png -e HVCT $3.wav ${3}-HVCT.png
/usr/local/bin/wxtoimg -A -n -c -m ${3}-map.png -e therm $3.wav ${3}-thermal.png
/usr/local/bin/wxtoimg -A -n -c -m ${3}-map.png -e MB $3.wav ${3}-MB.png
# サムネイル用画像を作成
convert -resize 200x800 ${3}-MCIR.png ${3}-MCIR-s.png
convert -gravity center -crop 200x100+0+0 ${3}-MCIR-s.png ${3}-MCIR-s.png
convert -resize 200x800 ${3}-MSA.png ${3}-MSA-s.png
convert -gravity center -crop 200x100+0+0 ${3}-MSA-s.png ${3}-MSA-s.png
convert -resize 200x800 ${3}-HVCT.png ${3}-HVCT-s.png
convert -gravity center -crop 200x100+0+0 ${3}-HVCT-s.png ${3}-HVCT-s.png
convert -resize 200x800 ${3}-thermal.png ${3}-thermal-s.png
convert -gravity center -crop 200x100+0+0 ${3}-thermal-s.png ${3}-thermal-s.png
convert -resize 200x800 ${3}-MB.png ${3}-MB-s.png
convert -gravity center -crop 200x100+0+0 ${3}-MB-s.png ${3}-MB-s.png
# 衛星画像を公開用ディレクトリへ移動
mv ${3}-MCIR.png $7
mv ${3}-MSA.png $7
mv ${3}-HVCT.png $7
mv ${3}-thermal.png $7
mv ${3}-MB.png $7
# サムネイル用画像を公開用ディレクトリへ移動
mv ${3}-MCIR-s.png $7
mv ${3}-MSA-s.png $7
mv ${3}-HVCT-s.png $7
mv ${3}-thermal-s.png $7
mv ${3}-MB-s.png $7
fi
rtl_fm
- ビットレート(-s 60k)ではノイズが多いので大きくするが(-s 160k)がベストで更に大きくすると処理が追い付かなくなる
- ゲインは(-g 49)が最高値
- soxの出力ビットレートはwxtoimg指定の「11025」のみ動作する(倍の22050では画像が乱れる)
- 格納するオーディオは衛星の出0度~没0度までで,0度は受信不可のため仰角が上がったところからにしてサイズを少なくしたいが,後に説明する事情により不可
wxmap
- MAP時間(PassStart)に衛星出現時刻に90秒を追加しているがMAPの開始時間ではなく衛星の出現範囲かどうかをチェックしているだけである(=ではエラーとなるため+1でも可)
- MAP時間(PassStart)を変更してもMAPの範囲は変わらない(出0度~没0度までのMAPとなる)
- 作成されるMAPファイルにはメタ情報があり編集後は継承されないため画像操作は不可(出力画像のまま使用するしかない)
wxtoimg
- -Aで出0度~没0度までの画像を出力(無い場合は解析不可部分の画像が切られる)
- -cはテレメトリー ラインを画像から切り取る
- -nノイズフィルターでノイズが集約されて丸くなるようだ
- 後から画像を再作成できるように必要データをバックアップするようにしたのだが,時間が経過するとMAPと合成できなくなる(つまり再作成不可)ようだ(使用制限があるのかな)→ 合成で使用する音声ファイル(WAVファイル)のタイムスタンプ(CTIMEかMTIMEなのかは未確認)を参照して衛星の方向などを計算している(つまり作成した時のタイムスタンプにすれば再作成可能)
スクリプトを実行ファイルにする
$ chmod +x schedule_all.sh
$ chmod +x schedule_satellite.sh
$ chmod +x receive_and_process_satellite.sh
スケジュール用スクリプトをcronに登録
$ crontab -e
1 0 * * * /srv/predict/schedule_all.sh
$
(STEP5)動作確認
cronでは0時1分に起動するので,手動で「/srv/predict/schedule_all.sh」を実行して確認する
公開
以下にて試行実験中
http://www.inoshita.jp/document/NOAA/pictNOAA.php
- 室内,有線LANで稼働 → 無線LANにする
- 受信範囲が狭い,感度が悪い → アンテナ,LNA,BPFの調整
- 安定稼働 → 消費電力,CPU温度のロギング