PIC 36:SERVOモータ@


SERVOモータのコントロール

[コントロール基板]  以前からロボット用に使われている「Servoを使いたい」と思い購入しましたが、なかなか使うチャンスがありませんでした。この正月休みを利用して暖めていた物を試しに使ってみる事にしました。

 SERVOは一般のモータと異なり、一方方向に回転する物ではなく「ある位置からスタートして、また戻る」を繰り返します。こんな感じで使うもので、使い方は普通のモータと異なります。

 小形なアンテナを回転させるのに使おうと思ったのですが、うっかり半回転の物を買って来たので結局使えず(この製品が多い)、しばらくお蔵入りになっていたものです。
 1回転の物(360deg)を少し前に購入したので、この機会に改めて動かす実験をして見ました。

 写真はVer2のVRを付けたものです。

作動の基本

 SERVOモータは結構値段が高く、ロボットのような複数使う物では全体でかなりの値段になってしまうので、私としてはあまり複雑な物はやらない事にしています。
 SERVOに付いて特徴を並べてみると次のようになります(思いつくままなのでまとまりが無い!)。
 部品としてのSERVOなので、買っても秋葉原では説明文など付いてない。どこかの説明文を読まないと回転さえ出来ないのが現状です。

 1.信号
 ラジコンのプロポーでは1mSecから2mSecのパルスをコントロール信号としてSERVOに加え、回転させている。
 SERVOはこのパルス幅と同じ角度の位置になるまで、モータを回転させている。

 2.回転
 回転は180度、360度、複数回るものがカタログ上に見える。ただし1回転以上の物はあまり売っていない。ほとんど半回転(Max180度)の物です。

 3.チャンネル
 市販の製品では20mSecのスパンで9チャンネル分のパルスを連続して送り、受ける方はそれを各SERVOにパルスを送って回転させています。

 4.記憶
 秋月電子で購入して来たGWSの1回転SERVOは、止まるまでパルスを連続で与えないと止まってしまいました。これは、ある意味では便利ですが「パルス幅を記憶してない」のでコントロールが面倒になります。
 回転角180度の別メーカの品は「パルス幅を記憶」しているので、ボタンを押して1回信号(パルス)を送れば必要な角度まで回って止まります。その間ボタンから離れても実行されます。

 5.スピード
 速さはSERVOによって大きく変わります、秋月電子GWS1回転の物は約2秒かかります。180度の物はかなり早く回り、もっとゆっくり回って欲しいですがスピードコントロールは出来ません。SERVOの種類によって決まります。

 6.電源
 4.8Vか6.0Vの物が多く売られています。ニッカド電池やニッケル水素電池(NI-MH)で動く物です。IC電源の5Vが来ている場合はそれが使えます。

 7.電流
 想定外なのは電流です。モータが回転を始めるまでたくさん電流が流れ0.5Aのレギュレータを使った場合、電流の制限によって電圧が保てない場合がありました(回転に息をするような症状が出る)。
 電池の場合は十分ですが、レギュレータを使った物は1Aの物が必要です。
 モータは一度回転を始めるとその後電流はあまり流れません。またスタンバイ(同じ角度を維持)状態では極めて少ない電流になります。

 8.内部の構造
 減速ギヤにプラスチックを使ったものとメタルギヤの2種類の物が売られています。当然メタルギヤの方が耐久力はありますが気持ち重くなります、そして値段も上がります。
 軽さを考え、プラスチックの利用も考えられます。
 また、内部の軸受けにベアリングの入った丈夫なものなどがあります。

 9.動力の伝達
 SERVOの回転を外部に伝える物として、回転板や十字型をした物など色々な物が市販されています、付属してなければ購入時には忘れずにチエックしましよう。

 10.本体取り付けの金具など
 取り付け板、回転版を固定するネジなど小物が結構必要です。本体の取り付けはネジ止めですが、この辺は現物に合わせれば問題ありません。購入時に注意します。

 11.コントロール線
 SERVOの線は3本です。

[A]コントロールでパルス信号を受け取ります。ICの端子とは(ショートしても壊れないように)500Ω-4.7KΩを間に挟んで接続する。
[B]は電源の+です。
[C]は電源の-です。

試しに動かす

 ボタンを付けて適当なパルス(1mSec)を出してSERVOに加えます。これで右か左に動くはずです。ただし、これは一度だけしか動きません。もう一つパルス2mSecを出すスイッチを付け、これを押すと逆に動くことになります。

 念の為1mSec+20mSecの休み、そして1mSec+20・・・これを繰り返しSERVOに加え続ける。
 2つのSWを押すたびに右・左と動くのが分ります。パルスの幅でSERVOの止まる位置が異なります、また種類で止まる角度も変わります。

 手元のGWSの1回転の物は5mSecパルスでは回転が止まらなくなりました(短すぎた)、ストッパーが聞かないようです。7mSecあたりが良かったです、これで360度+60度ぐらい回っています。
 もう一つの物はこれだと120度ぐらいしか回りません、もう少し時間を短くしたいです。この辺は使い方やメーカによって決めます。
 一応、動くことが分りましたのでこれのプログラムを入れておきます。

コントロール

   ICはPIC16F648Aを使い内部発振の4MHz動作です、特に意味はありません。

 スイッチは端子をプルアップしてRA0/RA1に接続しDATAとして読み込んでいます。RA3がコントロール信号で(この後Ver2ではRA2に変更)SERVOに接続しています。
 レギュレータとして5Vの1Aを付け、外部電源を利用して回転の実験をしました。(よく見るとプログラムは無駄があるので後で直します。)

2008/JAN/28

プログラム @ プログラム A
;-------------------------------------------------------
; SERVO Motor control
; Controle Pulse = 20mSec
; 4MHz				BY M.Kikuchi
;2008/1/24
;-------------------------------------------------------
	LIST		P=PIC16F648A
	INCLUDE		"P16F648A.INC"
	__CONFIG	0x3F51
	ERRORLEVEL	-302
;-------------------------------------------------------
TEMP	EQU	20H	;tempolary
ASET	EQU	21H	;Standard=15
S_TIME	EQU	22H	;
CNT1	EQU	23H	;for Timer counter
CNT2	EQU	24H
SERVO	set	3	;SERVO Controle RA3

	ORG	0
;-------------------------------------------------------
BEGIN
	CALL	PORT_INI	;Port Mode set

MAIN				;KEY input check
	comf	PORTA,W		;L active
	movwf	TEMP
	movlw	3
	andwf	TEMP,W		;mask
	btfss	STATUS,Z
	goto	MA2
;ノーマル(Center)
MA1
	bsf	PORTA,SERVO	;SERVO	start
	movlw	d'12'		;0.1x12=12mSec
	movwf	S_TIME		;
MA11
	call	WA_100		;Wait
	decf	S_TIME,F	;or decfsz
	btfss	STATUS,Z
	goto	MA11
	goto	MAEND
;+ ------------------------------------------
MA2
	btfss	TEMP,1
	goto	MA3
	bsf	PORTA,SERVO	;SERVO	start
	movlw	d'20'		;0.1X20=2.0mSec
	movwf	S_TIME		;
MA21
	call	WA_100		;Wait 0.1 mSec
	decf	S_TIME,F
	btfss	STATUS,Z
	goto	MA21
	goto	MAEND
;- ------------------------------------------
MA3
	bsf	PORTA,SERVO	;SERVO	start
	movlw	d'5'		;0.1X5=0.5mSec
	movwf	S_TIME		;
MA31
	call	WA_100		;Wait 0.1 mSec
	decf	S_TIME,F
	btfss	STATUS,Z
	goto	MA31
MAEND
;Wait  -----------------
	bcf	PORTA,SERVO	;SERVO	stop
	movlw	D'20'		;1X20=20mSec
	movwf	S_TIME
MAE2
	call	WA_1M		;
	decf	S_TIME,F
	btfss	STATUS,Z
	goto	MAE2
	goto	MAIN		;End
;-------------------------------------------------------
PORT_INI
	clrf	PORTA
	MOVLW	0x07		;Turn comparators off and
	MOVWF	CMCON		;enable pins for I/O functions
				;For P16F648A
 	BSF	STATUS,RP0	;Bank1
	BCF	STATUS,RP1	;Bank1
	MOVLW	0ffH		;RB0-7=input
	MOVWF	TRISB		;PORTB
	MOVLW	03H		;RA0-1=in(1) / RA2-4=out(0)
	MOVWF	TRISA		;PORTA
	BCF	STATUS,RP0	;Bank0
	RETURN
;-------------------------------------------------------
; Timer subroutine		for 4MHz
; WA_100			:WA_1M
;-------------------------------------------------------
WA_100				;100usec(95usec)
	MOVLW	D'30'		
	MOVWF	CNT1		
T_LP1
	DECFSZ	CNT1,F
	GOTO	T_LP1		;3*30+2-1
	NOP			;+2+2=95
	NOP
	RETURN			;
;-------------------------------------------------------
WA_1M				;1mSec(with call)
	MOVLW	D'248'
	MOVWF	CNT2	
T_LP2
	nop			
	DECFSZ	CNT2,F		;2+4*248-1=993
	GOTO	T_LP2
	NOP
	NOP
	NOP
	RETURN			;=998
;-------------------------------------------------------
	end


[もどる]もどる  [MAIN MENU

inserted by FC2 system