###サーボモータの目標30度回したいです...
###一瞬動いただけで回らずにモーターがウィーンと音を出しているだけです.
どこか違うのでしょうか.
お願いします...
なし
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答2件
0
ベストアンサー
- ENピンを何故かPWMしているが、シリアルの送受信切り替えのピンなので無意味
- こいつの制御は全部シリアルでコマンド送って行う
- Serial.write()の第二引数が1バイト少ない
つまりちゃんとマニュアル読んで下さい
p.45「6.B3Mサーボモータを動かしてみる」の通りやれば動くと思います。
投稿2017/11/01 00:26
編集2017/11/01 09:25総合スコア13553
ありがとうございます!
あとボーレートの初期値は1500000です
// パケット生成
sendbuf[0] = 0x09; // コマンドの総データバイト数
sendbuf[1] = 0x06; // コマンド(SET POSITION)
sendbuf[2] = 0x00; // オプション
sendbuf[3] = sld; // サーボID
sendbuf[4] = 0x50; // 位置(下位1バイト)
sendbuf[5] = 0x46; // 位置(上位1バイト)
sendbuf[6] = 0xB8; // 時間(下位1バイト)
sendbuf[7] = 0x0B; // 時間(上位1バイト)
// チェックサムの計算
sum = sendbuf[0];
for (int i = 1; i < 8; i++) {
sum += sendbuf[i];
}
sendbuf[8] = lowByte(sum); // チェックサム
// 送信
digitalWrite(txden, HIGH);
Serial.write(sendbuf, 8);
Serial.flush(); //送信が終わるまで待つ
digitalWrite(txden, LOW);
}
void torque_on(int sld) { // トルクON
byte sum;
// パケット生成
sendbuf[0] = 0x07; // コマンドの総データバイト数
sendbuf[1] = 0x86; // コマンド(WRITE)
sendbuf[2] = 0x00; // オプション
sendbuf[3] = sld; // サーボID
sendbuf[4] = 0x00; // データ(ノーマル位置制御モード)
sendbuf[5] = 0x28; // アドレス(SERVO_TORQUE_ON)
sendbuf[6] = 0x01; // デバイスの数
// チェックサムの計算
sum = sendbuf[0];
for (int i = 1; i < 7; i++) {
sum += sendbuf[i];
}
sendbuf[7] = lowByte(sum); // チェックサム
// 送信
digitalWrite(txden, HIGH);
Serial.write(sendbuf, 8);
Serial.flush(); //送信が終わるまで待つ
digitalWrite(txden, LOW);
}
変更したのですがロックがかかってしまったままです…
コメント欄だと見づらいので質問文を編集して追記してください
set positionコマンドの方コマンド9バイトあるのに8バイトしか送ってませんよ。
追記しました!
0
一般的にサーボは位置制御なので、どの位置にどれくらいの時間で移動するかということになります。
示されているソースコードでは、おそらくsMove()がその設定をする関数だと思うのですが、loop()の中では一切呼び出されていません。
一瞬動いただけで回らずにモーターがウィーンと音を出しているだけ
これは、サーボモータに電源が入ってサーボロックがかかった状態と思います。
その状態から位置指令を出さないとサーボモータは動きません。
それが、sMove()の関数だと思うのですが。
投稿2017/10/31 08:37
総合スコア3581
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。