自作ドローンの製作に向け、プロポ(Jumper T8SG V2 Plus)から送信した信号(S-FHSS)をレシーバで受信し、マイコンと通信(SBUS)しシリアルモニタに表示するプログラムを書いて試してみました。
RADIOMADSTER R81 V2 はバインド待ち状態(ボタンを押しながら電源を入れる)では素早く点滅し、接続されていないと遅く点滅、バインドされた状態では点灯しています。
最初はバインドできてもすぐに切れてしまいました。データシートを再度読んでみたところ、動作電圧が4.5V~6Vだということでマイコンの3.3V接続していたことが原因だったようです。5Vに接続したところ切れずに接続状態を保つことができました。
プログラムの作成のため、arduino nanoで通信し、シリアルモニタに表示することが可能か調べてみました。しかし、nanoにはシリアル通信ようのピンは1つしかなく、デジタルピンを代用する方法も試してみましたがうまくいきませんでした(プログラムが悪かったのかもしれません)。代わりにシリアル通信用のピンが複数あるraspberry pi picoを使用することにしました(信号線はGPIO1に接続、シリアルモニタのボーレートは115200)。受信できるデータが飛び飛びになることがあるため、次回以降、その改善もしていこうと思います。
今回作成したプログラムは最後に記述します。


今回使用したもの
ソフト:Aruduino IDE
マイコン:RP2040マイコンボードキット(Raspberry Pi Pico)
プロポ:Jumper T8SG V2 Plus
レシーバ:RADIOMADSTER R81 V2 レシーバー(SFHSS)
今回は以下のブログを参考にさせていただきました。
・https://www.hoihoido.com/blog/drone-3/
・ http://www.hoihoido.com/blog/wp/?p=3133(上記リンクの修正版)
・ https://rikei-tawamure.com/entry/2020/03/17/120606#SBUS%E4%BF%A1%E5%8F%B7%E3%83%9E%E3%83%83%E3%83%97
・ https://cpu4edu.net/cafe/archives/art/00124.html
#define BAUD_RATE 100000 // S.BUS通信速度
#define SERIAL_CONFIG SERIAL_8E2 // S.BUS通信設定
uint8_t sbusData[25]; // S.BUSデータの受信バッファ
int channels[16]; // チャンネルデータ (0~15)
bool failsafe = false;
bool lostFrame = false;
void setup() {
Serial.begin(115200); // デバッグ用シリアル通信
Serial1.begin(BAUD_RATE, SERIAL_CONFIG); // S.BUS通信開始 (デフォルトUART1 RX: GPIO5)
Serial.println("S.BUS Receiver Initialized");
}
void loop() {
if (Serial1.available() > 24) { // S.BUSは25バイトフレーム
// データの受信
if (readSBUS()) {
// チャンネルデータの表示
Serial.print("Channels: ");
for (int i = 0; i < 16; i++) {
Serial.print(channels[i]);
Serial.print(" ");
}
// フェイルセーフとロストフレームの表示
Serial.print("Failsafe: ");
Serial.print(failsafe ? "ON" : "OFF");
Serial.print(" | Lost Frame: ");
Serial.println(lostFrame ? "YES" : "NO");
}
}
}
// S.BUSデータの読み取りとデコード
bool readSBUS() {
// S.BUSデータの読み取り
for (int i = 0; i < 25; i++) {
sbusData[i] = Serial1.read();
}
// S.BUSフレームヘッダーとフッターを確認
if (sbusData[0] != 0x0F || sbusData[24] != 0x00) {
return false; // 無効なフレーム
}
// チャンネルデータのデコード
channels[0] = (sbusData[1] | sbusData[2] << 8) & 0x07FF;
channels[1] = (sbusData[2] >> 3 | sbusData[3] << 5) & 0x07FF;
channels[2] = (sbusData[3] >> 6 | sbusData[4] << 2 | sbusData[5] << 10) & 0x07FF;
channels[3] = (sbusData[5] >> 1 | sbusData[6] << 7) & 0x07FF;
channels[4] = (sbusData[6] >> 4 | sbusData[7] << 4) & 0x07FF;
channels[5] = (sbusData[7] >> 7 | sbusData[8] << 1 | sbusData[9] << 9) & 0x07FF;
channels[6] = (sbusData[9] >> 2 | sbusData[10] << 6) & 0x07FF;
channels[7] = (sbusData[10] >> 5 | sbusData[11] << 3) & 0x07FF;
channels[8] = (sbusData[12] | sbusData[13] << 8) & 0x07FF;
channels[9] = (sbusData[13] >> 3 | sbusData[14] << 5) & 0x07FF;
channels[10] = (sbusData[14] >> 6 | sbusData[15] << 2 | sbusData[16] << 10) & 0x07FF;
channels[11] = (sbusData[16] >> 1 | sbusData[17] << 7) & 0x07FF;
channels[12] = (sbusData[17] >> 4 | sbusData[18] << 4) & 0x07FF;
channels[13] = (sbusData[18] >> 7 | sbusData[19] << 1 | sbusData[20] << 9) & 0x07FF;
channels[14] = (sbusData[20] >> 2 | sbusData[21] << 6) & 0x07FF;
channels[15] = (sbusData[21] >> 5 | sbusData[22] << 3) & 0x07FF;
// フラグのデコード
failsafe = sbusData[23] & 0x08;
lostFrame = sbusData[23] & 0x04;
return true; // 正常にデコード完了
}
コメント