web-dev-qa-db-ja.com

配線Piを備えたハードウェアPWMを使用してRaspberryPiでサーボを制御する

WireingPiライブラリを使用してsoftPwmでサーボを制御してみましたが、サーボがスタッターになりました。したがって、wiringPiライブラリでRaspberry Pi(GPIO18)のハードウェアPWMピンを使用したいと思います。しかし、周波数を50 Hzに設定し、デューティサイクルを変更してパルス幅を0.8ミリ秒から2.5ミリ秒の範囲にする方法がわかりません。

私はインターネット上で次の関係を見つけました(それが正しいかどうかはわかりません):

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.

クロック除数の最大値は約4000で、Raspberry PiPWMクロックの基本周波数は19.2MHzです。だからこれは私に〜4,8KHzを与えます。

私はすでにこれらの設定を取得しており、次の関係を使用して約50Hzが得られるはずです。

//put PWM in mark-space mode, which will give you 
//the traditional (and easily predictable) PWM    
pwmSetMode(PWM_MODE_MS);
//setting ping GPIO 18 as a pwm output
pinMode(18,PWM_OUTPUT);
//Set clock divisor to 4000
pwmSetClock(4000);
pwmSetRange (10) ;

出力信号をテストして、どの設定が何を変更するかを確認するためのオシロスコープがありません。これはそれを自分で見つけるのを難しくします。

簡単に言うと、Raspberry PiのハードウェアPWMを使用してサーボを制御するために、パルス幅が0.8msから2.1msのデューティサイクルを実現する方法を教えてもらえますか。

9
user2543697

代わりにRPIOを使用するのはどうですか?ライブラリへのリンクは次のとおりです。 http://pythonhosted.org/RPIO/index.html

PWMの例を次に示します。 http://pythonhosted.org/RPIO/pwm_py.html また、Cソースを直接使用することもできます: https://github.com/metachris/RPIO/tree/master/source/c_pwm

2
gat

私はPiとServoの完全な初心者です。しかし、wiringPiで動作するようになりました。

ここ 長さ1msから2msのパルスを20msごとに作成しようとしていると書かれています。この19.2Mhzベースクロックが実際に正しいと仮定すると、pwmクロックを400に設定し、pwm範囲を1000に設定すると、48Hzまたは20.8ミリ秒ごとにパルスが発生するはずです。次に、pwm値を48に設定すると、1msの長さのパルスが得られ、pwm値を96に設定すると、2msの長さのパルスが得られます。ただし、チップをpwm-msモードに設定する必要があります。 (私もosciolloscopeを持っていないので、ここにはたくさんのはずがあります)

だからそれを設定するには:

  • gpioモード1pwm
  • gpio pwm-ms
  • gpio pwmc 400
  • gpio pwmr 1000

そして、あなたはサーボを左から右に回すことができます

  • gpio pwm 1 48
  • gpio pwm 1 96

(実際、私が28から118まで動作させたサーボ;サーボである可能性があります)(セットアップシーケンスは重要であるようです;バグである可能性があります)

8
Koen
if (wiringPiSetup () == -1) //using wPi pin numbering
 exit (1) ;

pinMode(1, PWM_OUTPUT);
pwmSetMode(PWM_MODE_MS); 
pwmSetClock(384); //clock at 50kHz (20us tick)
pwmSetRange(1000); //range at 1000 ticks (20ms)
pwmWrite(1, 75);  //theretically 50 (1ms) to 100 (2ms) on my servo 30-130 works ok
return 0 ;

正しいgpioピンを使用していることを確認してください!

モデルAおよびBには、ピン18 BCM(1 wPi)に1つのハードウェアPWMがあります。

モデルA +およびB +は、ピン13および19 BCM(23、24 wPi)で2番目のハードウェアpwmを出力できます。

5
user1606576

私はwiringPiにソフトウェアのビットバンギングを介してそれを行わせました。 RPIOを試したかもしれませんが、特定のアプリケーションではオーディオ出力が機能する必要があり、RPIOのDMAによってオーディオが消えることを理解しています。wireingPiのsoftPwmやsoftServoも試したかもしれませんが、私もDCモーターをPWMで実行する必要があり、サーボのためだけにシステム全体を50Hzに下げたくありません。

このプログラムはデモンストレーションとして機能し、ジッターがなく(位置決めパルスを継続的に駆動しないため)、目に見えて区別できないエラーで毎回ターゲットに到達します。確かに、Piは、プログラムのタイミングを妨げるために、その時点で他に多くのことをしていません(SSH、gedit、ターミナルセッション、top内のすべてなどを介してXサーバーを実行することを除く)。

// Servo trial 11/15/14 by SLC

#include <wiringPi.h>

#include <stdio.h>
#include <unistd.h>

int main()
{
    wiringPiSetup();
    pinMode( 6, OUTPUT );
    digitalWrite( 6,  HIGH );

    int idx = 0, tries = 0;
    while ( tries++ < 30 )
    {
        int i;
        const int period[] = { 500, 1500, 2500 };

        printf( "Setting period to %i ms\n", period[idx] );
        for ( i = 0; i < 20; ++i )
        {
            // Output going through an inverter (to convert 3.3V to 5V)
            digitalWrite( 6, LOW );
            usleep( period[idx] );
            digitalWrite( 6,  HIGH );
            usleep( 20 * 1000 );
        }
        ++idx;
        idx %= 3;

        sleep( 2 );
    }
}

私のサーボはRadioShack Micro Servoで、他の「マイクロ」サーボと同じように見えます。また、インバーターを捨てて、3.3VGPIOを使用して信号を駆動できることもわかりました。

0
Scott