4

私はArduinoとこのフォーラムに不慣れで、これはチュートリアル以外の私の最初のArduinoプロジェクトです。

rc トランスミッター/レシーバーと Arudino を使用してサーボを制御しようとしています。サーボを RC 受信機に直接接続する代わりに Arduino を使用している理由は、RC が 1000µs から 2000µs の PWM しか生成できないのに対し、サーボの全範囲の動きを得るには 600µs から 2400µs の PWM が必要だからです。 . 私がやろうとしたことは、pulseIn() から値を読み取り、この値を以下のコードで記述されているように 0 から 180 度にマッピングすることです (これはサーボ ライブラリを使用します)。

しかし、このコードでは、モーターの挙動がおかしくなっています。無線送信機の操縦桿を可動域全体で動かすと、モーターは 0 から 180 度にスイープする代わりに、0 から 45 度に回転し、45 度から 0 度に戻り、0 から 45 度に戻り、再び 0 度に戻ります。誰か助けやアドバイスをお願いできますか?

どうもありがとうございました

#include <Servo.h> 
Servo myservo;

int ch1; 
int ch2;
int ch3;
int degree;

void setup() {
  pinMode(7, INPUT);
  myservo.attach(9);
  Serial.begin(9600); 
}

void loop() {
  ch3 = pulseIn(7, HIGH, 25000);
  degree = ((ch3-1250)* 180)/700;
  Serial.print("Channel 3:");
  Serial.println(ch3);
  myservo.write(degree);
  delay(5);  // waits 5ms for the servo to reach the position 
}
4

2 に答える 2

3

intデータ型をオーバーフローしています。符号付きの値は -32768 ~ +32767 のみです。int ドキュメントを参照

式はすべてintであり、コンパイラは、より大きな中間値が必要であると推測しません。180 倍は赤信号です。(2000-1250)*180 = 135000 = ブーム

数学を理解するには、以下のテスト プログラムに示すように、数式を個々の操作に分解します。それは基本的に、コンパイラがあなたのために行っていることです。

以下のプログラムを実行すると、失敗が表示されます。out 値が 45 に達した直後に、中間値がオーバーフローし、数式が破綻します。

in: 1040 out: 39   t0: -210 t1: 27736 t2: 39  
in: 1048 out: 41   t0: -202 t1: 29176 t2: 41  
in: 1056 out: 43   t0: -194 t1: 30616 t2: 43  
in: 1064 out: 45   t0: -186 t1: 32056 t2: 45  
in: 1072 out: -45   t0: -178 t1: -32040 t2: -45  
in: 1080 out: -43   t0: -170 t1: -30600 t2: -43  

以下のプログラムをテスト フィクスチャとして使用します。unsigned int を使用するようにデータ型を変更すると、必要に応じて出力を動作させることができます。

int ch3;
int degree;

void setup() {
    ch3 = 1000;
    Serial.begin(9600); 
}

void loop() {
    int t0, t1, t2;

    degree = ((ch3-1250)* 180)/700;

    t0 = ch3 - 1250;
    t1 = t0 * 180;
    t2 = t1 / 700;

    Serial.print("in: ");
    Serial.print(ch3);
    Serial.print(" out: ");
    Serial.print(degree);
    Serial.print("   t0: ");
    Serial.print(t0);
    Serial.print(" t1: ");
    Serial.print(t1);
    Serial.print(" t2: ");
    Serial.println(t2);

    ch3 += 8;
    if(ch3 > 2400) {
        ch3 = 1000;
    }

    delay(100);
}
于 2013-02-12T08:12:10.913 に答える
0

注意として、https://robotics.stackexchange.com/で Arduino/servo 運が向上する可能性があります。

シリアル出力には何が表示されますか? ch3 は 0 から 45 または 0 から 180 を循環していますか? map()ここで手動で行っていることを行うように設計されていることを忘れないでください。

私の最初の疑いは、pulseInタイムアウトしているため、またはパルスの途中で読み取りを開始しているため (予想よりも短いパルスにつながる可能性があります)、時々 0 が返されることです。

于 2013-02-12T01:17:14.373 に答える