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

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

ただいまの
回答率

90.76%

  • Arduino

    493questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0-180,180-0度回したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 426

umi2525

score 3

サーボモータの目標30度回したいです...

一瞬動いただけで回らずにモーターがウィーンと音を出しているだけです.

どこか違うのでしょうか.
お願いします...

なし

該当のソースコード

byte sendbuf[9];
int txden = 13; // txden はデジタルピン13

void setup() { 
  Serial.begin(115200);
  pinMode(txden, OUTPUT);
  digitalWrite(txden, LOW);
  torque_on(0); //IDOのトルク ON
}

void loop() {
double theta0 = constrain(target*100, -maxAngle*100, maxAngle*100);
  int theta = (int) theta0;  // 目標角度を整数型に直す
  sMove(90,theta,180);   // パケットの生成及び送信
  delay(1); // 1[ms]待つ
}

void sMove(int sld, int sPos, int sTime) {
  byte sum;

  // パケット生成
  sendbuf[0] = 0x09; // コマンドの総データバイト数
  sendbuf[1] = 0x06; // コマンド(SET POSITION)
  sendbuf[2] = 0x00; // オプション
  sendbuf[3] = sld; // サーボID
  sendbuf[4] = 0x50;
  sendbuf[5] = 0x46;   
 sendbuf[6] = 0xB8;
  sendbuf[7] = 0x0B;

  // チェックサムの計算
  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) {
  byte sum;

  // パケット生成
  sendbuf[0] = 0x08; // コマンドの総データバイト数
  sendbuf[1] = 0x04; // コマンド(WRITE)
  sendbuf[2] = 0x00; // オプション
  sendbuf[3] = sld; // サーボID
  sendbuf[4] = 0xA0;
  sendbuf[5] = 0x0F;

  // チェックサムの計算
  sum = sendbuf[0];
  for (int i = 1; i < 6; i++) {
    sum += sendbuf[i];
  }
  sendbuf[7] = lowByte(sum);  //  チェックサム

  // 送信
  digitalWrite(txden, HIGH);
  Serial.write(sendbuf, 7);
  Serial.flush();   //送信が終わるまで待つ
  digitalWrite(txden, LOW);
}

試したこと

補足情報(言語/FW/ツール等のバージョンなど)

Arduinoです.

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2017/10/31 17:13

    サーボの型番は?

    キャンセル

  • umi2525

    2017/11/01 08:50

    近藤科学のB3Mです、

    キャンセル

  • ozwk

    2017/11/01 09:14

    配線どうなってます?

    キャンセル

  • umi2525

    2017/11/01 09:18

    VCC→5V,GND→GND,D→D1(TX),R→D2(RX),EN→D13です

    キャンセル

回答 2

checkベストアンサー

0

  • ENピンを何故かPWMしているが、シリアルの送受信切り替えのピンなので無意味
  • こいつの制御は全部シリアルでコマンド送って行う
  • Serial.write()の第二引数が1バイト少ない

つまりちゃんとマニュアル読んで下さい
p.45「6.B3Mサーボモータを動かしてみる」の通りやれば動くと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/01 09:37

    ありがとうございます!

    キャンセル

  • 2017/11/01 09:38

    あとボーレートの初期値は1500000です

    キャンセル

  • 2017/11/01 13:04

    // パケット生成
    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);
    }
    変更したのですがロックがかかってしまったままです…

    キャンセル

  • 2017/11/01 13:22 編集

    コメント欄だと見づらいので質問文を編集して追記してください

    set positionコマンドの方コマンド9バイトあるのに8バイトしか送ってませんよ。

    キャンセル

  • 2017/11/02 00:51

    追記しました!

    キャンセル

0

一般的にサーボは位置制御なので、どの位置にどれくらいの時間で移動するかということになります。

示されているソースコードでは、おそらくsMove()がその設定をする関数だと思うのですが、loop()の中では一切呼び出されていません。

一瞬動いただけで回らずにモーターがウィーンと音を出しているだけ

これは、サーボモータに電源が入ってサーボロックがかかった状態と思います。
その状態から位置指令を出さないとサーボモータは動きません。
それが、sMove()の関数だと思うのですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Arduino

    493questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。