430MHzのLoRaモジュールで以下の機能を実現するスケッチです。※1
- KISSモードTNC
- テキストチャット
「KISSモードTNC」モードでは、LoRaモジュールをKISSモードのターミナルノードコントローラとして動作させます。シリアル回線からAX25形式で送られたパケットを指定された周波数でLoRa変調により送信します。※2
「テキストチャット」モードでは、LoRaモジュールにシリアル接続された端末から送られたテキストメッセージの平文を指定された周波数でLoRa変調により送信します。
※1Arduino LoRaをベースにLoRaのChannel Activity Detection機能を追加したものを用いています。
※2APRS on LoRaのKISSモードTNCを流用しています。
詳細な通信方式はプロトコルを参照して下さい。
- Semtech SX1276/77/78/79を使ったボードで動作します。:
Semtech SX1276/77/78/79 | Arduino |
---|---|
VCC | 3.3V |
GND | GND |
SCK | SCK |
MISO | MISO |
MOSI | MOSI |
NSS | 8 |
NRESET | 4 |
DIO0 | 7 |
NSS
,NRESET
,DIO0
はLoRa.setPins(csPin, resetPin, irqPin)
. で接続することが出来ます。ボードによってピン接続を変更して下さい。
- ファイル→環境設定で、追加のボードマネージャのURLに以下を追加
https://adafruit.github.io/arduino-board-index/package_adafruit_index.json
- ツール→ボードで
AdaFruit Feather32u4
を選択 - ツール→書込装置で
ArduinoISP
を選択
- LoRaKissTNC.inoを開く
- スケッチ→検証・コンパイルでコンパイル
- スケッチ→マイコンボードに書き込むでArduinoへ書き込み
- スマホにUSBシリアル端末をインストール
- OTGケーブルとmicroUSBケーブルを使ってLoRa32u4をスマホに接続
- シリアルポートの設定で
ボーレート9600 データビット8 パリティnone ストップビット1 フロー制御off
を選択 - 接続の設定で送信フォームの表示、改行コードCR+LFを選択
APRSクライアントとしてAndroid端末上でAPRSDroidを用います。まずAPRSDroidの設定画面でコールサインを設定して下さい。次にLoRaトランシーバをOTGケーブルで接続し、設定画面で以下を設定してください。
- 接続方式 TNC(KISS)を選択します
- TNC初期化設定 初期化設定文字列にTNCの初期化文字列をURLエンコードした文字を設定します。
%0DKISS%2043851%2C3%2C8%2C8%2C10000%0D
これはTNCの以下の初期化文字列をURLエンコード(%0D=改行 %20=スペース %2C=,
)したものです。
(改行)KISS 43851,3,8,8,10000(改行)
初期化文字列の詳細については後述します。
- 接続タイプ USBシリアルを設定します。
- 機器通信速度 9600bpsを設定します。
以上で完了です。
ARPSDroidを起動するとTNCへAX.25形式のパケットが送られます。LoRa対応のi-gate局からデジピートされます。
KISSコマンドにより、LoRaモジュールをKISS TNCモードにします。 初期化文字列を用いてモジュールのパラメータを以下の通り指定できます。
KISS <キャリア周波数(10kHz単位)> , <帯域> , <拡散率> , <コーディングレート>, <最大バックオフ時間(ms)>
各パラメータの詳細については「テキストチャット」モードのコマンドを参照して下さい。
438.0MHz~439MHzまで10kHz単位で指定します。範囲外の周波数が指定された場合は送信出来ません。
以下のBW値を指定します。デフォルト値は15.6kHzです。
LoRaの電波型式はF1Dとなります。430MHz帯では総務省告示第百二十五号無線設備規則別表第二号第54の規定に基づくアマチュア局の無線設備の占有周波数帯幅の許容値
に基づき占有帯域幅30kHz以下となりますのでご注意下さい。
BW値 | 帯域幅 |
---|---|
0 | 7.8kHz |
1 | 10.4kHz |
2 | 15.6kHz(デフォルト値) |
3 | 20.8kHz |
拡散率を6(2^6=64) ~ 12(2^12=4096)
の範囲で指定できます。
コーディングレートを 5(4/5) ~ 8(4/8)
の範囲で指定できます。
本プログラムでは送信前に所定時間(3sec)チャンネルのアクティビティを監視し、他局が送信をしていない場合に自局からの送信を行います。
衝突が起きた場合には3秒からここで指定された時間の範囲でランダムに待ち時間を入れます。拡散率が高い場合は衝突が起きる可能性が高いので、フレーム送出時間と同程度の長めのバックオフ時間(BW=62.5,SF=11,CR=8で10000ms程度)を設定してください。
LoRaKissTNCはKISSプロトコルで受信パケットのRSSI/SNRを返します。APRSゲートウェイ側でも表示できるようにAPRXのパッチを用意しました。 gitからクローン後(パッチはv2.9.0をベースにしています)、patchコマンドでパッチをあててください。
2020-01-14 16:41:53.564 JL1NIE-6 R(-55,11.50) JL1NIE-5>APDR15,WIDE1-1::JL1NIE-10:dx{23
aprf-rf.logの受信パケットを示すRフラグにRSSI/SNRがR(RSSI,SNR)
の形式で入ります。
またログからビーコン用のメッセージパケットを作るスクリプトも用意しました。
自局位置についてはスクリプト埋め込みですので適宜修正してください。
#!/bin/sh
tac /var/log/aprx/aprx-rf.log | grep " R(" | head -n 1 | gawk '{match($2,/(.+)\..+/,t);match($4,/R\((.+)\,(.+)\)/,a);match($5,/([A-Z0-9\-]+)>/,c);printf("!3536.15N/13931.24E-LoRa station:%s %s RSSI=%s SNR=%s\n",t[1],c[1],a[1],a[2]);}'
参考までにaprx.confの例を掲載します。 運用に際してはAPRS網への負荷等、他局への影響を十分考慮の上設定するようお願いします。
mycall JS1YFC-6 #自局コールサイン
myloc lat 3536.05N lon 13931.22E #自局位置
<aprsis>
passcode 12345 #APRS-ISのパスワード
server rotate.aprs2.net
</aprsis>
<logging>
pidfile /var/run/aprx.pid
rflog /var/log/aprx/aprx-rf.log
aprxlog /var/log/aprx/aprx.log
</logging>
<interface>
serial-device /dev/ttyACM0 9600 8n1 KISS
# TNCの初期文字列
# Freq=438.51MHz BW=15.6kHz SF=8 CR=8 Backofftime=10000ms
# <FEND><RET><FEND><CR>SET KISS 43851,3,8,8,10000<CR>
initstring "\xc0\xff\xc0\x0dSET KISS 43851,3,8,8,10000\x0d"
callsign $mycall
tx-ok true
</interface>
<beacon>
beaconmode aprsis
cycle-size 5m
#最後の受信局をビーコン表示
beacon exec /usr/local/bin/aprxLastseen.sh
</beacon>
<digipeater>
transmitter $mycall
<source>
source APRSIS
relay-type third-party
ratelimit 240 480
via-path WIDE1-1
msg-path WIDE1-1
filter -t/st
</source>
</digipeater>
テキストチャットモードでは端末から入力された文字を行単位で平文で送信します。
行頭がset
で始まる行はコマンド列として解釈されます。
まず交信の前にコールサインを設定して下さい。(コールサインを設定しないと送信出来ません)
set call <あなたのコールサイン>
次にコマンドを使って運用周波数やLoRa変調のパラメータを設定して下さい。デフォルトでは周波数438.51MHz、SF=8、BW=15.6kHz 出力20dBm(100mW)の設定になっています。
set
Freq=43851
SF=8
BW=2 (15.6kHz)
TXpower=20
ターミナルからメッセージを入れ、最後に改行(CR/LF)を入力して下さい。 メッセージの送信が完了すると以下のように表示されます。
<コールサイン> >: <送信したメッセージ>
相手局からメッセージを受信すると以下のように表示されます。
<相手局コールサイン> (<RSSI値>,<SNR値>,<周波数エラー値>)<: <受信したメッセージ>
自局のコールサインを指定します。パケット先頭には必ず自局コールサインが入ります。 またコールサインが指定されていない場合送信できません。
set call コールサイン
運用周波数を10kHz単位で指定します。 指定できる範囲は438MHz-439MHz(全電波形式の範囲)です。 デフォルト値は438.51MHzです。
set freq 43851
送信出力をdBmで指定します。2dBm - 20dBmの範囲です。 デフォルト値は20dBmです。
set pwr 20
拡散率(Spreading Factor)を指定します。6 - 12の範囲です。 小さい値ほど高速に送信できますがSNRでは不利になります。 デフォルト値は9です。
set sf 9
チャープスペクトラムの帯域幅を指定します。0-8の範囲です。帯域幅が広いほど高速に送信できますがSNRでは不利になります。
set bw 2
BW値 | 帯域幅 |
---|---|
0 | 7.8kHz |
1 | 10.4kHz |
2 | 15.6kHz (デフォルト値) |
3 | 20.8kHz |
set
コマンドでパラメータを指定しないと現在の設定値が表示されます。
Freq=43851
SF=9
BW=2 (15.6kHz)
TXpower=20
設定をデフォルト値に戻します。
set init
本スケッチを用いたLoRaトランシーバの申請方法はこちらです。