【RC用フライトレコーダ】その2 - オフボード型
【その1 - 作ってみた。】はこちら
前回は概要を紹介しました。今回はオフボード型を紹介します。
まずはオフボードタイプのログです。オンボードタイプのように機体の挙動はわかりませんが、舵の打ち方はそのまま記録されています。セレナLtでスポーツマン演技を行った時のログです。緑がエルロン、青がエレベータ、黒がラダー、赤がスロットルです。
な、な、なんだ、この宙返りの時のエレベータの打ち方は?
ストールターンから2回宙返り、ハーフ・スクエア・ループ・ウィズ1//2ロールから逆宙返り2回のところまでを拡大してみました。自分では機体を見ながら円になるように、入れたり抜いたりしているつもりなのですが。😅
以下たわごとです。
・翼型が半対称なのでトラベルアジャストでダウン側の舵角を多めにしています。
・横風だったのか、私の根性がひねくれているのか、宙返りの最中にラダーを入れて、あっち行け、こっち来いとやっています。
・ラダーは、正宙と逆宙で逆方向に打っているのが見て取れます。
・風がそれなりに吹いていましたので、水平飛行中もエルロンをショコショコと打っていたような気がします。
・正宙返りと逆宙返りでの底辺位置でのスロットル開度が異なります。↓
・逆宙が怖い?の小心者です。無意識なのですが、早く行け!と逆宙の方が開度が大きいのか、半対称翼だから?
・宙返り、逆宙返り、ともに底辺付近でエルロンを入れてます。↓
・まだ、このヒコーキの見え方に慣れていません。真横から見た位置になると不安になって、そこにいるよな?そっち向いているよなと翼を振って確認してしまう小心者です。
というわけで、実は同様の目的のラジコンヒコーキ用のフライトレコーダーは昭和の時代に作られています。
半世紀前のRC飛行機用フライトレコーダー
ラジコン技術誌1975年4月号の記事を引用
1970年代の前半に電波実験社が、フライヤーの送信電波をモニターするという手法のフライトレコーダーを作り、競技会に持ち込み、フライヤーの操縦テクニックの解析を行っています。記事には、ラジコン飛行機におけるフライトレコーダーの必然性が書かれていましたが、なぜか流行らずに終わってしまったと思います。
現代版フライトレコーダー
ラジコンプロポ ( プロポーショナル:比例制御 ) の黎明期には、いろいろな方式が考案されたようですが、RCサーボへの目標角度をパルス幅で伝えるという方式が主流になりました。(現在ではデジタルデータを直接受け取るシリアルバス方式も使われています。)ラジコンプロポの電波は、PPM信号をAM変調、FM変調する方式から、デジタルのPCM信号、そして2.4GHzでは個々の送受信機でペアリングする方式になったため、現在では他人の信号をモニタするのは困難です。しかしながら、デユアルレシーバーモードでペアリングをした受信機のひとつを地上に置き、その受信機からの信号を記録することで1970年当時と同様のフライトレコーダを作ることは可能です。またシリアルバスを使用すればPCへの取り込みが簡単に行えます。
というわけで作ってみることにしました。まずはバスの仕様を調べます。
XBUS/JRの仕様
XBUSの仕様の概要は公開されており、現時点では RC DEPOT HELI のサイトからダウンロードできます。" XBusサーボ プロトコル仕様概略 Ver. 1.0.6" のドキュメントで、UARTの仕様は以下のように記されています。またプロトコルについても記されています。
・3.3V TTL 1線 半二重通信(ホストUARTは通常TXモード)
・8bit, 1 start bit, 1 stop bit, non parity, LSB first
・Idle Hi Level
・250kbps BER under 1%
S-BUS/FUTABAの仕様
S-BUSの仕様は公開されていませんが、既にあちこちで解析されていますので、その情報を使わせて頂くことにしました。
・Futaba S-BUS controlled by mbed
・Futaba S-BUS to USB-HIDコンバータの制作
こちらの方の解析では
・3.3V 負論理
・100000bps
・data : 8bit
・stopbit : 1.5
・parity : even
とのことです。
バス信号のPCへの取り込み
昔のパソコンではCOMポートと呼ばれるシリアルポート(RS-232-C)の入出力端子が実装されており、周辺機器との接続に用いられていました。現在でもシリアル信号での接続の要求は多々あり、そのためのシリルアルUSB変換器が各種販売されています。RS-232-Cの規格での信号レベルは正負の信号なのですが今回はS-BUS、XBUS、に合った3.3Vのものを使います。
真っ当なものを選びますと、このあたりでしょうか。
・FTDI USBシリアル変換ケーブル( 3.3V )
あまり安価なものは当たり外れがあるかとは思いますが、Amazonで3個で¥580で購入した以下のモジュールは3個とも問題無く動いています。
・HiLetgo 3個セット USB Toシリアル USB ToTTL CH340モジュール
XBUSのインターフェース
・XBUS信号を保護抵抗を介してシリアルUSB変換器のRxDへ接続します。
・受信機のGNDとシリアルUSB変換器を接続します。
・変換器に5V/3.3Vの切り替えがある場合は3.3Vを選択します。
S-BUSのインタフェース
S-BUSはアイドル状態(信号無し時)がLowレベルという、何故?な 仕様ですので信号を反転する必要があります。今回は手持ちのインバータ 74HC04 を使用しました。6回路入りです。未使用入力はGNDに接続しておきます。
動作確認のために適当なRCサーボを接続して板の上に貼り付けたのが、前回のその1の記事にもアップしている以下の画像になります。このボードでは FUTABAタイプにはFTDI USBシリアル変換ケーブル( 3.3V )を用いています。
オフボード型のフライトレコーダの受信機用に安価な互換受信機 Corona R6DM-SB DMSS 2.4GHz(JR-XG互換6ch受信機)を使ってみましたが、問題無く動作しています。これであれば総費用¥3,000ちょっとでできます。(パソコンは除く)ただしこの受信機のバス出力はFUTABAのS-BUS仕様ですのでPCとのインタフェース、データ取り込み及び変換ソフトはS-BUS用を用いることになります。
データ取り込み及び変換ソフトウェア
シリアルバスのデータをPCに取り込むためのソフトと、取り込んだデータをグラフ化するために、タイムスタンプを付けてチャネル毎に数値データにして並べるソフトが必要になります。当初はTera Termとサクラエディタとエクセルで処理していたのですが、手作業がいくつも入り、面倒になってきましたので、ネットでPythonを学びつつスクリプトを書いてみました。
Python って便利だというのをあらためて知りました。
Step1: COMポートからのデータで.csvファイルを生成する。(XBUS用)
import serial
f_out = open('OutFile.csv','w')
comport = serial.Serial('COM3', baudrate=250000, \
parity=serial.PARITY_NONE)
line_counter = 0
int_data_1 = 0
int_data_2 = 0
int_data_3 = 0
while True:
try:
recv_data = comport.read()
int_data = int.from_bytes(recv_data, byteorder='big')
print("\r" ,line_counter, end="" )
line_counter +=1
if( (int_data_3==164)and(int_data_2==26) \
and(int_data_1==2)and(int_data==1) ):
f_out.write( str(int_data) )
f_out.write("\n")
else:
f_out.write( str(int_data) )
f_out.write(",")
int_data_3 = int_data_2
int_data_2 = int_data_1
int_data_1 = int_data
except KeyboardInterrupt:
print("Stop by Ctrl+C")
break
f_out.close()
comport.close()
Step2 : Step1で生成されたデータ列を各チャンネルデータに変換する(XBUS用)
import pandas as pd
time = 0
l_line = [0]*29
f_out = open('CnvFile.csv','w')
f_out.write("time,ch1,ch2,ch3,ch4")
f_out.write("\n")
data = pd.read_csv("OutFile.csv",skiprows=1,error_bad_lines=False)
max_line = data.shape[0]
print("MaxLine :",max_line)
print("MaxColum :",data.shape[1])
line_num = 0
while( line_num < max_line ):
print( "\rLine :", line_num, end="" )
if( str((data.iloc[line_num,1])) != '192' ):
f_out.write( str(time) )
f_out.write(",")
f_out.write( str(int(data.iloc[line_num,2])*256 \
+int(data.iloc[line_num,3])) )
f_out.write(",")
f_out.write( str(int(data.iloc[line_num,6])*256 \
+int(data.iloc[line_num,7])) )
f_out.write(",")
f_out.write( str(int(data.iloc[line_num,10])*256 \
+int(data.iloc[line_num,11])) )
f_out.write(",")
f_out.write( str(int(data.iloc[line_num,14])*256 \
+int(data.iloc[line_num,15])) )
f_out.write("\n")
time += 14
line_num += 1
Pythonを使いこなていませんので変な書き方をしているかもしれません。
どちらにしてもラジコン界の人には、あまり縁の無い世界だと思いますので、Pythonはどうするかとか?上記の情報だけでは不足ですよね?必要であればWindowsでの実行ファイルとか作ることも可能のようですので、興味のある方はコメントなり下さい。不足情報を、書き足していきます。
では、また。