カルマン渦
カルマン渦とは「渦状の雲」だそうだ(詳細はこちら)
早速,NOAAに映っているか確認してみると・・・
(画像は,2023.2.25 NOAA18 10:26:44~10:42:27 HVCT)
映っていた
日々の生活を好き勝手につづったブログ(My blog is written by inoshita.jp)
カテゴリー「NOAA」の検索結果は以下のとおりです。
カルマン渦とは「渦状の雲」だそうだ(詳細はこちら)
早速,NOAAに映っているか確認してみると・・・
(画像は,2023.2.25 NOAA18 10:26:44~10:42:27 HVCT)
映っていた
忘れないようにするため更新記録を登録
以下をcronにて実行させる
20 0 1,15 * * /sbin/reboot
30 0 * * * /sbin/rtcwake -m mem -l -t $(date +%s -d '6:00')
現在受信システムを外部設置に向けて構築中
(2023.3.5 追加)
20 12 * * 1-5 /sbin/rtcwake -m mem -l -t $(date +%s -d '17:40')
ひと月試行しながらNOAA受信システムを改良
右側のチューナーを使用
左側のチューナーでは受信感度が悪い(HDSDRで受信するなら問題は無い)
137MHzのBPFをAliexpressから調達
前後の電波は完全に遮断される(使用するとFM放送は受信不可)が,5dBも低下するのでRFアンプでゲイン向上させないと厳しい
Amazonから3種調達して比較
評価 | 製品 | 仕様 | 試行画像 |
〇 | ![]() |
0.1-2000MHz 30dB 9-12V 9V時16mA(実測) (注)12Vでは高ゲインのためかノイズが増加 |
![]() |
![]() |
0.01-4000MHz 21dB 5V 5V時157mA(実測) 3.3V時138mA(実測) |
![]() |
|
◎ | ![]() |
5-6000MHz 20dB 5V 5V時64mA(実測) |
![]() |
鮮明なのは一番上だが9Vのため次点とした
残り2つは5Vで変わり映えしないので消費電力の低い方を選択
(PINE64)
DC-INピン(USB電源ラインと直結)から5Vを供給(最終的にはDCDCで5V)
電力は無線LAN,チューナー込みで起動時1.3A程度必要,安定時は600mA位となる
NOAA受信時はチューナーの約300mAとLNAの64mAが加算されるので1Aは必要
長時間の待機時はシステムをサスペンドさせることも検討中
(LNA・FAN)
LNAは受信時以外は必要ないのでGPIOで電源制御する(チューナーは受信起動されていないと省電力)
熱の問題も予想できるのでFANの制御も追加
当初はLNAもFANと同じFETスイッチにしていたが,LNAの回路が絶縁(Gndがアンテナ~チューナー経由で接続)されていなかったためリードスイッチを使用
LNA給電時は赤のLEDを点灯するようにした
debianベースの「Armbian_22.08.1_Pine64_bullseye_current_5.15.63.img」を使用した場合
・初期のrootパスワードは「1234」
・hostname, CPUの設定など
$ sudo armbian-config
・フォントの導入
$ sudo apt install task-japanese
$ sudo apt install fonts-vlgothic
・wifi設定
$ sudo armbian-config
ドライバの設定が自動的に行われる
APの設定で完了
LNA・FANの電源を制御するためGPIO(PC7, PC8)を使用
GPIOのセットアップ
$ sudo armbian-config
System→Hardwareからpps-gpioを有効にする(スペースキーで有効・無効の切り替え)を行い再起動
一般ユーザがGPIOを利用できるようにする
$ ls -l /dev/gpio*
crw------- 1 root root 254, 0 11月 3 15:46 /dev/gpiochip0
crw------- 1 root root 254, 1 11月 3 15:46 /dev/gpiochip1
crw------- 1 root root 254, 2 11月 3 15:46 /dev/gpiochip2
$ sudo chmod 666 /dev/gpio
起動後に作成されるデバイスなので以下でパーミッションを変更
$ sudo vi /etc/rc.local
gpioは直接操作でなくコマンド経由が推奨されている
$ sudo apt install gpiod
コマンド |
説明 |
gpiodetect |
システムの gpiochips,それらの名称,ラベル,GPIOライン数を一覧表示 |
gpioinfo |
指定した gpiochips の pin番号と名称,ライン番号、アクティブ状態,フラグを一覧表示 |
gpioget |
指定した gpiochips の GPIOの値を読み取る |
gpioset |
指定した gpiochips の GPIOの値を設定 |
gpiofind |
ライン名で gpiochip とオフセットを検索 |
gpiomon |
GPIOでイベントを監視,終了する前に処理するイベントの数,またはイベントを指定 |
コマンドで指定するためGPIOのPC7とPC8のライン番号を探す
gpiochipsを表示
$ gpiodetect
gpiochip0 [1f02c00.pinctrl] (32 lines)
gpiochip1 [1c20800.pinctrl] (256 lines)
gpiochip2 [axp20x-gpio] (2 lines)
それぞれの gpiochips の一覧を表示
(gpiochip0)
$ cat /sys/kernel/debug/pinctrl/1f02c00.pinctrl/pins
registered pins: 13
pin 352 (PL0) 0:1f02c00.pinctrl
pin 353 (PL1) 1:1f02c00.pinctrl
pin 354 (PL2) 2:1f02c00.pinctrl
pin 355 (PL3) 3:1f02c00.pinctrl
pin 356 (PL4) 4:1f02c00.pinctrl
pin 357 (PL5) 5:1f02c00.pinctrl
pin 358 (PL6) 6:1f02c00.pinctrl
pin 359 (PL7) 7:1f02c00.pinctrl
pin 360 (PL8) 8:1f02c00.pinctrl
pin 361 (PL9) 9:1f02c00.pinctrl
pin 362 (PL10) 10:1f02c00.pinctrl
pin 363 (PL11) 11:1f02c00.pinctrl
pin 364 (PL12) 12:1f02c00.pinctrl
(gpiochip1)
$ cat /sys/kernel/debug/pinctrl/1c20800.pinctrl/pins
registered pins: 103
pin 32 (PB0) 32:1c20800.pinctrl
pin 33 (PB1) 33:1c20800.pinctrl
・
・
・
pin 70 (PC6) 70:1c20800.pinctrl
pin 71 (PC7) 71:1c20800.pinctrl
pin 72 (PC8) 72:1c20800.pinctrl
pin 73 (PC9) 73:1c20800.pinctrl
・
・
・
pin 235 (PH11) 235:1c20800.pinctrl
(gpiochip2)
$ cat /sys/kernel/debug/pinctrl/axp20x-gpio/pins
registered pins: 2
pin 0 (GPIO0) 0:axp20x-gpio
pin 1 (GPIO1) 1:axp20x-gpio
PC7とPC8は gpiochip1 の 71と72のラインであることが判る
PC7 FAN ON/OFF
$ gpioset gpiochip1 71=0 #OFF
$ gpioset gpiochip1 71=1 #ON
PC8 ON/OFF
$ gpioset gpiochip1 72=0 #OFF
$ gpioset gpiochip1 72=1 #ON
表示情報の追加もあり改良
スケジューリング用スクリプト①(schedule_all.sh)
スケジューリング用スクリプト②(schedule_satellite.sh)
#!/bin/bash
#
# $1 = NOAA [15|18|19]
# $2 = 周波数
# $3 = 出力ディレクトリ
#
# 近接時刻の仰角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`
# 最後のUTC(var2)
var2=`echo $PREDICTION_END | cut -d " " -f 1`
# 最大仰角度と経度
MAXANGLE=`/usr/bin/predict -t /srv/predict/weather.tle -p "${1}" | awk -v max=0 '{if($5>max){max=$5;kei=$9}}END{print max, kei}'`
# 現地時間で終了が本日
while [ `date --date="TZ=\"UTC\" @${var2}" +%D` = `date +%D` ]
do
# 最大仰角度(MAXELEV),最大時の経度(KEIDO)
MAXELEV=`echo $MAXANGLE | cut -d " " -f 1`
KEIDO=`echo $MAXANGLE | cut -d " " -f 2`
# 衛星の開始と終了緯度
BGIDO=`echo $PREDICTION_START | cut -d " " -f 8`
ENIDO=`echo $PREDICTION_END | cut -d " " -f 8`
if [ $MAXELEV -gt 19 ]
then
# 最初の時刻
START_TIME=`echo $PREDICTION_START | cut -d " " -f 3-4`
# 最初のUTC(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`
# list: $3/schedule.list
# Satellite-Name begin-time end-time maxelev file-name
echo ${1//" "} `date --date="TZ=\"UTC\" @${var1}" +%H:%M:%S` `date --date="TZ=\"UTC\" @${var2}" +%H:%M:%S` $MAXELEV $OUTDATE $var1 $BGIDO $ENIDO $KEIDO >> ${3}/schedule.list
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`
var2=`echo $PREDICTION_END | cut -d " " -f 1`
MAXANGLE=`/usr/bin/predict -t /srv/predict/weather.tle -p "${1}" $nextpredict | awk -v max=0 '{if($5>max){max=$5;kei=$9}}END{print max, kei}'`
done
スケジュールされた受信用スクリプト(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
# 衛星(NOAA)からFM変調画像を受信
/usr/bin/gpioset gpiochip1 72=1
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
/usr/bin/gpioset gpiochip1 72=0
if [ -e $3.wav ]
then
# MAP作成時刻(時刻をずらすため+90してる訳ではなく範囲に収めている)
PassStart=`expr $5 + 90`
# 受信画像に合わせたMAPを作成
/usr/local/bin/wxmap -T "${1}" -H $4 -p 0 -l 0 -o $PassStart ${3}-map.png
# タイプ別の衛星画像を作成(5種)
for TYPE in MCIR MSA HVCT therm MB
do
# 衛星画像を作成
/usr/local/bin/wxtoimg -B 180 -L 540 -A -n -c -m ${3}-map.png -e $TYPE $3.wav ${3}-${TYPE}.png
# 画像作成が正常か画像サイズから判断
WIDTH=`identify ${3}-${TYPE}.png | cut -d " " -f 3 | cut -d "x" -f 1`
if [ $WIDTH -lt 1200 ]
then
# サムネイル画像を作成
convert -resize 200x800 ${3}-${TYPE}.png ${3}-${TYPE}-s.png
convert -gravity center -crop 200x100+0+0 ${3}-${TYPE}-s.png ${3}-${TYPE}-s.png
# 公開サイトに画像を移動
mv ${3}-${TYPE}.png $7
mv ${3}-${TYPE}-s.png $7
else
rm ${3}-${TYPE}.png
fi
done
fi
PINE64は電源管理が実装されているので「rtcwake」が使える
60秒サスペンドして復帰
$ sudo /sbin/rtcwake -m mem -s 60
rtcwake: assuming RTC uses UTC ...
rtcwake: wakeup from "mem" using /dev/rtc0 at Sun Nov 13 11:17:39 2022
$ (復帰)
指定時間に復帰
$ sudo /sbin/rtcwake -m mem -l -t $(date +%s -d "2022-11-13 20:30")
rtcwake: wakeup from "mem" using /dev/rtc0 at Sun Nov 13 11:30:00 2022
$ (復帰)
ラズパイでは電源管理が実装されていないのでPINE64の優位となる機能である
最終的にはバッテリー運用となるため省電力化に有効としているが,画像の公開運用サーバ(リバースプロキシの実装が前提)としてどうかも考えているのでサスペンドさせない運用となることもある
NOAAの画像受信をアンテナ直下に設置したいと考えていたので無線LANが実装されているラズパイ(サイズ,性能的にZERO2)を使いたかったのだが入手困難なため断念してPINE64を利用することにし通信はUSBの小型無線LANを接続して対応することにした
PINE64を選択した理由は低価格でラズパイ3と同等性能そして低消費電力だったからである
しかし使ってみるとArmbianにて以下の様な事態が発生,PINE64は癖があり正常に利用できるまで時間を費やしてしまった
2台購入して2台とも同じ現象なので製品の不良ではない
上記のPanicはヒートシンク,後にFANを追加して何度か再起動すると正常に起動するようになった → CPU温度を監視していると60℃以下にしておかないと異常となることが多いようだ
(他の問題点)
以下の3つ案で専用の受信機を考えていたが,システムをコマンド制御できることが判ったのでSDRドングルを使用
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
$ 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
$ 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
$ 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
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で接続できるように設定する
自動ログインにしておくとログイン後のみで済ませられるのでお勧め
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
$ 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
$ 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では環境が揃う)
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
wxmap
wxtoimg
スクリプトを実行ファイルにする
$ 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