注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!

1.3.2 サーボ

前書き

このレッスンでは、サーボを回転させる方法を学ぶ。

部品

../_images/list_1.3.21.png

原理

サーボ

サーボは一般に、ケース、シャフト、ギアシステム、ポテンショメーター、DCモーター、および内蔵式ボードで構成されている。

../_images/image1211.png

これは次のように動作する:マイクロコントローラーはPWM信号をサーボに送信し、サーボの内蔵式ボードは信号ピンを介して信号を受信し、内部のモーターを制御して回転させる。その結果、モーターはギアシステムを駆動し、減速後にシャフトを駆動する。サーボのシャフトとポテンショメーターは接続されている。シャフトが回転する時、ポテンショメーターが駆動されるため、ポテンショメーターは電圧信号を内蔵式ボードに出力する。 その後、ボードは現在の位置に基づいて回転の方向と速度を決めるため、定義された位置で正確に停止してそのまま保持する。

../_images/image1221.png

角度は制御ワイヤに適用されるパルスの持続時間によって決まる。これはパルス幅変調と呼ばれる。 サーボは20ミリ秒ごとに1パルスを期待している。パルスの長さにより、モーターの回転距離が決まる。 たとえば、1.5msパルスは、モーターを90度の位置(ニュートラル位置)に回転させる。

1.5 ms未満のパルスがサーボに送信されると、サーボはある位置まで回転し、出力軸をニュートラル位置から反時計回りにある程度保持する。 パルスが1.5ミリ秒を上回る場合、逆のことが起こる。 有効な位置にサーボを回転させるように命令するパルスの最小幅と最大幅は、各サーボの機能である。 通常、パルスの最小幅は約0.5 msで、最大幅は2.5 msである。

../_images/image1231.jpeg

回路図

../_images/image337.png

実験手順

ステップ1: 回路を作る。

../_images/image125.png

ステップ2: コードのフォルダーに入る。

cd ~/davinci-kit-for-raspberry-pi/c/1.3.2

ステップ3: コードをコンパイルする。

gcc 1.3.2_Servo.c -lwiringPi

ステップ4: EXEファイルを実行する。

sudo ./a.out

プログラムが実行されると、サーボは0度から180度まで回転し、それから180度から0度まで循環的に回転する。

コード

#include <wiringPi.h>
#include <softPwm.h>
#include <stdio.h>

#define ServoPin    1       //define the servo to GPIO1
long Map(long value,long fromLow,long fromHigh,long toLow,long toHigh){
    return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow;
}
void setAngle(int pin, int angle){    //Create a funtion to control the angle of the servo.
    if(angle < 0)
        angle = 0;
    if(angle > 180)
        angle = 180;
    softPwmWrite(pin,Map(angle, 0, 180, 5, 25));
}

int main(void)
{
    int i;
    if(wiringPiSetup() == -1){ //when initialize wiring failed,print message to screen
        printf("setup wiringPi failed !");
        return 1;
    }
    softPwmCreate(ServoPin, 0, 200);       //initialize PMW pin of servo
    while(1){
        for(i=0;i<181;i++){     // Let servo rotate from 0 to 180.                  setAngle(ServoPin,i);
            delay(2);
        }
        delay(1000);
        for(i=181;i>-1;i--){        // Let servo rotate from 180 to 0.              setAngle(ServoPin,i);
            delay(2);
        }
        delay(1000);
    }
    return 0;
}

コードの説明

long Map(long value,long fromLow,long fromHigh,long toLow,long toHigh){
    return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow;
}

次のコードで値をマップする Map() 関数を作成する。

void setAngle(int pin, int angle){    //Create a funtion to control the angle of the servo.
    if(angle < 0)
        angle = 0;
    if(angle > 180)
        angle = 180;
    softPwmWrite(pin,Map(angle, 0, 180, 5, 25));
}

角度をサーボに書き込むために、関数 setAngle() を作成する。

softPwmWrite(pin,Map(angle,0,180,5,25));

この関数はPWMのデューティサイクルを変更できる。

サーボを0〜180°に回転させるために、周期が20msのときにパルス幅を0.5ms〜2.5msの範囲内で変更してください。 関数 softPwmCreate() では、周期が200x100us = 20msに設定されているため、0〜180を5x100us〜25x100usにマッピングする必要がある。

この関数のプロトタイプを以下に示す。

int softPwmCreate(int pin,int initialValue,int pwmRange);

pin: Raspberry PiのGPIOピンはPWMピンとして設定できる。

initialValue: 初期パルス幅は、initialValueに100usを掛けたものである。

pwmRange: PWMの周期は、pwmRangeに100usを掛けたものである。