LinuxCNCでラジコンサーボを動かす
linuxCNCにはPWMジェネレータが入っているので,その勉強にもなるラジコンサーボコントロールをしてみましょう.
なんというか,基本,LinuxCNC documentation wikiの「RC servo test」設定のままです.
日本語でコメント入れた設定セットをzipでまとめてあります.
PWM機能は使い道はいろいろあるとは思います.
○ラジコンサーボとは
基礎知識として,ラジコン用のステアリング,ラダー,ロボット脚などに使われているラジコンサーボには,
大きく分けると2つあります:PWM方式と,最近出てきたシリアル通信方式です.
ここではPWM方式を取り扱います.
このラジコンサーボには3つの配線,電源とGND,それから信号入力があります.
つまり,信号を受け取ったあとは,サーボモータの中のこびとさん制御回路が処理しています.
入力される信号はメーカによりわずかに異なりますが,おおむね,
「ニュートラルを1.5ms幅とし,±0.7〜0.8msの幅の変動をもたせた信号を,10ms〜20ms毎に受け取る」
ことになっているようです.
幅の変動,というのは要するにPWMのデューティ変化ですので,
linuxcncでもマイコンでもPWMが出来ればそれなりに作れます.
ただ,パルスタイミングが合わないと振動の原因になるそうなので,
パルスの送信間隔揺れが小さい機材が望ましいです.
受け取ったパルスをモータが角度指令として解釈し,
モータの軸の角度を検出するポテンショメータ(直線性の良い可変抵抗器)や
デジタルエンコーダの示す角度と比較し,指令と一致するまで駆動させます.
この「比較し,駆動する」部分をどのように処理するかで「アナログサーボ」「デジタルサーボ」と名前がわかれます.
中の回路の違いなので根本的な違いはあまりないです.
・動作デモ Youtubeサイトからはコチラ
○動作手順
以下に示す
・servotest.halメインの設定
・servotest.xml ユーザインタフェース設定.スライドバーを作る
・autosave.halscope 波形確認用のソフトウェアオシロの設定
の3ファイルを,
「/home/my_user_name/linuxcnc/configs/」に作ったRCservotestにフォルダに入れ,
linuxの端末をひらき,
「 cd ~/linuxcnc/configs/RCservotest/」でカレントディレクトリを変更した上で,
「 halrun -I servotest.hal 」と入力する.
以下,設定ファイル(最下部にzipでまとめたものがある)
・servotest.hal メインの設定
##### RC Servo Test Configuration - servotest.hal #####
loadrt threads name1=fast-thread period1=10000 name2=slow-thread period2=1000000 # fast-thread period of
## 10000 gives 1 degree per period, or 1 degree resolution, but many PC's may
## crash with this setting. 20000 gives 2 degrees per fast-thread period, or 2 degree resolution.
## "fast-thread period"を「10000」にすると1度/タイミング、1度刻みの分解能が得られるが、多くのPCではリアルタイム動作が追いつかない
## 20000だと2度/タイミングの分解能になる
## パラレルポート呼び出し アドレスまたはparport No.で指定
loadrt hal_parport cfg="0x0378" # 必要に応じて変更する.parport番号でも可
loadrt pwmgen output_type=0
## 〜〜タイプのPWMをロード.タイプはPWMGENの解説に書いてある
## http://linuxcnc.org/docs/html/man/man9/pwmgen.9.html
#loadusr -Wn mypanel pyvcp -g 250x500+800+0 -c mypanel mypanel.xml # Sample from doc's
loadusr -Wn servopyvcp pyvcp -g 700x80+50+50 -c servopyvcp servotest.xml
## サーボ操作用スライドバーのウィンドウ呼び出し
## FUNCTIONS #########################################
addf parport.0.read fast-thread
addf pwmgen.update slow-thread
addf pwmgen.make-pulses fast-thread
addf parport.0.write fast-thread
## パルス生成をfast-thread periodで、PWM値変更をslow-thread periodで
## ということは,slow-thread period毎にしか角度指令できないということだが,
## 元からラジコンサーボは約1msごとの司令を受け取るようにできているのでがんばっても概ねこの程度でしか動かせない.
## CONNECTIONS #######################################
## pwmgen の設定.値は小数点ありで. x.xx * 10 [ms] の意味を表す.てことは0.1ms刻みで調整可という事.
setp pwmgen.0.min-dc 0.06
##float rw, -90 degrees at .6 ms (center - .9ms),
## tries to keep the servo output shaft off of the hardware limit stop
## PWM幅最小値の指示。サーボモータは機械的な限界を超えても動こうとするので,この値で制限する.
## ニュートラルの値から9ms短い値,6msのパルス幅としている
## サーボモータのメーカや品種によって値が異なるかもしれないので,可能なら調べる.
## 無負荷で動作させてモータ動作音がし続けるようならより大きく調整の必要がある .
setp pwmgen.0.max-dc 0.24
##float rw, 90 degrees at 2.4 ms, (center + .9ms),
## tries to keep the servo output shaft off of the hardware limit stop
## PWM幅最大値の指示。この値でサーボモータが機械的な限界を超えて動作しないように制限する.
## ニュートラルの値から9ms長い値.2.4msのパルス幅になる.
## サーボモータのメーカや品種によって値が異なるかもしれない.
## 無負荷で動作させてモータ動作音がし続けるようならより小さく調整する必要がある.
#setp pwmgen.0.offset 0.15 #float rw, center position at 1.5ms
setp pwmgen.0.offset 0.153 #float rw, center position at 1.53ms, this line is
## tweaked but servo should be adjusted to center on 1.5ms
## サーボのニュートラル位置設定.だいたい1.5msだが
## メーカにより微妙に異なるので確認すること
#setp pwmgen.0.scale 1000.00 #float rw
setp pwmgen.0.scale 1120.00 #float rw, tweaked a little for a particular servo
setp pwmgen.0.pwm-freq 100.00 #float rw, frequency can be changed as needed,
## but affects other parameters
## PWM周波数.変更可だが、他の設定もそれに合わせ変更の必要がある
setp pwmgen.0.enable TRUE # could be connected to a pyVCP button
net PWMcmd servopyvcp.anaout-f pwmgen.0.value #float
## PWMのアナログ換算値
net PWMout pwmgen.0.pwm parport.0.pin-16-out #bit
## サーボ信号出力ポート設定
#########################################
# start real-time threads
start
# start HALscope
loadusr halscope
・servotest.xml ユーザインタフェース設定.スライドバーを作る
<!-- servotest.xml -->
<pyvcp>
<vbox>
<scale>
<font>("Helvetica",14)</font><width>"40"</width><halpin>"anaout"</halpin>
<resolution>0.1</resolution><orient>HORIZONTAL</orient>
<initval>0</initval><min_>-90</min_><max_>90</max_>
</scale>
<!-- Commented out because scale works better
<dial>
<size>200</size><cpr>100</cpr><min_>-90</min_><max_>90</max_><text>"Dial"</text>
<initval>0</initval><resolution>0.1</resolution><halpin>"anaout"</halpin>
<dialcolor>"yellow"</dialcolor><edgecolor>"green"</edgecolor><dotcolor>"black"</dotcolor>
</dial> -->
</vbox>
</pyvcp>
・autosave.halscope 波形確認用のソフトウェアオシロの設定
THREAD fast-thread
MAXCHAN 2
HMULT 1
HZOOM 2
HPOS 4.157303e-01
CHAN 1
PIN parport.0.pin-16-out
VSCALE -1
VPOS 0.300971
VOFF 0.000000e+00
CHAN 2
TSOURCE 1
TLEVEL 0.500000
TPOS 0.500000
TPOLAR 1
TMODE 0
RMODE 1