OrangePi-PCを使ってみる

ハードウェアPWMでサーボモータを動かす その1

2017年3月に、ようやくOrangePi(H3/H2+)に対応したハードウェアPWMドライ バーが公開されました。
そこで、このドライバーを使ってサーボモータ(SG90)の制御ができましたので紹介します。
まず、こちらの ページに従ってハードウェアPWMドライバーをインストールします。

サーボモータのPWMピン(オレンジ)はオンボードUARTの真ん中(PA5)に接続します。
サーボモータのデータ シートによると、SG90はPWM Periodが20mSecとなっています。
ドライバーの仕様には
PRESCALE_DIV120  = 0x00, // Divide 24mhz clock by 120 => PWM clock: 200Khz, PWM single "cycle": 5us
と書かれています。

つまり、PRESCALE_DIV120  = 0x00を使って、全体の周期を20mSecにするためには
20mSec / 5μSec = 4000
となり、これがドライバーのentire_cyclesとなります。

また、こちらのページにポジションごと のパルス幅が紹介されています。
例えばポジション=0°の時のパルス幅は1.45mSecなので
1.45mSec/5μSec = 290
となり、これがポジション0度の時のactive_cyclesとなります。

計算値を使って、実際に動作させましたが、少し誤差があるようなので、動きを見ながら微調整しました。
ポジション Activeなパルス幅 active_cycleの値(計算値) active_cycleの値(実測値) 実測値から逆算したActiveなパルス幅
1.45mSec 290 290 1.45mSec
+90° 2.4mSec 480 470 2.35mSec
-90° 0.5mSec 100 125 0.625mSec

これらを反映したのが以下のスクリプトとなります。
このスクリプトでSG90が 0°→ -90° → +90° → 0° に動きます。
#!/bin/bash
#enable pwm
echo 1 > /sys/class/pwm-sunxi-opi0/pwm0/run
sleep 1

#set prescale to 200KHz
cat /sys/class/pwm-sunxi-opi0/pwm0/prescale
echo 0 > /sys/class/pwm-sunxi-opi0/pwm0/prescale
sleep 1

#set entirecycle to 4000
cat /sys/class/pwm-sunxi-opi0/pwm0/entirecycles
echo 4000 > /sys/class/pwm-sunxi-opi0/pwm0/entirecycles
sleep 1

#Move to Center
#cat /sys/class/pwm-sunxi-opi0/pwm0/activecycles
echo 290 > /sys/class/pwm-sunxi-opi0/pwm0/activecycles
sleep 1

#Move to Angle -90
echo 125 > /sys/class/pwm-sunxi-opi0/pwm0/activecycles
sleep 1

#Move to Angle +90
echo 470 > /sys/class/pwm-sunxi-opi0/pwm0/activecycles
sleep 1

#Move to Center
echo 290 > /sys/class/pwm-sunxi-opi0/pwm0/activecycles
sleep 1

#disable pwm
echo 0 > /sys/class/pwm-sunxi-opi0/pwm0/run



C言語のPWM関数を作りました。
ソースはこちらで公開してい ます。

git clone https://github.com/nopnop2002/pwmlib-opi
cd pwmlib-opi
cc -o pwmt pwmt.c pwm.c -lwiringPi
sudo ./pwmt

サーボモータがジリジリ動きます。
次回はコマンドラインからサーボモーターを使う方法を紹介します。