SBDBTとarduinoで挫折中2


SBDBTとarduinoで挫折中の続きです。




【やりたいこと】
・SBDBTを使い、Arduino を Wii リモコンで動かす。
・Wii リモコンの拡張端子も有効にする。
・ここさえ開通すれば、
 ロボサバ用のコントローラーにツインスティックが使えます。


th_CIMG1448.jpg
↑要は改造済みのコレを早くファミタンク等で使いたいのであります。


【教えてもらったり調べたりでわかったこと】
・16進数は、0xAAみたいに頭に0xをつけて表記する。例は10進数では16×10+10=170。
・SBDBTのファームデータを、ビット反転しないように設定する。(ロボ用は反転)
・データは、8バイト分のバイナリで届いている。
 例:10000000(0X80)の塊が8個。
・バイナリデータをデータとして書きだす時には、
 DEC,HEXなど形式を指定しないと文字化けして当然。
・RCB-3用の信号の形式は、micono先生のところ
・ROBO-XEROの場合は、上の8バイトのデータが、ロボゼロ用の変数V120~V126にスコンと入るので、
 それを調べて分岐させれば操作ができる。 


【やるべきこと】
・arduinoのシリアル通信で、
 8バイトのデータをスコンと受信する。
・そのためのプログラムを書く。


【新しい問題点】
・ハードウェアSerialは、バッファ機能があり便利。
 ただし、PCでのモニタリングに使おうとすると、
 受信したデータとモニタリングに書きだしたデータがごちゃごちゃして上手くいかない。
・SoftwareSerialにはバッファがないので不便。
・でも、ソフト制作の確認用にシリアルモニタが欲しい。
 コントローラのボタンを押したら8バイトの文字列がズラリと表示されるようにしたい。




結論

【まずやるべきこと】
・ピン0番1番以外を使ったモニタリングシステムを用意。
・arduinoのLCDモニタは過去に何度かチャレンジ済みなので復習する。
 液晶で反省したい
 距離センサの距離をディスプレイ表示したい
 ROBOXERO(12) シリアル受信1

・液晶をつなぐのは面倒なので、今後また同じ面倒にならないようにシールド化しておく。




ということで、次回は液晶ディスプレイシールド化の電子工作をします・・・
スポンサーサイト

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

コメントの投稿

非公開コメント

No title

miconoさま
ありがとうございます!
極端な例で考えると、データのごにょごごにょで読み込みタイミングがズレ、
たとえば8バイト以上で読み始めて、スタートビットが7バイト目とかに始まったりすると、
やっぱり読み込みラグが出てしまうかも、と思いまして、
でも8バイト来てから読み始めるというのはとても効率が良いので、
ちょっといろいろ組み合わせて試してみます。
いただいたお話をいろいろ総合すると、なかなかに堅牢なプログラムに仕上がりそうです♪

No title

ちゃくちゃくと進んでますね。
実際にarduinoを動かして試してやってる訳じゃないのであれですが、
n=myserial. available();
でnが8以上ならreadするとか

進捗

昨晩、夢の中で改行の謎が解けました。
・欲しいデータ以外にやたらとFFが入る。
・ボタンを連打するとデータの配列が正しく表示されることがある。
ということから、おそらくバッファに1バイトしか届いていないのに、2~7バイトを読み込み表示しようとしていたのだと思います。
適切なディレイを挟むか、読みこんだデータがFFだったら読みなおしする機能を入れれば、たぶん完成になります。

No title

miconoさん、ぱぱっちさん、ありがとうございます。
値の型のバイト数なんて、今まで気にしたこともなかったです。
8バイトのセットがバッファに届いていて、1バイトずつ読み込んで配列に格納する・・・
場合によってはちゃんと表示されるという、かなり近いところまで来ているので、
もう少し頑張ります。
ちなみに、失敗するとFFが格納されてしまっています。
今日やってダメなら、ダメソースを晒します・・・

No title

miconoさんに先に配列とチェックサムを突っ込まれた。。。w
あと、読み込みのところは経験ないのですが、送信プログラムを作った経験からすると、intは4バイトなので1バイトのcharに格納した方が良いような気がします。
外してるかもしれませんが。

No title

ほんとだ。シールド作られたんですね(^^)

配列の定義は、個数で、かつ、0ベースです。
ま、この辺のルールは言語によって異なりますよね。

うまく行くといいですね!

No title

大ヒント、ありがとうございます!
一晩たってみて、冷静に考えたら送るシリアルと受けるシリアルは別ものなので、
PCでモニタリングしながらで出来るハズと思い直している最中です。
(昨日書いたブログが自動アップされました。実はシールドまで進めてしまいました。)

>あと読み取ったc[0]-c[7]の値はASCIIではないので、
>その値が改行コードと同じ値(0x0Aとか0x0D)である場合もあると思います。

なるほど盲点でした。そこまで考えが至りませんでした。
printf(c[i],DEC);など形式を指定しているのですが、その場合は改行にはなりませんよね?

>あとc[0]は常に0x80だと思いますので、それを基準に8バイトずつ読むようにするとか
>c[7]はチェックサムなので、正しく読めているかチェックも必要なのかもしれませんね。

配列に多めに読み込んで、この機能を盛り込んでみます!

>int c[8];

理解不足でした。。。
そこが一番の原因だったかもしれません。

うまくいくといいですね

SoftwareSerialの速度はSBDBTと合わせておく必要があるかと思いますが、
SoftwareSerialはあまり速いのが使えなかったかと思います。
速度に不満足ならNewSoftSerialというのが使えたかと思います。

あと読み取ったc[0]-c[7]の値はASCIIではないので、
その値が改行コードと同じ値(0x0Aとか0x0D)である場合もあると思います。
そのことが改行してしまう原因になっていることはないでしょうか?

あとc[0]は常に0x80だと思いますので、それを基準に8バイトずつ読むようにするとか
c[7]はチェックサムなので、正しく読めているかチェックも必要なのかもしれませんね。

あと気になったんですが、
int c[8];
で、c[0]からc[7]に読込む必要があるのではないでしょうかね?

ありがとうございます!

・ボーレートは上げて使った方が良さそうなので、最適なものを探してみます!
・ひょっとするとボーレートを最速にすれば、SBDBTとPC-USBのシリアル共存でもいけちゃうかもしれません。
・UART1_TX_POLARITY 0 は先日いただいたアドバイス通り試しており、
 間違いなく受信&表示できております♪

SBDBTから来たシリアルのバッファの7バイトを、for文でint c[7]の配列に読み込んで入れて、c[0]から順番に表示したら改行、
としたいのですが、現状、プログラムが下手でメチャメチャに改行されてしまいます。
連続入力すると改行すら入らないというダメっぷりです。。。
c[2]だけ読んで0以外ならLED点灯とかも試しましたが、うまくいっていないのでモニタリングしたくなった次第であります。
正解のスケッチを聞いてしまいたいという強い衝動に駆られますが、もうひとがんばりしてみます><

上手くいくといいですね

SBDBTのファームに関しては、
Wii用ファームの、
global.h
BAUDRATE1 2400でなくもっと速くてよい
UART1_TX_POLARITY 0
UART1_RX_POLARITY 0
にしてビルドしたのを使うのではダメでしょうかね?
プロフィール

二名川(ニナガワ)

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

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