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のデューティサイクルを実現する方法を教えてもらえますか。
代わりに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
私はPiとServoの完全な初心者です。しかし、wiringPiで動作するようになりました。
ここ 長さ1msから2msのパルスを20msごとに作成しようとしていると書かれています。この19.2Mhzベースクロックが実際に正しいと仮定すると、pwmクロックを400に設定し、pwm範囲を1000に設定すると、48Hzまたは20.8ミリ秒ごとにパルスが発生するはずです。次に、pwm値を48に設定すると、1msの長さのパルスが得られ、pwm値を96に設定すると、2msの長さのパルスが得られます。ただし、チップをpwm-msモードに設定する必要があります。 (私もosciolloscopeを持っていないので、ここにはたくさんのはずがあります)
だからそれを設定するには:
そして、あなたはサーボを左から右に回すことができます
(実際、私が28から118まで動作させたサーボ;サーボである可能性があります)(セットアップシーケンスは重要であるようです;バグである可能性があります)
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を出力できます。
私は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を使用して信号を駆動できることもわかりました。