OrangePi-PCを使ってみる

Debian Jessieでサーボモータを動かす

2017年3月に、ようやくDebian Jessie(H3/H2+)に対応したハードウェアPWMドライ バーが公開されました。
そこで、このドライバーを使ってサーボモータ(SG90)の制御ができましたので紹介します。
まず、こちらの ページに従ってハードウェアPWMドライバーをインストールします。
これ以降、デバッグポートは使えなくなります。
デバッグポートにTTL-USB変換を繋げているとブート時にkernelがハングします。

OrangePiのハードウェアPWMはオンボードUARTの真ん中(PA5)しかありません。
そこで、サーボモータのSignalピン(オレンジ)はオンボードUARTの真ん中(PA5)に接続します。
今回はサーボモータとしてSG90を使いました。
サーボモータ(SG90) OrangePi-PC
オレンジ
PA5

5V
茶色
GND

SG90のデータ シートによると、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 PWM clock: 200Khz, PWM single "cycle": 5us
cat /sys/class/pwm-sunxi-opi0/pwm0/prescale
echo 0 > /sys/class/pwm-sunxi-opi0/pwm0/prescale
sleep 1

#set entire_cycle to 20ms
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

サーボモータがジリジリ動きます。



Raspberryではサーボモータを動かすためにpigpio ライブラリがよく使われます。
pigpioライブラリはクライアント・サーバで構成されていて、サーバはバックグラウンドで動きます。
サーバがバックグラウンドで動くので、クライアントは好きな時にサーボモータを動かすことができます。

そこで、ハードウェア PWMドライ バーを使ったサーバプロセスとコマンドラインツールを作りました。
まず、こちらの ページに従ってハードウェアPWMドライバーをインストールします。
次に、以下の手順でコンパイルとサーバ側プロセスを起動します。
$ git clone https://github.com/nopnop2002/pwmlib-opi
$ cd pwmlib-opi
$ cc -o pwmc pwmc.c
$ cc -o pwmd pwmd.c pwm.c -lwiringPi
$ su
$ ./pwmd &
$ exit

クライアント側は以下のコマンドを使います。
pwmc period active
period : サーボモータのPWM Period(mSec)
active : サーボモータのActive Pulse(mSec)

SG90の場合のPWM Periodは20mSec、Active Pulseは以下のようになります。
ポジション Activeなパルス幅
1.45mSec
+90° 2.35mSec
-90° 0.625mSec

以下のスクリプトでSG90が 0°→ -90° → +90° → 0° に動きます。
サーバ側動作が完了するまで、クライアントは待たされるので、コマンドの後のsleepは不要です。
#!/bin/bash
echo "Move to Center"
./pwmc 20.0 1.45
echo "Move to +90"
./pwmc 20.0 2.35
echo "Move to -90"
./pwmc 20.0 0.625
echo "Move to Center"
./pwmc 20.0 1.45

次回はDebian Stretchでサーボモーターを使う方法を紹介します。