SBDBTとarduinoの挫折終了


SBDBTのRCB信号(正論理)→Arduinoの低速シリアルで読む

というなんでもないようなことに悪戦苦闘中です。

ちょっとスクリプトがキタナイ気がするんですけど、
何とかそれらしく動くというところまで進みました。

Arduinoのシリアルモニタに、たとえば↑ボタンを押して離すと、

80,0,1,40,40,40,40,1,check sum OK !
80,0,0,40,40,40,40,0,check sum OK !

のように表示されます。
チェックサムは仮のもので、特にアナログパッドにはまだ対応できていません。
後ほどスケッチが完成したら、SBDBTのファームの設定含めてまとめようと思います。




途中経過とはいえ、Arduinoのシリアル通信での読み込み方の壁を越えられそうな状態なので、
ここまでのスケッチをメモがてら書き留めておきます。
(後でここのスクリプトにさかのぼる時に、ブログに上げておけば、ブログ記事という解説付きの確実なスクリプトをコピペで実行できるので便利です。自分のフォルダの中だと似たようなスクリプトが多すぎてゴミ屋敷状態です。)




以下スケッチ。


void setup(){
  Serial.begin(2400);
}
void loop(){
  int i;
  byte c[8];
  if (Serial.available() > 0) { //シリアルバッファにデータがあるかチェック
    c[0] = Serial.read();//バッファの先頭のデータを1個c[0]に代入
    if (c[0] != 0xFF){//データが0xFFのゴミだったら無視して読み込み直す
      if (c[0] == 0x80){//c[0]が0x80のスタートビットかチェック。見つけたら次へ。
        Serial.print(c[0],HEX);
        Serial.print(",");
        for (i=1;i<8;i++){//スタートビットは読み込み済みなので、次の7個のデータを読み込む。
          c[i]= Serial.read();
          if (c[i] == 0XFF){//データが0xFFのゴミだったら読み込み直すためにiを1もどす。
            i --;
          } 
          else {//データが0xFFのゴミではなければ、以下を実行。
            Serial.print(c[i],HEX);//16進数で数値を表示。
            Serial.print(",");
          }//コンマで区切る。
        }
        if(c[7]==c[1]+c[2]){//ボタン部分のみのチェックサムを簡易計算してみる。
          Serial.println("check sum OK !");//チェックサムOKを表示。
        }
        else
        {
          Serial.println("check sum * * ERROR * *");//ダメならエラーを表示。
        }
      }
    }
  }
}







課題
・バッファに8バイト溜まったら調べるようにしたら、なぜか
 キーのプレスとリリースのタイミングがズレてしまうことがあった。
 ので、1バイトあったら調べるようにしておいた。
・チェックサムのc[1]~c[6]までの合計の下位7ビット、の作り方を知らない。
 ので、今のところc[1]~c[2]の十字とABXYボタンだけでチェックサム。
・キーごとに分岐するように、関数を付け足す。
 その一般的で効率的な方法を調べる。

ということで、見ている方はちょっとモドカシイかもしれませんが、すみません。
Processingの勉強も平行して始めています。やりたい事にピッタリの言語に出会えたかもしれません。
スポンサーサイト

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

コメントの投稿

非公開コメント

micono先生、ありがとうございます!

すみません、ちょっと時間かけすぎました。正解を教えていただきありがとうございます。

・私のスケッチは、PCの表示に時間をかけすぎたことのズレを、他のところを調整せずに、そのスクリプト内だけで場当たり的に強引に調整していたのが美しくなかったんだということがよく分かりました。動けばよいというものではないですね。
・電文運送信最低時間を設定するというのも目鱗です。
・チェックサムについては、longの変数に足し入れていって、最後に論理積でマスクすれば下位7bitが抽出できるわけですね!longを使うというのが思いつきませんでした。そこが知りたかった正解でした!
・0番ピンを抜き差ししながらプログラムを書いていたので、ソフトウェアシリアルで代理してしまうというのもハッとさせられました。試行錯誤には便利すぎます。

ブログを読まれた方はイライラされたかもしれませんが(笑)、私にとってはものすごく実りのある勉強になりましたし、SBDBTとArduinoの初心者向けの基本道路が開通したような気がします。(このスケッチは初心者以外にとっては当たり前のものなのか、検索してもあまり出てこないんです。)
おかげさまで、次のステップに進めます!

No title

Arduinoが取りこぼすので、SBDBTのWiiのファームの電文送信最低時間を
0より大きくする。例えば50msに。
#define UART1_MINIMUM_INTERVAL 50

とりあえず、ArduinoとSBDBTの速度より、PCとの通信を速くしてみた。
以下のコードで私の環境では取りこぼしなしで動いています。

//-------------------------------------------------------------
// Arduinoのコード
//-------------------------------------------------------------

#include <SoftwareSerial.h>

//0,1だとSBDBTの配線したままArduinoの
//書き込みできないので、面倒だから0,1以外を使う
SoftwareSerial mySerial(2, 3);

unsigned char c[8];
unsigned long chksum;

void setup(){
mySerial.begin(2400);//SBDBTとArduinoは2400bps
Serial.begin(19200);//シリアルモニター表示
c[0]=0x80;//常に
}

void loop(){
int i;
if (mySerial.available() >= 8) { //8byte以上あるかチェック
if (mySerial.read() == 0x80){ //1byte読み込んで0x80のスタートビットかチェック
Serial.print(c[0],HEX);//16進数で数値を表示。
Serial.print(",");//コンマで区切る。
for (chksum=c[0],i=1;i<8;i++){//スタートビットは読み込み済みなので、次の7個のデータを読み込む。
c[i]= mySerial.read();
if(i<7) chksum+=c[i];
Serial.print(c[i],HEX);//16進数で数値を表示。
Serial.print(",");//}//コンマで区切る。
}
if(c[7]==(chksum & 0x7F)){//ボタン部分のみのチェックサムを簡易計算してみる。
Serial.println("check sum OK !");//チェックサムOKを表示。
} else {
Serial.println("check sum * * ERROR * *");//ダメならエラーを表示。
}
}
}
}

//-------------------------------------------------------------

No title

あと、最初の
if (c[0] != 0xFF){//データが0xFFのゴミだったら無視して読み込み直す
は意味をなしてないように思いますが...
なくても同じ挙動では?

No title

0xFFのゴミが出ると書かれてますが。

自分のWiiリモコンでやってみた時、ゴミのような値は出ないんですが、
これはArduino, SBDBTのファームの問題でなく
お使いになられているコントローラーの問題なのでしょうか??

あと、チェックサムですが、c[0]からc[6]を加算した値の下位7ビットです。
なんで、
if(c[7]==(chksum & 0x7F)){
のような感じにしないとダメなように思います。
プロフィール

二名川(ニナガワ)

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 ゼロライナー
以下続く

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