質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

Q&A

解決済

3回答

1040閲覧

近藤科学B3Mモータのデータのreadができない

monster666

総合スコア16

mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

0グッド

0クリップ

投稿2019/05/09 07:13

編集2019/05/09 12:22

近藤科学のB3Mモータにmbedからコマンドを送信して、電流制御しています。
現在の電流値を見ようとデータの読み込みコマンドを送信するのですが、データが戻って来ず電流値を見ることができません。
対処法を教えてください。以下がデータ読み込み用関数の中身です。

C++

1short read_data(unsigned char ID, char addr, char length){ //ID:サーボID addr:メモリアドレス length:データ長さ(byte) 2 short get_data; 3 4 char data[7] = {}; 5 6 data[0] = 0x07; 7 data[1] = 0x03; 8 data[2] = 0x00; 9 data[3] = ID; 10 data[4] = addr; 11 data[5] = length; 12 data[6] = 0; 13 for(int i = 0; i < data[0]-1; i++) 14 data[6] += data[i]; 15 16 EnPin = 1; //データ送信 17 //BufferedSerial::write(data, 7); 18 for(int i = 0; i < 7; i++){ 19 Servo.putc(data[i]); 20 } 21 wait_us(600); 22 23 EnPin = 0; //データ受信 24 wait_us(1100); 25 char re[10] = {}; 26 for(int i = 0; i < 5+length; i++) 27 { 28 re[i] = Servo.getc(); 29 } 30 31 for(int i = 0; i < length; i++){ 32 get_data |= re[4+i] << (i*8); 33 } 34 35 return get_data; 36} 37

##mbedとRS485USBとのピン接続

mbedピンRS485USBピン
VoutVcc
GNDGND
p13D
p14R
p12EN

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2019/05/09 07:38

サーボは動かせてますか? (READだけできないのか、何もできてないのか)
monster666

2019/05/09 07:44

トルク制御でモータは動作しています。 ただデータの読み込み有りと無しでは多少発生トルクが異なっているように感じました。 readの部分でメインループが止まっており、ループが繰り返されていない状態です。
ozwk

2019/05/09 07:52

* データ読み込み用関数に実際どのような引数を与えて実行してますか * 読めないのは電流値だけですか
monster666

2019/05/09 07:57 編集

サーボのIDが0、現在の電流値が保存されているアドレス0x48、データの長さが2バイトなので引数は(0x00, 0x48, 0x02)としています。 試しに電流値の他にもデータの読み込みをできるか試しましたが、できませんでした。
ozwk

2019/05/09 11:28

Servo.getc();が何回走ってますか? シリアルでpcに出すなりしてみてください
ozwk

2019/05/09 11:33 編集

あとEnPinがちゃんと電圧動いてるかの確認とハードの回路図(接続図)をざっくりと
monster666

2019/05/09 12:12

Servo.getc()の部分が動いていないようでした。 またEnPinでは電圧が加わっていたので、そこは問題がないかと思います。
guest

回答3

0

ベストアンサー

あ、もしかしてServo::putc()のデータ出待ちか...>wait
にしても、設定ボーレートの10bit分の時間に対してあまり余裕を持たせない方がいいでしょう。
ボーレートとかの記述がないのでどの程度が適当なのかわかりませんが。
できればUART送信完了の割り込みとかでさっさと受信に切り替えてしまいたいところですね。

投稿2019/05/11 02:48

thkana

総合スコア7610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2019/05/11 02:51

おっと、前の回答へのコメントのつもりで間違えて回答にしちゃった...削除するほどでもないでしょう。そういうことでご理解お願いします。
guest

0

「受信できない」という結果だけを悩むんじゃなくて、「何が起こっているのか」をしっかり観察して考察することが重要です。(問題の解決にも重要なので、できればそういうことは最初から質問に書いて下さい)

readの部分でメインループが止まっており

メーカーのサイトをみると、RS485で半二重通信だそうです。「半二重通信」はいいですか? ひとつの送信ラインを皆で共用。ということは、受信に切り替えないとデータを受信出来ません。
特に理由がないのなら、送信が終わったらwaitなどしていないでさっさと受信に切り替えたほうがよろしいのでは。

全く受信出来ないのではなく期待するデータ数からいくつか欠けるだけ、とかであればその可能性が高いと思います。

投稿2019/05/10 15:54

thkana

総合スコア7610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2019/05/14 12:04

あと、今日気がついたのだけれど、mbedの標準のSerialって割り込み使ってないみたいだから、データを取りこぼさないようにするにはそれなりに注意しないといけないかも。
guest

0

コードの内容はあんまし見てませんが、、

こういう場合、も一つモニタ用のシリアルポートを用意し、送信メッセージ送信時にそのデータを文字列にしてそのモニタ用ポートにそのまま送信してしまい、それをPCのターミナルソフトで読めるようにしておきます
そうすれば、送信メッセージが想定している正しいフォーマットになっているかがチェックできます

また、このあと、モータからのレスポンスメッセージも、このモニタ用ポートに文字列変換して出すようにしておけば、いろいろデバッグできます。

バイナリの通信というのはいろいろ想定外のスカが多く出やすいので、こういう方法でメッセージをモニタできるようにしておくと、後々のトラブルも対処しやすくなります

投稿2019/05/09 11:01

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問