Raspberry Pi でサーボモーターを使う ~ 速度計を作ってみる

先日、サーボモーターを購入しました。以前にRaspberry PiGPSを制御するプログラムを作りましたが、回る角度を指定できるサーボモーターなら速度や高度表示に使えないかと思った次第です。

※当サイトは、Raspberry PiのプログラミングにC/C++を使用しています。

1.サーボモーターの構造

購入したサーボモーターは、「SG90」というポピュラーな製品です。

サーボモーターには、3つの線が出ています。黄色の線はPWMの入力、赤は5V入力、黒(茶)はGNDです。それぞれの線を、Raspberry Piに接続します。PWMは今回、GPIO13を使用します。

※今回はRaspberry Piから5Vを得ていますが、できれば別の電源から取得が望ましいです。

created by Rinker
TOWER PRO
¥440 (2022/01/29 02:30:31時点 Amazon調べ-詳細)

2.角度指定をどうするか

プログラムでは、角度を指定してサーボモーターを動作させます。サーボモーターの仕様から様々な計算をする必要がありますが、今回は簡単に説明します。

まず、PWMの初期化は以下のとおりです。クロックは100にしました。

    pinMode(13, PWM_OUTPUT);
    pwmSetMode(PWM_MODE_MS);
    pwmSetClock(100);
    pwmSetRange(1024);

SG90は180度回転するサーボモーターです。PWMに渡す値は、以下のようになります。

0度:96
180度:461

そして、回る方向が左回りなので、右回りにします。よって以下のような関数を用意しました。180度で180kmまで表示する速度計とするので、角度と速度は一致します。

int GetPWMValue(float speed) {

    speed = (float)180 - speed ;  // 右回りになるように変更

    int retvalue = 0 ;

    retvalue = (int)((float)365 * speed / (float)180 + (float)96) ;

    return retvalue ;
}

そして、GPSの速度を取得する毎にPWM出力します。

 pwmWrite(13, GetPWMValue(スピード)) ;

3.動作結果

速度が0の時です。

速度が90kmの時です。90度よりも回ってしまいました。調べると、個体差があるそうです。調整する必要がありそうです。(計算がおかしい?)

4.レスポンスは良いので実用性はある

SG90を使ってみると、レスポンスはとても良いモーターであることが分かりました。これなら、速度表示も遅延が少なく表示できそうです。しかし、1秒ごとに角度が変わる(GPSを1秒間隔で取得)ので、モーター内部の歯車などの耐久性が心配です。使っているうちに劣化しそうです。

速度計以外の、頻繁に値を更新しない使い方なら有効だと思いました。将来的には、ラジコン飛行機の舵に使おうと考えています。