demo

プロポ信号から PWM 制御

前回まではプロポからの信号を Arduino を使って読み取ることまでは行いましたが、 今回はその信号をもとにモータードライバを使って DC モーターの PWM 制御を行いました。

PWM の出力にあたっては以下のサイトを参照しました。 ありがとうございます。

https://monoist.atmarkit.co.jp/mn/articles/1401/07/news003_2.html

コード

今回書いたコードは以下のとおり

/*
controlDCmotorPWM.ino
2014.05.29
Control DC motor with PWM using propotional system and Arduino
ver1.00
Haru
*/


//set pin num
//--------------------------------------------
// input
const int rcv = 4; // up/down

// output
const int outPin1_1 = 3;
const int outPin1_2 = 5;
//--------------------------------------------

// init
//--------------------------------------------
int pulseNum = 0;
int speedVal = 0;
//--------------------------------------------


void setup(){

    //setup pin mode
    //--------------------------------------------
    pinMode(rcv, INPUT);

    pinMode(outPin1_1, OUTPUT); // outPin1: DC motor
    pinMode(outPin1_2, OUTPUT);
    //--------------------------------------------

    // test pulse
    Serial.begin(9600);
}


void loop(){

    pulseNum = pulseIn(rcv, HIGH); //recieve pulse
    int speedVal = map(pulseNum, 2000, 1000, -255, 255);
    // convert pulseNum(1100~1900) to speedVal(-255~255
    speedVal = constrain(speedVal, -255, 255); // constrain speedVal

    //control
    //--------------------------------------------
    if( speedVal > 20){
        analogWrite(outPin1_1, speedVal);
        digitalWrite(outPin1_2, LOW);
    }

    else if( speedVal < -20){
        digitalWrite(outPin1_1, LOW);
        analogWrite(outPin1_2, -speedVal);
    } else {
        digitalWrite(outPin1_1, LOW);
        digitalWrite(outPin1_2, LOW);
    }
    //--------------------------------------------


    // sirial monitor
    Serial.print("pulseNum: ");
    Serial.print(pulseNum);

    Serial.print(" | speedVal: ");
    Serial.println(speedVal);
}

処理の流れを簡単に説明すると

プロポから受け取った 1100~1900 までの信号を PWM 出力できる-255~255 に map 関数を使って変換。

※ただし、プロポからの信号に若干の誤差が含まれるためまれに-255~255 の範囲を超えた出力をしてしまう時があり、そうなると DC モーターにかかる電圧が急激に変動したりするので constrain 関数を使い最小値と最大値がそれぞれ範囲内に収まるように調節します。

あとは出力に設定したピンで analogwrite 関数を使い PWM 出力をしてあげればプロポのレバーの強弱に合わせて DC モーターの強弱も強弱します。

※ここでも、PWM が負の値の時に if 文の中身でマイナスを付けて打ち消さないと動作不良の原因になるので注意してください。

今回の作業でだいぶ飛行船の制御に近づいたように感じます。 ただモーターが回るだけでもプロポから操作するだけで結構楽しいです(笑)

実際の動作

最後に実際に動かしている動画を載せておきます。

Reference