MP-101ワイヤレスリモコンの作成 その2

2021年6月7日

悩んだところ 

まだ基盤が届かないので、悩んだところの続き

Xbeeのピッチ変換基板 秋月vsスイッチサイエンス 似ているけど結局全然違う どちらが良いのか?

秋月の「XBee用2.54mmピッチ変換基板」は基本5V用で、基盤にレギュレーターがついていてxbeeには3.3V供給するようになっている。3.3V系で動作させても一応動くので実験中などでは良いかもしれないがかなり気分的に悪い。結局外してバイパスした。昔の仕様なんだと思うけどxbee使う人は3.3V用意しているはずなので、これは不要かと思った。

電源用パスコン LED元々ついている。電源のLEDは3.3V変換後についている。
2.54mm側ピン間隔600mil  お値段300円

スイッチサイエンスの「XBeeピッチ変換基板とソケットのセット」は、電源は直結。LEDは一つはxbeeが動作したときにxbeeの設定で点灯。もう一つはlink時に点滅とかするがよく分かりませんでした。
2.54mm ピン間隔 400mil (秋月と違うので後から変えようとするとちょっとたいへん) LEDやパスコン抵抗類は付いていない。お値段300円

どちらが使いやすいかというと好みかもしれませんけど、スイッチサイエンスの方が小型で、わざわざレギュレータ外してバイパスする必要が無いので使いやすい印象。LEDとかは動作がおかしいときに目視で確認できるのは便利なので後からでもつけた方が良い。

左スイッチサイエンス 右秋月
xbee面
左スイッチサイエンス 右秋月

xbeeの2mmピッチは基盤外注作成するときは別に何の問題にもならないが、ブレッドボードや普通の基盤で作ろうと思うとかなりやっかい。秋月のxbee変換基板だと足間隔も大きいし全体も大きいため、ブレッドボード基盤 で配置しているとすぐに入りきらない問題が出てきてしまいました。

xbee3について

xbeeは今まで主流だったのはおそらくXBee ZB S2Cモジュール U.FLタイプ1個 ¥2,500(秋月価格)(同じ製品はスイッチサイエンスより秋月の方が大体安い。それはスイッチサイエンスも認めており、ホームページの至る所に、秋月の方が安いですよと書いてある。)

XBee3 Zigbee3.0モジュール U.FL 1個 ¥2,210と少し安いし何よりこの業界基本新しい物の方が良いとの法則もあるため、あまり考えずにxbee3の方を購入、一応小電力コンパクトも言われていたし。ただ、最近あまりxbeeははやっていないのかなかなか使用記事が見つけられず苦戦しました。特にはじめてxbee3に手を出した場合S2Cの記事を見てxbee3見てもちんぷんかんぷん。その1にも書きましたが、XBee(無線通信)の実験 http://zattouka.net/GarageHouse/micon/XBee/XBee1.htm こちらを通してみるとよく分かりますが、注意点挙げておきますと

  • xbee3はファームウェアーは基本一種類。S2C互換用に古い仕様のファームもあるみたいだけど、一つのファームでほぼすべての機能を実装している
  • 1対1通信ならばルーターモード同士でも動作するため気にしなくても良かった。速さが変わるのかと思い一応親機側をXCTU画面の一番最初CEをForm Netoork[1]にしている(コーディネーターモード)
  • 相手先を指定しないブロードキャストで使用すると処理速度が遅い。ATDLとATDHでしっかり相手側指定して通信するべき
  • 素人は1対多通信は諦めた方が良いかも。そもそも解説記事が少ない。
  • リアルタイムでない1対多 通信はATコマンドで相手先を変えながら通信すれば擬似的に1対多通信ができるため目的は達せられた
  • ほとんどのことはATコマンドででき、速度的にもほぼ十分。ただしATGT(Guard Times)+++のあとどのくらい待つかの時間。これを少なくしておかないと遅くなる。最少2ms 心配なので3msにして使っている。
  • I/Oがせっかくついているので使わないのはもったいない。(後で書くことになりますがその1の記事で困ったI/Oの数問題はxbeeのI/Oを使用して解決している)
CEでルーターモードとコーディネーターモードを変える

使いやすいようにルーチン化

少々おそいが、LED光らせたり通信先変更くらいは大丈夫だった。デバッグ用の不要ルーチンも多いのはちょっとテストに手間がかかったため。

とりあえず問題なく動作はしているようですが、改良の余地は当然あると思うので、アイデアあれば教えてください。

bool xbeecmd_enter()//ATモードにするための開始コマンド
 {
 ifdef XBEEATCMDS_DEBUG_SERIAL
 mySerial.print("ENTER COMMAND MODE: ");
 endif
 delay (110);
   XBEE_SERIAL.print("+++");
   return dumpReply();
 }

bool XbeeWrite(int port, int highlow)//xbeeのportを通常のdigitalwriteのように使用するためのルーチン
 {
   if (xbeecmd_enter()) // enter to AT command mode
   {
     if (highlow == HIGH) {
   XBEE_SERIAL.print("ATD");
   XBEE_SERIAL.print(port);
   XBEE_SERIAL.print("5");
   XBEE_SERIAL.print("\r");
   xbeecmd_apply();
   xbeecmd_exit();
   xbee_err = dumpReply();
 }
 else if (highlow == LOW) {
   XBEE_SERIAL.print("ATD");
   XBEE_SERIAL.print(port);
   XBEE_SERIAL.print("4");
   XBEE_SERIAL.print("\r");
   xbeecmd_apply();
   xbeecmd_exit();
   xbee_err = dumpReply(); }
 }
   else
   {
     xbee_err = false;
   }
 }

bool xbeecmd_CMD(String cmd)//ATコマンドを送るだけ\rを最後につけて送る
 {
 ifdef XBEEATCMDS_DEBUG_SERIAL
 mySerial.print(cmd);
   mySerial.print(": ");
 endif
 XBEE_SERIAL.print(cmd);
   XBEE_SERIAL.print("\r");
   return dumpReply();
 }

bool xbeecmd_apply()//xbeeはATコマンドで指示してもATAC等で指示してから実際には動作する
 {
 ifdef XBEEATCMDS_DEBUG_SERIAL
 mySerial.print("APPLY CHANGES: ");
 endif
 XBEE_SERIAL.print("ATAC\r");
   return dumpReply();
 }

bool xbeecmd_save()//書き込み動作は少し遅いし電源入れたときには初期値に戻っているほうが良いため実際には使用しない
 {
 ifdef XBEEATCMDS_DEBUG_SERIAL
 mySerial.print("WRITE DATA TO MEMORY: ");
 endif
 XBEE_SERIAL.print("ATWR\r");
   return dumpReply();
 }
 bool xbeecmd_reset()
 {
 ifdef XBEEATCMDS_DEBUG_SERIAL
 mySerial.print("RESET: ");
 endif
 XBEE_SERIAL.print("ATFR\r");
   return dumpReply();
 }
 bool xbeecmd_exit()//このコマンドでATモードを抜けてデーター通信モードになる
 {
 ifdef XBEEATCMDS_DEBUG_SERIAL
 mySerial.print("EXIT AT COMMAND MODE: ");
 endif
 XBEE_SERIAL.print("ATCN\r");
   return dumpReply();
 }

bool dumpReply()
 {
String label;
   char dat[255];   // 格納用文字列
   int count = 0;  // 文字数のカウンタ
 unsigned long time;
 time = millis();
   //    mySerial.println(time);
   while ((millis() - time) < 3000) {
     if (XBEE_SERIAL.available()) {
       dat[count] = XBEE_SERIAL.read();
       if (dat[count] == '\r') {
         label = dat;
         break;
       }
       else {
         count++;                              // 文字カウンタに 1 加算
       }
     }
   }
   //      mySerial.println(millis());
   if (label == "") // timeout
   {
     return false;
   }
   else
   {
     xbee_ret = label;
     return true;
   }
}

2021.05.31 dumpReply() 修正
はじめxbeeからの返事を見ていなかったので、ルーチンが甘かった。ハートビート方式でバッファーが埋まることがあったので、dat[255]と多めにキープ。オーバーして入力してしまい誤動作の原因となることがあった。C言語系のあるあるです。 まだ時々返事にゴミが入るので実際に問い合わせ結果を利用するときに注意が必要。 後日親機・子機のスケッチ公開できるときまでもう少し検討してみます。

xbeeからの返事を見る必要に迫られたのは、時々勝手に接続がおかしくなるとき対策で、子機の起動時に確認してエラーリカバリーや修正をするため。
子機をシンプルにしたかったため入力系ボタンをつけていないため、セットアップルーチンでやることが増えました。

実際の使い方は以下のような感じ

      xbee_err = XbeeWrite(AFMF_LED, HIGH);
や

if (local2_BTN == LOW) {//2番機選択
 if (!xbeecmd_enter()) // enter to AT command mode
 {   xbee_err = false; }
 else
 {
   xbeecmd_CMD("ATDL41BE070C");
   xbeecmd_CMD("ATD04");
   xbeecmd_CMD("ATD15");
   xbeecmd_CMD("ATD24");
   xbeecmd_apply();
   xbeecmd_exit();
   xbee_err = true;
   ZoomSpeed[local_mode] = ZoomSpeed[0];
   MP_speed[local_mode] = MP_speed[0];
   AFMF_MODE[local_mode] = AFMF_MODE[0];
   ASS1_MODE[local_mode] = ASS1_MODE[0];
   local_mode = 2;
   ZoomSpeed[0] = ZoomSpeed[local_mode];
   MP_speed[0] = MP_speed[local_mode];
   AFMF_MODE[0] = AFMF_MODE[local_mode];
   ASS1_MODE[0] = ASS1_MODE[local_mode];
   refresh_LED(); }
 }
LED光らせるのもXbeeWriteより早いから、直接コマンドで書いたりしてる。
下のほうは、送信先変更するときに以前のパラメータに復元するための作業。LED表示も前に戻す

xbeeで入力系はさすがにレスポンスが心配で使わずLED光らせるところのみ使用。
全体に入力系レスポンスに神経使っているのはLANCでズームインアウトを途中で引っかかることなく使いたいから。

MP-101の動作はカメラ映像を本線に流しているカメラで行うことは少ないが、ズームは使う。そのためズーム速度も3パターンでかなり遅いやつも選択できるようにしたかった。

つづく

MP-101ワイヤレスリモコンの作成 シリーズ

その1 その2 その3 その4 その5  その6 その7 その8

関連

ESP32でBluetooth(BLE)で相互通信 その1 

ESP32でBluetooth(BLE)で相互通信 その2

M5stamp PICO UDP相互通信テスト

 

電子工作

Posted by akiba