9 years, 4 months ago.

サーボモータの制御問題,よかったら教えていただきたい.もう一週間ぐらい全然進んでない><

二つのサーボを動かせたいですけど. 数値の差により,モータ1とモータ2を回転させたい. http://developer.mbed.org/users/changzhe8387/code/temp/ 詳細はこのプログラムの101行から問題が発生した 数値の差をパルス幅に変換し,そのパルス幅をサーボに代入.コード98と99行目のaとbの値はパルス幅に変換した,pwm1とpwm2(サーボ)に代入した.しかし実際にやってみたら,pwm1しか動かない. これは何故だろうか?教えてください.

1 Answer

9 years, 4 months ago.

こんにちは。

Quote:

しかし実際にやってみたら,pwm1しか動かない. これは何故だろうか?教えてください.

動かないとの事ですが、もう少し現象を詳しく教えて頂けないでしょうか? どのような波形が出ることを期待されていて、実際の出力がどうなっているかなど。 printf() で変数の値を出力されているようなので、動かない場合のログを頂けると何か分かるかも知れません。

少し気になったのですが、for ループで実行されるコードは意図されたものでしょうか? for ループのブロックの外側にある wait_ms() 関数の呼び出しは、for ループ内で実行されません。

    while(1){     
        sampleTemp();                        
        float k=getAvgTemp1()-getAvgTemp2();
        float i=getAvgTemp3()-getAvgTemp4();
        pc.printf("Temp1:%f\nTemp2:%f\n",getAvgTemp1(),getAvgTemp2());
        pc.printf("Temp3:%f\nTemp4:%f\n",getAvgTemp3(),getAvgTemp4());
            a = k * 2;
            b = i * 2;
        {
        for(int p = start; p < end; p += a) 
        pwm1.pulsewidth_us(p);
        wait_ms(10);
        }
        {
        for(int q = start; q < end; q += b)
        pwm2.pulsewidth_us(q);
        wait_ms(10);
        }
}

オンラインIDEで、コードを整形すると分かりやすいと思います(HELP アイコンの隣の Format Code)。

for ループ内から wait_ms() 関数呼び出しを行うのであれば、以下のようになると思います。

    while(1){
        sampleTemp();
        float k=getAvgTemp1()-getAvgTemp2();
        float i=getAvgTemp3()-getAvgTemp4();
        pc.printf("Temp1:%f\nTemp2:%f\n",getAvgTemp1(),getAvgTemp2());
        pc.printf("Temp3:%f\nTemp4:%f\n",getAvgTemp3(),getAvgTemp4());
            a = k * 2;
            b = i * 2;
        for(int p = start; p < end; p += a) {
            pwm1.pulsewidth_us(p);
            wait_ms(10);
        }
        for(int q = start; q < end; q += b) {
            pwm2.pulsewidth_us(q);
            wait_ms(10);
        }
    }