エントリー

カテゴリー「通信」の検索結果は以下のとおりです。

NOAA受信システムをPINE64で構築(2)

ひと月試行しながらNOAA受信システムを改良

IMG_20221106_170340.jpg

ハードウェア
USBチューナー(SDRドングル)

IMG_20211012_193239.jpgIMG_20220227_193236.jpg

右側のチューナーを使用

左側のチューナーでは受信感度が悪い(HDSDRで受信するなら問題は無い)

BPF(バンドパスフィルター)

IMG_20220917_191303.jpgIMG_20220918_121550.jpg

137MHzのBPFをAliexpressから調達

前後の電波は完全に遮断される(使用するとFM放送は受信不可)が,5dBも低下するのでRFアンプでゲイン向上させないと厳しい

LNA(ローノイズアンプ:低ノイズのRFアンプ)

Amazonから3種調達して比較

評価 製品 仕様 試行画像
IMG_20220115_203004.jpg

0.1-2000MHz

30dB

9-12V

9V時16mA(実測)

(注)12Vでは高ゲインのためかノイズが増加

20221018-083114-NOAA19-MCIR.jpg
  IMG_20220115_202857.jpg

0.01-4000MHz

21dB

5V

5V時157mA(実測)

3.3V時138mA(実測)

20221019-194132-NOAA19-MCIR.jpg
IMG_20221023_145529.jpg

5-6000MHz

20dB

5V

5V時64mA(実測)

20221110-085901-NOAA19-MCIR.jpg

鮮明なのは一番上だが9Vのため次点とした

残り2つは5Vで変わり映えしないので消費電力の低い方を選択

電源

(PINE64)

DC-INピン(USB電源ラインと直結)から5Vを供給(最終的にはDCDCで5V)

IMG_20221018_194509.jpgIMG_20221018_194516.jpg

電力は無線LAN,チューナー込みで起動時1.3A程度必要,安定時は600mA位となる

NOAA受信時はチューナーの約300mAとLNAの64mAが加算されるので1Aは必要

長時間の待機時はシステムをサスペンドさせることも検討中

(LNA・FAN)

LNAは受信時以外は必要ないのでGPIOで電源制御する(チューナーは受信起動されていないと省電力)

熱の問題も予想できるのでFANの制御も追加

PIN_Board_回路図.png

当初はLNAもFANと同じFETスイッチにしていたが,LNAの回路が絶縁(Gndがアンテナ~チューナー経由で接続)されていなかったためリードスイッチを使用

IMG_20221106_170443.jpg

LNA給電時は赤のLEDを点灯するようにした

ソフトウェア
OS

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の設定で完了

GPIO

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
NOAA受信用シェルスクリプト

表示情報の追加もあり改良

スケジューリング用スクリプト①(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
  • LNAの電源ON・OFFを追加
  • 作成画像が正常か(画像サイズから)判断
省電力モード(サスペンドなど)

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受信システムをPINE64で構築

NOAAの画像受信をアンテナ直下に設置したいと考えていたので無線LANが実装されているラズパイ(サイズ,性能的にZERO2)を使いたかったのだが入手困難なため断念してPINE64を利用することにし通信はUSBの小型無線LANを接続して対応することにした

IMG_20220904_130615.jpgIMG_20220904_135503.jpg

PINE64

PINE64を選択した理由は低価格でラズパイ3と同等性能そして低消費電力だったからである

しかし使ってみるとArmbianにて以下の様な事態が発生,PINE64は癖があり正常に利用できるまで時間を費やしてしまった

  • 最初の起動でPanicとなる → 2,3回再起動すると起動するようになる
  • メモリ異常でPanicとなる → 発熱だと思われる → (ArmbianがPINE64 LTS用だからかもしれない → メモリが異なるとWikiにはある)
  • 64GBマイクロSDカードではRWが遅い → 32GBで解決した

IMG_20220904_182357.jpg

2台購入して2台とも同じ現象なので製品の不良ではない

上記のPanicはヒートシンク,後にFANを追加して何度か再起動すると正常に起動するようになった → CPU温度を監視していると60℃以下にしておかないと異常となることが多いようだ

IMG_20220906_211814.jpg

(他の問題点)

  • オーディオジャックから音が出力されない
  • マイクロ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を追加して冷却性能をアップ(メモリも冷却対象)したところ安定稼働するようになる

IMG_20221004_182921.jpg

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温度のロギング

台風14号

NOAA_20220919_1042.jpg

(2022-0919-1042の画像)

この場所では前日の九州上陸頃にやまじ風が吹き荒れたが最接近時は風はほとんど無し

Screenshot_20220920-070548.png

最低気圧は(2022-0919-10頃で)約970hpa

3日間NOAA画像を受信していたのだけど受信状態が良くないことが判った(上の映像がベスト)

台風通過後NOAA専用アンテナを観るとエレメントが(柔い構造なので)やはり曲がってしまっていたので修理しないと・・・

WXtoImgのweather.txtが更新できない件

ADS-Bのアンテナを調整したせいでNOAAのアンテナに問題が起きてないか確認するためWXtoImgを起動した

ところがシステムアップによるOS再構築でWXtoImgも再インストールとなったこともあり初期設定してみたところエラーが発生する

①Options>Ground Station Locationの実行で位置の設定 → 問題なし

②File>Update Keplerの実行で通常行う衛星軌道スケジュールのDL → エラー発生

SS20220831_001.png

HTTPのエラーコード「301 Moved Permanently」は「ウェブサイトが恒久的に移転している」との事だが,つまりのところファイルが無いってこと

③File>Satellite Pass Listの実行で(①で設定した)現在地における衛星の到来スケジュール表示 → エラー発生

SS20220831_002.png

衛星軌道スケジュールがDLできなかったのためかNOAA18の情報が古いとエラーがでている

このまま「OK」の実行でスケジュールが表示されるものの時刻が実は異常である(時刻通り受信しておかしいことに気付いた)→ 正確には「こちら」に記載されていたスケジュールと照らし合わせて判明

SS20220831_003.png

これでは困るので調査

まずDLしようとしている衛星軌道スケジュールが「weather.txt」であることを突き止めた

そして「weather.txt」はWXtoImgのインストールでセットアップしたフォルダーに存在することが判り

SS20220831_004.png

WXtoImgのマニュアルにて「weather.txt」をDLして書き換えていることが判明(書き換えても良いということ)

そこで「weather.txt」がどこかに存在しないか探してみると以下の3か所にあった

  • http://www.shinetek.com.cn/eos_data/weather.txt
  • https://celestrak.org/norad/elements/weather.txt
  • http://www.wxinfo.ru/weather.txt

どれが最新か調べてないが「celestrak.org」の「weather.txt」を手動でDLしてWXtoImgのフォルダーに上書きした

File>Satellite Pass Listの実行によるエラーもなくなり時刻も問題なさそう

SS20220831_005.png

しばらくは手動で更新することになるかも(半年毎位で良いかな)

(追記:2022.9.1)

19:00過ぎだけどNOAA-19が側を通るので受信(kgaptで位置を確認)

SS20220901_001.png

近いので良好に受信できている

SS20220901_002.png

日没後のため「MSA multispectral analysis」による合成は無理だった

NOAA202209011011.jpg

左下に台風11号が写っている

ページ移動

ユーティリティ

検索

エントリー検索フォーム
キーワード

新着コメント

過去ログ

Feed