オリジナルサーボドライバ作製

(2005年 1月 2日 (C) 岡田 紀雄)

どこまでできる(やるか)かわかりませんが、比較的安価に手に入るアナログサーボを MOSFET をはじめ、マイコンチップを搭載して動かしてみようと思います。 俺サーボとかいうのと同じノリです。 バーニング宮田さんはじめ、諸先輩方のウェブを参考にしております。 目新しさの代わりに失敗が目立つと思います。 いろいろとご指摘いただけると幸いです。 (ちょこっとずつ更新していきます)


 まずは、一般的なところから、Hブリッジと制御CPUを合わせた基板を作ってみたいと思います。 作ろうと思ったときに、お手本になるものが欲しいので、まずは、バーニング宮田さんの「FETによるモータドライバの作成」の回路を使わせていただき、CPU には、Renesas R8C/11 R5F21114FP を使うことにしてみました。 全て未経験なものを選んだ方が、面白いと思ったので、これらを選んだ、というところです。

 各パーツを結線するにしても資料がないと結線できないので、資料集めから行いました。

 さて、これらをずらっと並べてみると、こんな感じです。

 左の基板はOAKS8, EIA232C, COMポート用コネクタ を乗せてるだけです。 空きスペースに、FET, コンデンサ、写真にはないですが抵抗を配置予定です。

注) CPU ですが、これを選らんだのは、@小さい、Aチップ単品で手に入る手段がある、BPWM入出力が可能、C12bit A/Dコンバータがある といったところでしょうか。

(2005年1月2日)


いきなり、脱線します。 PIC って C compiler がないなぁって思ってましたが、ここで free な C compiler があることを知りました。 ということで、PIC12F675もオリジナルサーボドライバの CPU として候補に入れておきたいと思います。

注) PIC12F675 ですが、これを選らんだのは、@小さい、Aチップ単品で手に入る手段がある、B16bitタイマがある、C10bit A/Dコンバータがある といったところでしょうか。

開発環境としては、

です。 CC5X は MPLAB IDE 上で動作するため、free で PIC の統合環境を得ることができます。 以下に実例を挙げますが、中身は適当ですので、そのまま使うことは避けてくださいね(全く動作保障できませんので)。

これにより出力された .asm ファイルは c の source が注釈として添付されていて、PIC のアセンブラを勉強するにも役立ちそうです。
この C copiler ですが、フリーで使える PIC は限定が掛かってますが、今回候補にしている PIC12F6xx はサポートされてます。

 1:     ; CC5X Version 3.2A, Copyright (c) B Knudsen Data
2:      ; C compiler for the PICmicro family
3:      ; ************   4. Jan 2005  17:41  *************
4:
5:              processor  12F675
6:              radix  DEC
7:
8:      INDF        EQU   0x00
9:      FSR         EQU   0x04
10:     PORTA       EQU   0x05
11:     TRISA       EQU   0x85
12:     Carry       EQU   0
13:     PD          EQU   3
14:     TO          EQU   4
15:     RP0         EQU   5
16:     a           EQU   0x21
17:     in          EQU   0
18:     out         EQU   1
19:     i           EQU   0x20
20:
21:             GOTO main
22:
23:       ; FILE orgsvdrv.c
24:                             ;/* global variables */
25:                             ;char           a;
26:                             ;bit            b1, b2;
27:                             ;
28:                             ;/* assign names to port pins */
29:                             ;bit            in  @ PORTA.0;
30:                             ;bit            out @ PORTA.1;
31:                             ;
32:                             ;void           sub( void )
33:                             ;{
34:     sub
35:                             ;       char            i;      /* a local variable */
36:                             ;
37:                             ;       /* generate 20 pulses */
38:                             ;       for( i = 0; i < 20; i++ )  {
39:             CLRF  i
40:     m001    MOVLW .20
41:             SUBWF i,W
42:             BTFSC 0x03,Carry
43:             GOTO  m002
44:                             ;               out = 1;
45:             BCF   0x03,RP0
46:             BSF   0x05,out
47:                             ;               nop();
48:             NOP  
49:                             ;               out = 0;
50:             BCF   0x05,out
51:                             ;       }
52:             INCF  i,1
53:             GOTO  m001
54:                             ;}
55:     m002    RETURN
56:                             ;void           main( void )
57:                             ;{

   ・・・ 中略 ・・・

60:             END
61:     ; *** KEY INFO ***
62:
63:     ; 0x0001   12 word(s)  1 % : sub
64:     ; 0x000D   28 word(s)  2 % : main
65:
66:     ; RAM usage: 3 bytes (1 local), 61 bytes free
67:     ; Maximum call level: 1
68:     ; Total of 41 code words (4 %) 

簡単にセットアップのスナップショットを挙げておきます。 添付されている install.txt を読むときに一緒に見ていただけるとわかりやすいと思います。 install.txt にもありますが、注意点としては、「Set Language Tool Location」 Window での Location 設定において、
 @ ダブルクオーテーションでくくる
 A フォルダ(ディレクトリ)の末尾のバックスラッシュ(=¥マーク)は削除する
でした。

(2005年1月4日)


結構、ご無沙汰してしまってます。 がんばって更新をしてみたいと思います。
今、PICを使うか(正確には使えるか)、不安に思っている点がありますので、モータ制御の基本に立ち返って検証?してみたいと思います。
(バイブルとしては、後閑さんここ宮田さんここここです。)

まずは、基本から見直しです。 モータドライバで考えなきゃいけないことって何でしょう?ってことで、思いついた順番につらつらと書いてみます。
Hブリッジに使うトランジスタの種類としては、パワートランジスタか、パワーMOSFETか?です。 パワートランジスタが電流増幅素子に対して、パワーMOSFETは、制御電極(ゲート)に電圧を印加することで ON/OFF を実現できるため、直流駆動電力が小さい素子といえます。 バッテリーで駆動させるロボットですので、電力の小さいパワーMOSFETを使うことにします。
素子が決まったところで、次にHブリッジです。

(ちょっと余談)
お恥ずかしい話しですが、ロボット工作を始めたころ、これがマスターできないと作れない、と思っていました。
RCサーボはPWMを角度信号として入力し制御できるようになっているため、ここの部分を理解しなくてもできてしまいます。
逆に言えば、RCサーボでロボットが作れる、と教えてくださった、諸先輩方には、感謝です。

Hブリッジについては、いろいろなところで書かれてますが、私なりに復習をしてみます。 お気づきの点がありましたら、ご指摘いただけると助かります。

MOSFETの制御電極信号をs1〜s4とします。 そのとき、s1=s4(=sa), s2=s3(=sb) の組み合わせで一方をON, 他方を OFF とすれば、モーターが回転します(以降、sa=ON, sb=OFF を正回転と表記します)。 逆回転させるには、そのON/OFFを逆にすればよい(以降、sa=OFF, sb=ONを逆回転と表記します)、という単純なものですが、気をつけなければいけないことは、貫通電流で、s1=s3=ON もしくは、s2=s4=ON となることで、低抵抗負荷での Vdd->GNDへの電流が流れ、MOSFETは燃えます。 一瞬でも怖いことですので、s1〜s4を全てOFFにしてから次のアクションに移るのが安全なのでしょうね。

このHブリッジでは、s1〜s4 を全て OFF にすることで、モーターに電流が流れませんので、フリー状態になります。 また、s1=s2=OFF, s3=s4=ON とすることで、ブレーキをかけることができるといわれてます。 ロボットの場合、高負荷が掛かった状態でモーターを停止させることが求められてますので、ここでいうブレーキ動作よりも、負荷に対して逆回転をかけて角度動作を止める方がよいと考え、フリー状態、ブレーキ状態は使わないことにします。

とすると、s1 と s2 は常に反対の信号でよいことになります(しかし、貫通電流だけは注意です)。
Low-Side PWM駆動は、3本の信号線でできることになります。 ただし、s1 <- sa, s2 <- not(sa) という回路を作らないとだめですけどね。

今日のところはココまで。

この理屈で正しければ、PIC12F675 でも十分な制御ができるのではないか?と思ってます。 PIC12F675 は信号ピン5本です。 このPWMに3本、ADCに1本、通信に2本。 不安なことは、内臓CLKが4MHzなので制御周期などはこのスピードで満足できるか?です。(PIC端子の配分は、GP0-2 がPWM信号ピン, GP3,5が通信ピン, GP4がADCピンとします)

(2005年2月6日)


久々にこちらを更新します。
PowerMOSFET を使って、作ってみました。

  • 1月2日にあげているMOSFETを6つ使用。
  • 真ん中の8ピンが入力で外2つに分かれてる
    のがモーター出力ピン。

が、いきなり、モクモクと煙が。。。 回路上は間違ってないぞ。 プログラムはちょっと自信がないけど、PWM出力はちゃんとできているのは、オシロで確認済み。 と確認しながら進めて、いざ電源ONをした思ってるんですが、いきなりだったので結構メゲてます。 さてさてどこから手直ししてよいものやらわからずです。 新しいことにチャレンジするのって楽しいけど、メゲると、とことんまで意欲が落ちてしまうものですね。

(2005年4月2日)


掲示板でバーニング宮田さんから激励のコメントをいただきました。 うれしいものです。

煙モクモクでたときの回路図。 宮田さんのところの回路図で入力を4つに変えたかったので、n-MOSFET のゲートを分離させてみた。 その際に、プルダウン抵抗 5.1kΩはつけることにしました。 変に電圧がかかってしまうのを嫌ってのことです。

2SK1132 は 2SJ377, 2SK2231 とは表面からみたときのピンの並びが違うので、配線は注意です(1月2日のところに pdf があるので参照のこと)。

今回は、In-0, In-3 を常に0、In-2 を常に1とし、In-1 を PWM の duty を変える事でモーターを動かそうとしてました。 プログラムとしては、その逆回転ができるように In-2, In-1 を常に0、In-0 を常に1とし、In-3 に PWM というものも作ったのですが、それ以前に、モクモクと出てしまいました。
制御は、手馴れた H8/3664F でまずは作ってます。 以下に、そのソースを載せておきます。 変だな、というところは、是非、コメントください。 > みなさん
(注:公開用ではないので、コメントなしのソースです)
 ← 動作できました。 4/9日記にバグ取り版を挙げておきました。

(2005年4月3日)


掲示板に宮田さんから頂いたコメントで動かすことができました!
バーニングさせてもいけないので、前回のソースは削除させてもらって、新しいものを挙げておきます(今日3回ほどアップデートしました)。

SVDRV.c ・・・ H8/3664F 制御プログラム本体
SVDRV.h ・・・ 上記プログラムのヘッダファイル(ほとんど記載なし)

回転方向を変えたりできてるので、一応は大丈夫だと思ってます。 驚いたのですが、前回、バーニングしたFETですが、ちゃんと動きますね。 試しに付け替えしないでやってみたら、モーターが元気良く動いたのでびっくりです。 汚いソースですが読んでいただければ、やってることはわかっていただけると思います。 PCと繋げて、u : duty 比を大きく(低速回転)、d : duty 比を小さく(高速回転)、U : PWM周波数を大きく、D : PWM周波数を小さく、C : 回転を逆にする です。

私の経験より、ずっと役に立つサイトがありましたので、紹介しておきます。

(2005年4月9日)


モーターが回っただけでやる気が倍増してきました。
モーター関係、Power-MOSFET 関係のネットサーフィンをして、情報収集をしました(普通、調べてから実験かな?)。

  1. 改造しようとしているRCサーボ関連の情報
  2. Power-MOSFET 関連情報
  3. その他、気になる情報を

とすると、コアレスモータで低周波PWMで壊れてしまう、というのはどういうことでしょう?

低周波であろうと、高周波であろうと、印加される最大電圧は同じ。 電流にしても連続的な電流は大小はあれ流れているわけですから、問題となるとはいえないような。。。
最大印加電圧がどこで決まるのか?もメーカーサイトを見て回ったのですが、わかりませんでした。 A17B の場合、4.5V印加時のデータが公開されてましたが、PS-2174FET では近藤科学より6.0V を定格電圧としている、というのもあって、疑問は深まるばかりです。

 文字ばっかりなので、モータ制御系のテストボード(Renesus R5F21114FP)と、宮田さん風ボディ裏de直交軸を作ってみたので写真公開。 ポテンショメータは murata 製のものを使用予定。 PS-2174FET のものでは入らない&裏軸に搭載しづらいので(つまり、裏軸にポテンショをつける方針としてます)。 murata製のものにすることで、360度回転もできちゃったりします(が、その前に脚がもつれる?)

サーボケースは PS-2174FET のものですが、サーボギア部分のケースは金属ブッシュの入ったものに交換(なので、KRS-2350ICS RedVersion っぽく見えてます)。 1つのアッパーケースの耳はカットしてませんが、アルミ加工の際にどうするか決めようと思ってます(軸裏とかの止めるのにあった方が便利かもしれないので)。

(2005年4月10日)


 先週に引き続き、Power-MOSFET で試験をしてみました。 今日のは簡単な実験です。

 トランジスタ技術2005年4月号p.111にあるようにPower-MOSFET のゲート容量は大きいので、それをドライブする部分の工夫は?という観点で実験をしてみました。
結論からですが、2SK2231 を使う場合は、CPU出力をそのままゲートに接続しても波形のナマリは見られずでした。 逆に、中途半端(?)なバイポーラトランジスタによるコンプリメンタリ・エミッタフォロア回路でドライブすると立ち下がりにナマリが発生してしまいました(回路が悪かった?)。訂正:入力信号との比較による遅延評価ではエミッタフォロア回路の方がよかった(4月29日追記)。 次回やるときは、ON抵抗の小さい Power-MOSFET でやってみたいと思います。

パルス立ち上がり
いずれの回路の場合も 0.08usec. と変化なし。
パルス立ち下がり(5.1kΩプルダウン抵抗回路)
0.07usec. と立ち上がりより速かった。
パルス立ち下がり(エミッタフォロア回路)
0.22usec. と左記の3倍時間が掛かっている。
訂正:元信号との比較が重要(4月29日追記)

 あと、「コアレスモーターで壊れてしまう」というのは、どうやら誤った認識みたいですね。 逆に、一般に使われている H-bridge の Pch&Nchを同時にON/OFF するPWMの方がどんなモーターに対しても電流が流れづらく、負荷をかけてしまってるといえますね。 特にロボットのように高負荷状態でモーターに大きなトルクがかかる場合、モーター内の残留エネルギーがモーター内で熱エネルギーに転換されてしまうため、無駄にエネルギーを消費していると言えますね。 ROBO-ONE大会などでサーボが熱くなって冷やす、というのは、まさにモータードライブ方法によるものといえるかもしれません(しかし、効率よく制御しても、やっぱりそれをフルに使ってロボットを動かすということからすると、モーターを冷やすというアクションは必要なのでしょう)。

 バーニング宮田さんとメールで相談させていただいたのですが、Low-Side PWM 方式がモーターに対して一番よい制御方式と言えるでしょう。

 Low-Side PWM 方式で、私がずっと勘違いして解釈していたのは、以下の点でした。 もしかしたら、ここを見ていただいている方にも同じような悩みがある方がいらっしゃるかもしれませんので、メモを残しておきます(素人なので誤記や誤った解釈があるかもしれません。適宜ご指摘いただけると勉強になります)。 Low-Side PWM 方式においては、

というところでしょうか。 特に1つ目のところがわからなくて、どうして、Low-Side PWM 方式でサーボの角度が固定にできるんだ?と悩んでました。 車の場合で言い換えると、上り坂でアクセルを軽く踏んで停止させている状態といえるでしょう(下がらないし上らないし、というのは釣り合っているということですからね)。

(追記:24時5分)

 OAKS8 の FLUSH 書き込みがうまくいかないなぁって思っていたら、UART0 ではなく UART1 での通信でないと駄目なんですね。 FullKit を持ってないのですが、その回路図とか眺めながら作っていたのですが、全然気がつきませんでした。 DEBUG と書いてあるので、普通は使わないと思い込んで、FLUSH に書くというのは普通でないというのが全く関連づきませんでした。 たしかに、FLUSH への書き込みはデバッグだよな、ってわかればあたりまえ。 こんなところで止まってしまっていたので、なかなかCPU が決まりませんでしたが、これで R5F21114FP に決定でしょうか。

(2005年4月16日)


 今日はまじめに R5F21114FP を使ってみるということでHEW4 を パソコンに導入して環境整備など行ってみました。

 日立系 Renesas の MPU (SH, H8) に慣れてしまったので、純粋な Renesas の MPU ( Rxx ) マニュアルは読みづらいこと、読みづらいこと。 慣れると、筆者の気持ちはわかるのですが、マニュアルの完成度は SH系に習って欲しいものです。 補う意味で、ハードウェアマニュアル以外にサンプルプログラムを document にしてるのが web に挙がってることで何とか救われました。

 Renesas 純正の HEW4 を導入して TimerY/Z を使った、プログラマブル波形発生モードと割り込みを何とか習得できました、というところです。 ポイントをメモしておきます。 以下のソースでは、SFR の記載がハードウェアマニュアルとも一致していないのが個人的にわかりづらかったので、作り直したものとなってますので、既存のものでは動かないと思います。

 いきなりですが、メインクロックの外部X'tal による発振許可などではまりました。

1:	void		SET_MAINCLK( void )
2:	{
3:		SFR_PRCR_PRC0	= 1;		// システム制御レジスタプロテクト解除
4:		SFR_CM13		= 1;		// Xin-Xout 端子選択
5:		SFR_CM15		= 1;		// Xin-Xout 駆動能力選択 : HIGH選択
6:		SFR_CM05		= 0;		// メインクロック発信 (Xin-Xout)
7:		SFR_CM16		= 0;		// 分周なし
8:		SFR_CM17		= 0;		// 分周なし
9:		SFR_CM06		= 0;		// CM16/17 有効
10:		nop();				// 発信安定待ち ( NOP * 4 )
11:		nop();				// 発信安定待ち ( NOP * 4 )
12:		nop();				// 発信安定待ち ( NOP * 4 )
13:		nop();				// 発信安定待ち ( NOP * 4 )
14:		SFR_OCD_2		= 0;		// メインクロック選択
15:		SFR_PRCR_PRC0	= 0;		// システム制御レジスタプロテクト
16:	}

 ここが乗り切れれば、次は TimerY/Zの準備です。

1:	void		SET_TIMER( void )
2:	{
3:		SFR_P3D_1		= 1;		// P31(TZout) port = output mode
4:		SFR_P3_1		= 0;		// P31(TZout) port = Low
5:		SFR_P3D_2		= 1;		// P32(CNTR1) port = output mode
6:		SFR_P3_2		= 0;		// P32(CNTR1) port = Low
7:
8:		SFR_TCSS		= 0b00010100;	// Timer Count Source control (TX:f1/TY:f8/TZ:f8)
9:		SFR_TYZMR		= 0b01010101;	// TimerY/Z mode (TY/TZ programable pulse mode for PWM)
10:
11:		SFR_TYZOC_TYOCNT	= 0;		// TimerY out control
12:		SFR_TYZOC_TZOCNT	= 0;		// TimerZ out control
13:		SFR_PUM_TYOPL	= 0;		// 0:[primary=H, secondary=L, stop=L], 1:[primary=L, secondary=H, stop=H]
14:		SFR_PUM_TZOPL	= 0;		// 0:[primary=H, secondary=L, stop=L], 1:[primary=L, secondary=H, stop=H]
15:
16:		SFR_PREY		= xxxx;		// TimerY prescaler
17:		SFR_TYPR		= xxxx;		// TimerY primary register
18:		SFR_TYSC		= xxxx;		// TimerY secondary resister
19:		SFR_PREZ		= xxxx;		// TimerZ prescaler
20:		SFR_TZPR		= xxxx;		// TimerZ primary register
21:		SFR_TZSC		= xxxx;		// TimerZ secondary resister
22:	}

 ここで、OAKS8 の付録についているソースをよく読むと、TimerY の分周ですが、f1 が使えない場合がある、というコメントです。 これは、チップに WS が印字されているチップの場合で、私の場合も、f1 は設定しても、f8相当になってしまってました(これを知らず悩んでしまいました)。

 続いて、TimerY/Z の割り込み準備です。 まず、 HEW4 の環境から変えないといけません。 ここは、どこかのマニュアルにも書いてあったのですが、メモを取るのを忘れてしまったので、画像の CUT&PASTE を少し詳しく残しておきます。

  • HEW4 の「ビルド」メニューの
       Renesas R8C Standard Toolchain
    を選択。
  • 「c」 の欄にある Category で 「Code Modification 」を選び
     [-fMVT] Generates variable vector table
    にチェックを入れる。
    ・・・ これを忘れた場合、コンパイル時に warning が出るが、
       いまひとつ理解できずコンパイル終了してしまうので、
       できてると勘違いする可能性大。

 割り込みについては、次のように記載すればOKです。 ただ、IPL のレジスタ変更方法がわからなかったので、デフォルトでは全ての割り込みが同時に許可/不許可されるようになります。

割り込みルーチンの定義

1:      #pragma interrupt ty_int( vect = 23 )
2:      void            ty_int( void )
3:      {
4:              // 処理記載 ( TimerY 割り込み処理 )
5:      }

6:      #pragma interrupt tz_int( vect = 24 )
7:      void            tz_int( void )
8:      {
9:              // 処理記載 ( TimerZ 割り込み処理 )
10:     }

以下メインプログラム内で

11:     SFR_TYIC_ILEV0  = SFR_TYIC_ILEV2        = 1;    // TimerY interrupt level
12:     SFR_TZIC_ILEV1  = SFR_TZIC_ILEV2        = 1;    // TimerZ interrupt level
13:     SFR_TYZMR_TYS   = SFR_TYZMR_TZS = 1;    // TimerY/Z count start flag
14:     SFR_TYIC_IR     = SFR_TZIC_IR   = 1;    // TimerY/Z interrupt enable
15:     ei();                                   // enable interrupt ( with count-starting TimerY/Z )

 割り込みレベルは適当にセットしてます。 上記の場合、TimerY bit[2..0]=0b101=5, TimerZ bit[2...0]=0b110=6 としてます。

 (上記 1 - 10 行目は書き忘れてましたので追記しておきます。(4/18) )

(2005年4月17日)


 仕事が忙しくて、進捗なしです。 オリジナルサーボの仕様を固める意味で、メモを残しておきます。

 EAGLE lbr を1つ作ってみたので、よかったら使ってください。 IRF7317.lbr
 他、CPU とかは、EAGLE のダウンロードサイトと同じところにありますが、足りなくなったら作ってみようと思います。

(2005年4月24日)


先日の実験で誤った解釈をしてしまっていたので、訂正します。 2005年4月16日ですが、エミッタフォロアのPowerMOSFET ドライブで効果が薄いと書きましたが、CPUからの制御信号との比較という点で見ていなかったので、信号の遅延という点では誤りであることがわかりました。 (同じことをしないようにするために、先日分はそのまま残しておきます。)

 今回は、オシロの波形をPCで取り込みができたので、その画像で結果を示します。 各波形の水色(上段)が評価回路の入力信号(CPUの出力信号)で、黄色(下段)がNch-PowerMOSFETの出力信号です。

パルス立ち上がり(エミッタフォロア回路)
特に波形としては良好(分解能以下)。
パルス立ち下がり(5.1kΩプルダウン抵抗回路)
入力波形もブロードになり、その影響で、出力波形
が、0.3μsec程度遅延がみられる。
パルス立ち下がり(エミッタフォロア回路)
入力波形は問題なし(影響を与えてない)。
出力波形も0.1μsec 以下の遅延であった。

 入力信号のパルス立下り(H→L)の際、PowerMOSFET の出力信号でオーバーシュートしていました。 単なるオシロのプローブ端子の調整ミスかもしれません。 原因はこれから調べます。

 また、ソフト技研さんから、R5F21114FP が 12個届きました。 部品も着々と揃ってきましたので、本格的にサーボ組み立てしてみたいところです(GW中に仕上がるかな?)。

Renesas製R5F21114FP
  • TimerY/Zの2ch分「プログラマブル波形発生モード」が使える。
    LowSidePWMのNch 2ch をダイレクトにドライブできる。

(2005年4月29日)


いしかわさんの情報を元に、チップサイズが割り出せましたので、制御基板作成に加速がつきました。
はじめてのアートワーク(といっても、ベタGND+auto)なので、ビアが多く含まれてますが、なんとなくできたような、錯覚を覚えてしましす。 が、3本ほど結線できてないのがありますね。 うまく出来上がったら、再配置&ビア減らし後、露光&現像&エッチングをしてみたいと思います。 まずは、一度動かしてみる、というのがGW中の目標でしょうか。

  • 20mm x 40mm に押し込みました。
  • とりあえず並べて、
    • ベタGND設定
    • AUTO による自動配線

  • 何かできた錯覚を覚えてしまう。。。

(2005年5月1日)


なんとなく触っていたら、できました。 もう少し頑張ってみて、とりあえず動かしてみたいので、プリント基板作りへ。。。

  • 20mm x 40mm に押し込み、結線も全て完了。
  • 意外と、頑張ればできるので感動です。

 先ほど、実家から帰ってきました(ということで、上記のアートワークは実家で暇な時間にやってました)。
 帰ってくると荷物が届いてました。

 Digi-Key に注文していた IRF7317 100個です。 ダンボールがえらくデカイので、個数を間違えたか?って思いましたが、ちゃんと100個でした。 ダンボールの上にモータを乗せてみましたので、その大きさがわかっていただけると思います。 注文してから3日弱で届けられました。 アメリカからにしては、すっごく早いですね。 びっくりです。 カード支払いは怖いので、振込みにしましたが、専用用紙により振り込まないといけないので、銀行へ行かないといけませんが、2週間の猶予があるので、大丈夫でしょう。

 肝心の IRF7317 ですが、PowerMOSFET Nch+Pch のもので、ON抵抗もとっても小さくて良いです。

(2005年5月2日)


 詰め込み作業の途中経過。 片面実装(配線両面)でも意外とたくさん搭載できるものですね。 パーツが全て揃うまでは、アートワークを続けたいと思います。 今回は、auto で配線を引き回した後に手でチョコチョコ位置を変えてあげてビア数を減らしたり、クリティカルパスと思われるところを最短距離になるように位置ずらししたりしました。 最後は、忘れず DRC による clearance の確認で終了。

  • 41.5mm x 21.5mm としてしまいましたが、
     DRCエラーなし
     ビア数も19個(除くGND)
    を達成。
  • 発信子を小さいものにしました
  • アナログ端子を忘れていたので追加
  • 残件は、
    • EIA232 端子
    • mode 端子
    の追加。

 これを10サーボ分作るわけですけど、はて、どうやって10枚分の印刷をすればいいんだろう。。。
 ともあれ、まず1枚分、普通紙に印刷してみよう。。。ん? プリンタの解像度が不足している! 専用紙にしてニジミは抑えきれるのだろうか?? 嫌な予感がする。

 とりあえず、普通紙印刷した紙の上に部品を並べてみる。 思った以上に部品は大きいがパターンの間隔 (Clearance) が取れてないことに気がつきました。 アートワークをやり直しておいた方が、後々楽できそう。 嫌な予感が的中する前に、回避しよう。 今回、引き回し配線の関係で目標としていたサイズより大きくなったのですが、もともと、40mm x 20mm にしたかった理由は、サーボケース横に取り付けたかったからです(既製品のRCサーボも大体このサイズ)。 それだけ。 実際には、各辺 1mm位のマージンがあるので、41.5mm x 21.5mm でも出来上がった基板を切り出すと 40mm x 20mm になってくれると思ってます。

(2005年5月3日)


 両面部品実装&試行錯誤(同じサイズの部品を表裏に重ねて配置)で、更にビア数低減、Vdd/GND 太幅化ができました(宮田さん、アドバイスありがとうございます!)。 基板サイズが小さくできそうなので、やってみたいと思います。

今日はここまで。 各辺 2〜3mm 程度小さくできました! やればできるものです。 EAGLE を始めて、まだ5日程度ですが、ロボット作りということを忘れて、はまりまくってます。

 Vdd / GND につづいて、モーターへの出力配線も太くしました(単に忘れていただけ)。 配線 (NET) をちゃんと定義しておくと、幅と間隔をしっかりとレイアウトしてくれるので、助かりますね。 パスコンをLSIの側に置くことをすっかり忘れていたりしましたが、今回のもので、納得がいくところまできました。 あとは、サイズでしょうか。 宮田さんから、目標としてる 40mm x 20mm だと、宮田さんの3サーボ制御基板と同じサイズだよ、と、激励をいただきました。 がんばりたいと思います。
 今、ちょっと悩んでるのは、EAGLEサイトから renesas.lbr をダウンロードしたのですが、Renesas R5F21114FP のチップ中央右側にGNDの点が2点あり、それが必ず DRCエラーとして出てきてしまうのです。 ライブラリ変更をすればよいのでしょうけど、見てみても見当たらない。。。 もしかして、Renesas のロゴにくっ付いてしまってるのかな??

(2005年5月5日)


 う〜ん。 モデラーに続いてプリンタまで欲しくなってきました。

 下の右写真が今回レイアウトした基板を 2 x 3 面付けにして印刷した様子。 ただし、とっても面倒なことをしてます。 2 x 3 面付け印刷というのが Eagle でできるのかどうかわからなかったので、プリンタ印刷の際、用紙左上のオフセットをズラして印刷してます。 両面あるので、合計12回も印刷しないといけない、かつ、その際、紙の位置ズレが起きてはいけない、という、とってもヒヤヒヤしながらの作業です。 今回、テスト印字してみたのですが、最初の左上のものが左に1.5mmほどずれてしまってます。 これでは、両面基板を作った場合、ビアが表裏で違うところになるため、基板として使えません。。。 Eagle で簡単に 2 x 3 面付けのパターン印刷できる方法があったら、教えてください!

 たぶん、レイアウトイメージを Eagle 図面上で CUT & PASTE できるんじゃないかな?って思うんですが、それがわからないんですよぉ。

 プリンタはやっぱりニジミが気になりますね。 位置あわせ精度、ニジミ抑制ということで、レーザープリンタが欲しい!(最近、パソコンショップでもみかけないもんなぁ。。。トナーが高いもんなぁ。。。)

 ともあれ、それなりに動かせるレベルのレイアウトができたと思ってますので、いざ、基板作りへと移りたいと思います。

(13:05記載)

 なんとも、お粗末な経験をしたので、メモを残しておきます。

 本番印刷直前にE8 エミュレータ接続端子が足りないことに気がついて( RESET端子 ) 、ヘッダピンを付け替えました。

 そのとき、悪循環に陥ってしまいました。 皆さんも注意しましょう。 何かの拍子だと思いますが、複数の EAGLE が立ち上がってしまって、気がつかないまま、片方の EAGLE で一生懸命編集をしていたのですが、何度素子を増やしてもパターン図面に表示されないという状態に陥りました。 もう1方の EAGLE がファイルロックしてしまってたみたいで、DRC 値など全て受け付けない状態になってました。 こういった場合、慌てず使っていない方の EAGLE を閉じれば編集が再開できます。 が、DRC がパターン図面と回路図面で食い違ってしまってる場合(DRC値を変更してしまった場合)、まず、同じ値にしないと、何も編集ができませんので、両画面出して見比べて、1つ1つを修正していってください。 これに気がつくまで数時間、結局、今日はレイアウト完成まで、となりました。 実際の基板作りは明日に持越しです。

(23:50 記載)

(2005年5月6日)


 JinSato さんからアドバイスいただきまして、EAGLE で面付けができました! ありがとうございました! > JinSato さん
 ちょうど、これから印刷して基板作りをしようと思ってたところのメールだったので、助かりました。 面付けしたイメージがこんな感じです。

 一番外側に白い線を入れたのですが(ちょっとWebでは見えづらいですね)、基板サイズ 100mm x 75mm に合わせて引いてみました。 両面基板作りなので、表裏の位置あわせが重要になるので、ガイドラインをいれてみた、というところです。

(12:05 記載)

 EAGLE で面付けするための手法を簡単にメモしておきます。

  @ パターン図面で全レイヤーをアクティブにする。

    このウィンドウで All を押せば全てアクティブにできます。

  A つづいて、パターン図面を全て領域選択します。
     選択は、アイコンの「」を押した後、領域左上にてマウス左ボタンを押し、
     押したまま領域右下まで広げてボタンを離す、です。

  B 領域選択した場所をコピーします。
     その際、アイコンの「」を押した後、選択した領域にてマウスの「右」ボタンをクリックします。 左ではありません。

  C 新しいパターン図面を開いて、アイコンの「」を押せば、貼り付けができます。
     この貼り付けは何度も行えるので、お好みの位置に張る付けをしていけばOKです。
     注意点は、パーツ番号がインクリメントされていきます。
     たとえば、抵抗R1−R5を使っていたとしたら、2つめのペーストした図面はR6−R10になります。
     外注するときなどは気をつけてください。
     インクリメントされない方法を JinSato さんからご教授いただいたのですが、今回は手作りなので、適応を見送ってます。
     あと、手で修正した回路図面が含まれている場合、ペースト位置によっては、
     DRCエラーが生じる場合や、パターン引き回しができない、とエラーがでる場合などあります。

 (22:50 追記)

 さて、無事にパターン図面が面付けした状態で印刷できるようになったので、基板作りを開始したいと思います。
 両面で位置ズレしないように、治具を作って露光からスタートしました。

左側は表面の印刷したものに基板サイズ + 0.5mm 程度の大きさに切り抜いた1mm厚のABSを貼り付け、さらに、折り返した部分には裏面のパターンを印刷したフィルムをつけました。 これで、位置ズレは小さく抑えられるはず。 他にも、両面テープで行う方法など、いろいろなサイトで紹介されてますので参考にされるとよいでしょう。

 露光、現像、エッチング、順調に進んでいると思ってました、が、エッチング時間が長すぎましたぁ! 一応、失敗したものの、フラックスまでは練習とおもって、やってみました。 エッチングが過剰にかかってしまった基板がこれです。 最初は配線パターンが消えかかってるだけだと思ったのですが、パッド部分含めてピンホールが開き始めていたので、エッチング過剰であったと思われます。 ベタ部分が抜けたらすぐに止めないと駄目ですね。 ショートを気にして、ちょっとだけオーバーエッチと思ったのが失敗でした。。。(どこかで聞いた台詞ではあるのですが)

表面
細い配線が消えかかってるのに加えて
パッドまでもがピンホールの嵐でした。
裏面が透けて見えてますが、エッチングの
時もこれが残渣として残ってるのではないか?
と錯覚したものでした。
裏面
ベタ部分と細配線とのクリアランスは
エッチングオーバーもあってか、十分分離
できている感じです。

 今日の反省を活かして、明日は、細配線を太く変えたものを用意し、多少のオーバーエッチにも耐えられる配線にしてみたいと思います。
 さすがに、パワー系はしっかりと残ってました(0.8mmなので)。

(22:00 記載)

(2005年5月7日)


 今日は朝から基板作り!と思ったのですが、EAGLE をゴチャゴチャ触っていた細かな設定変更をしていました。 で、結局、1から作り直しての基板作成となったのでした。。。

本日の基板(表面)
右列の上段・中段は穴あけテストをしてみました
本日の基板(裏面)
裏なので左列が穴あけテストになります
穴あけテスト(中段・表面より)
ビア(0.8mmφ)部分はそこそこできたのですが、
端子部(1.2mmφ)部分は位置ずれ大!
穴あけテスト2(上段・表面より)
今回は端子部分含めOK。
穴あけテスト2(上段・裏面より)
両面の位置ずれが無視できる程度に仕上がった!

 見ていただいたとおり、結構、両面の位置ズレも小さく、断線もない状態で仕上がりました。 本当は、ちょっと露光時間が短く、全面露光して追加現像処理をしたんですけどね。 テスト基板を1枚(片面)で作って、先日のミスがどこで生じているのか?を確認しながらやりました。 結果としていえないところが悲しいのですが、印刷したフィルムを見ると、先日のベタ部分にみえた模様があったので、露光時間が多すぎる、という点が1つ怪しげだったので、露光時間を思い切って6分にしたのですが、足りませんでした。 ということで、全面露光という形でしたが、追加2分程度実施し、薄皮一枚残っていたレジストを取り除きました。

 もう1点、今回工夫した点は、全ての配線をマニュアルで太い配線に置き換えを実施。 端子間は0.4mmでそれ以外の信号線は0.6mm、Power系は0.8-1.2mmで引き回しとしました。 クリアランスは変更してませんが(個々の配線に対しての変更という方法がわからないので)、信号線は0.275mm, Power系は0.4mmとしました。 それでも、数箇所、補正忘れがあったみたいで、厳しいところがありますが、こんなものでしょう。 よくできてると思いました。

 昨日のベタ部分のピンホールは今回は出てませんでした。 露光時間を短くしたことがよかったものと思われます。 インクジェット専用フィルムで焼き付ける場合、8分程度でOKのようなので、次は、これでテストしてみたいと思います(使用環境:ちびライト−基板距離 約6cm)。 ビア作り、ショートチェックをして問題なければ、実装に入りたいと思います。

 ここで1つ思いました。

 これ、予備を含めて12個作ろうとしていたのですが、かなり時間と集中力が必要で、大変です! やはり、基板は発注して作るほうがよさそうです。 デバッグは、自作でガンガンにやってから、というところでしょうけど、同じものを位置ズレなく作ること(特に穴あけが厳しい!)に自信がありません。

 軽く PCB-POOL に見積もりをしてみたのですが、4x4面付けで $72.48(US) で1枚あたり約1,040円でした。(ただし、輸送賃が$63(US) かかるので、もっとたくさん買わないと損ですねぇ。
 P板.com だと、同じ品質で16枚発注だと、1枚あたり2,000円となりました。 約 2 倍ですね。 P板.com は EAGLE データ(*.brd)が使えませんが、PCB-POOL はサポートしてくれてるみたいですね。 P板.com のページにGARBER データ出力の手順書があるので、この点は問題なし、というところでしょうか。。。

 (2005年5月8日)