PIC12F683(8ピン)を使ったステッピングモータドライブ用PCインターフェイス
●概要
PIC(ワンチップマイコン)を利用してパソコンを用いてステッピングモーターを制御できます。
PIC12F683を2個使った非常にシンプルな回路で2個のモータを制御できます(PIC1個で1個のモータを制御できます)。
PICの内部ではRS232Cの通信と,ステップ動作と2つの仕事をこなしています。
パソコンとはRS232C(COMポート)で接続します。
COMポートに対して,コマンドを送ると,それに従ってステップします。
また,コマンド,ステップ数を返信しますので,コマンドが受け付けられたかどうかの確認もできます。
●お送りする部品リスト
部品名 |
型式等 |
数量 |
PIC |
12F683(モータ番号0,1を書き込み済み) |
2個 |
トランジスタアレイ |
TD62083 |
1個 |
SWダイオード |
1N4148(または代用品) |
2個 |
モニタ用LED |
(赤、緑など、形式不明) |
1個 |
抵抗 |
100,510Ω、1kΩ、10〜100kΩ |
各1個 |
コンデンサ |
100uF |
1個 |
D-SUBコネクタ |
メス |
1個 |
PICとトランジスタアレイを組み合わせてテストした後に出荷致します。
(2007年1月18日から変更)
●仕様
・RS-232Cの通信速度は9600bpsです。
・回路をシンプルにするため、クリスタル、セラロックなどは使用せず、PIC内蔵クロックを使用しています。
そのため、使用温度などの条件によっては正常に通信出来なくなる可能性があります。出荷前に室温でテストを行った上出荷いたします。
(内蔵クロックでも19200bpsの通信が可能でした。様々な条件でも安定に動作するように、今回はスピードを落とした9600bpsとします。)
・励磁方式は1−2相励磁です。
・ステップ速度も変更できます(下記の「制御コマンド」参照)。
・制御コマンドに関しては別途記載致します。
・先のコマンド実行(ステップ)中に次のコマンドがあった場合,先のコマンド(所定のステップ数)が終了してから次のコマンドを実行します。
ステップが追いつかずにコマンドが連続的に送られた場合,コマンドを64個PIC内のバッファに蓄えます。バッファ数をオーバーしないようにして下さい。万一オーバーした場合はエラーを返しますので、適切なエラー処理してください。
・PIC内では、コマンドの受信とモータのステップ動作の両方を実行しています。そのため、いったんコマンドを受信したら、ある一定時間コマンドを受け付けできなくなります。コマンドを連続的送りたいときには一定の間隔(正確には分かりませんが、たぶん10msオーダー)で送信する必要があります。
・ハイパーターミナルなどの通信ソフトでも動作確認できますが,コマンド文字列は一度にまとめて送る必要があります。「キー打ち込み」ではなく文字列の「貼り付け」を利用して下さい。
・制御プログラムは添付しません。Visual Basic で作製したソースファイルは下記に公開致します。
●制御コマンドについて(初期のものからバージョンアップしました。旧バージョンの仕様はこちら。)
コマンドの種類は下記の通りです。x,yの所には数字が入ります。
・'CxLyyy' : モータ番号xのモータをyyyステップします。yyyは000〜100の範囲です。(例'C0L020':モータ番号0番のモータを20ステップします。) 000ならステップせず状態の取得に利用します。
・'CxRyyy' : 上記とは反対方向にyyyステップします。yyyは000〜100の範囲です。
・'CxSyyy' : ステップの速さを変更します。yyyは000〜009の範囲です。
000のときが最も遅く1秒あたりおよそ4ステップです。1増えるごとにおよそ2倍となります(早くなればなるほど誤差が大きくなり、コマンド受付もエラーが発生しやすくなると思います)。初期値は003であり1秒あたりおよそ32ステップです。使用するモータにもよりますが000〜005の範囲で使用することをおすすめします。
・'CxSTOP' : バッファに蓄積されたコマンドにかかわらず,強制的にすぐに停止します。(例'C1STOP':モータ番号1番のモータをすぐに停止します。)
コマンドに対する応答として下記の文字列が帰ってきます。
・'OK:Cx????:yyyyy' :コマンドを受け付けたとき。yyyyyは電源を入れてからのステップ位置(+32766〜-32767の範囲で可変長)
・'ER:Cx????:yyyyy' :コマンドを受信はできたが,バッファがいっぱいで処理できない。
・'DN:Cx____:yyyyy' :所定のステップが終了したとき。
・存在しないチャンネル番号を指定した時や通信エラーの場合は何も返しません。
・複数のモータを接続しているときに,コマンド送信の周期によりますが、同時に上記DNメッセージが複数のPICから送られてくることがある場合も考えられます。その場合文字化けして正常に受け取ることができません。
例えば、電源投入後(モータが停止している状態で)
@'C0R050'コマンドを送った場合、
Aすぐに'OK:C0R050:0'が返ってきます(タイミングによっては、最後の'0'が'1'になる場合もあります)。
B50ステップした後(約1.6秒後(50÷32))に'DN:C0____:50'が返ってきます。
●サンプル通信ソフト1(VB6のソースファイル)
あくまで使用例ということでお考えください。
ここにあります。あくまで参考例ということでお考えください。サポートはできません。
●サンプル通信ソフト2(EXCEL マクロ)
ここにあります。あくまで参考例ということでお考えください。サポートはできません。
※COMポート番号は1〜9の範囲でお使いください。USB-シリアル変換ケーブルを使用する際はデバイスマネージャーにて設定を行ってください。
★仕様変更対応の範囲
・仕様変更はありません

テスト回路(見えない裏面に抵抗1本とダイオード2本があります)

ステッピングモータ12個用の回路(落札者のご希望により製作した物です)

ステッピングモータ12個用の回路の裏面

テスト回路の回路図(2007年1月18日から変更)
※補足1 トランジスタアレイとモータの接続は、一例として、X:11,15、Y:12,16、X−:13,17、Y−:14,18 としてください。
※補足2 PICとトランジスタアレイの間にLEDを入れる(4個×2)と、励磁されている相がどれであるか、簡単かつ容易に判別できます。トランジスタアレイ内部に抵抗があるため、電流制限抵抗は不用です。
※補足3 写真1枚目のモータを使用する場合、モータのコネクタの配列は、上から「黄、青、緑、赤、白」の順です。

テスト用ソフト(VB6)の実行画面

データ通信ソフト(VB6)の作成画面
●オークション関係トップページへ(他にもいろいろと出品しています)
●PIC関連の出品物の入札を考えている方に(必ずお読み下さい)
下記がソースファイルです。参考程度ということでご理解ください。
Private Sub Command1_Click(Index As Integer)
'L100ボタンが押された
MSComm1.Output = "C" + CStr(Index) + "L100"
End Sub
Private Sub Command2_Click(Index As Integer)
'L10ボタンが押された
MSComm1.Output = "C" + CStr(Index) + "L010"
End Sub
Private Sub Command3_Click(Index As Integer)
'強制停止ボタンが押された
MSComm1.Output = "C" + CStr(Index) + "STOP"
End Sub
Private Sub Command4_Click(Index As Integer)
'R10ボタンが押された
MSComm1.Output = "C" + CStr(Index) + "R010"
End Sub
Private Sub Command5_Click(Index As Integer)
'R100ボタンが押された
MSComm1.Output = "C" + CStr(Index) + "R100"
End Sub
Private Sub Command6_Click(Index As Integer)
'取得ボタンが押された
MSComm1.Output = "C" + CStr(Index) + "R000" ' L000 でもok
End Sub
Private Sub Command7_Click()
Text1.Text = "" ' クリアします
End Sub
Private Sub Form_Load()
MSComm1.CommPort = 5 ' ご使用のCOMポート番号を指定してください。
MSComm1.Settings = "9600,n,8,1" ' 変更しないでください
MSComm1.PortOpen = True ' ポートの使用開始します
MSComm1.InputLen = 0
Timer1.Interval = 10 ' タイマーを使用開始
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False ' ポートの使用終了
End Sub
Private Sub Timer1_Timer()
' 返信されるメッセージをテキストボックスに入れます
Text1.Text = Text1.Text + MSComm1.Input
End Sub