表示ができたら,次は駆動だ.
サーボモータの制御
サーボモータとは
サーボモータとは,ミニ四駆で使われているような,電源を入れたら回りっぱなしのモータに角度を制御するユニットが付属していて,外部からの信号を入力して回転角度を任意に設定できるモータのことです.出力できる角度や角速度,トルクなどは,それぞれのモータによって異なります.
古典的なラジコンサーボモータは,回転角度をアナログな電圧で入力していたのですが,近年は,PWM(Pulse Width Modulation)信号と言う,周期的なパルス信号で入力する方式が一般的です.さらに最近は,角度をUARTやSPIで入力できるサーボモータも増えてきたのですが,今回は,一番対応しているサーボモータの種類が多い,PWMを使用する方式でやってみます.
ラジコンサーボモータの制御信号
ラジコンサーボモータに角度を入力する信号は,厳密に規格が決まっているわけではないため,実はメーカーごとに違います.今回は,50[Hz]で1.5±0.5[ms]で制御するサーボモータを対象にします.
このラジコンサーボモータは,1.5[ms]の間 H ,18.5[ms]の間 L の信号を連続して受け取ったときに,可動角のちょうど中心の角度を保持します.1.0[ms]と2.0[ms]の信号を受け取ったときは,可動角の限界の角度を保持します.
回路
ラジコンサーボモータをEdisonから制御するときに,一番問題となるのが,信号の電圧レベルです.だいたいのラジコンサーボモータは,3.3[V]程度の電圧レベルでも十分,H信号とL信号を見分けてくれるのですが,Edisonの標準信号電圧レベルの1.8[V]だと,さすがにキツい.
そこで,電圧レベル変換ICを使用して,電圧レベルを変換します.
74VHC125というレベル変換ICを利用します.このICは,1.5[V]の入力レベルでHと判断し,後段に変換後の電圧を出力します.上の図のように,125の2番ピンにEdisonからの信号(J18-7)を接続し,3番ピンをサーボモータの入力ピンに接続してください.1番ピンは,このICのEnable端子なので,GND(J19-3)につないでください,また,125に電源を供給するため,14番ピンには3.3[V](J20-2)を,7番ピンにはGND(J19-3)をつないでください.
プログラム
#include <stdio.h>
#include <mraa.h>
int main(int argc, char *argv[])
{
mraa_init();
mraa_pwm_context pwm;
pwm = mraa_pwm_init(20);
mraa_pwm_period_us(pwm, 20*1000); // 20[ms]
mraa_pwm_enable(pwm, 1);
int i;
const int STEP = 20;
for(i=0;i<STEP;i++){
mraa_pwm_write(pwm, 1.0/15.0+1.0/15.0/STEP*i);
usleep(200*1000); // 0.2[s]
float out = mraa_pwm_read(pwm);
fprintf(stdout, "PWM0 : %f\n", out);
}
mraa_pwm_enable(pwm, 0);
mraa_deinit();
return ret;
}
実験結果
まとめ
- ラジコンサーボモータはPWM信号でコントロールできる.
- Edisonからサーボモータに信号を伝えるには,途中で電圧のレベル変換をする必要がある.
- EdisonからのPWMは,MRAAライブラリから簡単にできる.