RobovieMaker2(10)こまったこと2


//////////【Arduinoのスケッチ】
void setup() {
Serial.begin(115200); // 115200bpsでポートを開く
}
void loop() {
Serial.println("w 2009f6 01 00");//※サーボオンコマンド
}
///////////


とすることで、
ArduinoからVS-RC003へとシリアル送信ができることがわかって喜んだのもつかの間、

//////////【Arduinoのスケッチ】
void setup() {
Serial.begin(115200); // 115200bpsでポートを開く
}
void loop() {
Serial.println("w 2009f6 01 00");//※サーボオンコマンド
delay(1000);//1秒休む。
}
///////////


という風に、1秒のディレイを入れただけでシリアルを受けてくれなくなることがが判明しました。
通常の操作コマンドも、同じコマンドを3行以上連続で送信ことでまあまあ動いたてくれたりしますが、
ロボを操作するには心もとないです。

【確認】
・VS-RC003のコントローラーボタン入力のLEDはコマンド送信時に点滅している。
・VS-RC003の受け入れはたぶんTTLレベル。サインスマートArduino nano互換もTTLで出しているハズ。
・ArduinoはTXピンから送信しているので、115200bpsには対応できているハズ。
・通信ケーブルにフェライトコアを入れてみたりケーブルを短くしてみましたが変化なし。
・電源投入時のみ長押し判定なのかもしれないが、マニュアルにはそういうことは書いていない。
・同コマンド3行連続送信の場合の成功率は90%ぐらい。
・同コマンド2行連続送信の場合の成功率はごく稀。
・Serial.print("w 2009f6 01 00\r\n"); 改行コードを左記に変更しても結果は同じ。
・Arduino UNOでも同じ症状。




コマンド送信が成功したかどうかを監視するチェックプログラムがあるのかなとも思ったのですが、
オフィシャルの「C言語で操作するサンプル」をみても、チンプンカンプンな上に、受信のチェックはしていても、送信のチェックは特に行ってない模様。

ここ一週間ほど、この件でずーっと悩んでいます。
助けてオビ・ワン・・・
スポンサーサイト

テーマ : 自然科学
ジャンル : 学問・文化・芸術

コメントの投稿

非公開コメント

No title

木の背さん、ありがとうございます!詳しくはFacebookの方でさせていただきます。
今回の記事は、送信が通るかどうかの検証でした。受信の方は読み取った1バイトのシリアルを並び替え、信号の終端を判断するという処理が必要になります。
送信だけならばSerial.println("w ほにゃらら")を送りつけるだけで問題なく動くはずなのですが、
過去に試した時はハードウェアシリアルを用いても成功率がまちまちで競技には使い難いレベルだったと記憶しています。
http://fc2canned.blog54.fc2.com/blog-category-19.html
上記のSBDBTのシリアルのarduinoでの読み取りについては、競技で使えるレベルに安定しているので、可能ではある・・・と思っています。

VSRC-アルディーノ

ずいぶん古い投稿なので、悩みましたけど書き込んでおきますね。

このプログラムの通りだとすると、VSRCの乗っ取りのコマンドが抜けています。
通信速度は、なんら問題はありません。

同時に、このままだと延々とサーボオン指令を繰り返すので、いろいろ困ります。

いま、実験してるスケッチが困ったことになってるので、意見が聞ければと思い掲載しておきますね。

//char input[30];
int input;
int i=0;
int inbyte;

void setup() {
Serial.begin(9600);
Serial1.begin(115200);
}

void loop() {
input=Serial1.read();
if(input != -1 ){
Serial.write(input);
}
if(Serial.available() > 0){

inbyte = Serial.read();
Serial.println(inbyte);
if ('s' == inbyte){
Serial.println("w 2009e0 00 00"); //
Serial1.println("w 2009e0 00 00"); //VSRCのっとり
delay(100);
Serial.println("w 2009f6 01 00"); //
Serial1.println("w 2009f6 01 00"); //サーボオン
delay(2000);
}
if ('w' == inbyte){
Serial.println("r 2009de 05");
Serial1.print("r 2009de 05\n\r");

}
}
}

アルディーノマイクロにて実験しておりまして、これだとUSBがSerialで9600ボーレートです。
で、TX,RXピンがUSBと別になっているので、Serial1で115200のVSRC用になってます。

シリアルモニタにて、s、wを入力することで、サーボオン>バッテリー電圧の読み取りまで行けました。

欠点は、出てきた数字が理解不能という・・

今更ですが、参考になれば。

No title

B.Wさん
たびたびありがとうございます!
まだ解決していません><

>「PCで動いているから大丈夫」とは言い切れないことが多いです。
たしかにそうですね。通信を一番デリケートなものとみなして試してみます。
ケーブルを最短にしたり、シールド線にしたりも試してみます。

>setup()内で害のないコマンドを数発
これもありかもしれません。
もとのプログラムでもloop()で同じコマンドを送り続けているので、はじめのコマンドエラーは自動的に消化しているような気がしますが、\r\nの回数で最適なものがあったりするかもしれません。

時間をみつけて試行錯誤してみます!

No title

こんばんは。
もう解決しているでしょうか?

PCはマイコンに比べてずっと早く動いているので、多少の通信ズレはがんばって補正してくれちゃうみたいなので、「PCで動いているから大丈夫」とは言い切れないことが多いです。

VS-RC003のシリアル通信資料のP.13に
「以下のように一番初めのコマンドはエラーになりやすいので注意が必要です」
とありますが、これが該当するのではないでしょうか?

もしそうだとすると、Arduinoのloop()内は繰り返し実行されるので、setup()内で害のないコマンドを数発投げて、そのあとでloop()処理をしてみると言うのはいかがでしょうか?

No title

B.Wさん、ありがとうございます!
FacebookでZakさんからもスピード早すぎ(16Mhzでは通常4%のエラーが出る)という指摘をうけていまして、そうかもしれない!と思ったのですが、
Arduino→PCで見るシリアルモニタが115200で、2mぐらいのケーブル経由でもまずエラーが出ないので、スピードだけの問題ではないような気がし始めています。(arduinoとIDEの間でこっそりエラーチェックをしていれば別ですが)
あと、VS-RC003が15200固定なので、スピードを落とせないのです。

No title

ご無沙汰しております。
見当違いでしたらごめんなさい。
ちょろっと記事を読んだだけで実機などは持っていないのですが、115200bpsだと早すぎるのではないでしょうか?
「他の方もその速度で実行している」という情報があるのであれば別の原因という気もしますが、まずは通信速度を落としてみてはいかがでしょう?
プロフィール

二名川(ニナガワ)

Author:二名川(ニナガワ)
ホビーロボットをレトロゲームが発展したものと捉えて楽しく遊び倒します。
子供が夢を見ている時間帯に稼働します。

宣伝:電子出版しました。
「コンソロイド ガイドブック」
46107_CONSOLOID_GUID_FACE_200.jpg





■作成中の機体
汎用ヒト型決戦遊具 ~RX計画~
RX-7.5 ゼロタンク
RRf-0.6 ゼニィ
RXM-7.9 ゼムネス
RX-7.5R 量産型ゼロタンク
RX-7.5Fp ファミタンク仮設1号
RX-7.7 ゼロキャノン
RX-7.8 ゼログレイ
SMS-0.1 ゼロライナー
以下続く

ブログ内検索
最近の記事
最近のコメント
カテゴリ
月別アーカイブ
リンク